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/15 02:45] Tomáš Matějka |
2017:microzed-lcd [2018/01/15 05:32] (aktuální) Tomáš Matějka |
||
|---|---|---|---|
| Řádek 14: | Řádek 14: | ||
| 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. | 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 ====== | ====== Použité SW nástorje ====== | ||
| Řádek 27: | Řádek 33: | ||
| 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: | 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 |}}. | ||
| + | | ||