реклама на сайте
подробности

 
 
> Управление GPIO на Linux
vgovseychuk
сообщение Jan 21 2016, 08:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955



Добрый день!

Меня интересует возможность управления gpio из linux.
По идее GPIO сначала нужно экспортировать, но как узнать, какой пин нужно экспортировать? Например, я хочу вывести 1 на 28-ой пин 3-его порта. При этом не хочется помнить, что GPIO3.28 - это включение питания USB.
Нельзя ли как-то дать понять системе, например через dts, что этот пин занят юзером и дать к нему доступ сразу, задав к тому же прерывания от этого пина или дефолтное состояние?

Ну и код dts для примера. Led-ы работают сразу через /sys/class/leds , а вот gpio нет.
Код
    gpio {
        compatible = "mygpio";
        pinctrl-names = "default";
        pinctrl-0 = <&gpio_pins_3V3>;
        gpio_USBHOST_VCCEN {
            label = "usbvccen";
            gpios = <&gpio3 28 GPIO_ACTIVE_HIGH>;
            default-state = "on";
        };
    };
    leds {
        compatible = "gpio-leds";
        pinctrl-names = "default";
        pinctrl-0 = <&leds_pins>;
        power {/* POWER */
            label = "power";
            gpios = <&gpio3 29 GPIO_ACTIVE_HIGH>;
            default-state = "on";
        };
        status {/* ACT */
            label = "status";
            gpios = <&gpio2 26 GPIO_ACTIVE_HIGH>;
            default-state = "on";
        };
    };

Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
shamrel
сообщение Jan 21 2016, 09:07
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 132
Регистрация: 10-10-07
Из: Новосибирск
Пользователь №: 31 229



Действительно. Перед началом работы с 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.: в командах могут быть ошибки, под рукой нет боевой системы.




--------------------
Go to the top of the page
 
+Quote Post
vgovseychuk
сообщение Jan 21 2016, 10:11
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 16-03-14
Пользователь №: 80 955



Большое спасибо за разъяснения. А можно ли, допустим, назвать пин UsbOnGpio, и потом с ним работать из линукса, не экспортируя его каждый раз и не вспоминая, что же такое у нас GPIO125 ?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016