Nauka programowania sterowników dla systemu Linux za pomocą Raspberry Pi

13

Chciałbym napisać sterownik urządzenia Linux dla jakiegoś prawdziwego urządzenia sprzętowego. Jakie urządzenia peryferyjne Raspberry Pi są dobrze dopasowane? Zasadniczo potrzebuję:

  1. Musi być wystarczająco mały dla początkującego (najwyżej kilka miesięcy, lepiej kilka tygodni).

  2. Arkusz danych musi być dostępny. Na początku myślałem o adapterze USB-Ethernet, ale wygląda na to, że ma bardzo ograniczony arkusz danych.

Jakieś pomysły? Czy może być coś w rodzaju pracy z konsolą szeregową w GPIO?

ivan
źródło
2
Sterowniki Linuksa to moduły jądra i technicznie nie muszą one wcale mieć nic wspólnego ze sprzętem, więc pierwszą rzeczą, którą chcesz wypróbować, jest prawdopodobnie interfejs urządzenia char - tj. Coś, co zapewnia plik urządzenia char, który może czytać i / lub pisać (podobnie jak w proc.) w jakimś trywialnym celu.
Złotowłosa
Zrobiłem to wszystko, ukończyłem samouczki i napisałem moduły jądra dla pseudo-urządzeń, a także czytałem książki na temat rozwoju jądra / sterownika. Wszystko jest w porządku, ale teraz chcę pracować z prawdziwym sprzętem.
ivan
Greg KH napisał to jakiś czas temu (pod pewnymi względami może być nieco nieaktualny): linuxjournal.com/article/7353 Więc są urządzenia USB z publicznymi arkuszami danych. Ma tam kilka wskazówek dotyczących inżynierii wstecznej (nie chciałbym tego robić z niczym zbyt skomplikowanym). Rzeczy na temat styków GPIO Domyślam się, że ogólnie działają przy użyciu istniejących sterowników I2C itp., Ale możesz po prostu zignorować to i zrobić coś sam.
Złotowłosa

Odpowiedzi:

4

Nauka pisania sterowników może być trudna w przypadku łączenia ze skomplikowanymi urządzeniami i / lub skomplikowanymi magistralami. Z tego powodu poleciłbym albo użycie prostych i dobrze znanych urządzeń (ignorując istniejącą implementację ich sterowników w jądrze), takich jak urządzenia I²C / SPI, które są zwykle używane z mikrokontrolerami. Na przykład możesz znaleźć dowolne urządzenie, które jest „obsługiwane” przez społeczność Arduino (co oznacza, że ​​jest dla niego biblioteka / dokumentacja) i spróbuj użyć go z RaspberryPi.

Jeśli to nie wystarczy lub nie chcesz kupować za dużo sprzętu, możesz sam go stworzyć. Po prostu zdobądź mikrokontroler (np. Atmega lub coś takiego), stwórz program, który stanie się jakimś urządzeniem, a następnie spróbuj połączyć się z nim za pomocą sterowników Linux. W ten sposób możesz łatwo tworzyć programy, które będą emulować różne klasy urządzeń. A ponieważ sam napiszesz swoje „oprogramowanie układowe”, pomoże ci to w debugowaniu problemów.

Potrzebujesz do tego pewnych umiejętności programowania mikrokontrolera, ale nie jest trudno nauczyć się programowania z Arduino i uważam, że i tak jest to przydatna wiedza dla programisty sterowników.

