Привет, так как доступ через 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. Но и то не факт и интернет об этом молчит