Question about GPIO access in Debian 12 on Beaglebone Black

Hello,
I downloaded this image for the Beaglebone Black AM335x 12.2 2023-10-07 4GB eMMC IoT Flasher - BeagleBoard

I have Debian 12.6, uname 5.10.168-ti-r78;
I cannot access gpiochip1 for sure P9_14, P9_12. I can access some gpiochip2 gpio’s.
I think some uboot overlay is missing, but I cannot find anything useful on Beaglebone instructions.
How to provide access to more GPIO pins?

Hi. I have a similar issue. See:

GPIO50 file/directory deleted - #45 by Jcal

To answer your question I followed the instructions at:

Accessing More I/O @beagleboard.org

Not sure if the “fix” helped me.

What you mean by “cannot access”. For example how are you trying to access the pins? What errors (if any) are you getting?

1 Like

Post this stuff

$gpiodetect
$gpioinfo gpiochip0
$gpioinfo gpiochip1
$gpioinfo gpiochip2

I talked with @RobertCNelson that there might be problems with gpiod.

Yesterday I tried with P8_32 and P9_29, no luck as well.
Anyway to provide more info I have this in uEnv.txt uncommented

disable_uboot_overlay_video=1
disable_uboot_overlay_audio=1
disable_uboot_overlay_wireless=1

I compiled gpiod 2.2 to bbb, it does not crash when I cannot use pins at inputs, it just silently wait.

@foxsquirrel

debian@BeagleBone:~$ gpiodetect
gpiochip0 [gpio-0-31] (32 lines)
gpiochip1 [gpio-32-63] (32 lines)
gpiochip2 [gpio-64-95] (32 lines)
gpiochip3 [gpio-96-127] (32 lines)
gpiochip0 - 32 lines:                                
        line   0:       "P8_25 [mmc1_dat0]"     input
        line   1:       "[mmc1_dat1]"           input
        line   2:       "P8_5 [mmc1_dat2]"      input
        line   3:       "P8_6 [mmc1_dat3]"      input
        line   4:       "P8_23 [mmc1_dat4]"     input
        line   5:       "P8_22 [mmc1_dat5]"     input
        line   6:       "P8_3 [mmc1_dat6]"      input
        line   7:       "P8_4 [mmc1_dat7]"      input
        line   8:       "NC"                    output active-low consumer="PHY reset"
        line   9:       "NC"                    input
        line  10:       "NC"                    input
        line  11:       "NC"                    input
        line  12:       "P8_12"                 input
        line  13:       "P8_11"                 input
        line  14:       "P8_16"                 input
        line  15:       "P8_15"                 input
        line  16:       "P9_15A"                input
        line  17:       "P9_23"                 input
        line  18:       "P9_14 [ehrpwm1a]"      input
        line  19:       "P9_16 [ehrpwm1b]"      input
        line  20:       "[emmc rst]"            input
        line  21:       "[usr0 led]"            output consumer="beaglebone:green:usr0"
        line  22:       "[usr1 led]"            output consumer="beaglebone:green:usr1"
        line  23:       "[usr2 led]"            output consumer="beaglebone:green:usr2"
        line  24:       "[usr3 led]"            output consumer="beaglebone:green:usr3"
        line  25:       "[hdmi irq]"            input
        line  26:       "[usb vbus oc]"         input
        line  27:       "[hdmi audio]"          input
        line  28:       "P9_12"                 input
        line  29:       "P8_26"                 input
        line  30:       "P8_21 [emmc]"          input
        line  31:       "P8_20 [emmc]"          input
