====== 7. I/O prostor mapovaný do paměti ======
* pro vyučující: [[..:..:internal:tutorials:07:start|cvičení 7]]
===== Osnova cvičení =====
- zápis na I/O bránu
- čtení z I/O brány
- zobrazení grafiky displeji s řídicím a datový registrem
===== Co bych si měl na cvičení zopakovat/připravit =====
- MipsIt simulátor
- rozumět programům z předchozích cvičení
===== Náplň cvičení =====
Cílem je dostat se z procesoru na periferní zařízení.
K řešení úkolů můžete použít následující šablonu:
#define t0 $8
#define t1 $9
#define t2 $10
#define s0 $16
#define s1 $17
#define s2 $18
.globl start
.set noat
.set noreorder
.ent start
start:
// Zde je místo pro Váš vlastní kód...
nop
.end start
===== Úkoly =====
Pracujte v simulátoru Mips.exe. Osmibitový I/O port je mapován do paměti od adresy 0xBF900000.
==== Zápis hodnoty na výstupní port ====
- Napište program, který zobrazí 8bitové číslo z registru ''s1'' na výstupní periferii (LED).
- Rozšiřte program tak, aby v nekonečné smyčce stále dokola zobrazoval na výstupu sekvenci následujících čísel.
pole:
.word 1, 2, 4, 8, 16, 32, 65, 48, 66, 51, 54, 65, 80, 79, 1, 2, 3
==== Čtení ze vstupního portu ====
- Napište program, který do registru ''s1'' načte 8bitovou hodnotu ze vstupní periferie (přepínače).
- Rozšiřte program tak, že ze vstupu přečte číslo a na výstup zobrazí hodnotu z o 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).
==== Grafický výstup na display desky MZ_APO ====
K vývojovému kitu [[..:..:documentation:mz_apo:|MZ_APO]] je připojený grafický displej
s lokálním řadičem, který se stará o obnovování obrazu
na TFT LCD display s rozměry 480 x 320 bodů.
Řadič přijímá příkazy zapisované na 16-bitovou bránu mapovanou
do fyzického paměťového prostoru na adresu 0x43c00008 (PARLCD_REG_BASE_PHYS+PARLCD_REG_CMD_o).
Většina příkazů pak vyžaduje pro provedení vlastní operace
zapsání dat. Data je potřeba zapsat na adresu 0x43c0000c (PARLCD_REG_BASE_PHYS+PARLCD_REG_DATA_o).
Příklad, jak zpřístupnit určitý rozsah fyzických adres
pro práci z programu napsaného v jazyce C naleznete
v [[..:01:|prvním cvičení]]. Příklady použití mapování
v aplikacích naleznete v adresářích
/opt/apo/binrep/mzapo_binrep
/opt/apo/lcd/mzapo_lcdtest
Kontrolér displeje vyžaduje konfiguraci množství parametrů
pro nastavení parametrů volbu propojení vlastního LCD ("skla")
a pro nastavení napěťových úrovní a časování aby byl obraz
stabilní a kontrastní.
Tuto funkci však není nutné z vašich programů provádět,
protože počáteční nastavení provede již aplikace pro zobrazení
IP adresy na displeji.
Pro zobrazení grafického výstupu tedy stačí vyslat příkaz 0x2c,
který je následovaný požadovanými barvami jednotlivých
bodů zadávaných ve formátu RGB 565 postupně řádek po řádku.
^ Složka ^ počet bitů ^ Bity ^
| R - red | 5 | 15 .. 11 |
| G - green | 6 | 10 .. 5 |
| B - blue | 5 | 4 .. 0 |
Požadovaný grafický výstup je možné připravovat přímo
během vysílání dat na display (takto jsou implementované
předložené testovací programy), ale pro přípravu složitějšího
výstupu je mnohem vhodnější vykreslovat objekty
to bloku paměti (frame-buffer) a poté vyslat dokončený obsah
na display.
uint16_t *fb = (uint16_t)malloc(sizeof(uint16_t) * width * height)
Úkoly
- zobrazte červený obdélník
- zobrazte zelený kruh, který částečně překrývá obdélník
Pro zdatnější je pak možné přidat nastavování barvy obdélníku
s využitím rotačních voličů. Případně je možné voliči měnit
polohu objektů nebo jejich velikost. Režim je možné přepínat
například stlačením voliče.
Kompletní popis příkazů, kterými je možné konfigurovat řadič
displeje naleznete v souboru
/opt/apo/zynq/doc/mz_apo/components/HX8357-C.pdf
==== Rozšíření, úkoly pro přípravu na další úlohy ====
=== Výpis textů, bitmapové fonty ===
Existuje mnoho možností jak definovat
[[https://en.wikipedia.org/wiki/Glyph|glyfy]] (grafické podoby)
jednotlivých znaků, číslic, symbolů. Pokročilejší metody
využívající popis glyfu křivkami umožňují zobrazit znak
o libovolné velikosti. Jednodušší řešení přímo definuje
podobu písmene informací, které body mají být nastaveny na barvu
textu. Ostatní jsou ponechány s původní barvou nebo jsou vyplněné
barvou pozadí.
Příkladem definice glyfů přímo binárně v matici 14x16 bodů
může být následující soubor
[[https://github.com/ghaerr/microwindows/blob/master/src/fonts/winFreeSystem14x16.c]]
z projektu [[https://github.com/ghaerr/microwindows|Microwindows]].
Pole winFreeSystem14x16_bits definuje nastavení jednotlivých bitů
v matici. Typ prvků pole MWIMAGEBITS odpovídá typu uint16_t.
Nejvíce významný bit (MSB, bit 15) odpovídá nejlevějšímu bodu
znaku/symbolu. Postupně následují další body v řádce. Nejméně
významné bity pak většinou nejsou využité, znaky fontu 14x16
jsou užší než 16 bodů. Další položka pole odpovídá dalšímu řádku.
Pole winFreeSystem14x16_offset není pro daný font používané, protože
výška každého znaku/symbolu je 16 bodů, to je 16 16-bitových čísel.
Přitom první grafická representace odpovídá v kódování [[https://en.wikipedia.org/wiki/ASCII|ASCII]] znaku mezera (0x20, 32 dekadicky).
Pole winFreeSystem14x16_width definuje šířku každého znaku v bodech.
Další informace a parametry již nejsou pro implementaci jednoduchého
zobrazování textů podstatné.
- pokuste se přidat do vykreslovaného obrazu i zobrazení aktuálního času
Soubory s dalšími definicemi fontů v různé velkosti naleznete v adresáři
/opt/apo/lcd/fonts
počítačů v laboratoři.
Největší velikost obsahuje jen číslice. Některé fonty obsahují i několik
úseků z kódové tabulky [[https://en.wikipedia.org/wiki/Unicode|Unicode]] a pokrývají tak kompletně potřeby českého jazyka, Ruštiny i některé arabské jazyky. Základ aplikace s již definovanými hlavičkovými soubory pro použití fontů naleznete v adresáři
/opt/apo/mzapo_template
Aplikace je též dostupná z fakultního serveru GIT [[https://gitlab.fel.cvut.cz/b35apo/mzapo_template]].
Datový typ použitý pro definice fontů naleznete v souboru [[https://gitlab.fel.cvut.cz/b35apo/mzapo_template/blob/master/font_types.h|font_types.h]].