====== 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