gpiochip1 - 32 lines:
        line   0:       "P9_15B"                input
        line   1:       "P8_18"                 input
        line   2:       "P8_7"                  input
        line   3:       "P8_8"                  input
        line   4:       "P8_10"                 input
        line   5:       "P8_9"                  input
        line   6:       "P8_45 [hdmi]"          input
        line   7:       "P8_46 [hdmi]"          input
        line   8:       "P8_43 [hdmi]"          input
        line   9:       "P8_44 [hdmi]"          input
        line  10:       "P8_41 [hdmi]"          input
        line  11:       "P8_42 [hdmi]"          input
        line  12:       "P8_39 [hdmi]"          input
        line  13:       "P8_40 [hdmi]"          input
        line  14:       "P8_37 [hdmi]"          input
        line  15:       "P8_38 [hdmi]"          input
        line  16:       "P8_36 [hdmi]"          input
        line  17:       "P8_34 [hdmi]"          input
        line  18:       "[rmii1_rxd3]"          input
        line  19:       "[rmii1_rxd2]"          input
        line  20:       "[rmii1_rxd1]"          input
        line  21:       "[rmii1_rxd0]"          input
        line  22:       "P8_27 [hdmi]"          input
        line  23:       "P8_29 [hdmi]"          input
        line  24:       "P8_28 [hdmi]"          input
        line  25:       "P8_30 [hdmi]"          input
        line  26:       "[mmc0_dat3]"           input
        line  27:       "[mmc0_dat2]"           input
        line  28:       "[mmc0_dat1]"           input
        line  29:       "[mmc0_dat0]"           input
        line  30:       "[mmc0_clk]"            input
        line  31:       "[mmc0_cmd]"            input
gpiochip2 - 32 lines:
        line   0:       "[mii col]"             input
        line   1:       "[mii crs]"             input
        line   2:       "[mii rx err]"          input
        line   3:       "[mii tx en]"           input
        line   4:       "[mii rx dv]"           input
        line   5:       "[i2c0 sda]"            input
        line   6:       "[i2c0 scl]"            input
        line   7:       "[jtag emu0]"           input
        line   8:       "[jtag emu1]"           input
        line   9:       "[mii tx clk]"          input
        line  10:       "[mii rx clk]"          input
        line  11:       "NC"                    input
        line  12:       "NC"                    input
        line  13:       "[usb vbus en]"         input
        line  14:       "P9_31 [spi1_sclk]"     input
        line  15:       "P9_29 [spi1_d0]"       input
        line  16:       "P9_30 [spi1_d1]"       input
        line  17:       "P9_28 [spi1_cs0]"      input
        line  18:       "P9_42B [ecappwm0]"     input
        line  19:       "P9_27"                 input
        line  20:       "P9_41A"                input
        line  21:       "P9_25"                 input
        line  22:       "NC"                    input
        line  23:       "NC"                    input
        line  24:       "NC"                    input
        line  25:       "NC"                    input
        line  26:       "NC"                    input
        line  27:       "NC"                    input
        line  28:       "NC"                    input
        line  29:       "NC"                    input
        line  30:       "NC"                    input
        line  31:       "NC"                    input
gpiochip3 - 32 lines:
        line   0:       "[mdio_data]"           input
        line   1:       "[mdio_clk]"            input
        line   2:       "P9_22 [spi0_sclk]"     input
        line   3:       "P9_21 [spi0_d0]"       input
        line   4:       "P9_18 [spi0_d1]"       input
        line   5:       "P9_17 [spi0_cs0]"      input
        line   6:       "[mmc0_cd]"             input active-low consumer="cd"
        line   7:       "P9_42A [ecappwm0]"     input
        line   8:       "P8_35 [lcd d12]"       input
        line   9:       "P8_33 [lcd d13]"       input
        line  10:       "P8_31 [lcd d14]"       input
        line  11:       "P8_32 [lcd d15]"       input
        line  12:       "P9_20 [i2c2_sda]"      input
        line  13:       "P9_19 [i2c2_scl]"      input
        line  14:       "P9_26 [uart1_rxd]"     input
        line  15:       "P9_24 [uart1_txd]"     input
        line  16:       "[rmii1_txd3]"          input
        line  17:       "[rmii1_txd2]"          input
        line  18:       "[usb0_drvvbus]"        input
        line  19:       "[hdmi cec]"            input
        line  20:       "P9_41B"                input
        line  21:       "[rmii1_txd1]"          input
        line  22:       "P8_19 [ehrpwm2a]"      input
        line  23:       "P8_13 [ehrpwm2b]"      input
        line  24:       "NC"                    input
        line  25:       "NC"                    input
        line  26:       "P8_14"                 input
        line  27:       "P8_17"                 input
        line  28:       "[rmii1_txd0]"          input
        line  29:       "[rmii1_refclk]"        input
        line  30:       "P9_11 [uart4_rxd]"     input
        line  31:       "P9_13 [uart4_txd]"     input

