summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/dev/eve.c
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2025-02-16 20:17:07 +0100
committerUros Majstorovic <majstor@majstor.org>2025-02-16 20:17:07 +0100
commit2e17dd17ee9777084b2f211f08c4231dd5f8b906 (patch)
treef50ad99c62d81906082cbb28eb84d857ef7311c9 /fw/fe310/eos/dev/eve.c
parent064631db87182694459056ceeb331506b553d0f0 (diff)
extended gpio implemented
Diffstat (limited to 'fw/fe310/eos/dev/eve.c')
-rw-r--r--fw/fe310/eos/dev/eve.c213
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);
}