PB173 - Binární programování Linux X. Komunikace s HW Jiri Slabý ITI, Fakulta informatiky 26. 11. 2013 Komunikace s HW • Obvykle práce ovladačů v jádře a 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í J. Slabý (ITI, Fl) Principy komunikace s HW O Jádro zaštiťuje nízkoúrovňovou komunikaci o Zařízení V /dev/ (ttyS*, ttyUSB*, lp*) • Soubory v /sys/ (gadgety) Q Jádro ovládá jen přerušení • Vrstva UIO • Dokumentace: uio-howto O Jádro nedělá s HW nic • Systémová volání • ioperm,out+in • Soubory v /sys/ (PCI) • mmap • Knihovny pro přímou komunikaci s HW 9 libusb, libpciaccess J. Slabý (ITI, Fl) PB173/07 26.11.2013 3/ 13 Systémová volání - l/O porty • Porty jsou specifikum některých CPU (včetně x86) • Samostatná (malá) sběrnice • 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 J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 4/ 13 Úkol Zahrajte melodii na PC speaker O Implementujte Si funkci beep (unsigned int hz) ° Zapište 0xb6 na port 0x43 • Zapište 0xl234dd/hz na port 0x42 • Zapište (0xl234dd/hz)» 8 na port 0x42 • Přečtěte port 0x61 (obsah spodních 2 bitů zahoďte) • Zapište 0x03 na port 0x61 0 Implementujte si funkci stop_beep(void) • Přečtěte port 0x61 (obsah zahoďte) • Zapište 0x00 na port 0x61 O Po všech zápisech a čteních čekejte alespoň 10 fis 0 Zavolejte ioperm 0 Zavolejte beep s různými frekvencemi • Přidejte čekání za každý beep, aby tón chvíli zněl O Zavolejte stop_beep 0 Spusťte J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 5/ 13 PCI zařízení • PCI, PCI-X, PCIe • Hierarchická sběrnice • Identifikace doména:bus:slot:funkce • Bridge (=routery) • Konfigurační prostor (ROM) • Automatická konfigurace • ID zařízení (vendor, device), l/O prostory, IRQ • Obsah l/O - specifikace zařízení (výrobce) • lspci • Podrobnosti v PCI specifikaci J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 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 • Přerušení, DMA, atd. (UIO) • Soubory /sys/bus/pci/devices/*/resource* a Mapují se pomocí mmap • Obsah: ve specifikaci konkrétního zařízení J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 7/ 13 Úkol Komunikace s EDU zařízením O Mapujte resourceO PCI zařízení S ID 0xlle8 V qemu • Jen v laboratoři na virtuálních strojích • Mapujte jako volatile unsigned int * 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 0 Spusťte J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 8/ 13 Knihovny pro přímou komunikaci s HW • Kromě mmap přístupu existují i knihovny • libusb, libpciaccess • Jsou přenositelné • Poskytují lepší rozhraní • Pracují se soubory v /proč a /sys J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 9/ 13 libpciaccess a gcc ... -lpciaccess (pciaccess.h) a Inicializace: pci_system_init a Deinicializace: pci_system_cleanup a Vytvoření iterátoru (struct pci_device_iterator *) • Vím ID: pci_id_match_iterator_create • Vím slot:pci_slot_match_iterator_create a Procházení iterátoru: pci_device_next • Vrací struct pci_device * (a null nakonec) a Zničení iterátoru: pci_iterator_destroy J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 10/ 13 Úkol Výpis zařízení pomocí libpciaccess O Volejte pci_system_init O Vytvořte iterátor (parametr NULL) O Projděte zařízení O Pro každé vypište číslo • Domény • Sběrnice • Zařízení 0 Funkce 0 Spusťte a zkontrolujte s íspci -nn J. Slabý (ITI, Fl) libpciaccess a zařízení • Před další prací je nutné inicializovat struct pci_device • Pomocí pci_device_probe • Potom lze pracovat s dalšími prvky struct pci_device • vendor_id, device_id, irq, . . . a 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* • Zápis: pci_device_cfg_write* J. Slabý (ITI, Fl) PB173/07 26. 11. 2013 12/ 13 Práce S EDU pomocí libpciaccess O Mapujte si 0. region • pci_device_map_range • Mapujte jako volatile unsigned int • Podobně jako mmap předtím O Vypište, co je na první a třetí pozici Q 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