#include #include #include "platform.h" #include "eos.h" #include "event.h" #include "board.h" #include "soc/interrupt.h" #include "soc/pwr.h" #include "soc/i2s.h" #include "eve/eve.h" #include "eve/eve_touch_engine.h" #include "eve.h" #define EVE_POLL_INTERVAL 2 static void handle_time(unsigned char type) { eve_select(); eve_handle_time(); eve_deselect(); } static void handle_poll(unsigned char type) { if (eos_eve_intr_enabled()) return; eve_select(); eve_handle_intr(); eve_deselect(); } static void handle_intr_evt(unsigned char type, unsigned char *buffer, uint16_t len) { if (!eos_eve_intr_enabled()) return; eve_select(); eve_handle_intr(); eve_deselect(); GPIO_REG(GPIO_LOW_IE) |= (1 << EVE_PIN_INTR); } 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(uint8_t wakeup_cause) { int rst = (wakeup_cause == EOS_PWR_WAKE_RST); int rv = EVE_OK; eve_select(); if (rst) { rv = eve_init(); if (!rv) { eve_gpio_set_dir(EVE_GPIO_DIR); eve_touch_init_engine(); } } else { eve_activate(); } eve_deselect(); if (rv) return EOS_ERR; eve_touch_init(); eos_evtq_set_handler(EOS_EVT_EVE, handle_intr_evt); 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) { uint32_t matrix[6]; int r; eve_select(); 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); do { r = eve_cmd_done(); if (r < 0) break; eve_deselect(); eos_evtq_exec(); eve_select(); } while (!r); eve_touch_set_extended(1); eve_brightness(0); eve_touch_get_matrix(matrix); eve_deselect(); 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]); } 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; } 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); } 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); } 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); }