diff options
| author | Uros Majstorovic <majstor@majstor.org> | 2021-12-07 20:14:23 +0100 | 
|---|---|---|
| committer | Uros Majstorovic <majstor@majstor.org> | 2021-12-07 20:14:23 +0100 | 
| commit | 9c8f5a5e8f11e4a5012d55b96afae290242b8fdd (patch) | |
| tree | 785538c3539d0b3d710f983c55c089567f5a458a | |
| parent | 7ded8116d90081851e0ddb1b4bdd77b645f6535c (diff) | |
fixed eve, spi start/stop interface
| -rw-r--r-- | fw/fe310/eos/board.h | 3 | ||||
| -rw-r--r-- | fw/fe310/eos/eos.c | 6 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/Makefile | 2 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve.c | 130 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve.h | 16 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve_eos.c | 88 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve_eos.h | 6 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve_platform.c | 62 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve_platform.h | 12 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve_touch.c | 76 | ||||
| -rw-r--r-- | fw/fe310/eos/eve/eve_touch.h | 5 | ||||
| -rw-r--r-- | fw/fe310/eos/i2c.c | 1 | ||||
| -rw-r--r-- | fw/fe310/eos/net.c | 5 | ||||
| -rw-r--r-- | fw/fe310/eos/spi.c | 1 | ||||
| -rw-r--r-- | fw/fe310/eos/spi_dev.c | 9 | 
15 files changed, 226 insertions, 196 deletions
diff --git a/fw/fe310/eos/board.h b/fw/fe310/eos/board.h index 62111a9..a695029 100644 --- a/fw/fe310/eos/board.h +++ b/fw/fe310/eos/board.h @@ -39,6 +39,9 @@  #define I2S_IDLE_CYCLES         8 +#define CTP_PIN_INT             1 +#define CTP_PIN_RST             19 +  #define EVE_GPIO_DIR            0xf  #define EVE_GPIO_CAM            0 diff --git a/fw/fe310/eos/eos.c b/fw/fe310/eos/eos.c index 2f1f4d3..68d299a 100644 --- a/fw/fe310/eos/eos.c +++ b/fw/fe310/eos/eos.c @@ -16,7 +16,7 @@  #include "cell.h"  #include "sock.h"  #include "i2c/bq25895.h" -#include "eve/eve.h" +#include "eve/eve_eos.h"  #include "board.h" @@ -56,7 +56,7 @@ void eos_init(void) {      if (rv) printf("BQ25895 INIT ERR:%d\n", rv);      eos_spi_select(EOS_SPI_DEV_EVE); -    rv = eve_init(wakeup_cause, touch_calibrate, touch_matrix, EVE_GPIO_DIR); +    rv = eos_eve_init(wakeup_cause, EVE_GPIO_DIR, touch_calibrate, touch_matrix);      eos_spi_deselect();      if (rv) printf("EVE INIT ERR:%d\n", rv); @@ -74,7 +74,7 @@ void eos_run(uint8_t wakeup_cause) {      int rv;      eos_spi_select(EOS_SPI_DEV_EVE); -    rv = eve_run(wakeup_cause); +    rv = eos_eve_run(wakeup_cause);      eos_spi_deselect();      if (rv) printf("EVE RUN ERR:%d\n", rv); diff --git a/fw/fe310/eos/eve/Makefile b/fw/fe310/eos/eve/Makefile index e55ef7a..7a5351f 100644 --- a/fw/fe310/eos/eve/Makefile +++ b/fw/fe310/eos/eve/Makefile @@ -2,7 +2,7 @@ include ../../common.mk  CFLAGS += -I.. -I../../bsp/include -obj = eve.o eve_platform.o eve_touch.o eve_phy.o eve_vtrack.o eve_font.o eve_kbd.o eve_text.o clipb.o +obj = eve.o eve_eos.o eve_platform.o eve_touch.o eve_phy.o eve_vtrack.o eve_font.o eve_kbd.o eve_text.o clipb.o  %.o: %.c %.h diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c index ddfd4c0..7bb8ff4 100644 --- a/fw/fe310/eos/eve/eve.c +++ b/fw/fe310/eos/eve/eve.c @@ -303,7 +303,14 @@ void eve_cmd_burst_end(void) {      cmd_burst = 0;  } -static int _init(uint8_t gpio_dir) { +void eve_handle_intr(void) { +    uint16_t intr_flags; + +    intr_flags = eve_read16(REG_INT_FLAGS); +    eve_handle_touch(intr_flags); +} + +int eve_init(uint8_t gpio_dir, int touch_calibrate, uint32_t *touch_matrix) {      uint8_t chipid = 0;      uint8_t reset = 0x07;      uint16_t timeout; @@ -359,6 +366,9 @@ static int _init(uint8_t gpio_dir) {      eve_write8(REG_VOL_SOUND, 0x00);        /* turn synthesizer volume off */      eve_write8(REG_VOL_PB, 0x00);           /* turn recorded audio volume off */ +    /* configure interrupts */ +    eve_write16(REG_INT_MASK, 0); +      /* write a basic display-list to get things started */      eve_dl_start(EVE_RAM_DL, 0);      eve_dl_write(CLEAR_COLOR_RGB(0,0,0)); @@ -372,18 +382,35 @@ static int _init(uint8_t gpio_dir) {  #endif      /* nothing is being displayed yet... the pixel clock is still 0x00 */ +    eve_touch_init(touch_calibrate, touch_matrix);      return EVE_OK;  } -static void _start(void) { +void eve_start(void) { +    eve_touch_start(); + +    /* enable interrupts */ +    eve_write8(REG_INT_EN, 0x01); +    while(eve_read8(REG_INT_FLAGS)); +} + +void eve_stop(void) { +    eve_touch_stop(); + +    /* disable interrupts */ +    eve_write8(REG_INT_EN, 0x00); +    while(eve_read8(REG_INT_FLAGS)); +} + +void eve_start_clk(void) {      uint16_t gpiox; +    eve_write8(REG_PCLK, EVE_PCLK);         /* start clocking data to the LCD panel */      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_write16(REG_GPIOX, gpiox);          /* enable the DISP signal to the LCD panel, it is set to output in REG_GPIOX_DIR */  } -static void _stop(void) { +void eve_stop_clk(void) {      uint16_t gpiox;      gpiox = eve_read16(REG_GPIOX) & ~0x8000; @@ -391,45 +418,43 @@ static void _stop(void) {      eve_write8(REG_PCLK, 0);  } -int eve_init(uint8_t wakeup_cause, int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir) { -    int rv; -    int rst = (wakeup_cause == EVE_WAKE_RST); - -    if (rst) { -        int rv = _init(gpio_dir); -        if (rv) return rv; -    } else { -        eve_command(EVE_ACTIVE, 0); -        eve_time_sleep(40); -    } +void eve_active(void) { +    eve_command(EVE_ACTIVE, 0); +    eve_time_sleep(40); +} -    rv = eve_touch_init(wakeup_cause, touch_calibrate, touch_matrix); -    if (rv) return rv; +void eve_standby(void) { +    if (power_state != EVE_PSTATE_ACTIVE) return; -    eve_platform_init(); +    eve_command(EVE_STANDBY, 0); -    return EVE_OK; +    power_state = EVE_PSTATE_STANDBY;  } -int eve_run(uint8_t wakeup_cause) { -    int rv; +void eve_sleep(void) { +    if (power_state != EVE_PSTATE_ACTIVE) return; -    _start(); -    rv = eve_touch_run(wakeup_cause); +    eve_stop_clk(); +    eve_stop(); -    return rv; -} +    eve_command(EVE_SLEEP, 0); -void eve_start(void) { -    _start(); -    eve_touch_start(); +    power_state = EVE_PSTATE_SLEEP;  } -void eve_stop(void) { -    uint16_t gpiox; +void eve_wake(void) { +    eve_active(); -    eve_touch_stop(); -    _stop(); +    if (power_state == EVE_PSTATE_SLEEP) { +        eve_start(); +        eve_start_clk(); +    } + +    power_state = EVE_PSTATE_ACTIVE; +} + +void eve_brightness(uint8_t b) { +    eve_write8(REG_PWM_DUTY, b);  }  int eve_gpio_get(int gpio) { @@ -459,42 +484,3 @@ void eve_gpio_set_dir(uint8_t dir) {      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(); -    } - -    power_state = EVE_PSTATE_ACTIVE; -} - -void eve_brightness(uint8_t b) { -    eve_write8(REG_PWM_DUTY, b); -} diff --git a/fw/fe310/eos/eve/eve.h b/fw/fe310/eos/eve/eve.h index ae0a672..02fa697 100644 --- a/fw/fe310/eos/eve/eve.h +++ b/fw/fe310/eos/eve/eve.h @@ -56,17 +56,21 @@ int eve_cmd_exec(int w);  void eve_cmd_burst_start(void);  void eve_cmd_burst_end(void); -int eve_init(uint8_t wakeup_cause, int touch_calibrate, uint32_t *touch_matrix, uint8_t gpio_dir); -int eve_run(uint8_t wakeup_cause); +void eve_handle_intr(void); + +int eve_init(uint8_t gpio_dir, int touch_calibrate, uint32_t *touch_matrix);  void eve_start(void);  void eve_stop(void); +void eve_start_clk(void); +void eve_stop_clk(void); + +void eve_active(void); +void eve_standby(void); +void eve_sleep(void); +void eve_wake(void);  int eve_gpio_get(int gpio);  void eve_gpio_set(int gpio, int val);  uint8_t eve_gpio_get_dir(void);  void eve_gpio_set_dir(uint8_t dir); - -void eve_standby(void); -void eve_sleep(void); -void eve_active(void);  void eve_brightness(uint8_t b); diff --git a/fw/fe310/eos/eve/eve_eos.c b/fw/fe310/eos/eve/eve_eos.c new file mode 100644 index 0000000..35c237e --- /dev/null +++ b/fw/fe310/eos/eve/eve_eos.c @@ -0,0 +1,88 @@ +#include <stdlib.h> + +#include "platform.h" + +#include "eos.h" +#include "interrupt.h" +#include "event.h" +#include "power.h" + +#include "board.h" + +#include "eve.h" +#include "eve_eos.h" + +static int _run; + +static void handle_time(unsigned char type) { +    if (_run) { +        eve_spi_start(); +        eve_handle_time(); +        eve_spi_stop(); +    } +} + +static void handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) { +    if (_run) { +        eve_spi_start(); +        eve_handle_intr(); +        eve_spi_stop(); + +        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_UI | EVE_ETYPE_INTR, NULL, 0); +} + +int eos_eve_init(uint8_t wakeup_cause, uint8_t gpio_dir, int touch_calibrate, uint32_t *touch_matrix) { +    int rst = (wakeup_cause == EOS_PWR_WAKE_RST); +    int rv; + +    if (rst) { +        rv = eve_init(gpio_dir, touch_calibrate, touch_matrix); +        if (rv) return EOS_ERR; +    } else { +        eve_active(); +    } + +    eos_evtq_set_handler(EOS_EVT_UI, handle_evt); +    eos_timer_set_handler(EOS_TIMER_ETYPE_UI, handle_time); +    eos_intr_set(INT_GPIO_BASE + EVE_PIN_INTR, IRQ_PRIORITY_UI, handle_intr); +    eos_intr_disable(INT_GPIO_BASE + EVE_PIN_INTR); + +    return EOS_OK; +} + +int eos_eve_run(uint8_t wakeup_cause) { +    eos_eve_start(); +    eve_start_clk(); + +    return EOS_OK; +} + +void eos_eve_start(void) { +    eve_start(); + +    GPIO_REG(GPIO_INPUT_EN)     |=  (1 << EVE_PIN_INTR); +    GPIO_REG(GPIO_OUTPUT_EN)    &= ~(1 << EVE_PIN_INTR); +    GPIO_REG(GPIO_PULLUP_EN)    &= ~(1 << EVE_PIN_INTR); +    GPIO_REG(GPIO_OUTPUT_XOR)   &= ~(1 << EVE_PIN_INTR); + +    GPIO_REG(GPIO_LOW_IE)       |=  (1 << EVE_PIN_INTR); + +    eos_intr_enable(INT_GPIO_BASE + EVE_PIN_INTR); +    _run = 1; +} + +void eos_eve_stop(void) { +    _run = 0; +    eos_intr_disable(INT_GPIO_BASE + EVE_PIN_INTR); + +    GPIO_REG(GPIO_LOW_IE)       &= ~(1 << EVE_PIN_INTR); + +    eve_stop(); +}
\ No newline at end of file diff --git a/fw/fe310/eos/eve/eve_eos.h b/fw/fe310/eos/eve/eve_eos.h new file mode 100644 index 0000000..80eea86 --- /dev/null +++ b/fw/fe310/eos/eve/eve_eos.h @@ -0,0 +1,6 @@ +#include <stdint.h> + +int eos_eve_init(uint8_t wakeup_cause, uint8_t gpio_dir, int touch_calibrate, uint32_t *touch_matrix); +int eos_eve_run(uint8_t wakeup_cause); +void eos_eve_start(void); +void eos_eve_stop(void); diff --git a/fw/fe310/eos/eve/eve_platform.c b/fw/fe310/eos/eve/eve_platform.c index 2a43f1c..4450412 100644 --- a/fw/fe310/eos/eve/eve_platform.c +++ b/fw/fe310/eos/eve/eve_platform.c @@ -1,61 +1,36 @@  #include <stdlib.h> - -#include "platform.h" +#include <stdio.h>  #include "eos.h" -#include "interrupt.h" -#include "event.h" - -#include "board.h"  #include "eve.h"  #include "eve_platform.h" - -static void handle_time(unsigned char type) { -    eve_handle_time(); -} - -static void handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) { -    eve_handle_touch(); - -    GPIO_REG(GPIO_LOW_IP) = (1 << EVE_PIN_INTR); -    GPIO_REG(GPIO_LOW_IE) |= (1 << EVE_PIN_INTR); -} - -static void handle_intr(void) { -    GPIO_REG(GPIO_LOW_IE) &= ~(1 << EVE_PIN_INTR); -    eos_evtq_push_isr(EOS_EVT_UI | EVE_ETYPE_INTR, NULL, 0); -    return; +void *eve_malloc(size_t size) { +    void *p = malloc(size); +    printf("MALLOC:%p %d\n", p, size); +    return p;  } -void eve_time_sleep(uint32_t ms) { -    eos_time_sleep(ms); +void eve_free(void *p) { +    printf("FREE:%p\n", p); +    free(p);  }  void eve_timer_set(uint32_t ms) {      eos_timer_set(ms, EOS_TIMER_ETYPE_UI);  } -void eve_timer_clear(void) { -    eos_timer_clear(EOS_TIMER_ETYPE_UI); +void eve_time_sleep(uint32_t ms) { +    eos_time_sleep(ms);  }  uint64_t eve_time_get_tick(void) {      return eos_time_get_tick();  } -void eve_platform_init(void) { -    eos_evtq_set_handler(EOS_EVT_UI, handle_evt); -    eos_timer_set_handler(EOS_TIMER_ETYPE_UI, handle_time); - -    GPIO_REG(GPIO_INPUT_EN)     |=  (1 << EVE_PIN_INTR); -    GPIO_REG(GPIO_OUTPUT_EN)    &= ~(1 << EVE_PIN_INTR); -    GPIO_REG(GPIO_PULLUP_EN)    &= ~(1 << EVE_PIN_INTR); -    GPIO_REG(GPIO_OUTPUT_XOR)   &= ~(1 << EVE_PIN_INTR); - -    GPIO_REG(GPIO_LOW_IE)       |=  (1 << EVE_PIN_INTR); -    eos_intr_set(INT_GPIO_BASE + EVE_PIN_INTR, IRQ_PRIORITY_UI, handle_intr); +void eve_timer_clear(void) { +    eos_timer_clear(EOS_TIMER_ETYPE_UI);  }  void eve_spi_start(void) { @@ -65,16 +40,3 @@ void eve_spi_start(void) {  void eve_spi_stop(void) {      eos_spi_deselect();  } - -#include <stdio.h> - -void *eve_malloc(size_t size) { -    void *p = malloc(size); -    printf("MALLOC:%p %d\n", p, size); -    return p; -} - -void eve_free(void *p) { -    printf("FREE:%p\n", p); -    free(p); -} diff --git a/fw/fe310/eos/eve/eve_platform.h b/fw/fe310/eos/eve/eve_platform.h index b33bd48..77afffc 100644 --- a/fw/fe310/eos/eve/eve_platform.h +++ b/fw/fe310/eos/eve/eve_platform.h @@ -1,9 +1,9 @@  #include <stdint.h> +#include <stdlib.h> +#include "timer.h"  #include "spi.h"  #include "spi_dev.h" -#include "power.h" -#include "timer.h"  #define EVE_ETYPE_INTR      1 @@ -12,10 +12,6 @@  #define EVE_SPI_FLAG_BSWAP  EOS_SPI_FLAG_BSWAP  #define EVE_SPI_FLAG_TX     EOS_SPI_FLAG_TX -#define EVE_WAKE_RST        EOS_PWR_WAKE_RST -#define EVE_WAKE_RTC        EOS_PWR_WAKE_RTC -#define EVE_WAKE_BTN        EOS_PWR_WAKE_BTN -  void *eve_malloc(size_t);  void eve_free(void *); @@ -36,8 +32,6 @@ void eve_spi_stop(void);  #define eve_spi_unlock      eos_spi_unlock  void eve_time_sleep(uint32_t ms); +uint64_t eve_time_get_tick(void);  void eve_timer_set(uint32_t ms);  void eve_timer_clear(void); -uint64_t eve_time_get_tick(void); - -void eve_platform_init(void); diff --git a/fw/fe310/eos/eve/eve_touch.c b/fw/fe310/eos/eve/eve_touch.c index ff155d5..4f8a543 100644 --- a/fw/fe310/eos/eve/eve_touch.c +++ b/fw/fe310/eos/eve/eve_touch.c @@ -5,7 +5,6 @@  #include "power.h"  #include "eve.h" -static int touch_intr_mask = EVE_INT_TAG | EVE_INT_TOUCH;  static int touch_multi;  static uint8_t touch_tag0; @@ -39,16 +38,15 @@ static const uint32_t _reg_track[] = {      REG_TRACKER_4  }; -void eve_handle_touch(void) { +void eve_handle_touch(uint16_t intr_flags) {      int i;      char touch_ex = 0;      char int_ccomplete = 0; -    uint8_t flags; +    uint16_t intr_mask; -    eve_spi_start(); +    intr_mask = eve_read16(REG_INT_MASK); +    if (!touch_multi && (intr_flags & EVE_INT_TOUCH)) touch_multi = 1; -    flags = eve_read8(REG_INT_FLAGS) & touch_intr_mask; -    if (!touch_multi && (flags & EVE_INT_TOUCH)) touch_multi = 1;      for (i=0; i<EVE_MAX_TOUCH; i++) {          uint8_t touch_tag;          uint32_t touch_xy; @@ -123,7 +121,7 @@ void eve_handle_touch(void) {              }              touch->x = touch_x;              touch->y = touch_y; -            if (touch_multi || (flags & EVE_INT_TAG)) { +            if (touch_multi || (intr_flags & EVE_INT_TAG)) {                  touch_tag = eve_read8(_reg_tag[i]);              } else {                  touch_tag = touch->tag; @@ -241,16 +239,12 @@ void eve_handle_touch(void) {      if (touch_multi) int_ccomplete = 1; -    if (int_ccomplete && !(touch_intr_mask & EVE_INT_CONVCOMPLETE)) { -        touch_intr_mask |= EVE_INT_CONVCOMPLETE; -        eve_write8(REG_INT_MASK, touch_intr_mask); +    if (int_ccomplete && !(intr_mask & EVE_INT_CONVCOMPLETE)) { +        eve_write16(REG_INT_MASK, intr_mask | EVE_INT_CONVCOMPLETE);      } -    if (!int_ccomplete && (touch_intr_mask & EVE_INT_CONVCOMPLETE)) { -        touch_intr_mask &= ~EVE_INT_CONVCOMPLETE; -        eve_write8(REG_INT_MASK, touch_intr_mask); +    if (!int_ccomplete && (intr_mask & EVE_INT_CONVCOMPLETE)) { +        eve_write16(REG_INT_MASK, intr_mask & ~EVE_INT_CONVCOMPLETE);      } - -    eve_spi_stop();  }  void eve_handle_time(void) { @@ -260,8 +254,6 @@ void eve_handle_time(void) {          int more = 0;          uint16_t touch_evt = 0; -        eve_spi_start(); -          if (touch_timer.evt & EVE_TOUCH_ETYPE_LPRESS) {              touch_evt |= EVE_TOUCH_ETYPE_LPRESS;              if (touch) touch->eevt |= EVE_TOUCH_EETYPE_LPRESS; @@ -295,12 +287,10 @@ void eve_handle_time(void) {          if (touch_handler && touch_evt) {              touch_handler(touch, touch_evt, touch_timer.tag0, touch_handler_param);          } - -        eve_spi_stop();      }  } -static void _init(int touch_calibrate, uint32_t *touch_matrix) { +void eve_touch_init(int touch_calibrate, uint32_t *touch_matrix) {      /* configure touch */      eve_write8(REG_CPURESET, 2);                            /* touch engine reset */      eve_write16(REG_TOUCH_CONFIG, 0x4000);                  /* host mode multi touch */ @@ -329,49 +319,37 @@ static void _init(int touch_calibrate, uint32_t *touch_matrix) {      }      eve_write8(REG_CTOUCH_EXTENDED, 0x00);                  /* set extended mode */ - -    /* configure interrupts */ -    eve_write8(REG_INT_MASK, touch_intr_mask); -    eve_write8(REG_INT_EN, 0x01); -    while(eve_read8(REG_INT_FLAGS)); -} - -static void _start(void) { -    eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS); -} - -static void _stop(void) { -    eve_write8(REG_TOUCH_MODE, EVE_TMODE_OFF);  } -int eve_touch_init(uint8_t wakeup_cause, int touch_calibrate, uint32_t *touch_matrix) { -    int rst = (wakeup_cause == EVE_WAKE_RST); +void eve_touch_start(void) { +    uint16_t intr_mask;      int i; -    eve_vtrack_init(); - +    touch_multi = 0; +    touch_tag0 = 0; +    memset(&touch_timer, 0, sizeof(touch_timer));      for (i=0; i<EVE_MAX_TOUCH; i++) {          EVETouch *touch = &touch_obj[i]; + +        memset(&touch_obj[i], 0, sizeof(EVETouch));          touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;      } +    eve_vtrack_init(); -    if (rst) _init(touch_calibrate, touch_matrix); +    intr_mask = eve_read16(REG_INT_MASK); +    eve_write16(REG_INT_MASK, intr_mask | EVE_INT_TAG | EVE_INT_TOUCH); -    return EVE_OK; +    eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);  } -int eve_touch_run(uint8_t wakeup_cause) { -    _start(); - -    return EVE_OK; -} +void eve_touch_stop(void) { +    uint16_t intr_mask; -void eve_touch_start(void) { -    _start(); -} +    intr_mask = eve_read16(REG_INT_MASK); +    eve_write16(REG_INT_MASK, intr_mask & ~(EVE_INT_TAG | EVE_INT_TOUCH | EVE_INT_CONVCOMPLETE)); +    eve_touch_timer_clear(touch_timer.touch); -void eve_touch_stop(void) { -    _stop(); +    eve_write8(REG_TOUCH_MODE, EVE_TMODE_OFF);  }  void eve_touch_set_handler(eve_touch_handler_t handler, void *param) { diff --git a/fw/fe310/eos/eve/eve_touch.h b/fw/fe310/eos/eve/eve_touch.h index 37c4013..b10fde2 100644 --- a/fw/fe310/eos/eve/eve_touch.h +++ b/fw/fe310/eos/eve/eve_touch.h @@ -98,11 +98,10 @@ typedef struct EVETouchTimer {  typedef void (*eve_touch_handler_t) (EVETouch *, uint16_t, uint8_t, void *); -void eve_handle_touch(void); +void eve_handle_touch(uint16_t intr_flags);  void eve_handle_time(void); -int eve_touch_init(uint8_t wakeup_cause, int touch_calibrate, uint32_t *touch_matrix); -int eve_touch_run(uint8_t wakeup_cause); +void eve_touch_init(int touch_calibrate, uint32_t *touch_matrix);  void eve_touch_start(void);  void eve_touch_stop(void); diff --git a/fw/fe310/eos/i2c.c b/fw/fe310/eos/i2c.c index 972deae..63dd7e6 100644 --- a/fw/fe310/eos/i2c.c +++ b/fw/fe310/eos/i2c.c @@ -12,6 +12,7 @@  int eos_i2c_init(uint8_t wakeup_cause) {      eos_i2c_stop();      eos_i2c_speed(EOS_I2C_SPEED); +      return EOS_OK;  } diff --git a/fw/fe310/eos/net.c b/fw/fe310/eos/net.c index 167a879..4d9aadf 100644 --- a/fw/fe310/eos/net.c +++ b/fw/fe310/eos/net.c @@ -311,6 +311,10 @@ static void net_start(void) {      SPI1_REG(SPI_REG_CSID) = eos_spi_csid(EOS_SPI_DEV_NET);  } +static void net_stop(void) { +    eos_intr_set_handler(INT_SPI1_BASE, NULL); +} +  int eos_net_init(uint8_t wakeup_cause) {      int i; @@ -400,6 +404,7 @@ void eos_net_stop(void) {          if (!done) asm volatile ("wfi");          set_csr(mstatus, MSTATUS_MIE);      } +    net_stop();  }  int eos_net_sleep(uint32_t timeout) { diff --git a/fw/fe310/eos/spi.c b/fw/fe310/eos/spi.c index a4b164e..11a0703 100644 --- a/fw/fe310/eos/spi.c +++ b/fw/fe310/eos/spi.c @@ -102,6 +102,7 @@ void eos_spi_start(uint16_t div, uint8_t csid, uint8_t cspin, unsigned char evt)  void eos_spi_stop(void) {      eos_spi_flush(); +    eos_intr_set_handler(INT_SPI1_BASE, NULL);      spi_evt = 0;  } diff --git a/fw/fe310/eos/spi_dev.c b/fw/fe310/eos/spi_dev.c index 54b337a..2d3d8f5 100644 --- a/fw/fe310/eos/spi_dev.c +++ b/fw/fe310/eos/spi_dev.c @@ -40,7 +40,6 @@ int eos_spi_dev_init(uint8_t wakeup_cause) {  }  int eos_spi_select(unsigned char dev) { -    if (dev == EOS_SPI_DEV_NET) return EOS_ERR;      if (spi_lock) return EOS_ERR_BUSY;      if (spi_dev == EOS_SPI_DEV_NET) { @@ -50,14 +49,18 @@ int eos_spi_select(unsigned char dev) {      }      spi_dev = dev; -    eos_spi_start(spi_div[dev], spi_cfg[dev].csid, spi_cfg[dev].cspin, spi_cfg[dev].evt); +    if (dev == EOS_SPI_DEV_NET) { +        eos_net_start(); +    } else { +        eos_spi_start(spi_div[dev], spi_cfg[dev].csid, spi_cfg[dev].cspin, spi_cfg[dev].evt); +    }      return EOS_OK;  }  int eos_spi_deselect(void) { -    if (spi_dev == EOS_SPI_DEV_NET) return EOS_ERR;      if (spi_lock) return EOS_ERR_BUSY; +    if (spi_dev == EOS_SPI_DEV_NET) return EOS_ERR;      eos_spi_stop();  | 
