Większość bibliotek, w wielu językach, interakcję z pinów GPIO poprzez /sys/class/gpio/export
, /sys/class/gpio/import
, /sys/class/gpio/gpio10/value
, itd. Jednak jądro Linux docs jasno stwierdzić , że jest to sposób spuścizna robi rzeczy.
Jaki jest nieoczywisty sposób robienia rzeczy?
Jeśli dobrze rozumiem w przestrzeni jądra, użyłbym tych funkcji lub standardowych sterowników jądra do typowych zadań GPIO.
Czego miałbym użyć do przestrzeni użytkownika? Czy istnieje interfejs Sysfs dla nie-dziedzictwa?
PS: Wiem, że dokumenty jądra stwierdzają, że starszy interfejs oparty na liczbach całkowitych, choć uważany za przestarzały, jest nadal użyteczny ze względu na kompatybilność. Jednak nie jestem zainteresowany użyciem tego starszego kodu.
/sys/class/gpio/export
ponieważ mają bezpośredni dostęp do sprzętu, chociaż MOGĄ korzystać z usług jądra. Z pewnością okres przejściowy WiringPi i AFAIK ma bezpośredni dostęp do rejestrów SoC.Odpowiedzi:
sysfs
został wycofany i został zastąpiony przezlibgpiod
.https://www.beyondlogic.org/an-introduction-to-chardev-gpio-and-libgpiod-on-the-raspberry-pi/
Interakcje są
/dev/gpiochipx
raczej z/sys/class/gpio
.Jedyną oczywistą poprawą (dla mnie) jest to, że wydarzenia GPIO mają teraz znacznik czasu.
źródło
Jak dotąd rozumiem, że (jak już wspomniano) interfejs sysfs jest przestarzały. Istnieją co najmniej dwa stosunkowo nowe interfejsy API C w przestrzeni użytkownika (przepraszam WiringPi i PiGpio). Wydaje się, że jeden lub oba mają etykietę libgpiod
Można je zainstalować na buster (ale nie jessie) za pomocą:
Nie jestem pewien co do rozciągania. Nie jestem również pewien, który interfejs API wymaga instalacji.
1) Pierwszy C API opiera się na /usr/include/linux/gpio.h, który przechowuje struktury danych i definiuje używane z wywołaniami systemowymi do interakcji z gpios. To jest napisane przez Linusa Walleij. Przykład tego interfejsu API pokazano poniżej i pochodzi on z wykładu Linusa Walleija wskazanego w komentarzach do kodu. Programy używające tego interfejsu API muszą mieć #include pokazane w poniższym przykładzie, ale nie muszą być kompilowane z żadnymi bibliotekami (AFAIK).
2) Drugi interfejs API języka C opiera się na /usr/include/gpiod.h, który zapewnia uproszczony interfejs, który streszcza konfigurację i obsługuje oraz umożliwia bez kontekstowe odczyty, zapisy i inne funkcje. Utrzymuje to Bartosz Golaszewski. Wprowadzenie do API znajduje się w niektórych slajdach Bartosz, które można znaleźć na:
https://ostconf.com/system/attachments/files/000/001/532/original/Linux_Piter_2018_-_New_GPIO_interface_for_linux_userspace.pdf?1541021776
Kilka dobrych przykładów używania tego interfejsu API można znaleźć na stronie:
https://framagit.org/cpb/example-programs-using-libgpiod/-/tree/master/
Pamiętaj, że programy korzystające z tego interfejsu API muszą:
i zostanie skompilowany z biblioteką -lgpiod (na przykład):
Udało mi się skompilować i uruchomić kilka przykładów.
** Istnieje interfejs API C ++ również dostarczony przez Bartosza Golaszewskiego, który zależy od /usr/include/gpiod.hpp. Jest to opakowanie C ++ oparte na C API i zależy od standardu C ++ 11.
Programy korzystające z tego interfejsu API muszą:
Przykład użycia tego interfejsu API znajduje się na tych samych slajdach co interfejs API C.
https://ostconf.com/system/attachments/files/000/001/532/original/Linux_Piter_2018_-_New_GPIO_interface_for_linux_userspace.pdf?1541021776
Nie udało mi się jeszcze skompilować tych przykładów, ale podejrzewam, że jest jeszcze biblioteka, którą muszę odkryć.
Poniżej znajduje się przykładowy program do odczytu gpio wykorzystujący C API numer 1 z góry (ten autorstwa Linusa Walleij). Wielokrotnie czyta gpio 4 na / dev / gpiochip0 i wypisuje jego wartość.
Połącz z
Wykonać:
To pokaże wartość określonego przesunięcia gpio co 0,25 sekundy.
źródło
apt-get install gpiod
? Czy w środku są prototypy funkcji<linux/gpio.h>
? Czy istnieje plik biblioteki, z którym można się połączyć?