7840
правок
Fizikdaos (обсуждение | вклад) (Подготовка страницы к переводу) |
Fizikdaos (обсуждение | вклад) (Отметить эту версию для перевода) |
||
Строка 1: | Строка 1: | ||
<languages/> | <languages/> | ||
<translate> | <translate> | ||
<!--T:1--> | |||
В Wiren Board часть GPIO выведена на клеммники, часть выведена на разъёмы UEXT, часть используется для служебных целей. | В Wiren Board часть GPIO выведена на клеммники, часть выведена на разъёмы UEXT, часть используется для служебных целей. | ||
GPIO также используются для управления транзисторами для коммутации низковольтной нагрузки. | GPIO также используются для управления транзисторами для коммутации низковольтной нагрузки. | ||
<!--T:2--> | |||
Соответствие между номерами GPIO в Linux и их местоположением и функцией можно найти в табличке [[WB SH 3.5: Список GPIO|WB SH 3.5: Список GPIO]] или [[WB rev. 2.8: Список GPIO|WB rev. 2.8: Список GPIO]]. | Соответствие между номерами GPIO в Linux и их местоположением и функцией можно найти в табличке [[WB SH 3.5: Список GPIO|WB SH 3.5: Список GPIO]] или [[WB rev. 2.8: Список GPIO|WB rev. 2.8: Список GPIO]]. | ||
<!--T:3--> | |||
В Wiren Board rev. 2.8 8 GPIO на специальном разъёме подключены через [[Special:MyLanguage/MCP23S08|MCP23S08]] и временно не работают со стандартным Linux API. Описание работы с ними есть на странице [[Special:MyLanguage/MCP23S08|MCP23S08]]. | В Wiren Board rev. 2.8 8 GPIO на специальном разъёме подключены через [[Special:MyLanguage/MCP23S08|MCP23S08]] и временно не работают со стандартным Linux API. Описание работы с ними есть на странице [[Special:MyLanguage/MCP23S08|MCP23S08]]. | ||
<!--T:4--> | |||
<b> Все GPIO (как и остальные порты Wiren Board) работают с напряжением 3.3V. Ни в коем случае не подключайте к GPIO напрямую сигналы, напряжением больше 3.3V! В случае необходимости подключения устройств, работающих с более высоким напряжением, необходимо использовать схемы согласования или подключать (для 5V) через резистор в 20 кОм и более </b> | <b> Все GPIO (как и остальные порты Wiren Board) работают с напряжением 3.3V. Ни в коем случае не подключайте к GPIO напрямую сигналы, напряжением больше 3.3V! В случае необходимости подключения устройств, работающих с более высоким напряжением, необходимо использовать схемы согласования или подключать (для 5V) через резистор в 20 кОм и более </b> | ||
<!--T:5--> | |||
На некоторых GPIO (в частности на 3х GPIO, выведенных на клеммники в Wiren Board rev. 2.8) можно программно установить 47к подтяжку к +3.3В. См. [[Special:MyLanguage/Pin_pull-up|Pin_pull-up]]. | На некоторых GPIO (в частности на 3х GPIO, выведенных на клеммники в Wiren Board rev. 2.8) можно программно установить 47к подтяжку к +3.3В. См. [[Special:MyLanguage/Pin_pull-up|Pin_pull-up]]. | ||
===Интерфейс sysfs в Linux === | ===Интерфейс sysfs в Linux === <!--T:6--> | ||
<!--T:7--> | |||
GPIO в Linux поддерживаются через sysfs-интерфейс. | GPIO в Linux поддерживаются через sysfs-интерфейс. | ||
<!--T:8--> | |||
Для работы через sysfs c определённым GPIO его надо экспортировать: | Для работы через sysfs c определённым GPIO его надо экспортировать: | ||
<!--T:9--> | |||
Здесь и далее N - номер gpio | Здесь и далее N - номер gpio | ||
<!--T:10--> | |||
<pre> | <pre> | ||
echo N > /sys/class/gpio/export | echo N > /sys/class/gpio/export | ||
</pre> | </pre> | ||
<!--T:11--> | |||
Экспортированные gpio появляются в каталоге /sys/class/gpio : | Экспортированные gpio появляются в каталоге /sys/class/gpio : | ||
<!--T:12--> | |||
<pre> | <pre> | ||
root@wirenboard:~# ls -1 /sys/class/gpio/ | root@wirenboard:~# ls -1 /sys/class/gpio/ | ||
Строка 39: | Строка 50: | ||
</pre> | </pre> | ||
<!--T:13--> | |||
В директории <b>/sys/class/gpioN</b> теперь находятся файлы для работы с GPIO (где N - номер GPIO, как и было сказано ранее): | В директории <b>/sys/class/gpioN</b> теперь находятся файлы для работы с GPIO (где N - номер GPIO, как и было сказано ранее): | ||
<!--T:14--> | |||
<pre> | <pre> | ||
root@wirenboard:~# ls -1 /sys/class/gpio/gpioN/ | root@wirenboard:~# ls -1 /sys/class/gpio/gpioN/ | ||
Строка 53: | Строка 66: | ||
</pre> | </pre> | ||
<!--T:15--> | |||
Установка направления GPIO (ввод/вывод) производится с помощью записи в файл <b>direction</b> | Установка направления GPIO (ввод/вывод) производится с помощью записи в файл <b>direction</b> | ||
<!--T:16--> | |||
<pre> | <pre> | ||
echo in > /sys/class/gpio/gpioN/direction # установим GPIO номер N на ввод | echo in > /sys/class/gpio/gpioN/direction # установим GPIO номер N на ввод | ||
Строка 60: | Строка 75: | ||
</pre> | </pre> | ||
<!--T:17--> | |||
Чтение и установка значения GPIO производится с помощью файла <b>value</b>. | Чтение и установка значения GPIO производится с помощью файла <b>value</b>. | ||
<!--T:18--> | |||
Чтение: | Чтение: | ||
<!--T:19--> | |||
<pre> | <pre> | ||
echo in > /sys/class/gpio/gpioN/direction # установим GPIO номер N на ввод | echo in > /sys/class/gpio/gpioN/direction # установим GPIO номер N на ввод | ||
Строка 69: | Строка 87: | ||
</pre> | </pre> | ||
<!--T:20--> | |||
Запись: | Запись: | ||
<!--T:21--> | |||
<pre> | <pre> | ||
echo out > /sys/class/gpio/gpioN/direction # установим GPIO номер N на вывод | echo out > /sys/class/gpio/gpioN/direction # установим GPIO номер N на вывод | ||
Строка 79: | Строка 99: | ||
====Интерфейс sysfs и прерывания==== | ====Интерфейс sysfs и прерывания==== <!--T:22--> | ||
<!--T:23--> | |||
Через интерфейс sysfs можно запросить прерывания по изменению состояния процессора. | Через интерфейс sysfs можно запросить прерывания по изменению состояния процессора. | ||
<!--T:24--> | |||
Установка прерывания производится путём записи значения в файл "edge". Значения могут быть: | Установка прерывания производится путём записи значения в файл "edge". Значения могут быть: | ||
* "none" - отключить прерывание | * "none" - отключить прерывание | ||
Строка 89: | Строка 111: | ||
* "both" - включить прерывание по обеим фронтам. | * "both" - включить прерывание по обеим фронтам. | ||
<!--T:25--> | |||
Пример: | Пример: | ||
<pre> | <pre> | ||
Строка 100: | Строка 123: | ||
26: 76 gpio-mxs 3 gpiolib | 26: 76 gpio-mxs 3 gpiolib | ||
<!--T:26--> | |||
</pre> | </pre> | ||
Строка 108: | Строка 132: | ||
<!--T:27--> | |||
Прерывания можно ловить из userspace с помощью системного вызова epoll() и select() на файл value. | Прерывания можно ловить из userspace с помощью системного вызова epoll() и select() на файл value. | ||
Пример работы см. [https://github.com/contactless/wiegand-linux-sysfs] | Пример работы см. [https://github.com/contactless/wiegand-linux-sysfs] | ||
<!--T:28--> | |||
См. также [http://elinux.org/GPIO elinux.org] | См. также [http://elinux.org/GPIO elinux.org] | ||
===Прямое обращение через память процессора=== | ===Прямое обращение через память процессора=== <!--T:29--> | ||
<!--T:30--> | |||
<b>Этот метод настоятельно НЕ РЕКОМЕНДУЕТСЯ для использования без достаточных оснований. Для работы из С/C++ стоит использовать работу через файлы в sysfs, как описано в предыдущем разделе</b>. | <b>Этот метод настоятельно НЕ РЕКОМЕНДУЕТСЯ для использования без достаточных оснований. Для работы из С/C++ стоит использовать работу через файлы в sysfs, как описано в предыдущем разделе</b>. | ||
<!--T:31--> | |||
Управлять GPIO можно с помощью прямого доступа к регистрам процессора, в обход Linux через интерфейс /dev/mem. При этом, по сравнению с работой через sysfs минимизуются наладные расходы. Этот метод можно использовать, | Управлять GPIO можно с помощью прямого доступа к регистрам процессора, в обход Linux через интерфейс /dev/mem. При этом, по сравнению с работой через sysfs минимизуются наладные расходы. Этот метод можно использовать, | ||
если вам необходим очень быстрый доступ к GPIO, например bitbang протоколов или ШИМ. Стоит иметь в виду, что планировщик процессов всё ещё может вносить в работу программы значительные задержки. | если вам необходим очень быстрый доступ к GPIO, например bitbang протоколов или ШИМ. Стоит иметь в виду, что планировщик процессов всё ещё может вносить в работу программы значительные задержки. | ||
Рекомендуется выносить критичные ко времени задачи в ядро. | Рекомендуется выносить критичные ко времени задачи в ядро. | ||
<!--T:32--> | |||
См. [http://olimex.wordpress.com/2012/09/11/imx233-olinuxino-gpios-faster-and-faster/] , [https://github.com/OLIMEX/OLINUXINO/blob/master/SOFTWARE/iMX233/gpio-mmap.h] | См. [http://olimex.wordpress.com/2012/09/11/imx233-olinuxino-gpios-faster-and-faster/] , [https://github.com/OLIMEX/OLINUXINO/blob/master/SOFTWARE/iMX233/gpio-mmap.h] | ||
===GPIO и Device Tree=== | ===GPIO и Device Tree=== <!--T:33--> | ||
<!--T:34--> | |||
Указывать GPIO в Device Tree необходимо для настройки GPIO для работы в режиме программного SPI, I2C, для использования GPIO в качестве источника прерываний и т.д. | Указывать GPIO в Device Tree необходимо для настройки GPIO для работы в режиме программного SPI, I2C, для использования GPIO в качестве источника прерываний и т.д. | ||
Так например на пин 10@UEXT1 (CS) и пины 5@UEXT2 (SCL), 6@UEXT2 (SDA), 10@UEXT2 (CS) выведены линии GPIO процессора. Их можно сконфигурировать для использования например в качестве chip-select для SPI или в качестве I2C. | Так например на пин 10@UEXT1 (CS) и пины 5@UEXT2 (SCL), 6@UEXT2 (SDA), 10@UEXT2 (CS) выведены линии GPIO процессора. Их можно сконфигурировать для использования например в качестве chip-select для SPI или в качестве I2C. | ||
<!--T:35--> | |||
GPIO процессора и периферийных устройств разбиты на банки (gpiochip). GPIO процессора разбиты на 3 банка по 32 GPIO: gpio0, gpio1, gpio2. Адресация GPIO в Device Tree происходит по номеру банка и номеру GPIO *внутри* банка. | GPIO процессора и периферийных устройств разбиты на банки (gpiochip). GPIO процессора разбиты на 3 банка по 32 GPIO: gpio0, gpio1, gpio2. Адресация GPIO в Device Tree происходит по номеру банка и номеру GPIO *внутри* банка. | ||
====Пример 1==== | ====Пример 1==== <!--T:36--> | ||
<!--T:37--> | |||
Определим сигнал 6@UEXT2 (SDA) в качестве источника прерываний для драйвера mrf24j40. Согласно таблице [[Special:MyLanguage/Список GPIO|Список GPIO]], сигнал соответствует GPIO 53 процессора. 53 принадлежит второму банку gpio (от 32 до 63). Номер GPIO внутри банка 53-32=21 : | Определим сигнал 6@UEXT2 (SDA) в качестве источника прерываний для драйвера mrf24j40. Согласно таблице [[Special:MyLanguage/Список GPIO|Список GPIO]], сигнал соответствует GPIO 53 процессора. 53 принадлежит второму банку gpio (от 32 до 63). Номер GPIO внутри банка 53-32=21 : | ||
<!--T:38--> | |||
<pre> | <pre> | ||
6lowpan@0 { | 6lowpan@0 { |