Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:microzed-lcd

Toto je starší verze dokumentu!


Zadání

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.

Úvod

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.

Použitý HW

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: uvodni_fotka.jpg

Komunikace s LCD

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.

Použité SW nástorje

  • Vivado Design Suite - Vývojové prostředí pro tvorbu a syntézu programovatelné logiky (FPGA).
  • XSDK (Xilinx Software Development Kit) - Vývojové prostředí využívané pro tvorbu a debuggování aplikace pro Linux.
  • PetaLinux- Nástroj pro kompletní konfiguraci a sestavení embedded Linux systému a import hardwarového popisu.

Ovládání displeje

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.

2017/microzed-lcd.1515984692.txt.gz · Poslední úprava: 2018/01/15 03:51 autor: Tomáš Matějka