diff options
author | Uros Majstorovic <majstor@majstor.org> | 2021-11-28 23:53:05 +0100 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2021-11-28 23:53:05 +0100 |
commit | acce7d8e05ac38776d6340342f6a7868df4f7f28 (patch) | |
tree | c0e2f3934b82967e4c2aff4a3dfcc5802bc94232 /fw/fe310/eos/eve/eve.c | |
parent | 0b0972ce96a59fb9b59c0b166e0174ba4d8dd198 (diff) |
lcd driver added; fixed startup code;
Diffstat (limited to 'fw/fe310/eos/eve/eve.c')
-rw-r--r-- | fw/fe310/eos/eve/eve.c | 209 |
1 files changed, 113 insertions, 96 deletions
diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c index 3447d6b..8cca34b 100644 --- a/fw/fe310/eos/eve/eve.c +++ b/fw/fe310/eos/eve/eve.c @@ -254,15 +254,23 @@ void eve_cmd_dl(uint32_t dl) { int eve_cmd_done(void) { uint16_t r = eve_read16(REG_CMD_READ); + if (r == 0xfff) { + uint16_t ptr; + cmd_offset = 0; + ptr = eve_read16(REG_COPRO_PATCH_PTR); eve_write8(REG_CPURESET, 1); eve_write16(REG_CMD_READ, 0); eve_write16(REG_CMD_WRITE, 0); eve_write16(REG_CMD_DL, 0); eve_write8(REG_CPURESET, 0); - return -1; + eve_write16(REG_COPRO_PATCH_PTR, ptr); + eve_write8(REG_PCLK, EVE_PCLK); + + return EVE_ERR; } + return (r == cmd_offset); } @@ -270,8 +278,10 @@ int eve_cmd_exec(int w) { eve_write16(REG_CMD_WRITE, cmd_offset); if (w) { int r; + do { r = eve_cmd_done(); + if (r < 0) break; } while (!r); if (r < 0) return EVE_ERR; } @@ -293,92 +303,17 @@ void eve_cmd_burst_end(void) { cmd_burst = 0; } -int eve_gpio_get(int gpio) { - uint16_t reg = eve_read16(REG_GPIOX); - return !!(reg & (1 << gpio)); -} - -void eve_gpio_set(int gpio, int val) { - uint16_t reg = eve_read16(REG_GPIOX); - uint16_t reg_val = (1 << gpio); - if (val) { - reg |= reg_val; - } else { - reg &= ~reg_val; - } - eve_write16(REG_GPIOX, reg); -} - -uint8_t eve_gpio_get_dir(void) { - uint16_t reg = eve_read16(REG_GPIOX_DIR); - return reg & 0x000f; -} - -void eve_gpio_set_dir(uint8_t dir) { - uint16_t reg = eve_read16(REG_GPIOX_DIR); - reg &= 0xfff0; - reg |= dir & 0x0f; - eve_write16(REG_GPIOX_DIR, reg); -} - -void eve_active(void) { - uint16_t gpiox; - - eve_command(EVE_ACTIVE, 0); - - if (power_state == EVE_PSTATE_SLEEP) { - eve_time_sleep(40); - eve_touch_active(); - } - - gpiox = eve_read16(REG_GPIOX) | 0x8000; - eve_write16(REG_GPIOX, gpiox); - - power_state = EVE_PSTATE_ACTIVE; -} - -void eve_standby(void) { - uint16_t gpiox; - - if (power_state != EVE_PSTATE_ACTIVE) return; - - gpiox = eve_read16(REG_GPIOX) & ~0x8000; - eve_write16(REG_GPIOX, gpiox); - - eve_command(EVE_STANDBY, 0); - - power_state = EVE_PSTATE_STANDBY; -} - -void eve_sleep(void) { - uint16_t gpiox; - - if (power_state != EVE_PSTATE_ACTIVE) return; - - gpiox = eve_read16(REG_GPIOX) & ~0x8000; - eve_write16(REG_GPIOX, gpiox); - - eve_touch_sleep(); - - eve_command(EVE_SLEEP, 0); - - power_state = EVE_PSTATE_SLEEP; -} - -void eve_brightness(uint8_t b) { - eve_write8(REG_PWM_DUTY, b); -} - -static int _init(int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir) { +static int _init(uint8_t gpio_dir) { uint8_t chipid = 0; uint8_t reset = 0x07; uint16_t timeout; - eve_command(EVE_CORERST, 0); + eve_command(EVE_CORERST, 0); /* reset */ + eve_command(EVE_CLKEXT, 0); eve_command(EVE_CLKSEL, 0x46); /* set clock to 72 MHz */ eve_command(EVE_ACTIVE, 0); /* start EVE */ - eve_time_sleep(40); + eve_time_sleep(4); timeout = 0; while (chipid != 0x7c) { /* if chipid is not 0x7c, continue to read it until it is, EVE needs a moment for it's power on self-test and configuration */ @@ -399,23 +334,23 @@ static int _init(int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir) eve_write32(REG_FREQUENCY, 72000000); /* tell EVE that we changed the frequency from default to 72MHz for BT8xx */ eve_write8(REG_PWM_DUTY, 0x00); + eve_write16(REG_GPIOX, 0x0000); eve_write16(REG_GPIOX_DIR, 0x8000 | (gpio_dir & 0x0f)); - eve_write16(REG_GPIOX, 0x8000); /* initialize display */ eve_write16(REG_HCYCLE, EVE_HCYCLE); /* total number of clocks per line, incl front/back porch */ eve_write16(REG_HOFFSET, EVE_HOFFSET); /* start of active line */ eve_write16(REG_HSYNC0, EVE_HSYNC0); /* start of horizontal sync pulse */ eve_write16(REG_HSYNC1, EVE_HSYNC1); /* end of horizontal sync pulse */ + eve_write16(REG_HSIZE, EVE_HSIZE); /* active display width */ eve_write16(REG_VCYCLE, EVE_VCYCLE); /* total number of lines per screen, including pre/post */ eve_write16(REG_VOFFSET, EVE_VOFFSET); /* start of active screen */ eve_write16(REG_VSYNC0, EVE_VSYNC0); /* start of vertical sync pulse */ eve_write16(REG_VSYNC1, EVE_VSYNC1); /* end of vertical sync pulse */ + eve_write16(REG_VSIZE, EVE_VSIZE); /* active display height */ eve_write8(REG_SWIZZLE, EVE_SWIZZLE); /* FT8xx output to LCD - pin order */ eve_write8(REG_PCLK_POL, EVE_PCLKPOL); /* LCD data is clocked in on this PCLK edge */ eve_write8(REG_CSPREAD, EVE_CSPREAD); /* helps with noise, when set to 1 fewer signals are changed simultaneously, reset-default: 1 */ - eve_write16(REG_HSIZE, EVE_HSIZE); /* active display width */ - eve_write16(REG_VSIZE, EVE_VSIZE); /* active display height */ /* do not set PCLK yet - wait for just after the first display list */ @@ -431,33 +366,115 @@ static int _init(int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir) eve_dl_write(DISPLAY()); eve_dl_swap(); - /* nothing is being displayed yet... the pixel clock is still 0x00 */ - eve_write16(REG_GPIOX, 0x8000); /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIOX_DIR by default */ - eve_write8(REG_PCLK, EVE_PCLK); /* now start clocking data to the LCD panel */ - - eve_cmd(CMD_SETROTATE, "w", 2); +#ifdef EVE_PCLK_FREQ + eve_cmd(CMD_PCLKFREQ, "www", EVE_PCLK_FREQ, 0, 0); eve_cmd_exec(1); +#endif + /* nothing is being displayed yet... the pixel clock is still 0x00 */ return EVE_OK; } int eve_init(uint8_t wakeup_cause, int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir) { - int rst = (wakeup_cause == EOS_PWR_WAKE_RST); - - eve_spi_start(); + int rst = (wakeup_cause == EVE_INIT_RST); if (rst) { - int rv = _init(touch_calibrate, touch_matrix, gpio_dir); + int rv = _init(gpio_dir); if (rv) return rv; } else { - power_state = EVE_PSTATE_SLEEP; - eve_active(); + eve_command(EVE_ACTIVE, 0); + eve_time_sleep(40); } eve_touch_init(wakeup_cause, touch_calibrate, touch_matrix); eve_platform_init(); - eve_spi_stop(); - return EVE_OK; } + +void eve_start(uint8_t wakeup_cause) { + uint16_t gpiox; + + gpiox = eve_read16(REG_GPIOX) | 0x8000; + eve_write16(REG_GPIOX, gpiox); /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIOX_DIR by default */ + eve_write8(REG_PCLK, EVE_PCLK); /* now start clocking data to the LCD panel */ + + eve_touch_start(wakeup_cause); +} + +void eve_stop(void) { + uint16_t gpiox; + + eve_touch_stop(); + + gpiox = eve_read16(REG_GPIOX) & ~0x8000; + eve_write16(REG_GPIOX, gpiox); + eve_write8(REG_PCLK, 0); +} + +int eve_gpio_get(int gpio) { + uint16_t reg = eve_read16(REG_GPIOX); + return !!(reg & (1 << gpio)); +} + +void eve_gpio_set(int gpio, int val) { + uint16_t reg = eve_read16(REG_GPIOX); + uint16_t reg_val = (1 << gpio); + if (val) { + reg |= reg_val; + } else { + reg &= ~reg_val; + } + eve_write16(REG_GPIOX, reg); +} + +uint8_t eve_gpio_get_dir(void) { + uint16_t reg = eve_read16(REG_GPIOX_DIR); + return reg & 0x000f; +} + +void eve_gpio_set_dir(uint8_t dir) { + uint16_t reg = eve_read16(REG_GPIOX_DIR); + reg &= 0xfff0; + reg |= dir & 0x0f; + eve_write16(REG_GPIOX_DIR, reg); +} + +void eve_standby(void) { + uint16_t gpiox; + + if (power_state != EVE_PSTATE_ACTIVE) return; + + eve_command(EVE_STANDBY, 0); + + power_state = EVE_PSTATE_STANDBY; +} + +void eve_sleep(void) { + uint16_t gpiox; + + if (power_state != EVE_PSTATE_ACTIVE) return; + + eve_stop(); + + eve_command(EVE_SLEEP, 0); + + power_state = EVE_PSTATE_SLEEP; +} + +void eve_active(void) { + uint16_t gpiox; + + eve_command(EVE_ACTIVE, 0); + + if (power_state == EVE_PSTATE_SLEEP) { + eve_time_sleep(40); + eve_start(0); + } + + power_state = EVE_PSTATE_ACTIVE; +} + +void eve_brightness(uint8_t b) { + eve_write8(REG_PWM_DUTY, b); +} |