Toto je starší verze dokumentu!
S pomocí vývojové desky MicroZed vytvořte driver pro grafický dotykový LCD displej s řadičem RA8875. Vytvořte demonstrační aplikaci s vypisováním textu pomocí fontů. Na displej vypisujte i aktuální souřadnice polohy prstu v případě dotyku displeje.
Cílem projektu bylo seznámit se s vývojovými nástroji pro SoC Zynq a s embedded Linuxem, který je pro implemetaci použit. Aktuální stav projektu splňuje pouze první část zadání, tedy vypisování textu na LCD. Dotykové ovládání není funční kvůli prozatím nedokončené periferii vytvořené v prgramovatelné logice Zynqu (FPG) pro řízení LCD.
Pro realizaci byl použit SOM MicroZed společnosti Avnet doplněný oI/O nosnou desku. Jádrem MicroZedu je Zynq-7000 SoC společnosti Xilinx, který ve společném pouzdře představuje kombinaci FPGA s dvoujádrovým proceseromem ARM Cortex A9. Dále je MicroZed doplněn o USB, Ethernet, QSPI flash paměť, DDR3 RAM (1 GB), slot na microSD kartu apod.
Jko displej byl použit 7 palcový TFT LCD ER-TFTM070-5 s rozlišením 800×480 pixelů, 16 bit barevnou hloubkou a doplněný o rezistiní doykový panel. Displej disponuje grafickým kontrolérem RA8875 a pro komunikaci je použito 16 bit paralelní rozhraní. Funkční zapojená testovací sestava je znázorněna na následujícím obrázku:
Komunikace probíhá po 16 bit standartizovaném paralelním rozhraní pod označením 8080. RA8875 zahrnuje i kontrolér pro rezistivní panel. Komunikace po sběrnici je obousměrná (three-state), pozice z dotykového panelu jsou tak vyčítány po stejné sběrnici, jako jsou zapisována obrazová data.
Pro demonstraci funkčnosti displeje byla vytvořena jednoduchá demonstrační aplikace, která umožňuje vypisování textu a vykreslování pixelů na zvolenou pozici v nekolika předvolených barvách. Aplikace využívá předpřipravené fonty v EEPROM paměti kontroléru RA8875.
V programovatelné logické čísi (PL části) byla vytvořena jednoduchá periferie pro namapování jednotlivých externích signálů (pinů) paralelního komunikačního rozhraní LCD do definovaného adresního prostoru v paměti s využitím interní AXI sběrnice. Po spuštění demonstrační aplikace nejprve namapuje periferii do virtuálního adresního prostoru tak, aby bylo možné k periferii přistupovat z uživatelského prostoru Linuxu bez nutnosti driveru:
static const unsigned IO_REG0_ADR = 0x43C00000; //physical address of periphery unsigned page_size = sysconf(_SC_PAGESIZE); //Get the number of bytes in a memory page // Open /dev/mem file - memory fd = open ("/dev/mem", O_RDWR); if (fd < 1) { perror("Cannot open /dev/mem"); exit(-1); } // maps HW peripheries into the virtual memory if ((io_reg0 = mmap(NULL, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, IO_REG0_ADR)) == MAP_FAILED) { perror("cannot map io_reg0"); exit(-1); }
Následně jsou jednotlivé piny paralelní sběrnice LCD řízeny zápisem 32 bit hodnoty na přidělenou virtuální adrasu:
//LCD interface outputs #define MASK_DATA_W 0x0000ffff //data bus #define MASK_RD_W 0x00010000 //redad signal #define MASK_WR_W 0x00020000 //write signal #define MASK_CS_W 0x00040000 //chip select #define MASK_RS_W 0x00080000 //data/instruction selection #define MASK_BL_CONT_W 0x00100000 //backlight control void LCD_WriteCmd (uint8_t cmd) //function for write instruction to RA8875 { *((unsigned *)(io_reg0 )) |= MASK_RD_W; *((unsigned *)(io_reg0 )) &= (~ MASK_CS_W); *((unsigned *)(io_reg0 )) |= MASK_RS_W; *((unsigned *)(io_reg0 )) &= ((~MASK_DATA_W) | cmd ); //write cmd *((unsigned *)(io_reg0 )) &= (~ MASK_WR_W); *((unsigned *)(io_reg0 )) |= MASK_WR_W; *((unsigned *)(io_reg0 )) |= MASK_DATA_W; //set data to 0xfffffff *((unsigned *)(io_reg0 )) &= (~ MASK_RS_W); return; } void LCD_WriteData (uint16_t data) //function for write data to RA8875 { *((unsigned *)(io_reg0 )) |= MASK_RD_W; *((unsigned *)(io_reg0 )) &= (~ MASK_CS_W); *((unsigned *)(io_reg0 )) &= (~ MASK_RS_W); *((unsigned *)(io_reg0 )) &= ((~MASK_DATA_W) | data ); //write data *((unsigned *)(io_reg0 )) &= (~ MASK_WR_W); *((unsigned *)(io_reg0 )) |= MASK_WR_W; *((unsigned *)(io_reg0 )) |= MASK_CS_W; *((unsigned *)(io_reg0 )) |= MASK_DATA_W; //set data to 0xfffffff return; }
Latence způsobená AXI sběrnicí je přibližně 200 ns, tomu odpovídá časový interval mezi změnami stavů logických úrovní (ověřeno měřením).
Následující kód znázorňuje část demonstrační aplikace, kde jsou přes celou plochu displeje vykreslovány různé barvy, vypisován text a vykreslovány čáry.