Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2017:microzed-lcd [2018/01/14 18:40] Tomáš Matějka |
2017:microzed-lcd [2018/01/15 05:32] (aktuální) Tomáš Matějka |
||
---|---|---|---|
Řádek 3: | Řádek 3: | ||
====== Úvod ====== | ====== Úvod ====== | ||
- | Cílem projektu bylo seznámit se s vývojovými nástroji pro SoC [[https://www.xilinx.com/products/silicon-devices/soc/zynq-7000.html|Zynq-7000]]. 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 zatím neoběvené chybě periferie pro podařilo Navrhnuté řešení bude následně využito pro dipomovou práci, kde displej poslouží jako pomocník | + | 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 ====== | ====== Použitý HW ====== | ||
+ | Pro realizaci byl použit SOM [[http://zedboard.org/product/microzed|MicroZed]] společnosti Avnet doplněný o[[http://zedboard.org/product/microzed-io-carrier-card|I/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 [[http://www.buydisplay.com/default/7-inch-lcd-module-capacitive-touch-screen-panel-i2c-spi-serial| ER-TFTM070-5 ]] s rozlišením 800x480 pixelů, 16 bit barevnou hloubkou a doplněný o rezistiní doykový panel. Displej disponuje grafickým kontrolérem [[https://cdn-shop.adafruit.com/datasheets/RA8875_DS_V12_Eng.pdf|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: | ||
+ | {{ :2017:microzed-lcd:uvodni_fotka.jpg?400 }} | ||
+ | ===== 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: | ||
+ | |||
+ | |||
+ | {{ :2017:microzed-lcd:zapojeni_sbernice.png?400 |}} | ||
+ | |||
+ | //Obrázek převzat z: http://www.buydisplay.com/download/interfacing/ER-TFTM070-5_Interfacing.pdf .// | ||
+ | ====== Použité SW nástorje ====== | ||
+ | |||
+ | * [[https://www.xilinx.com/products/design-tools/vivado.html|Vivado Design Suite]] - Vývojové prostředí pro tvorbu a syntézu programovatelné logiky (FPGA). | ||
+ | |||
+ | * [[https://www.xilinx.com/products/design-tools/embedded-software/sdk.html|XSDK]] (Xilinx Software Development Kit) - Vývojové prostředí využívané pro tvorbu a debuggování aplikace pro Linux. | ||
+ | |||
+ | * [[http://www.wiki.xilinx.com/PetaLinux|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: | ||
+ | <code c> | ||
+ | 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); | ||
+ | } | ||
+ | </code> | ||
+ | Následně jsou jednotlivé piny paralelní sběrnice LCD řízeny zápisem 32 bit hodnoty na přidělenou virtuální adrasu: | ||
+ | |||
+ | <code c> | ||
+ | //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; | ||
+ | } | ||
+ | </code> | ||
+ | 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 ===== | ||
+ | {{ youtube>R2cyjB2f9ew?medium }} | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | Veškeré zdrojové kódy jsou ke stažení zde: {{ :2017:microzed-lcd:microzed_lcd.zip |}}. | ||
+ | |||
+ | |