4

I've made a program using the wiringPi library that assigns GPIO pins to toggle at the press of associated number keys. I'd like my program to show the current status of the pins, even if they are toggled by external means (like another user running the program over SSH). Is it "safe" to read the status of a pin set to output?

Ghanima
  • 15,855
  • 15
  • 61
  • 119
Alexander
  • 600
  • 6
  • 18

1 Answers1

6

The answer

Yes it's safe. Judging from the source code of the library, it doesn't cache the values but reads them each time you call digitalRead function so it should work as expected.

Documentation

It isn't really documented in the wiringPi documentation but at least the documentation also doesn't say it's forbidden (for example for digitalWrite there is a not saying that you have to set the pin to OUTPUT first). So we have to dig deeper to get the answer.

Some background

WiringPi can control GPIO in two modes - using sysfs interface and using RaspberryPi specific registers in memory.

First option is a standard in Linux and it's documented here. Note that the documentation says:

However, note that not all platforms can read the value of output pins; those that can't should always return zero.

So we at least know that it is safe. I've checked by experimenting that it is supported on RaspberryPi.

This gives us a hint that reading output pin state is probably supported by the hardware itself but we can't be sure since it may be cached by the driver, for example. Lets check documentation:

The pin level registers return the actual value of the pin.

And it doesn't mention that it has to be set to OUTPUT. Experimentation seems to confirm this.

We can also check the [kernel driver] itself3:

lev = readl(gpio->base + GPIOLEV(gpio_bank))
return 0x1 & (lev >> gpio_field_offset);

So all it does is to indeed read the hardware register each time you read the state of the pin. And wiringPi does the same thing when not run in sysfs mode:

  if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0)
      return HIGH ;
  else
      return LOW ;
Krzysztof Adamski
  • 9,615
  • 1
  • 37
  • 53