Krzysztof Adamski
źródło
Co powiesz na wdrożenie komunikacji szeregowej w oprogramowaniu poprzez piny GPIO? Np. Podłącz szeregowy do komputera i spróbuj przynajmniej wypisać coś na konsolę. Czy to jest opłacalne?
ivan
@ivan: Nie jestem pewien, czy dobrze to zrozumiałem. Jeśli przez szeregowy masz na myśli UART / rs232, a przez oprogramowanie to znaczy bitbanging, to nie jest to możliwe z powodu ograniczeń czasowych. Jeśli natomiast masz na myśli (re) implementację urządzenia szeregowego Linux za pomocą sprzętu RaspberryPi UART, to oczywiście jest to wykonalne. Wierzę, że wszystkie potrzebne informacje na temat tego sprzętu można znaleźć w BCM2835 ARM Peripheralsdokumencie. Pamiętaj jednak, że aby go użyć, musisz najpierw wyłączyć istniejący sterownik w jądrze.
Krzysztof Adamski
Dziękuję, ale czy jesteś pewien, że UART nie jest w stanie bit-banging? Znalazłem ten link: ganssle.com/articles/auart.htm, więc wydaje się, że jest to wykonalne przy niskiej prędkości transmisji i przynajmniej przy implementacji części wysyłającej (co jest łatwiejsze).
ivan
@ivan: Ten artykuł nie dotyczy systemów z systemami operacyjnymi ogólnego przeznaczenia, takimi jak Linux. W UART masz bardzo ścisłe ograniczenia czasowe, które są bardzo trudne do spełnienia bez systemu operacyjnego w czasie rzeczywistym. Biorąc to pod uwagę, może to być możliwe przy niskiej prędkości transmisji, ale może to nie być naprawdę niezawodne.
Krzysztof Adamski,
Wygląda na to, że masz rację: raspberrypi.stackexchange.com/questions/1987/… (istnieje jednak interesujące rozwiązanie). Jeszcze raz dziękuję za pomoc.
ivan
3

Osobiście zacznę od bardzo prostego urządzenia, takiego jak jedna lub więcej diod LED podłączonych bezpośrednio do pinów GPIO.

Możesz albo kupić urządzenie gotowe do podłączenia, albo podłączyć własne.

Powodem, dla którego zasugerowałbym to, jest to, że debugowanie sterowników jest ogólnie znacznie trudniejsze niż normalny program, dlatego przydatne jest proste wyzwanie, aby rozpocząć, a także można użyć tego kodu jako metody debugowania dla bardziej skomplikowanych urządzeń (stan na pin GPIO do podłączenia do oscyloskopu), w którym ważne jest taktowanie.

Jeśli to jest przedmiotem zainteresowania istnieje sterownik jądra dla LedBorg dostępne tutaj , źródło powinno być rozsądnie prosty przykład za jazdę szpilki GPIO w regularnych odstępach czasu.

PiBorg
źródło
Cześć @PiBorg. czy możesz podać zasoby, które pomogą mi nauczyć się kodować prosty sterownik dla urządzenia takiego jak jedna lub więcej diod LED podłączonych bezpośrednio do pinów GPIO?
Sagar,
0

Najprostsze „urządzenie”, dla którego możesz napisać sterownik sprzętowy (jeśli Twoim celem jest opracowanie sterowników sprzętowych), może być tak proste jak LED (dodałem znaki cudzysłowu, ponieważ technicznie LED nie jest urządzeniem, ale nadal jest kawałkiem sprzęt), jak sugeruje @PiBorg.

Inne opcje to niektóre łatwe w obsłudze urządzenia / komponenty, takie jak fotorezystory, pasywne czujniki podczerwieni (krótkie: PIR), czujniki temperatury, wentylatory komputerowe (najlepiej wentylator 4-żyłowy, który pozwala nie tylko monitorować, ale także kontrolować RPM), matryce punktowe LED i tak dalej. Zasadniczo takie proste urządzenia pozwolą ci mieć minimum sprzętu (abyś mógł zobaczyć i dotknąć tego, co faktycznie osiągnąłeś), a jednocześnie możesz dowiedzieć się o wielu tematach, które są używane w przypadku znacznie bardziej złożonych urządzeń, w których złożoność wynika głównie z używanego protokołu.

Pamiętaj także, że nie musisz dokładać dodatkowych starań, aby wkopać się w moduły jądra. Oczywiście, jeśli chcesz to zrobić, nikt cię nie powstrzyma. :)

Oto przykład połączenia pasywnego czujnika podczerwieni (zamierzam go przetestować wkrótce po dostarczeniu mojego PIR: 3). Możesz wziąć to i zacząć zagłębiać się w świat jądra Linuksa, aby zobaczyć, jak możesz na przykład stworzyć sterownik jądra, który działa z PIR.

rbaleksandar
źródło