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