This is on kernel 6.10 I’m testing.
on 5.10 there are number of inputs input consumer and those I can use as user successfully.

I am running the load cape on this, looks like mine is one release back. Might try to back peddle to same release and see if it works.

fred@bbbi1:~$ gpioinfo
gpiochip0 - 32 lines:
	line   0: "[mdio_data]" unused input active-high 
	line   1: "[mdio_clk]"       unused   input  active-high 
	line   2: "P9_22 [spi0_sclk]" "P9_22" input active-high [used]
	line   3: "P9_21 [spi0_d0]" "P9_21" input active-high [used]
	line   4: "P9_18 [spi0_d1]" "P9_18" input active-high [used]
	line   5: "P9_17 [spi0_cs0]" "P9_17" input active-high [used]
	line   6:  "[mmc0_cd]"         "cd"   input   active-low [used]
	line   7: "P8_42A [ecappwm0]" unused output active-high 
	line   8: "P8_35 [lcd d12]" "P8_35" input active-high [used]
	line   9: "P8_33 [lcd d13]" "P8_33" input active-high [used]
	line  10: "P8_31 [lcd d14]" "P8_31" input active-high [used]
	line  11: "P8_32 [lcd d15]" "P8_32" input active-high [used]
	line  12: "P9_20 [i2c2_sda]" "P9_20" input active-high [used]
	line  13: "P9_19 [i2c2_scl]" "P9_19" input active-high [used]
	line  14: "P9_26 [uart1_rxd]" "P9_26" input active-high [used]
	line  15: "P9_24 [uart1_txd]" "P9_24" input active-high [used]
	line  16: "[rmii1_txd3]" unused input active-high 
	line  17: "[rmii1_txd2]" unused input active-high 
	line  18: "[usb0_drvvbus]" unused input active-high 
	line  19: "[hdmi cec]"       unused   input  active-high 
	line  20:     "P9_41B"       unused  output  active-high 
	line  21: "[rmii1_txd1]" unused input active-high 
	line  22: "P8_19 [ehrpwm2a]" "P8_19" input active-high [used]
	line  23: "P8_13 [ehrpwm2b]" "P8_13" input active-high [used]
	line  24:         "NC"       unused   input  active-high 
	line  25:         "NC"       unused   input  active-high 
	line  26:      "P8_14"      "P8_14"   input  active-high [used]
	line  27:      "P8_17"       unused  output  active-high 
	line  28: "[rmii1_txd0]" unused input active-high 
	line  29: "[rmii1_refclk]" unused input active-high 
	line  30: "P9_11 [uart4_rxd]" "P9_11" input active-high [used]
	line  31: "P9_13 [uart4_txd]" "P9_13" input active-high [used]
