diff options
author | Uros Majstorovic <majstor@majstor.org> | 2025-02-16 20:17:07 +0100 |
---|---|---|
committer | Uros Majstorovic <majstor@majstor.org> | 2025-02-16 20:17:07 +0100 |
commit | 2e17dd17ee9777084b2f211f08c4231dd5f8b906 (patch) | |
tree | f50ad99c62d81906082cbb28eb84d857ef7311c9 /fw/fe310/eos/dev/eve.c | |
parent | 064631db87182694459056ceeb331506b553d0f0 (diff) |
extended gpio implemented
Diffstat (limited to 'fw/fe310/eos/dev/eve.c')
-rw-r--r-- | fw/fe310/eos/dev/eve.c | 213 |
1 files changed, 126 insertions, 87 deletions
diff --git a/fw/fe310/eos/dev/eve.c b/fw/fe310/eos/dev/eve.c index dd72b0f..dad7dfe 100644 --- a/fw/fe310/eos/dev/eve.c +++ b/fw/fe310/eos/dev/eve.c @@ -1,153 +1,192 @@ #include <stdlib.h> -#include <stdio.h> - -#include "platform.h" +#include <stdint.h> #include "eos.h" #include "event.h" -#include "board.h" - -#include "soc/interrupt.h" #include "soc/pwr.h" -#include "soc/i2s.h" +#include "soc/timer.h" #include "eve/eve.h" #include "eve/eve_touch_engine.h" +#include "egpio.h" +#include "spi.h" +#include "aon.h" +#include "pwr.h" + #include "eve.h" -#define EVE_POLL_INTERVAL 2 +#ifdef EOS_DEBUG +#include <stdio.h> +#endif static void handle_time(unsigned char type) { - eve_select(); - eve_handle_time(); - eve_deselect(); -} + int rv; -static void handle_poll(unsigned char type) { - if (eos_eve_intr_enabled()) return; + rv = eve_select(); + if (rv) return; - eve_select(); - eve_handle_intr(); + eve_handle_time(); eve_deselect(); } -static void handle_intr_evt(unsigned char type, unsigned char *buffer, uint16_t len) { - if (!eos_eve_intr_enabled()) return; +int eos_eve_handle_intr(void) { + uint16_t intr_flags; + int rv; + + rv = eve_select(); + if (rv) return 0; - eve_select(); - eve_handle_intr(); + intr_flags = eve_handle_intr(); eve_deselect(); - GPIO_REG(GPIO_LOW_IE) |= (1 << EVE_PIN_INTR); + if (intr_flags == 0) return 0; + return 1; } -static void handle_intr(void) { - GPIO_REG(GPIO_LOW_IE) &= ~(1 << EVE_PIN_INTR); - GPIO_REG(GPIO_LOW_IP) = (1 << EVE_PIN_INTR); - eos_evtq_push_isr(EOS_EVT_EVE | EVE_ETYPE_INTR, NULL, 0); -} +int eos_eve_init(void) { + uint8_t wakeup_cause; + uint16_t gpio_reg; + int rst, rv; -int eos_eve_init(uint8_t wakeup_cause) { - int rst = (wakeup_cause == EOS_PWR_WAKE_RST); - int rv = EVE_OK; + rv = eve_select(); + if (rv) return rv; - eve_select(); + wakeup_cause = eos_pwr_wakeup_cause(); + rst = (wakeup_cause == EOS_PWR_WAKE_RST); if (rst) { rv = eve_init(); - if (!rv) { - eve_gpio_set_dir(EVE_GPIO_DIR); - eve_touch_init_engine(); - } + if (rv) goto eve_init_fin; + + eve_gpio_write(EVE_GPIO_DEFAULT); + eve_gpio_write_dir(EVE_GPIO_DIR); + eve_touch_init_engine(eos_egpio_get_val(EGPIO_PIN_CTP_SEL) ? EVE_TOUCH_ENGINE_HOST : EVE_TOUCH_ENGINE_GOODIX); + gpio_reg = EVE_GPIO_DEFAULT; } else { + uint8_t pwr_state; + + pwr_state = eos_aon_load4eve(); + eve_pwr_set_state(pwr_state); + eve_activate(); + gpio_reg = eve_gpio_read(); + eve_cmd_set_offset(); + if (gpio_reg & EVE_GPIO_DISP) { + eve_pwr_set_state(EVE_PSTATE_ACTIVE); + } + eve_deactivate(); } + +eve_init_fin: eve_deselect(); - if (rv) return EOS_ERR; + if (rv) return rv; - eve_touch_init(); + eos_egpio_eve_set(gpio_reg); - eos_evtq_set_handler(EOS_EVT_EVE, handle_intr_evt); + eve_touch_init(); eos_timer_set_handler(EOS_TIMER_ETYPE_UI, handle_time); - eos_intr_set_handler(INT_GPIO_BASE + EVE_PIN_INTR, handle_intr); - eos_intr_set_priority(INT_GPIO_BASE + EVE_PIN_INTR, IRQ_PRIORITY_EVE); return EOS_OK; } -void eos_eve_calibrate(void) { +int eos_eve_run(void) { + int rv; + + if (eve_pwr_state() != EVE_PSTATE_ACTIVE) return EOS_ERR_BUSY; + + rv = eve_select(); + if (rv) return rv; + + eve_touch_intr_enable(); + eve_touch_start(); + eve_intr_enable(); + eve_clk_start(); + eve_deselect(); + + return EOS_OK; +} + +int eos_eve_sleep(void) { + int rv; + + rv = eve_select(); + if (rv) return rv; + + eos_aon_save4eve(eve_pwr_state()); + eve_clk_stop(); + eve_intr_disable(); + eve_touch_stop(); + eve_touch_intr_disable(); + eve_pwr_sleep(); + eve_deselect(); + + return EOS_OK; +} + +void eve_calibrate(void) { + int rv, d; +#ifdef EOS_DEBUG uint32_t matrix[6]; - int r; +#endif - eve_select(); + if (!eve_selected()) { +#ifdef EOS_DEBUG + printf("EVE CALIBRATE: NOT SELECTED\n"); +#endif + return; + } - eve_brightness(0x40); eve_touch_set_extended(0); eve_cmd(CMD_TEXT, "hhhhs", EVE_HSIZE/2, EVE_VSIZE/2, 27, EVE_OPT_CENTER, "Please tap on the dot."); eve_cmd(CMD_CALIBRATE, "w", 0); eve_cmd_exec(0); + rv = EOS_OK; do { - r = eve_cmd_done(); - if (r < 0) break; + d = eve_cmd_done(); + if (d < 0) { + rv = d; + break; + } eve_deselect(); eos_evtq_exec(); - eve_select(); - } while (!r); + rv = eve_select(); + if (rv) { +#ifdef EOS_DEBUG + printf("EVE CALIBRATE ERR:%d\n", rv); +#endif + return; + } + } while (!d); eve_touch_set_extended(1); - eve_brightness(0); - eve_touch_get_matrix(matrix); - eve_deselect(); +#ifdef EOS_DEBUG + if (rv) { + printf("EVE CALIBRATE ERR:%d\n", rv); + return; + } + eve_touch_get_matrix(matrix); printf("TOUCH MATRIX:\n"); printf("uint32_t touch_matrix[6] = {0x%x,0x%x,0x%x,0x%x,0x%x,0x%x}\n", matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); +#endif } -void eos_eve_set_tmatrix(const uint32_t *matrix) { - eve_select(); - eve_touch_set_matrix(matrix); - eve_deselect(); -} - -int eos_eve_run(uint8_t wakeup_cause) { - eve_select(); - eve_touch_start(); - eve_intr_enable(); - eve_clk_start(); - eve_deselect(); - - eos_eve_intr_enable(); - return EOS_OK; -} +int eve_select(void) { + int rv; -void eos_eve_intr_enable(void) { - GPIO_REG(GPIO_INPUT_EN) |= (1 << EVE_PIN_INTR); - GPIO_REG(GPIO_LOW_IE) |= (1 << EVE_PIN_INTR); - - eos_intr_enable(INT_GPIO_BASE + EVE_PIN_INTR); - eos_timer_set_handler(EOS_TIMER_ETYPE_EVE, NULL); + rv = eos_spi_select(EOS_SPI_DEV_EVE); + return rv; } -void eos_eve_intr_disable(void) { - eos_intr_disable(INT_GPIO_BASE + EVE_PIN_INTR); - - GPIO_REG(GPIO_LOW_IE) &= ~(1 << EVE_PIN_INTR); - GPIO_REG(GPIO_INPUT_EN) &= ~(1 << EVE_PIN_INTR); - eos_timer_set_handler(EOS_TIMER_ETYPE_EVE, handle_poll); +void eve_deselect(void) { + eos_spi_deselect(); } -int eos_eve_intr_enabled(void) { - return !!(GPIO_REG(GPIO_INPUT_EN) & (1 << EVE_PIN_INTR)); -} - -void eos_eve_poll(void) { - if (eos_eve_intr_enabled()) return; - if (eos_timer_get(EOS_TIMER_ETYPE_EVE) != EOS_TIMER_NONE) return; - - eos_timer_set(EOS_TIMER_ETYPE_EVE, EVE_POLL_INTERVAL); +int eve_selected(void) { + return (eos_spi_dev() == EOS_SPI_DEV_EVE); } |