PB173 - Ovladače jádra - Linux VII. Komunikace s HW Jiri Slabý ITI, Fakulta informatiky 5. 11. 2013 Komunikace s HW LDD3 kap. 9 a 12 a l/O porty a paměť * Tj. samotná komunikace • Práce s PCI zařízeními • Zobecnění na jiné sběrnice J. Slabý (ITI, Fl) I/O Na x86: 2 přístupy • Porty • Memory Mapped I/O J. Slabý (ITI, Fl) 1/0 - porty Porty • Speciální adresový prostor • Závislé na architektuře • Speciální instrukce (in, out na x86) • Samostatná (malá) sběrnice • Na x86: řadič klávesnice, PC spkr, staré časovače a ovladače přerušení, ladicí port (0x80 => segmentový displej na desce), ... API • linux/io.h, linux/ioport.h • Vytvoření: request_region, release_region • R/W: inX(port), outX(co, port), kde X G {b, w, 1} • Vícenásobné R/W: insX, outsX Demo: pb173/07 Úkol: Přečíst port 0x80, zapsat do něj 1B a znovu přečíst J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 4/ 13 1/0-MM 10 Memory Mapped l/O • Součástí fyzického adresového prostoru • Přístup standardním čtením/zápisem • Nutnost přemapovat na virtuální adresy API • linux/io.h, linux/ioport.h • Vytvoření: request_mem_region, release_mem_region • /proc/iomem • Mapování: virt=ioremap(phys), iounmap(virt) • /proc/vmallocinfo(novější jádra) « R/W: readX(odkud), writeX(co, kam), kde X 6 {b,w,l,q} • Vícenásobné R/W: memcpy_f romio, memcpy_toio J. Slabý (ITI, Fl) PB173/02 5. 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/02 5. 11. 2013 6/ 13 PCI zařízení v jádře I. • linux/pci.h, Documentation/pci/* • struct pci_dev, struct pci_bus • pci_{set,get>_drvdata- uloží/načte programátorova data • pci_any_id značí jakékoliv ID Hledání zařízení O Iterátory (starší) • Vícenásobný přístup k zařízení • Nepodporuje hotplug 9 pci_get_device (vendor, device) • Reference: pci_dev_get, pci_dev_put struct pci.dev *pdev = NULL; while ((pdev = pcLget.device(VENDOR, DEVICE, pdev))) { printk("%2.x:%.2x.%.2x\n", pdev->bus->number, PCLSLOT(pdev->devfn), PCLFUNC(pdev->devfn)); } Úkol: vypsat všechna zařízení v systému (jejich ID) J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 7/ 13 PCI zařízení v jádře II. O Událostmi • Registrace seznamu chtěných zařízení a háčků • Seznam: struct pci_device_id (vendor, device, atd.) • Háčky: struct pci_driver (probe, remove, suspend, atd.) • pci_register_driver, pci_unregister_driver struct pcLdeviceJd my.table[] = { { PCLDEVICE(VENDOR1, DEVICE1) }, { PCLDEVICE(VENDOR1, DEVICE2) }, { PCLDEVICE(0x8086, PCI.ANYJD), .driver.data = 1 }, { 0, } }; MODULE.DEVICE.TABLE(pci, my.table); struct pci-driver my.pci-driver = { .name = "my_driver", . id.table = my.table, . probe = my_probe, . remove = my.remove, }; int my_probe(struct pcLdev *pdev, const struct pcLdeviceJd *id) { printk("%2.x %lu\n", pdev->bus->number, id->driver.data); return 0; } J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 8/ 13 Úkol Navázání PCI zařízení O linux/pci.h O Definice struct pci_device_id • ispci -nn a najít EDU a jeho vendor+device ID O Definice struct pci_driver • probe, remove, name, id_table O Definice háčků (viz definici struct pci_driver) • int (*probe)(struct pci_dev *, const struct pci_device_id *) • void (*remove)(struct pci_dev *) O V probe a remove vypsat • pdev->bus->number • PCI_SLOT(pdev->devfn) • PCI_FUNC(pdev->devfn) O Zavolat pci_register_driver a pci_unregister_driver J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 9/ 13 Operace s PCI Probe • Inicializace PCI zařízení • pci_enable_device • Do té doby nelze některé vlastnosti pdev používat (irq) • Rezervace a mapování l/O (první část cvičení) • Vytvoření: pci_request_region, pci_request_regions • Mapování: pci_ioremap_bar - alias pro ioremap(pci_resource_start(), pci_resource_len()) • Nastavení/detekce zařízení Remové • Opak Probe • iounmap, pci_release_region(s), pci_disable_device J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 10/13 Zobecnění Většina ostatních sběrnic funguje stejně a USB, l2C, HID, IEEE1394, ACPI, INPUT, EISA, ... • Nějaké probe/remove • Seznam ID a Registrace „ovladače" J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 11/13 Specifikace baru O karty EDU Offset Len R/W Meaning 0x0000 4B R ID & Revision 0x0004 4B R/W Inverted value 0x0008 4B R/W Factorial 0x0020 4B R Status Tabulka : Specifikace baru 0 karty EDU • ID & Revision: OxRRrrOOedu, RR - major, rr - minor • Inverted value: zapsané číslo se obrátí (operátor ~) a Faktoriál: vypočte se faktoriál (je nutné počkat na status bit) • Status: 0. bit - probíhá výpočet faktoriálu J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 12/13 Úkol Vyčtení identifikace karty EDU a práce s ní O Povolení zařízení (pci_enable_device) O Rezervace baru 0 (pci_request_region) O Vypsat fyzickou adresu baru 0 a porovnat s íspci O Přemapovat bar 0 (ioremap) O Přečíst a rozkódovat identifikaci a revizi (readx) 0 Ověřit živost karty pomocí invertovacího registru O Uklidit v remove (unmap, release, disable) J. Slabý (ITI, Fl) PB173/02 5. 11. 2013 13/13