#include #include #include "platform.h" #include "eos.h" #include "board.h" #include "soc/timer.h" #include "soc/i2s.h" #include "eve/eve.h" #include "eve.h" #include "gt911.h" #include "ili9806e.h" #include "lcd.h" static int lcd_enable(void) { int rv; rv = eos_spi_select(EOS_SPI_DEV_EVE); if (rv) return rv; eve_gpio_set(EVE_GPIO_LCD_EN, 1); eos_spi_deselect(); return EOS_OK; } static int lcd_disable(void) { int rv; rv = eos_spi_select(EOS_SPI_DEV_EVE); if (rv) return rv; eve_gpio_set(EVE_GPIO_LCD_EN, 0); eos_spi_deselect(); return EOS_OK; } static int lcd_select(void) { int rv; GPIO_REG(GPIO_OUTPUT_XOR) |= (1 << SPI_CSPIN_LCD); GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << SPI_CSPIN_LCD); GPIO_REG(GPIO_OUTPUT_EN) |= (1 << SPI_CSPIN_LCD); rv = eos_spi_select(EOS_SPI_DEV_LCD); if (rv) { GPIO_REG(GPIO_OUTPUT_EN) &= ~(1 << SPI_CSPIN_LCD); GPIO_REG(GPIO_OUTPUT_XOR) &= ~(1 << SPI_CSPIN_LCD); GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << SPI_CSPIN_LCD); return rv; } return EOS_OK; } static void lcd_deselect(void) { eos_spi_deselect(); GPIO_REG(GPIO_OUTPUT_EN) &= ~(1 << SPI_CSPIN_LCD); GPIO_REG(GPIO_OUTPUT_XOR) &= ~(1 << SPI_CSPIN_LCD); GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << SPI_CSPIN_LCD); } static int lcd_init(void) { int rv; rv = lcd_enable(); if (rv) return rv; eos_time_sleep(200); rv = lcd_select(); if (rv) { lcd_disable(); return rv; } rv = eos_ili9806e_init(); if (rv == EOS_ERR_ABSENT) eve_lcd_absent(); lcd_deselect(); if (rv) lcd_disable(); return rv; } static int lcd_sleep(void) { int rv; rv = lcd_select(); if (rv) return rv; eos_ili9806e_sleep(); lcd_deselect(); rv = lcd_disable(); if (rv) return rv; return EOS_OK; } int eos_lcd_init(uint8_t wakeup_cause) { int rv; rv = lcd_init(); if (rv) return rv; rv = eos_gt911_init(wakeup_cause); if (rv) return rv; return EOS_OK; } int eos_lcd_sleep(void) { int rv; if (eos_i2s_running()) return EOS_ERR_BUSY; /* There is a problem with GT911 and sleep */ // eos_gt911_sleep(); rv = lcd_sleep(); if (rv) return rv; return EOS_OK; } int eos_lcd_wake(void) { int rv; if (eos_i2s_running()) return EOS_ERR_BUSY; rv = lcd_init(); if (rv) return rv; /* There is a problem with GT911 and sleep */ // eos_gt911_wake(); return EOS_OK; }