LINUX.ORG.RU

Raspberry Pi + new GPIO interface(/dev/gpiochip*) = linux виснет наглухо

 , ,


0

4

Привет, так как доступ через sysfs deprecated, пытаюсь работать через /dev/gpiochip* Нарвался на интересную проблему. На некоторых пинах, при попытке прочитать handle, линукс виснет наглухо. Дальше только отключение питания.

Проблема воспроизводится не только на моем коде, но и в библиотеках gpio-hammer.c 56 строка и libgpiod При чем через gpioinfo вроде как почему то работает, а через gpioget - нет.

Пример:

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.27-v8+ #1409 SMP PREEMPT Tue Apr 6 18:29:13 BST 2021 aarch64 GNU/Linux

pi@raspberrypi:~ $ gpioinfo
gpiochip0 - 58 lines:
        line   0:     "ID_SDA"       unused   input  active-high
        line   1:     "ID_SCL"       unused   input  active-high
        line   2:       "SDA1"       unused   input  active-high
        line   3:       "SCL1"       unused   input  active-high
[skipped]
        line  30:       "CTS0"       unused   input  active-high
        line  31:       "RTS0"       unused   input  active-high
        line  32:       "TXD0"       unused   input  active-high
        line  33:       "RXD0"       unused   input  active-high
        line  34:    "SD1_CLK"       unused   input  active-high
        line  35:    "SD1_CMD"       unused   input  active-high
[skipped]
        line  54: "RGMII_TXD0"       unused   input  active-high
        line  55: "RGMII_TXD1"       unused   input  active-high
        line  56: "RGMII_TXD2"       unused   input  active-high
        line  57: "RGMII_TXD3"       unused   input  active-high
gpiochip1 - 8 lines:
        line   0:      "BT_ON"       unused  output  active-high
        line   1:      "WL_ON"       unused  output  active-high
        line   2: "PWR_LED_OFF" "led1" output active-low [used]
        line   3: "GLOBAL_RESET" unused output active-high
        line   4: "VDD_SD_IO_SEL" "vdd-sd-io" output active-high [used]
        line   5:   "CAM_GPIO"       unused  output  active-high
        line   6:  "SD_PWR_ON" "sd_vcc_reg"  output  active-high [used]
        line   7:    "SD_OC_N"       unused   input  active-high

pi@raspberrypi:~ $ gpioget gpiochip0 0
1 <--- [Работает]

pi@raspberrypi:~ $ gpioget gpiochip0 24
0 <--- [Работает]

pi@raspberrypi:~ $ gpioget gpiochip0 34  <--- [система виснет]
pi@raspberrypi:~ $ gpioget gpiochip1 1  <--- [система виснет]

Если посмотреть на атрибуты, которые возвращает

struct gpioline_info line;
ioctl(handle, GPIO_GET_LINEINFO_IOCTL, &line);

например для gpiochip1 пинов 0 и 1, то они одинаковые.

Но для 0-го пина команда ниже работает, для 1го вешает линукс.

struct gpiohandle_request req;
ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req);

Единственная зацепка, которая может быть - какая то магия с флагами для req. Но и то не факт и интернет об этом молчит