Действительно. Перед началом работы с GPIO из userspace, соответствующий вывод должен быть прописан в DTS. Это нужно для того, что бы ядро знало, что с этой ножкой нужно/можно работать через gpio-драйвер.
Я это делаю так:
CODE
usergpio_pins: pinmux_usergpio_pins {
pinctrl-single,pins = <
/*button*/
0x05C (PIN_INPUT_PULLUP | MUX_MODE7) /* SW1 gpmc_a7.gpio1_23 MODE7 */
/*Vif vif_12v_fixed*/
0x16C (PIN_OUTPUT_PULLUP | MUX_MODE7) /* uart0_rtsn.gpio1_9 MODE7 */
/*3V3_plc vif_3v3_plc_fixed*/
0x190 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* mcasp0_aclkx.gpio3_14 MODE7 */
>;
};
Соответственно, потом указатель на usergpio_pins помещаю в секцию pinmux.
Собственно, для процессора из примера MUX_MODE7 -- режим работы вывода процесса, соответствующий GPIO. Что такое PIN_INPUT_PULLUP и PIN_OUTPUT_PULLDOWN, думаю, понятно и так.
Единственная проблема с адресом. Это нужно смотреть документацию на процессор. Причем, следует отметить, что используется не абсолютный адрес, о смещение относительно блока pinmux.
Как работать с этим в userspace. Допустим, хотим вывести 1 в gpio1.9. (объявлен в примере).
1.
Инициализируем устройство gpio1.9:
echo 41 > /sys/class/gpio/export
Тонкий вопрос, как gpio1.9 превратился в 41 ?. В процессоре параллельные порты объединены в 32-битную шину. В обозначении gpio1.9 первая цифра "1" -- номер порта, вторая -- номер ножки в порту. Таким образом, абсолютный номер порта будет 32 + 9 = 41.
2.
Устанавливаем направление порта.
После экспорта в директории /sys/class/gpio/ появляется директория gpio41. Там много чего интересного, но сейчас нам нужен файл
direction. Записываем туда направление.
echo "out" > /sys/class/gpio/gpio41/direction
Понятно, что для входа, значение будет "in".
3.
Устанавливаем уровень. Теперь, через запись в файл value значения, мы управляем выводом:
echo "1" > /sys/class/gpio/gpio41/value
P.S.: в командах могут быть ошибки, под рукой нет боевой системы.