PB173 - Binární programování Linux X. Komunikace s HW Jiri Slabý Fakulta informatiky Masarykova univerzita 25. 11. 2014 Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 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 o Skenery, tiskárny a podobná USB zařízení • I jednoduchá PCI zařízení Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 2/ 13 Různé přístupy ke komunikaci s HW O Jádro zaštiťuje nízkoúrovňovou komunikaci • Zařízení V /dev/ (ttyS*, ttyUSB*, lp*) • Soubory v /sys/ (gadgety) O Jádro ovládá jen přerušení • Vrstva UIO • Dokumentace: uio-howto O Jádro nedělá s HW nic • Instrukcemi/voláními • Získání povolení: ioperm nebo iopl • 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/03 25.11.2014 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 • 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/03 25.11.2014 4/ 13 Úkol Zahrajte melodii na PC speaker (doplňte pbi73-bin/io/speaker. c) O Nastartujte Si virtuální Stroj (pbl73-bin/qemu-start) Q Dopište tělo funkce beep o 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 přečtenou hodnotu I 0x03 zpět na port 0x61 O 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 fis • Máte k dispozici usleep Q Přidejte do main volání ioperm O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 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/03 25.11.2014 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í Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 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 uint32_t * 0 Vypište, co je na první a druhé pozici 0 Zapište nějaké číslo na druhou pozici O Vypište, co je na druhé pozici 0 Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 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 Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 9/ 13 libpciaccess a gcc ... -lpciaccess (pciaccess.h) a Inicializace: pci_system_init a Deinicializace: pci_system_cieanup 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 Jiri Slabý (Fakulta informatiky, MU) PB173/03 25. 11. 2014 10/13 Úkol Výpis PCI zařízení pomocí libpciaccess O Volejte pci_system_init 0 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í 9 Funkce 0 Spusťte a zkontrolujte s íspci -nn Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 11 / 13 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, . .. • 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* Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 12/ 13 Úkol Práce S EDU pomocí libpciaccess O Mapujte si 0. region • pci_device_map_range • Mapujte jako volatile uint32_t * • Podobně jako mmap předtím O 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 0 Vypište, co je na třetí pozici O Spusťte Jiri Slabý (Fakulta informatiky, MU) PB173/03 25.11.2014 13/ 13