2

I'm using the Rust gpio_cdev library. This uses the GPIO character device, rather than the deprecated sysfs.

With the character device, you need to tell it the proper gpio chip to use.

My code might be running on a Raspberry Pi 2, 3, 4, or potentially 5 and 6 one day.

The docs say that instead of using a hardcoded value like /dev/gpiochip0, you should use their chips function that returns a list of chips, and look for the one you need.

What's the best thing to look for when searching for the right chip?

  • The chip with the most lines?
  • The chip with a specific name?
  • The chip with a specific number of lines?
  • Something else?
John
  • 467
  • 1
  • 5
  • 10

2 Answers2

1

For all Raspberry Pis I would assume the expansion header GPIO are always on /dev/gpiochip0.

It would be an extremely perverse decision to place them on any other gpiochip.

For reference the Pi4B has two gpiochips.

gpiochip0

lines=58 name=gpiochip0 label=pinctrl-bcm2711
offset=0 flags=0 name=ID_SDA user=
offset=1 flags=0 name=ID_SCL user=
offset=2 flags=0 name=SDA1 user=
offset=3 flags=0 name=SCL1 user=
offset=4 flags=0 name=GPIO_GCLK user=
offset=5 flags=0 name=GPIO5 user=
offset=6 flags=0 name=GPIO6 user=
offset=7 flags=0 name=SPI_CE1_N user=
offset=8 flags=0 name=SPI_CE0_N user=
offset=9 flags=0 name=SPI_MISO user=
offset=10 flags=0 name=SPI_MOSI user=
offset=11 flags=0 name=SPI_SCLK user=
offset=12 flags=0 name=GPIO12 user=
offset=13 flags=0 name=GPIO13 user=
offset=14 flags=0 name=TXD1 user=
offset=15 flags=0 name=RXD1 user=
offset=16 flags=0 name=GPIO16 user=
offset=17 flags=0 name=GPIO17 user=
offset=18 flags=0 name=GPIO18 user=
offset=19 flags=0 name=GPIO19 user=
offset=20 flags=0 name=GPIO20 user=
offset=21 flags=0 name=GPIO21 user=
offset=22 flags=0 name=GPIO22 user=
offset=23 flags=0 name=GPIO23 user=
offset=24 flags=0 name=GPIO24 user=
offset=25 flags=0 name=GPIO25 user=
offset=26 flags=0 name=GPIO26 user=
offset=27 flags=0 name=GPIO27 user=
offset=28 flags=0 name=RGMII_MDIO user=
offset=29 flags=0 name=RGMIO_MDC user=
offset=30 flags=0 name=CTS0 user=
offset=31 flags=0 name=RTS0 user=
offset=32 flags=0 name=TXD0 user=
offset=33 flags=0 name=RXD0 user=
offset=34 flags=0 name=SD1_CLK user=
offset=35 flags=0 name=SD1_CMD user=
offset=36 flags=0 name=SD1_DATA0 user=
offset=37 flags=0 name=SD1_DATA1 user=
offset=38 flags=0 name=SD1_DATA2 user=
offset=39 flags=0 name=SD1_DATA3 user=
offset=40 flags=0 name=PWM0_MISO user=
offset=41 flags=0 name=PWM1_MOSI user=
offset=42 flags=3 name=STATUS_LED_G_CLK user=led0
offset=43 flags=0 name=SPIFLASH_CE_N user=
offset=44 flags=7 name=SDA0 user=spi0 CS0
offset=45 flags=7 name=SCL0 user=spi0 CS1
offset=46 flags=0 name=RGMII_RXCLK user=
offset=47 flags=0 name=RGMII_RXCTL user=
offset=48 flags=0 name=RGMII_RXD0 user=
offset=49 flags=0 name=RGMII_RXD1 user=
offset=50 flags=0 name=RGMII_RXD2 user=
offset=51 flags=0 name=RGMII_RXD3 user=
offset=52 flags=0 name=RGMII_TXCLK user=
offset=53 flags=0 name=RGMII_TXCTL user=
offset=54 flags=0 name=RGMII_TXD0 user=
offset=55 flags=0 name=RGMII_TXD1 user=
offset=56 flags=0 name=RGMII_TXD2 user=
offset=57 flags=0 name=RGMII_TXD3 user=

gpiochip1

lines=8 name=gpiochip1 label=raspberrypi-exp-gpio
offset=0 flags=2 name=BT_ON user=
offset=1 flags=2 name=WL_ON user=
offset=2 flags=7 name=PWR_LED_OFF user=led1
offset=3 flags=2 name=GLOBAL_RESET user=
offset=4 flags=3 name=VDD_SD_IO_SEL user=vdd-sd-io
offset=5 flags=2 name=CAM_GPIO user=
offset=6 flags=3 name=SD_PWR_ON user=sd_vcc_reg
offset=7 flags=0 name=SD_OC_N user=

My laptop has four gpiochips. I only show the lines field as the name and user fields are blank.

lines=80 name=gpiochip0 label=INT3453:00
lines=80 name=gpiochip1 label=INT3453:01
lines=20 name=gpiochip2 label=INT3453:02
lines=35 name=gpiochip3 label=INT3453:03
joan
  • 71,852
  • 5
  • 76
  • 108
1

gpiodetect – list all gpiochips present on the system, their names, labels and number of GPIO lines

gpiochip0 [pinctrl-bcm2711] (58 lines)
gpiochip1 [raspberrypi-exp-gpio] (8 lines)
Milliways
  • 62,573
  • 32
  • 113
  • 225