Table of Contents

7. I/O prostor mapovaný do paměti

Osnova cvičení

  1. zápis na I/O bránu
  2. čtení z I/O brány
  3. zobrazení grafiky displeji s řídicím a datový registrem

Co bych si měl na cvičení zopakovat/připravit

  1. MipsIt simulátor
  2. 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

  1. Napište program, který zobrazí 8bitové číslo z registru s1 na výstupní periferii (LED).
  2. 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

  1. Napište program, který do registru s1 načte 8bitovou hodnotu ze vstupní periferie (přepínače).
  2. 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 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 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

  1. zobrazte červený obdélník
  2. 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 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 14×16 bodů může být následující soubor

https://github.com/ghaerr/microwindows/blob/master/src/fonts/winFreeSystem14x16.c

z projektu 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 14×16 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í 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é.

  1. 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 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 font_types.h.