Sensory i Linux
1. Sensory czynników środowiskowych
- Niska cena, zaskakująco dobre parametry oraz niewielkie rozmiary to główne czynniki decydujące o ich popularności.
- Linux w krótkim czasie zaczyna oferować dla nich wsparcie w postaci dedykowanego podsystemu IIO (ang. Industrial Input/Output)...
- Linux zyskuje nowe moce;
- Sposoby dodawania sensorów do systemu;
- Krótko o mechanizmie instancjonowania urządzeń w Linuksie;
- Drzewo urządzeń;
- Dodanie sensora I2C do drzewa urządzeń;
- Dodanie sensora SPI do drzewa urządzeń;
- Dodanie sensora 1wire do drzewa urządzeń;
- Dodanie sensora I2C poprzez zapis do pliku w /sysfs;
- Modyfikacja DT w locie;
- IIO;
- Podstawy;
- Obsługa zdarzeń;
- Wyzwalanie pomiaru;
- Trigger loop;
- Bufory;
- Bezpośredni dostęp do rejestrów sensora.
LINUX ZYSKUJE NOWE MOCE
- Prace nad IIO rozpoczynają się przed 2009 rokiem. Jest to spowodowane
coraz większą ilością napływających sterowników dla sensorów,
z których wiele oferowaną funkcjonalnością nie do końca pasuje do
istniejących podsystemów.
*Dla przykładu w systemie Linux podsystem
HWMON (ang. Hardware Monitoring) oferuje wsparcie oraz interfejs
programistyczny dla sensorów związanych z szeroko pojętym
monitorowaniem stanu zdrowia systemu, tj. pomiarem temperatur,
panujących napięć czy prędkości obrotowych wentylatorów.
*Inny
podsystem, znany jako Input oferuje z kolei wsparcie dla urządzeń
wejściowych, czyli myszy, klawiatur oraz joysticków. Zatem urządzeń
służących do interakcji z komputerem.
*Z kolei podsystem Misc to
miejsce dla pojedynczych, unikalnych sterowników niepasujących
nigdzie indziej.
Z przykładowej trójki Misc wydaje się najlepszym miejscem dla
nowych sensorów. Niestety ten pomysł nie znajduje uznania wśród
wielu programistów. Jeśli bowiem do Misc trafiłoby kilka sterowników
z podobną semantyką, to kłóciłoby się to z założeniem o unikalności
sterownika.
-> Zapadła więc decyzja o stworzeniu dedykowanego
podsystemu dla czujników, który będzie oferował spójny interfejs dla
twórców sterowników urządzeń oraz przestrzeni użytkownika.
W artykule położono duży nacisk na praktykę, dlatego warto zaopatrzyć
się wcześniej w jakiś zestaw developerski. Najlepiej w platformę Orange Pi
Zero, rekomendowany ze względu na oferowane możliwości oraz niską
cenę. Warto również zajrzeć na stronę https://github.com/tduszynski/iio,
gdzie czytelnik odnajdzie garść informacji na temat przygotowania odpowiedniego
kernela oraz narzędzi wykorzystanych w artykule.
SPOSOBY DODAWANIA SENSORÓW
DO SYSTEMU
Komunikacja z sensorami odbywa się najczęściej przy użyciu jednego
z trzech interfejsów szeregowych SPI, I2C lub 1wire.
a) SPI do
komunikacji wymaga trzech linii sygnałowych i jest na ogół wykorzystywany
w szybkich sensorach, np. akcelerometrach czy żyroskopach.
b) Z kolei bardzo wolny 1wire (transfery z prędkością do 160
kbps w trybie overdrive) do komunikacji (i opcjonalnie do zasilania
sensora) wymaga tylko jednej linii sygnałowej, ale za to pozwala na
podłączenie do niej wielu sensorów. Zastosowanie znajduje często w
czujnikach temperatury.
c) Kompromis stanowi interfejs I2C używający do komunikacji dwóch linii sygnałowych, z reguły wolniejszy od
SPI, ale też znacznie szybszy od 1wire. Często stosowany w sensorach
TOF (ang. time-of-flight), mierzących odległość, czy w sensorach wilgotności.
Należy podkreślić, że nie jest to reguła, a raczej fakt wynikający
z obserwacji.
Żaden z wymienionych interfejsów nie jest wyposażony w mechanizm
enumeracji. Oznacza to, że system musi z góry wiedzieć,
jakie urządzenia są podłączone do magistrali.
Istnieje kilka sposobów
na poinformowanie Linuksa o podłączonym sensorze.
- modyfikując drzewo urządzeń (ang. Device Tree) w sposób statyczny,
- modyfikując drzewo urządzeń w trakcie działania systemu (mechanizm
Device Tree Overlays),
- za pomocą pliku /sys/bus/i2c/devices/i2c-X/new_device, gdzie X
to numer magistrali I2C,
- wprowadzając informacje o sensorze do tzw. „board file”, który
jest plikiem źródłowym C jądra Linuksa, Zapis informacji w „board file” to era sprzed DT, więc nie warto do niej wracać.
- dodając wpis w tablicy ACPI.
Innym rozwiązaniem jest po prostu zrezygnowanie z używania sterownika
dostępnego w Linuksie i napisanie własnej aplikacji, która
wykorzysta dostępne API dla przestrzeni użytkownika (np. poprzez
skrypt w języku Python). ACPI
natomiast jest przeznaczone dla dużych systemów, np. serwerów,
dlatego nie jest stosowane w popularnych, amatorskich systemach
developerskich.
instancjonowania
urządzeń w Linuksie -jak
przebiega proces dopasowania urządzenia i sterownika (ang. binding)
Bez straty ogólności przyjmijmy, że sterownik jest wbudowany
w jądro. Podczas startu Linux przegląda dostępne sterowniki i dodaje
je do listy sterowników odpowiedniej magistrali. W każdy sterownik
wbudowana jest tablica ID wspieranych urządzeń, zapisana
w specyficzny dla magistrali sposób.
Z każdym urządzeniem dostępnym w systemie związane są jakieś
informacje pozwalające je jednoznacznie zidentyfikować. Pochodzenie
tych informacji zależy w dużej mierze od używanej magistrali.
Komentarze
Prześlij komentarz