Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2017:microzed-lcd

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.

Na následujícím obrázku je znázorněno zapojení LCD displeje:

Obrázek převzat z: http://www.buydisplay.com/download/interfacing/ER-TFTM070-5_Interfacing.pdf .

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).

Pro inicializaci displeje využití fontů a dlších funkcionalit kountroléru RA8875 byla vytvořena knihovna „lcd“. Většina funkcí byla převzata a poupravena z demonstračního kódu zveřejněného výrobcem http://www.buydisplay.com/download/democode/ER-TFTM070-5_16-bit-8080_DemoCode.txt .

Demonstrační video


Veškeré zdrojové kódy jsou ke stažení zde: microzed_lcd.zip.

2017/microzed-lcd.txt · Poslední úprava: 2018/01/15 05:32 autor: Tomáš Matějka