gpiochip1 - 32 lines:
	line   0: "P8_25 [mmc1_dat0]" "P8_25" input active-high [used]
	line   1: "[mmc1_dat1]" "P8_24" input active-high [used]
	line   2: "P8_5 [mmc1_dat2]" "P8_05" input active-high [used]
	line   3: "P8_6 [mmc1_dat3]" "P8_06" input active-high [used]
	line   4: "P8_23 [mmc1_dat4]" "P8_23" input active-high [used]
	line   5: "P8_22 [mmc1_dat5]" "P8_22" input active-high [used]
	line   6: "P8_3 [mmc1_dat6]" "P8_03" input active-high [used]
	line   7: "P8_4 [mmc1_dat7]" "P8_04" input active-high [used]
	line   8:         "NC"  "PHY reset"  output   active-low [used]
	line   9:         "NC"       unused   input  active-high 
	line  10:         "NC"       unused   input  active-high 
	line  11:         "NC"       unused   input  active-high 
	line  12:      "P8_12"       unused  output  active-high 
	line  13:      "P8_11"       unused  output  active-high 
	line  14:      "P8_16"      "P8_16"   input  active-high [used]
	line  15:      "P8_15"       unused  output  active-high 
	line  16:     "P9_15A"      "P9_15"   input  active-high [used]
	line  17:      "P9_23"      "P9_23"   input  active-high [used]
	line  18: "P9_14 [ehrpwm1a]" "P9_14" input active-high [used]
	line  19: "P9_16 [ehrpwm1b]" "P9_16" input active-high [used]
	line  20: "[emmc rst]"       unused   input  active-high 
	line  21: "[usr0 led]"       unused   input  active-high 
	line  22: "[usr1 led]"       unused   input  active-high 
	line  23: "[usr2 led]"       unused   input  active-high 
	line  24: "[usr3 led]"       unused   input  active-high 
	line  25: "[hdmi irq]"  "interrupt"   input  active-high [used]
	line  26: "[usb vbus oc]" unused input active-high 
	line  27: "[hdmi audio]" "enable" output active-high [used]
	line  28:      "P9_12"      "P9_12"   input  active-high [used]
	line  29:      "P8_26"      "P8_26"   input  active-high [used]
	line  30: "P8_21 [emmc]" "P8_21" input active-high [used]
	line  31: "P8_20 [emmc]" "P8_20" input active-high [used]
gpiochip2 - 32 lines:
	line   0:     "P9_15B"       unused   input  active-high 
	line   1:      "P8_18"      "P8_18"   input  active-high [used]
	line   2:       "P8_7"      "P8_07"   input  active-high [used]
	line   3:       "P8_8"      "P8_08"   input  active-high [used]
	line   4:      "P8_10"      "P8_10"   input  active-high [used]
	line   5:       "P8_9"      "P8_09"   input  active-high [used]
	line   6: "P8_45 [hdmi]" "P8_45" input active-high [used]
	line   7: "P8_46 [hdmi]" "P8_46" input active-high [used]
	line   8: "P8_43 [hdmi]" "P8_43" input active-high [used]
	line   9: "P8_44 [hdmi]" "P8_44" input active-high [used]
	line  10: "P8_41 [hdmi]" "P8_41" input active-high [used]
	line  11: "P8_42 [hdmi]" "P8_42" input active-high [used]
	line  12: "P8_39 [hdmi]" "P8_39" input active-high [used]
	line  13: "P8_40 [hdmi]" "P8_40" input active-high [used]
	line  14: "P8_37 [hdmi]" "P8_37" input active-high [used]
	line  15: "P8_38 [hdmi]" "P8_38" input active-high [used]
	line  16: "P8_36 [hdmi]" "P8_36" input active-high [used]
	line  17: "P8_34 [hdmi]" "P8_34" input active-high [used]
	line  18: "[rmii1_rxd3]" unused input active-high 
	line  19: "[rmii1_rxd2]" unused input active-high 
	line  20: "[rmii1_rxd1]" unused input active-high 
	line  21: "[rmii1_rxd0]" unused input active-high 
	line  22: "P8_27 [hdmi]" "P8_27" input active-high [used]
	line  23: "P8_29 [hdmi]" "P8_29" input active-high [used]
	line  24: "P8_28 [hdmi]" "P8_28" input active-high [used]
	line  25: "P8_30 [hdmi]" "P8_30" input active-high [used]
	line  26: "[mmc0_dat3]" unused input active-high 
	line  27: "[mmc0_dat2]" unused input active-high 
	line  28: "[mmc0_dat1]" unused input active-high 
	line  29: "[mmc0_dat0]" unused input active-high 
	line  30: "[mmc0_clk]"       unused   input  active-high 
	line  31: "[mmc0_cmd]"       unused   input  active-high 
