diff --git a/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c b/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c index 4db10152d0d37404a8b2a135293155f28f3cbe2f..4c971541d928d6a99a0498ee01d2579d429b45f5 100644 --- a/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c +++ b/seminaries/mzapo/lcd/mzapo_lcdip/mzapo_lcdip.c @@ -52,6 +52,7 @@ char *memdev="/dev/mem"; #define PARLCD_REG_BASE_PHYS 0x43c00000 #define PARLCD_REG_SIZE 0x00004000 +#define PARLCD_REG_CR_o 0x0000 #define PARLCD_REG_CMD_o 0x0008 #define PARLCD_REG_DATA_o 0x000C @@ -85,6 +86,11 @@ void *map_phys_address(off_t region_base, size_t region_size, int opt_cached) return mem; } +void parlcd_write_cr(unsigned char *parlcd_mem_base, uint16_t data) +{ + *(volatile uint16_t*)(parlcd_mem_base + PARLCD_REG_CR_o) = data; +} + void parlcd_write_cmd(unsigned char *parlcd_mem_base, uint16_t cmd) { *(volatile uint16_t*)(parlcd_mem_base + PARLCD_REG_CMD_o) = cmd; @@ -377,6 +383,12 @@ int main(int argc, char *argv[]) struct ifaddrs *ifa = NULL; struct ifaddrs *ifa_it; + int lcd_hw_reset = 0; + + if (argc >= 2) + if(!strcmp(argv[1], "reset")) + lcd_hw_reset = 1; + if (getifaddrs(&ifa)) { return -1; } @@ -404,6 +416,13 @@ int main(int argc, char *argv[]) if (parlcd_mem_base == NULL) exit(1); + if (lcd_hw_reset) { + parlcd_write_cr(parlcd_mem_base, 2); + parlcd_delay(100); + parlcd_write_cr(parlcd_mem_base, 0); + parlcd_delay(100); + } + parlcd_hx8357_init(parlcd_mem_base); parlcd_hx8357_init(parlcd_mem_base);