====== 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:qtmips:start|QtMips]] (přímo přístupná adresa 0xffffc104). - Rozšiřte program tak, aby v nekonečné smyčce stále dokola zobrazoval na výstupu sekvenci následujících čísel, dále prodlužte efekt na celých 32 bitů. pole: .word 1, 2, 4, 8, 16, 32, 65, 48, 66, 51, 54, 65, 80, 79, 1, 2, 3 lui $t0, 0xffff ori $t0, $t0, 0xc100 addi $t1, $0, 5 addi $t2, $0, 30 addi $t3, $0, 1 loop: sw $t1, 4($t0) sll $t1, $t1, 1 addi $t2, $t2, -1 bne $t2, $0, loop nop break lui $t0, 0xffff ori $t0, $t0, 0xc000 addi $t1, $0, 48 addi $t6, $0, 1234 addi $t2, $0, 10 loop: lw $t3, 0x08($t0) andi $t3, $t3, 1 beq $t3, $0, loop nop sw $t1, 0x0c($t0) addi $t1, $t1, 1 addi $t2, $t2, -1 bne $t2, $0, loop nop break ==== Č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