gpiochip3 - 32 lines:
	line   0:  "[mii col]"       unused   input  active-high 
	line   1:  "[mii crs]"       unused   input  active-high 
	line   2: "[mii rx err]" unused input active-high 
	line   3: "[mii tx en]" unused input active-high 
	line   4: "[mii rx dv]" unused input active-high 
	line   5: "[i2c0 sda]"       unused   input  active-high 
	line   6: "[i2c0 scl]"       unused   input  active-high 
	line   7: "[jtag emu0]" unused input active-high 
	line   8: "[jtag emu1]" unused input active-high 
	line   9: "[mii tx clk]" unused input active-high 
	line  10: "[mii rx clk]" unused input active-high 
	line  11:         "NC"       unused   input  active-high 
	line  12:         "NC"       unused   input  active-high 
	line  13: "[usb vbus en]" unused input active-high 
	line  14: "P9_31 [spi1_sclk]" "P9_31" input active-high [used]
	line  15: "P9_29 [spi1_d0]" "P9_29" input active-high [used]
	line  16: "P9_30 [spi1_d1]" unused output active-high 
	line  17: "P9_28 [spi1_cs0]" "P9_28" input active-high [used]
	line  18: "P9_42B [ecappwm0]" "P9_92" input active-high [used]
	line  19:      "P9_27"       unused  output  active-high 
	line  20:     "P9_41A"      "P9_91"   input  active-high [used]
	line  21:      "P9_25"      "P9_25"   input  active-high [used]
	line  22:         "NC"       unused   input  active-high 
	line  23:         "NC"       unused   input  active-high 
	line  24:         "NC"       unused   input  active-high 
	line  25:         "NC"       unused   input  active-high 
	line  26:         "NC"       unused   input  active-high 
	line  27:         "NC"       unused   input  active-high 
	line  28:         "NC"       unused   input  active-high 
	line  29:         "NC"       unused   input  active-high 
	line  30:         "NC"       unused   input  active-high 
	line  31:         "NC"       unused   input  active-high 
fred@bbbi1:~$ uname -r
5.10.168-ti-r77

Here is my .conf

fred@bbbi1:/boot$ cat uEnv.txt 
Docs: http://elinux.org/Beagleboard:U-boot_partitioning_layout_2.0

uname_r=5.10.168-ti-r77
#uuid=
#dtb=

###U-Boot Overlays###
###Documentation: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian#U-Boot_Overlays
###Master Enable
enable_uboot_overlays=1
###
###Overide capes with eeprom
uboot_overlay_addr0=LOAD-CAPE-uart-i2c.dtbo /BBORG_LOAD-GPIO-6-00A2.dtbo
#uboot_overlay_addr1=/boot/dtbs/5.10.168-ti-r77/overlays/BBORG_LOAD-GPIO-6-00A2.dtbo
#uboot_overlay_addr0=<file0>.dtbo
#uboot_overlay_addr1=<file1>.dtbo
#uboot_overlay_addr2=<file2>.dtbo
#uboot_overlay_addr3=<file3>.dtbo
###
###Additional custom capes
#uboot_overlay_addr4=<file4>.dtbo
#uboot_overlay_addr5=<file5>.dtbo
#uboot_overlay_addr6=<file6>.dtbo
#uboot_overlay_addr7=<file7>.dtbo
###
###Custom Cape
#dtb_overlay=<file8>.dtbo
###
###Disable auto loading of virtual capes (emmc/video/wireless/adc)
#disable_uboot_overlay_emmc=1
#disable_uboot_overlay_video=1
#disable_uboot_overlay_audio=1
#disable_uboot_overlay_wireless=1
#disable_uboot_overlay_adc=1
###
###Cape Universal Enable
enable_uboot_cape_universal=1
###
###Debug: disable uboot autoload of Cape
#disable_uboot_overlay_addr0=1
#disable_uboot_overlay_addr1=1
#disable_uboot_overlay_addr2=1
#disable_uboot_overlay_addr3=1
###
###U-Boot fdt tweaks... (60000 = 384KB)
#uboot_fdt_buffer=0x60000
###U-Boot Overlays###

