====== 8. I/O prostor mapovaný do paměti a PCI sběrnice ====== * pro vyučující: [[..:..:internal:tutorials:08:start|cvičení 8]] ===== Osnova cvičení ===== - Zápis na I/O bránu - Čtení z I/O brány - Zápis řetězce na sériový port - Volání služby operačního systému - Zpracování přerušení - Sběrnice, základní pojmy - Obvodové řešení V/V adaptéru - Sběrnice PCI ===== Co bych si měl na cvičení zopakovat/připravit ===== - MipsIt simulátor - Rozumět programům z předchozích cvičení - Rozumět přednáškám (I/O podsystém I a II) - Základy logických systémů - hradla, klopné obvody, apod. ===== Náplň cvičení ===== Cílem je z programu přistupovat na periferie procesorového zařízení. ===== Úkoly ===== S problematikou se seznamte nejdříve v simulátoru [[..:..:documentation:qtmips:start|QtMips]]. Jednoduchá vstupně výstupní periferie je mapovaná od adresy 0xffffc100. ==== Zápis hodnoty na výstupní port ==== - Napište program, který zobrazí 32-bitové číslo z registru na výstupní periferii - registr ''SPILED_REG_LED_LINE''. Jedná se o řádku 32 LED diod na desce [[..:..:documentation:mz_apo:start|MZ_APO]] (fyzická adresa 0x43c40004) nebo ekvivalentním výstupu v simulátoru [[..:..:documentation:qtrvsim:start|QtRvSim]] (přímo přístupná adresa 0xffffc104). - Změňte program, aby v nekonečném cyklu jezdil zadaný vzor zleva doprava lui t0, 0xffffc ori t0, t0, 0x100 addi t1, zero, 5 sw t1, 4(t0) slli t1, t1, 1 sw t1, 4(t0) slli t1, t1, 1 sw t1, 4(t0) slli t1, t1, 1 ebreak - Zjistěte co udělá tento program lui t0, 0xffffc ori t0, t0, 0x100 addi t1, zero, 0 addi t2, zero, 0 la s0, n lw s0,0(s0) cykl1: slli t1, t1, 1 ori t1, t1, 1 addi t2,t2,1 sw t1, 4(t0) bne s0,t2, cykl1 ebreak .data n: .word 5 - Zjistěte co dělá tento program, pomocí informací o [[..:03:start#periferie_mapovane_do_pametoveho_adresniho_prostoru|mapovaných periferiích]]. li t0, 0xffffc000 // base address into memory mapped I/O area addi t1, zero, 48 addi t6, zero, 1234 addi t2, zero, 10 loop: lw t3, 0x08(t0) andi t3, t3, 1 beq t3, zero, loop sw t1, 0x0c(t0) addi t1, t1, 1 addi t2, t2, -1 bne t2, zero, loop ebreak ==== Čtení ze vstupního portu ==== - Napište program, který do registru načte 32-bitovou hodnotu ze vstupní periferie (trojice otočných voličů). Na desce [[..:..:documentation:mz_apo:start|MZ_APO]] je stav voličů k přečtení z fyzické adresy 0x43c40024). V simulátoru [[..:..:documentation:qtmips:start|QtMips]] je nastavení voličů dostupné na adrese 0xffffc124. - Rozšiřte program tak, že ze vstupu přečte číslo a na výstup zobrazí hodnotu z odpovídající pozice ve výše uvedeném poli. Pokud je zadáno číslo, překračující rozsah pole, zobrazí program na výstupu samé jedničky (rozsvítí všechny LED). ==== Čtení a zápis z programu v jazyce C ==== Kompletní popis periferií implementovaných v simulátoru [[..:..:documentation:qtmips:start|QtMips]] naleznete na stránce třetího cvičení v odstavci [[..:03:start#periferie_mapovane_do_pametoveho_adresniho_prostoru|periferie mapované do paměťového adresního prostoru]] případně přímo v souboru [[https://github.com/cvut/QtMips/#peripherals|README.md]] přímo z projektu. Součástí třetího cvičení je i ukázka překladu z jazyka C do assembleru s rozborem generovaného kódu. Nalézá se tam také archiv s programem. Program naleznete in v adresáři ''/opt/apo/qtmips_binrep''. Program se shodnou funkcí pro desku MZ_APO naleznete v adresáři ''/opt/apo/binrep/mzapo_binrep''. Porovnání analýzy kódu zkompilovaného pro architekturu ARM naleznete na konci dnešního cvičení. ==== Zápis řetězce na sériový port ==== ==== Volání služby operačního systému ==== ==== Grafický výstup v emulátoru QtMips ==== ==== Zpracování přerušení ==== ===== Sběrnice a mapování periferií v PC ===== ==== Základní pojmy ==== - Sběrnice vs. dvoubodový spoj - Co mají tyto technické prostředky společného a v čem se liší? - Uveďte příklady dvoubodového spoje. - Uveďte příklady sběrnice. - V/V adaptér - Z jakých základních bloků se skládá obecný V/V adaptér na sběrnici? //(nápověda: na sběrnici je takových adaptérů více, komunikace je obousměrná)// - Dokážete stručně popsat rozdíl v realizaci vstupní a výstupní brány? - Adresace - Vysvětlete pojmy individuální a skupinová adresace. - Vysvětlete pojem dvouúrovňová adresace, k čemu se používá? Dokážete uvést příklad z praxe, kde se používá? - Co je to relokovatlenost adaptéru a jak se realizuje? - Co je to zrcadlení adresového prostoru? Kdy k němu dochází? ==== Obvodové řešení V/V adaptéru (pro zájemce) ==== Obvodové řešení V/V adaptéru již na PCI a modernějších sběrnicích není prakticky realizovatelné. Pro pochopení problematiky (před návrhem V/V adaptéru pro PCI) je však jednoduché obvodové řešení např. na sběrnici typu ISA vhodné. Adresový dekodér: {{..:ad.png?80|}} Jednoduchý V/V adaptér: {{..:isa.png?80|}} - Navrhněte adresový dekodér. Máte 16b adresovou sběrnici, zařízení má 64 V/V registrů. Úkol: umístit registrové pole do V/V prostoru od adresy 0x1480, k dispozici je jeden obvod 74LS688. - Diskutujte zrcadlení v tomto případě. == Příklad kompletního řešení == {{..:aa_sio3.png?160|}} {{..:aa_sio3t.png?120|}} - Je tento adaptér relokovatelný? - Na jaké adrese ve V/V prostoru bude přístupný? - Dochází zde k zrcadlení? ==== Sběrnice PCI ==== - Pomocí programu ''lspci'' zobrazte PCI zařízení v počítači. - Zobrazte podrobnosti o PCI zařízeních, adresy v paměti a V/V prostoru, které obsazují. - Pomocí ''lspci -xxx'' zobrazte konfigurační prostor PCI a pro vybraná zařízení určete pomocí tohoto výpisu: * typ zařízení * výrobce zařízení * jaké adresy ve V/V prostoru obsazuje * jaké adresy v paměťovém prostoru obsazuje === Návrh adaptéru PCI === Na přednáškách jste viděli příklad jednotlivých bloků adaptéru na PCI sběrnici, včetně řídicího konečného automatu. Rozšiřte tento návrh o možnost konfiguračního čtení a konfiguračního zápisu. (Časový diagram konfiguračního čtení:{{..:pci-cfg.png?32|}}) ===== Odkazy ===== * http://en.wikipedia.org/wiki/PCI_configuration_space - konfigurační prostor PCI zařízení * http://linuxcommand.org/man_pages/lspci8.html - manuálová stránka programu ''lspci'' * http://www.pcidatabase.com - PCI Vendor and Device Lists