Цей драйвер було протестовано на Raspberry Pi, і він також має працювати на Banana Pi, BeagleBone, Pine64 (та ін.) та інших одноплатних комп’ютерах, а також потенційно на інших платформах.
1. Мета
Цей драйвер дозволяє використовувати виводи GPIO аналогічно драйверу паралельного порту на ПК x86. Він може використовувати ті ж генератори кроків, лічильники енкодерів та подібні компоненти.
2. Застосування
loadrt hal_gpio inputs=GPIO5,GPIO6,GPIO12,GPIO13,GPIO16,GPIO17,GPIO18,GPIO19 \
outputs=GPIO20,GPIO21,GPIO22,GPIO23,GPIO24,GPIO25,GPIO26,GPIO27 \
invert=GPIO20,GPIO27 \
reset=GPIO21,GPIO22
Цей драйвер використовує бібліотеку libgpiod-dev та пакет gpiod, який містить низку утиліт для налаштування та запиту GPIO. Назви виводів GPIO у рядку «loadrt» HAL, наведеному вище, повинні відповідати назвам, наданим командою gpioinfo.
Зразок виводу (скорочений):
$ gpioinfo
gpiochip0 - 54 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
line 4: "GPIO_GCLK" unused input active-high
line 5: "GPIO5" unused input active-high
line 6: "GPIO6" unused input active-high
line 7: "SPI_CE1_N" unused input active-high
line 8: "SPI_CE0_N" unused input active-high
line 9: "SPI_MISO" unused input active-high
line 10: "SPI_MOSI" unused input active-high
line 11: "SPI_SCLK" unused input active-high
line 12: "GPIO12" unused input active-high
line 13: "GPIO13" unused input active-high
line 14: "TXD1" unused input active-high
line 15: "RXD1" unused input active-high
line 16: "GPIO16" unused input active-high
line 17: "GPIO17" unused input active-high
line 18: "GPIO18" unused input active-high
line 19: "GPIO19" unused input active-high
line 20: "GPIO20" unused output active-high
...
Список вхідних та/або вихідних контактів слід вказати, як показано у прикладі вище. Символ \ використовується для продовження рядка в HAL і служить для поліпшення читабельності. Імена контактів чутливі до регістру, і в рядках не повинно бути пробілів, ні між списками контактів, розділених комами, ні між знаками «=».
- Додаткові модифікатори є
-
- інвертувати
-
(дійсно лише для виходів). Інвертує значення фізичного виводу відносно значення в HAL.
- скинути
-
(дійсне тільки для виходів). Якщо будь-які контакти виділені в список «reset», то буде створено параметр HAL hal_gpio.reset_ns. Це не матиме ніякого ефекту, якщо функція hal_gpio.reset не буде додана до потоку реального часу. Вона повинна бути розміщена після функції hal_gpio.write і повинна знаходитися в тому ж потоці. Поведінка цієї функції еквівалентна аналогічній функції в драйвері hal_parport і дозволяє виконувати імпульс кроку в кожному циклі потоку. Якщо час hal_gpio.reset_ns встановлено довше, ніж 1/4 періоду потоку, до якого він додається, то значення буде зменшено до 1/4 періоду потоку. Існує нижня межа тривалості імпульсу. Наприклад, при 8 контактах у списку виводів ширина імпульсу не може бути меншою за 5000 нс на RPi4.
Наступні функції підтримуються у всіх версіях, але працюють лише у випадку, якщо встановлено версію libgpiod_dev >= 1.6. Вони повинні використовуватися так само, як і параметри, описані вище, і змінюють електричні параметри контактів GPIO, якщо це підтримується апаратним забезпеченням.
opendrain
відкритий код
упередженийвимкнути
розкривний список
підтягування
Версію встановленої libgpiod-dev можна визначити командою gpioinfo -v
3. Піни
-
hal_gpio.NAME-in - HAL_OUT Значення вхідного виводу, що подається до HAL
-
hal_gpio.NAME-in-not - HAL_OUT Інвертована версія вищезазначеного, для зручності
-
hal_gpio.NAME-out - HAL_IN використовує цей контакт для передачі значення біта HAL на фізичний вихід
4. Параметри
-
hal_gpio.reset_ns - HAL_RW - "setp" - цей параметр керує тривалістю імпульсу виводів, доданих до списку "скидання". Значення буде обмежене між 0 та періодом потоку / 4.
5. Функції
-
hal_gpio.read – Додайте це до базового потоку, щоб оновити значення виводів HAL відповідно до значень фізичного входу.
-
hal_gpio.write – Додайте це до базового потоку, щоб оновити фізичні піни відповідно до значень HAL.
-
hal_gpio.reset – Експортується лише за умови, що у списку скидання визначено контакти. Його слід розмістити після функції "write" та в тому ж потоці.
Зазвичай функція «read» буде розташована на початку списку викликів, перед будь-якими лічильниками енкодера, а функція «write» буде розташована пізніше у списку викликів, після stepgen.make-pulses.
6. Ідентифікація PIN-коду
Використовуйте імена контактів, повернуті утилітою gpioinfo. Вона використовує дані дерева пристроїв. Якщо встановлена ОС не має бази даних дерева пристроїв, то всі контакти будуть називатися «unnamed» (або подібним чином), і цей драйвер не можна буде використовувати.
Подальше оновлення цього драйвера може дозволити доступ за індексним номером, але наразі це не підтримується.
7. Вирішення проблем із дозволами.
Якщо під час завантаження драйвера з’являються повідомлення «доступ заборонено», спробуйте виконати наступні дії: (Для Raspbian це не повинно бути необхідним, а для платформ, відмінних від Pi, потрібно буде змінити ім’я мікросхеми GPIO відповідно до фактичного)
-
Створіть нову групу
gpioза допомогою командиsudo groupadd gpio -
Потім, щоб налаштувати дозволи для групи "gpio", створіть файл під назвою
90-gpio-accessу каталозі/etc/udev/rules.d/з наступним вмістом (він скопійований з інсталяції Raspbian)SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660" SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660" SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\ chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\ chown -R root:gpio /sys/devices/virtual/gpio &&\ chmod -R 770 /sys/devices/virtual/gpio;\ chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\ '" SUBSYSTEM=="pwm*", PROGRAM="/bin/sh -c '\ chown -R root:gpio /sys/class/pwm && chmod -R 770 /sys/class/pwm;\ chown -R root:gpio /sys/devices/platform/soc/*.pwm/pwm/pwmchip* &&\ chmod -R 770 /sys/devices/platform/soc/*.pwm/pwm/pwmchip*\ '" -
Додайте користувача, який запускає LinuxCNC, до групи
gpioза допомогоюsudo usermod -aG gpio <username>
8. Автор
Енді П’ю
9. Відомі помилки
Наразі жодного.