PB173 - Ovladače jádra - Linux VII. Jiří Slabý ITI, Fakulta Informatiky 9. 11. 2010 J. Slabý (ITI) PB173/01 9. 11. 2010 1 /1 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 9. 11. 2010 2/1 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/vmaiiocinf o (novější jádra) • R/W: readX (odkud) , writeX (co, kam) , kde X G {b, w, 1, q} • Vícenásobné R/W: memcpy_f romio, memcpy_toio Úkol: Přečíst ACPI identifikaci jako minule, ale s použitím těchto funkcí a kontrolou /proč (př.: drivers/misc/arm-charlcd.c) J. Slabý (ITI) PB173/01 9. 11. 2010 3/1 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) PB173/01 9. 11. 2010 4/1 Root Respektujte soukromí pb173/marktwain 9. 11. 2010 5/1 Generické rozhraní Pro porty a MMIO • Pomalejší (jeden if při každém přístupu) • Mapování: *_iomap *_iounmap (pci_iomap) • R/W: ioreadXX, iowriteXX, kde X G {8,16, 32, 64} Většina rozhraní implementuje MMIO, porty spíše výjimečně J. Slabý (ITI) PB173/01 9. 11. 2010 6/1 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) PB173/01 9.11.2010 7/1 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 • pci_get_device (vendor, device) • Reference: pci_dev_get, pci_dev_put struct pci.dev *pdev = NULL; while ((pdev = pci.get.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) PB173/01 9. 11. 2010 8/1 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 pci-device.id my.table[] = { { PCLDEVICE(VENDOR1, DEVICE1) }, { PCLDEVICE (VENDOR!, DEVICE2) }, { PCLDEVICE(0x8086, PCLANY.ID), . 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 pci.dev *pdev, const struct pci.device.id *id) { printk ("%2.x %lu\n" , pdev->bus->number, id->dri ver.data ) ; return 0; } J. Slabý (ITI) PB173/01 9. 11. 2010 9/1 Úkol Navázání PCI zařízení O linux/pci.h O Definice struct pci_device_id • ispci -nn a najít Combo a jeho vendor+device ID O Definice struct pci_driver o probe, remove, name, icLtable O Definice háčků (viz definici struct pci.driver) • int (*probe) (struct pci_dev *, const struct pci_device_id *) • void (*remove)(struct pci_dev *) 0 V probe a remove vypsat • pdev->bus->number • PCI.SLOT(pdev->devfn) • PCI_FUNC(pdev->devfn) J. Slabý (ITI) PB173/01 9. 11. 2010 10/1 Operace s PCI Probe • Inicializace PCI zařízení • pci_enable_device 9 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 a iounmap, pci_release_region(s), pci_disable_device J. Slabý (ITI) PB173/01 9. 11. 2010 11/1 Zobecnění Většina ostatních sběrnic funguje stejně • USB, l2C, HID, IEEE1394, ACPI, INPUT, EISA, ... • Nějaké probe/remove • Seznam ID « Registrace „ovladače" J. Slabý (ITI) PB173/01 9. 11. 2010 12/1 Úkol Vyčtení identifikace 9 Povolení zařízení (pci_enable_device) Q Rezervace baru 0 (pci_request_region) 0 Vypsat fyzickou adresu baru 0 a porovnat s ispci O Přemapovat bar 0 (ioremap) O Přečíst a rozkódovat identifikaci dole (readx) O Uklidit v remove (unmap, release, disable) Offset Len R/W Contents Meaning 0x0000 4B R 0xC610RRrr Design ID & Revision 0x0004 4B R OxYMDDhhmm Design build time Tabulka: Specifikace baru 0 karet COMBO Pozn.: součást domácího J. Slabý (ITI) PB173/01 9. 11. 2010 13/1