# 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.