PB173 - Binární programování Linux XI. Komunikace s HW Jiri Slabý Fakulta informatiky Masarykova univerzita 10. 12. 2015 Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 1 /13 Komunikace s HW • Obvykle práce ovladačů v jádře • Ale často není jádro třeba • Zařízení na sériovém portu • Skenery, tiskárny a podobná USB zařízení • I jednoduchá PCI zařízení Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 2/ 13 Různé přístupy ke komunikaci s HW O Jádro HW ovládá a uživatelovi nevystavuje • V Linuxu téměř nic O Jádro zaštiťuje nízkourovňovou komunikaci • Zařízení V /dev/ (ttyS*, ttyUSB*, lp*) • Soubory v /sys/ (gadgety) O Jádro obsluhuje jen přerušení • Vrstva UIO • Dokumentace: uio-howto O Jádro nedělá s HW nic • Uživatel používá instrukce/volání • Získání povolení: ioperm nebo iopi • Přímý přístup: out+in • Soubory v /sys/ (PCI) • mmap • Knihovny na přímou komunikaci s HW • libusb, libpciaccess Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 3/ 13 Přístup instrukcemi/voláními l/O porty • Porty jsou specifikum některých CPU (včetně x86) • Samostatná (malá) sběrnice o Speciální instrukce (in, out na x86) • Je zde řadič klávesnice, PC spkr, časovače a ovladače přerušení, ladicí port (0x80 segmentový displej na desce), ... • Žádost O přístup: ioperm, iopl • Čtení: inX • Zápis: outx, kde X e {b, w, 1} • Dokumentace: man ioperm a man inb Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 4/ 13 Úkol Zahrajte melodii na PC speaker (doplňte pbi73-bin/n/speaker c) O Nastartujte Si virtuální Stroj (pbl73-bin/qemu-start) O Dopište tělo funkce beep • Zapište 0xb6 na port 0x43 • Zapište 0xi234dd/hz na port 0x42 • Zapište (0xi234dd/hz)» 8 na port 0x42 • Přečtěte port 0x61 (obsah spodních 2 bitů zahoďte) • Zapište přečtenou hodnotu I 0x03 zpět na port 0x61 Q Dopište tělo funkce stop_beep • Přečtěte port 0x61 • Zapište o na spodní 2 bity portu 0x61 O Po všech zápisech a čteních čekejte alespoň 10 /is • Máte k dispozici usleep Q Přidejte do main volání ioperm O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 5/ 13 PCI zařízení • PCI, PCI-X, PCIe • Hierarchická sběrnice • Identifikace doména:bus:slot:funkce • Bridge (=routery) • Konfigurační prostor • Automatická konfigurace • ID zařízení (vendor, device), l/O prostory, IRQ • Obsah l/O - specifikace zařízení (výrobce) • lspci • Podrobnosti v PCI specifikaci Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 6/ 13 mmap pro přímou komunikaci s PCI • Každé PCI zařízení může mít: • l/O porty (komunikace viz dříve) • Paměť ve fyzickém prostoru o Přerušení, DMA, atd. (UIO) • Soubory /sys/bus/pci/devices/*/resource* • Mapují Se pomocí mmap • Obsah: ve specifikaci konkrétního zařízení Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 7/ 13 Úkol Komunikace s EDU zařízením O Mapujte resourceO PCI zařízení S ID 0xlle8 V qemu • Jen v qemu S -device edu • Mapujte jako volatile uint32_t * O Vypište, co je na první a druhé pozici O Zapište nějaké číslo na druhou pozici O Vypište, co je na druhé pozici O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 8/ 13 Knihovny pro přímou komunikaci s HW • Kromě přímého mmap přístupu existují i knihovny • libusb, libpciaccess • Jsou přenositelné • Poskytují lepší rozhraní • Pracují se soubory v /proč a /sys Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 9/ 13 libpciaccess • gcc ... -lpciaccess (pciaccess.h) • Inicializace: pci_system_init • Deinicializace: pci_system_cleanup • Vytvoření iterátoru (struct pci_device_iterator *) • Vím ID: pci_id_match_iterator_create • Vím slot: pci_slot_match_iterator_create • Procházení iterátoru: pci_device_next • Vrací struct pci.device * (a null nakonec) • Zničení iterátoru: pci_iterator_destroy Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 10/13 Úkol Výpis PCI zařízení pomocí libpciaccess O Volejte pci_system_init Q Vytvořte iterátor • S parametrem null, tj. projdi všechny O Projděte zařízení O Pro každé vypište číslo • Domény • Sběrnice • Zařízení • Funkce O Spusťte a zkontrolujte s íspci -nn Jiri Slabý (Fakulta informatiky, MU) PB173/05 10.12.2015 11 / 13 libpciaccess a zařízení • Před další prací je nutné inicializovat struct pci.device • Pomocí pci_device_probe o Potom lze pracovat s dalšími prvky struct pci.device • vendor_id, device_id, irq, ... • Mapování regionu: pci_device_map_range • Mapuje region do paměti • Podobné mmap regionu z dnešního cvičení • Konfigurační prostor • Zapisuje BIOS/je v ROM • Informace o zařízení • Ctení: pci_device_cf g_read* o Zápis: pci_device_cf g_write* Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 12/13 Úkol Práce S EDU pomocí libpciaccess O Mapujte si 0. region o pci_device_map_range • Mapujte jako volatile uint32_t * • Podobně jako mmap předtím Q Vypište, co je na první a třetí pozici O Zapište nějaké malé číslo na třetí pozici O Počkejte, než bude osmá pozice o O Vypište, co je na třetí pozici O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/05 10. 12. 2015 13/13