# Programowanie sterowników dla systemu Linux ###### tags: `sylabus` ## Ustalenia Zgodziliśmy się na 7 spotkań po 90 minut każde. Forma zajęć: warsztaty (15 godz.) Termin zajęć: wtorki 12:15, co dwa tygodnie Start zajęć: 9 marca 2021 Platforma: M$ Teams, [Canvas](https://canvas.ii.uni.wroc.pl) Liczba punktów ECTS: 4 ## Opis przedmiotu Na warsztatach będziemy rozwijać sterownik do sensora podłączonego przez magistralę I²C (IMU lub temperatury i wilgotności). Każde spotkanie zaczniemy od wprowadzenia do tematu, a dalej przełączymy się na pisanie kodu. Po każdych zajęciach sterownik będzie implementował coraz więcej funkcjonalności. System Linux będziemy uruchamiać pod kontrolą Renode symulującego płytkę rozwojową na procesorze ARM. Ambitni studenci w ramach projektu końcowego mogą spróbować podpiąć jakiś sensor do prawdziwego sprzętu, np. Raspberry Pi. ## Lista zagadnień ### Spotkanie 1 Wprowadzenie do Linuxa, budowanie kernela, budowanie modułów (w drzewie i poza), konfiguracja, devicetree, bootargs, bootowanie Linuxa. Renode - uruchomienie platformy. ### Spotkanie 2 Struktura drivera, budowanie jako moduł i jako część kernela, ładowanie i rejestracja modułów (implementacja najprostszego drivera i testy w Renode). ### Spotkanie 3 Character device driver. Kopiowanie danych pomiędzy user space a kernelem. IOCTLe. Aplikacja user space do interakcji z driverem. ### Spotkanie 4 Interakcja z hardware (mapowanie pamięci, dostęp do rejestrów, ciągła pamięć dla DMA). Implementacja drivera który konfiguruje peripheral. ### Spotkanie 5 Przerwania (jak Linux obsługuje przerwania), implementacja handlera przerwań w driverach (rejestracja/derejestracja, definicja w devicetree, wielowątkowość) ### Spotkanie 6 Podsystemy w Linuxie. Implementacja drivera I2C. ### Spotkanie 7 Sysfs, implementacja podsystemu industrial I/O w driverze ## Sylabus #### 1. Nazwa przedmiotu w języku polskim oraz angielskim Warsztaty: Programowanie sterowników dla systemu Linux Workshop: Linux device drivers programming #### 3. Język wykładowy język polski #### 11a. Forma zajęć i liczba godzin warsztaty #### 11b. Metody uczenia się Wykład, samodzielne rozwiązywanie zadań programistycznych, czytanie i analiza kodu jądra systemu Linux. #### 13. Wymagania wstępne w zakresie wiedzy, umiejętności i kompetencji społecznych dla przedmiotu/modułu * Zaliczone przedmioty - Architektury systemów komputerowych - Systemy operacyjne - Struktura jądra Unix (opcjonalnie) - Systemy wbudowane (opcjonalnie) * Niezbędne kompetencje - Bardzo dobra znajomość języka C - Płynność w obsłudze systemów uniksopodobnych z linii poleceń #### 14. Cele przedmiotu Celem przedmiotu jest przekazanie uczestnikom praktycznej wiedzy związanej z budowaniem, implementacją, debugowaniem i testowaniem sterowników dla systemu Linux. Studenci zapoznają się z symulatorami sprzętu oraz interfejsami programistycznymi jądra Linux. Zdobędą metody diagnozowania i naprawiania usterek kodu sterowników. #### 15. Treści programowe * Budowanie, uruchamianie, debugowanie jądra i modułów. * Rozruch jądra i środowisko startowe: DeviceTree i Bootargs. * Praca z symulatorem Renode. * Struktura modułu jądra i sterownika. * Interfejs urządzeń znakowych. * Interakcja ze sterownikiem: ioctl, kopiowanie danych do/z jądra. * Zasoby urządzenia: rejestry, DMA, przerwania. * Mapowanie zasobów urządzenia w przestrzeń adresową jądra. * Obsługa przerwań: górna i dolna połówka, procedury obsługi. * Wybrane podsystemy w jądrze Linux (zarządzanie pamięcią, wątki, synchronizacja, [user I/O API](https://www.kernel.org/doc/html/v5.11/driver-api/uio-howto.html)) * Szyna I²C i struktura sterownika urządzeń I²C. * Wystawianie właściwości urządzenia przez sysfs. * Omówienie podsystemu Industrial I/O. #### 16. Zakładane efekty uczenia się KBa: Urzędowe brednie - to zostawiamy na deser dla mnie ;-) #### 17. Literatura obowiązkowa i zalecana * [Linux Kernel Development](https://www.amazon.com/Linux-Kernel-Development-Robert-Love/dp/0672329468/), 3rd Edition * [The Linux Kernel documentation](https://www.kernel.org/doc/html/v5.11/index.html) * [Renode documentation](https://renode.readthedocs.io/en/latest/) #### 18. Metody weryfikacji zakładanych efektów kształcenia W trakcie semestru studenci będą rozwijać etapami (cykl dwutygodniowy) kod prostego sterownika. Po zakończeniu części warsztatowej studentom zostaną przydzielone mini-projekty, nad którymi będą pracować całkowicie samodzielnie. Wyniki swojej pracy studenci będą publikować w prywatnych repozytoriach GitHub. Kod będzie testowany automatycznie przez skrypty w repozytorium, po czym prowadzący przeprowadzi inspekcję kodu (ang. _code review_). #### 19. Warunki i forma zaliczenia poszczególnych komponentów przedmiotu Do zaliczenia wymagane będzie regularne oddawanie poszczególnych etapów implementacji modelowego sterownika. Projektem końcowym będzie można zdobyć ocenę wyższą niż 3.0. #### 20. Nakład pracy studenta Zajęcia z udziałem nauczyciela: * warsztaty: 15 godz. Praca własna studenta: * zadania programistyczne: 30 godz. * projekt końcowy 40 godz.