console=ttyS0,115200n8
cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet

#In the event of edid real failures, uncomment this next line:
#cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet video=HDMI-A-1:1024x768@60e

#Use an overlayfs on top of a read-only root filesystem:
#cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet overlayroot=tmpfs

##enable Generic eMMC Flasher:
#cmdline=init=/usr/sbin/init-beagle-flasher

Try toggling line

One is spi and the other is for an “lcd”
If you have open pins try to toggle it

$gpiochip<n> <line>=0
$gpiochip<n> <line>=1

I don’t know what is on your bus so pick something unused, your pin should line up.

Also

$groups

You must be in gpio

Post your .dts and your base .dts/.dtsi

Update,

Never mind this, mine is on 5.x. If memory is correct the 6.x has some issues. If the 5.x works that will be your only option unless you are ready to spend countless hours trying to track it down. When it has an issue with the kernel modules I run in the opposite direction.

6.x is fine on arm64, I am running the 3 relay RPI board on the Beagley-ai

6.1.83-ti-arm64-r62

Just checked a yocto build on 6.1 and it is broken. This is using the meta-ti (armhf) bbb

root@bb5:~# gpioset gpiochip1 21=0
gpioset: invalid line value: 'gpiochip1'
root@bb5:~# uname -a
Linux bb5 6.1.80-ti #1 SMP PREEMPT Fri Mar 22 02:57:54 UTC 2024 armv7l GNU/Linux

The lines are present and overlays loaded fine…

Hi, 5.x kernel is ok. I just need to use those PINS P8_32 and P9_29 as in Debian 10 I used those and I cannot change pcb layout because of the update.
I’ll try 5.10 once again and let you know

If you post a link to the exact image you are using I will install that on SD and test it with my known working source code.

Just did a totally factory setup using the 4 relay cape and BBB with an official image(curret IoT 5.x series). Both are untouched by me and I have verified my source code used for testing runs the cape without any problems.

We are not on the same page with this, my yocto build could be a problem that was self induced and not any fault of Ti or the 6.1 kernel.

This is the code I’m testing:

import gpiod
import unittest
from gpiod.line import Direction, Edge, Bias
from datetime import timedelta

class MyTest(unittest.TestCase):
    def test_falling_edge_event(self):
        #P8_32
        chip_no = 0
        chip_path = f"/dev/gpiochip{chip_no}"
        line = 11
        bias = Bias.PULL_UP
        with gpiod.request_lines(
            self.chip_path, {line: gpiod.LineSettings(edge_detection=Edge.BOTH, bias=bias)}
        ) as req:
            self.assertTrue(req.wait_edge_events(timedelta(seconds=15)))
            events = req.read_edge_events()
            event = events[0]
            print(event)

if __name__ == "__main__":
    try:
        event = MyTest()
        event.test_falling_edge_event(pin, PINS[pin])
    except OSError as ex:
        print(ex, "\nCustomise the example configuration to suit your situation")

I’m trying build from main Beagleboard page and right now from here: Index of /rootfs/debian-armhf-12-bookworm-iot-v5.10-ti

All I use is c and c++. I know enough python to say that’s python. Is the unittest in public or is that proprietary?

I can say that the IoT image (5.x) regarding the gpio pins is functional using lgpiod, so if it does not work it would be in the code.

The sys config access is who knows where, one place states it is, its going be, it works, who knows. I can say that the kernel config still had it as an option. I don’t recall digging in that direction in the 6.x so that might something to look into.