From 66e53b7e54878e2161f5c0dab6f90aebd9a1d97a Mon Sep 17 00:00:00 2001
From: Uros Majstorovic <majstor@majstor.org>
Date: Thu, 8 Apr 2021 02:27:15 +0200
Subject: added board.h

---
 fw/fe310/eos/Makefile             |   2 +-
 fw/fe310/eos/board.h              |  34 +++++++++
 fw/fe310/eos/eos.c                |   1 -
 fw/fe310/eos/eve/clipb.c          |   8 +--
 fw/fe310/eos/eve/eve.c            | 138 ++++++++++++++++++------------------
 fw/fe310/eos/eve/eve_platform.c   |   8 +--
 fw/fe310/eos/eve/eve_touch.c      | 144 +++++++++++++++++++-------------------
 fw/fe310/eos/eve/eve_vtrack.c     |  20 +++---
 fw/fe310/eos/eve/screen/window.c  |   8 +--
 fw/fe310/eos/eve/widget/selectw.c |  20 +++---
 fw/fe310/eos/eve/widget/strw.c    |  14 ++--
 fw/fe310/eos/eve/widget/textw.c   |  20 +++---
 fw/fe310/eos/i2s.c                |  65 ++++++++---------
 fw/fe310/eos/i2s.h                |   8 +--
 fw/fe310/eos/i2s_def.h            |  27 ++-----
 fw/fe310/eos/i2s_priv.h           |   8 +++
 fw/fe310/eos/interrupt.h          |   2 +
 fw/fe310/eos/msgq_def.h           |  10 ---
 fw/fe310/eos/msgq_priv.h          |  10 +++
 fw/fe310/eos/net.c                |  28 +++++---
 fw/fe310/eos/net_def.h            |  13 ----
 fw/fe310/eos/power.c              |   4 +-
 fw/fe310/eos/spi.c                |  66 ++++++++++++-----
 fw/fe310/eos/spi.h                |  24 +++++--
 fw/fe310/eos/spi_def.h            |  12 ----
 fw/fe310/eos/spi_dev.c            |  77 --------------------
 fw/fe310/eos/spi_dev.h            |  11 ---
 fw/fe310/eos/spi_priv.h           |  44 ++++++++++++
 fw/fe310/eos/trap_entry.S         |  36 +++-------
 fw/fe310/eos/uart.c               |   1 -
 30 files changed, 425 insertions(+), 438 deletions(-)
 create mode 100644 fw/fe310/eos/board.h
 create mode 100644 fw/fe310/eos/i2s_priv.h
 delete mode 100644 fw/fe310/eos/msgq_def.h
 create mode 100644 fw/fe310/eos/msgq_priv.h
 delete mode 100644 fw/fe310/eos/net_def.h
 delete mode 100644 fw/fe310/eos/spi_def.h
 delete mode 100644 fw/fe310/eos/spi_dev.c
 delete mode 100644 fw/fe310/eos/spi_dev.h
 create mode 100644 fw/fe310/eos/spi_priv.h

(limited to 'fw/fe310/eos')

diff --git a/fw/fe310/eos/Makefile b/fw/fe310/eos/Makefile
index 0b3d6fe..366e69a 100644
--- a/fw/fe310/eos/Makefile
+++ b/fw/fe310/eos/Makefile
@@ -2,7 +2,7 @@ include ../common.mk
 
 CFLAGS += -I. -I../bsp/include -I../bsp/drivers
 
-obj = trap_entry.o eos.o msgq.o event.o interrupt.o timer.o power.o i2s.o i2c.o uart.o spi.o spi_dev.o net.o wifi.o cell.o sock.o unicode.o
+obj = trap_entry.o eos.o msgq.o event.o interrupt.o timer.o power.o i2s.o i2c.o uart.o spi.o net.o wifi.o cell.o sock.o unicode.o
 
 
 %.o: %.c %.h
diff --git a/fw/fe310/eos/board.h b/fw/fe310/eos/board.h
new file mode 100644
index 0000000..98741da
--- /dev/null
+++ b/fw/fe310/eos/board.h
@@ -0,0 +1,34 @@
+#define SPI_DIV_NET             16
+#define SPI_DIV_EVE             16
+#define SPI_DIV_SDC             16
+#define SPI_DIV_CAM             16
+
+#define SPI_CSID_NET            3
+#define SPI_CSID_EVE            2
+#define SPI_CSID_SDC            0
+#define SPI_CSID_CAM            SPI_CSID_NONE
+
+#define SPI_CSPIN_NET           SPI_CSPIN_NONE
+#define SPI_CSPIN_EVE           SPI_CSPIN_NONE
+#define SPI_CSPIN_SDC           SPI_CSPIN_NONE
+#define SPI_CSPIN_CAM           23
+
+#define NET_PIN_RTS             20
+#define NET_PIN_CTS             22
+
+#define I2S_PIN_CK              1       /* PWM 0.1 */
+#define I2S_PIN_CK_SW           21      /* PWM 1.2 */
+#define I2S_PIN_CK_SR           18
+#define I2S_PIN_WS_MIC          19      /* PWM 1.1 */
+#define I2S_PIN_WS_SPK          11      /* PWM 2.1 */
+#define I2S_PIN_SD_IN           13
+#define I2S_PIN_SD_OUT          12
+
+#define I2S_IRQ_WS_ID           (INT_PWM2_BASE + 0)
+#define I2S_IRQ_SD_ID           (INT_PWM2_BASE + 3)
+
+#define I2S_CTRL_ADDR_CK        PWM0_CTRL_ADDR
+#define I2S_CTRL_ADDR_WS_MIC    PWM1_CTRL_ADDR
+#define I2S_CTRL_ADDR_WS_SPK    PWM2_CTRL_ADDR
+
+#define I2S_IDLE_CYCLES         8
diff --git a/fw/fe310/eos/eos.c b/fw/fe310/eos/eos.c
index 2a7f992..490e68b 100644
--- a/fw/fe310/eos/eos.c
+++ b/fw/fe310/eos/eos.c
@@ -33,7 +33,6 @@ void eos_init(void) {
     eos_wifi_init();
     eos_cell_init();
     eos_sock_init();
-    eos_spi_dev_init();
     eos_bq25895_init();
 
     eos_net_wake(wakeup_cause);
diff --git a/fw/fe310/eos/eve/clipb.c b/fw/fe310/eos/eve/clipb.c
index 04c9a46..974b631 100644
--- a/fw/fe310/eos/eve/clipb.c
+++ b/fw/fe310/eos/eve/clipb.c
@@ -3,17 +3,17 @@
 #include "eve.h"
 #include "clipb.h"
 
-static uint8_t _clipb[EVE_CLIPB_SIZE_BUF];
+static uint8_t clipb[EVE_CLIPB_SIZE_BUF];
 
 int eve_clipb_push(uint8_t *str, uint16_t len) {
     if (len >= EVE_CLIPB_SIZE_BUF) return EVE_ERR;
 
-    memcpy(_clipb, str, len);
-    _clipb[len] = '\0';
+    memcpy(clipb, str, len);
+    clipb[len] = '\0';
 
     return EVE_OK;
 }
 
 uint8_t *eve_clipb_get(void) {
-    return _clipb;
+    return clipb;
 }
\ No newline at end of file
diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c
index 6809d72..3b56e11 100644
--- a/fw/fe310/eos/eve/eve.c
+++ b/fw/fe310/eos/eve/eve.c
@@ -6,15 +6,15 @@
 
 #define EVE_MEM_WRITE           0x800000
 
-static char _cmd_burst;
-static uint16_t _cmd_offset;
+static char cmd_burst;
+static uint16_t cmd_offset;
 
-static char _dl_burst;
-static uint32_t _dl_addr;
+static char dl_burst;
+static uint32_t dl_addr;
 
-static uint32_t *_touch_calib;
-static uint8_t _brigtness;
-static uint8_t _power_state;
+static uint32_t *touch_calib;
+static uint8_t brigtness;
+static uint8_t power_state;
 
 void eve_command(uint8_t command, uint8_t parameter) {
     eve_spi_cs_set();
@@ -95,13 +95,13 @@ void eve_writeb(uint32_t addr, uint8_t *b, size_t size) {
     eve_spi_cs_clear();
 }
 
-static void _dl_inc(uint32_t i) {
-    _dl_addr += i;
+static void dl_inc(uint32_t i) {
+    dl_addr += i;
 }
 
 void eve_dl_start(uint32_t addr, char burst) {
-    _dl_addr = addr;
-    _dl_burst = burst;
+    dl_addr = addr;
+    dl_burst = burst;
     if (burst) {
         eve_spi_lock();
         eve_spi_cs_set();
@@ -110,20 +110,20 @@ void eve_dl_start(uint32_t addr, char burst) {
 }
 
 void eve_dl_write(uint32_t dl) {
-    if (_dl_burst) {
+    if (dl_burst) {
         eve_spi_xchg32(dl, EVE_SPI_FLAG_TX | EVE_SPI_FLAG_BSWAP);
     } else {
-        eve_write32(_dl_addr, dl);
+        eve_write32(dl_addr, dl);
     }
-    _dl_inc(4);
+    dl_inc(4);
 }
 
 void eve_dl_end(void) {
-    if (_dl_burst) {
+    if (dl_burst) {
         eve_spi_flush();
         eve_spi_cs_clear();
         eve_spi_unlock();
-        _dl_burst = 0;
+        dl_burst = 0;
     }
 }
 
@@ -132,33 +132,33 @@ void eve_dl_swap(void) {
 }
 
 uint32_t eve_dl_get_addr(void) {
-    return _dl_addr;
+    return dl_addr;
 }
 
-static void _cmd_inc(uint16_t i) {
-    _cmd_offset += i;
-    _cmd_offset &= 0x0fff;
+static void cmd_inc(uint16_t i) {
+    cmd_offset += i;
+    cmd_offset &= 0x0fff;
 }
 
-static void _cmd_begin(uint32_t command) {
+static void cmd_begin(uint32_t command) {
     uint8_t flags = 0;
 
-    if (_cmd_burst) {
+    if (cmd_burst) {
         flags = EVE_SPI_FLAG_TX;
     } else {
-        uint32_t addr = EVE_RAM_CMD + _cmd_offset;
+        uint32_t addr = EVE_RAM_CMD + cmd_offset;
         eve_spi_cs_set();
         eve_spi_xchg24(addr | EVE_MEM_WRITE, 0);
     }
     eve_spi_xchg32(command, EVE_SPI_FLAG_BSWAP | flags);
-    _cmd_inc(4);
+    cmd_inc(4);
 }
 
-static void _cmd_end(void) {
-    if (!_cmd_burst) eve_spi_cs_clear();
+static void cmd_end(void) {
+    if (!cmd_burst) eve_spi_cs_clear();
 }
 
-static void _cmd_string(const char *s, uint8_t flags) {
+static void cmd_string(const char *s, uint8_t flags) {
     int i = 0;
 
     while (s[i] != 0) {
@@ -167,68 +167,68 @@ static void _cmd_string(const char *s, uint8_t flags) {
     }
     eve_spi_xchg8(0, flags);
     i++;
-    _cmd_inc(i);
+    cmd_inc(i);
 }
 
-static void _cmd_buffer(const char *b, int size, uint8_t flags) {
+static void cmd_buffer(const char *b, int size, uint8_t flags) {
     int i = 0;
 
     for (i=0; i<size; i++) {
         eve_spi_xchg8(b[i], flags);
     }
-    _cmd_inc(size);
+    cmd_inc(size);
 }
 
 void eve_cmd(uint32_t cmd, const char *fmt, ...) {
-    uint8_t flags = _cmd_burst ? (EVE_SPI_FLAG_TX | EVE_SPI_FLAG_BSWAP) : EVE_SPI_FLAG_BSWAP;
+    uint8_t flags = cmd_burst ? (EVE_SPI_FLAG_TX | EVE_SPI_FLAG_BSWAP) : EVE_SPI_FLAG_BSWAP;
     va_list argv;
     uint16_t *p;
     int i = 0;
 
     va_start(argv, fmt);
-    _cmd_begin(cmd);
+    cmd_begin(cmd);
     while (fmt[i]) {
         switch (fmt[i]) {
             case 'b':
                 eve_spi_xchg8(va_arg(argv, int), flags);
-                _cmd_inc(1);
+                cmd_inc(1);
                 break;
             case 'h':
                 eve_spi_xchg16(va_arg(argv, int), flags);
-                _cmd_inc(2);
+                cmd_inc(2);
                 break;
             case 'w':
                 eve_spi_xchg32(va_arg(argv, int), flags);
-                _cmd_inc(4);
+                cmd_inc(4);
                 break;
             case '&':
                 p = va_arg(argv, uint16_t *);
-                *p = _cmd_offset;
+                *p = cmd_offset;
                 eve_spi_xchg32(0, flags);
-                _cmd_inc(4);
+                cmd_inc(4);
                 break;
             case 's':
-                _cmd_string(va_arg(argv, const char *), flags);
+                cmd_string(va_arg(argv, const char *), flags);
                 break;
             case 'p':
-                _cmd_buffer(va_arg(argv, const char *), va_arg(argv, int), flags);
+                cmd_buffer(va_arg(argv, const char *), va_arg(argv, int), flags);
                 break;
         }
         i++;
     }
     va_end(argv);
     /* padding */
-    i = _cmd_offset & 3;  /* equivalent to _cmd_offset % 4 */
+    i = cmd_offset & 3;  /* equivalent to cmd_offset % 4 */
     if (i) {
         i = 4 - i;  /* 3, 2 or 1 */
-        _cmd_inc(i);
+        cmd_inc(i);
 
         while (i > 0) {
             eve_spi_xchg8(0, flags);
             i--;
         }
     }
-    _cmd_end();
+    cmd_end();
 }
 
 uint32_t eve_cmd_result(uint16_t offset) {
@@ -236,14 +236,14 @@ uint32_t eve_cmd_result(uint16_t offset) {
 }
 
 void eve_cmd_dl(uint32_t dl) {
-    _cmd_begin(dl);
-    _cmd_end();
+    cmd_begin(dl);
+    cmd_end();
 }
 
 int eve_cmd_done(void) {
     uint16_t r = eve_read16(REG_CMD_READ);
     if (r == 0xfff) {
-        _cmd_offset = 0;
+        cmd_offset = 0;
         eve_write8(REG_CPURESET, 1);
         eve_write16(REG_CMD_READ, 0);
         eve_write16(REG_CMD_WRITE, 0);
@@ -251,11 +251,11 @@ int eve_cmd_done(void) {
         eve_write8(REG_CPURESET, 0);
         return -1;
     }
-    return (r == _cmd_offset);
+    return (r == cmd_offset);
 }
 
 int eve_cmd_exec(int w) {
-    eve_write16(REG_CMD_WRITE, _cmd_offset);
+    eve_write16(REG_CMD_WRITE, cmd_offset);
     if (w) {
         int r;
         do {
@@ -267,46 +267,46 @@ int eve_cmd_exec(int w) {
 }
 
 void eve_cmd_burst_start(void) {
-    uint32_t addr = EVE_RAM_CMD + _cmd_offset;
+    uint32_t addr = EVE_RAM_CMD + cmd_offset;
     eve_spi_lock();
     eve_spi_cs_set();
     eve_spi_xchg24(addr | EVE_MEM_WRITE, EVE_SPI_FLAG_TX);
-    _cmd_burst = 1;
+    cmd_burst = 1;
 }
 
 void eve_cmd_burst_end(void) {
     eve_spi_flush();
     eve_spi_cs_clear();
     eve_spi_unlock();
-    _cmd_burst = 0;
+    cmd_burst = 0;
 }
 
 void eve_active(void) {
     eve_command(EVE_ACTIVE, 0);
-    if (_power_state == EVE_PSTATE_SLEEP) eve_time_sleep(40);
+    if (power_state == EVE_PSTATE_SLEEP) eve_time_sleep(40);
 
-    eve_write8(REG_PWM_DUTY, _brigtness);
-    if (_power_state != EVE_PSTATE_SLEEP) return;
+    eve_write8(REG_PWM_DUTY, brigtness);
+    if (power_state != EVE_PSTATE_SLEEP) return;
 
     eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);
     eve_write8(REG_CTOUCH_EXTENDED, 0x00);
 
-    _power_state = EVE_PSTATE_ACTIVE;
+    power_state = EVE_PSTATE_ACTIVE;
 }
 
 void eve_standby(void) {
-    if (_power_state != EVE_PSTATE_ACTIVE) return;
+    if (power_state != EVE_PSTATE_ACTIVE) return;
 
-    _brigtness = eve_read8(REG_PWM_DUTY);
+    brigtness = eve_read8(REG_PWM_DUTY);
     eve_command(EVE_STANDBY, 0);
 
-    _power_state = EVE_PSTATE_STANDBY;
+    power_state = EVE_PSTATE_STANDBY;
 }
 
 void eve_sleep(void) {
-    if (_power_state != EVE_PSTATE_ACTIVE) return;
+    if (power_state != EVE_PSTATE_ACTIVE) return;
 
-    _brigtness = eve_read8(REG_PWM_DUTY);
+    brigtness = eve_read8(REG_PWM_DUTY);
     eve_write8(REG_PWM_DUTY, 0x0);
 
     eve_write8(REG_CTOUCH_EXTENDED, 0x01);
@@ -315,7 +315,7 @@ void eve_sleep(void) {
     eve_time_sleep(500);
     eve_command(EVE_SLEEP, 0);
 
-    _power_state = EVE_PSTATE_SLEEP;
+    power_state = EVE_PSTATE_SLEEP;
 }
 
 void eve_brightness(uint8_t b) {
@@ -323,7 +323,7 @@ void eve_brightness(uint8_t b) {
 }
 
 void eve_set_touch_calibration(uint32_t *matrix) {
-    _touch_calib = matrix;
+    touch_calib = matrix;
 }
 
 static int _init(void) {
@@ -382,13 +382,13 @@ static int _init(void) {
     eve_write8(REG_TOUCH_MODE, EVE_TMODE_CONTINUOUS);       /* enable touch */
     eve_write16(REG_TOUCH_RZTHRESH, EVE_TOUCH_RZTHRESH);    /* eliminate any false touches */
 
-    if (_touch_calib) {
-        eve_write32(REG_TOUCH_TRANSFORM_A, _touch_calib[0]);
-        eve_write32(REG_TOUCH_TRANSFORM_B, _touch_calib[1]);
-        eve_write32(REG_TOUCH_TRANSFORM_C, _touch_calib[2]);
-        eve_write32(REG_TOUCH_TRANSFORM_D, _touch_calib[3]);
-        eve_write32(REG_TOUCH_TRANSFORM_E, _touch_calib[4]);
-        eve_write32(REG_TOUCH_TRANSFORM_F, _touch_calib[5]);
+    if (touch_calib) {
+        eve_write32(REG_TOUCH_TRANSFORM_A, touch_calib[0]);
+        eve_write32(REG_TOUCH_TRANSFORM_B, touch_calib[1]);
+        eve_write32(REG_TOUCH_TRANSFORM_C, touch_calib[2]);
+        eve_write32(REG_TOUCH_TRANSFORM_D, touch_calib[3]);
+        eve_write32(REG_TOUCH_TRANSFORM_E, touch_calib[4]);
+        eve_write32(REG_TOUCH_TRANSFORM_F, touch_calib[5]);
     } else {
         uint32_t touch_calib[6];
         eve_cmd_dl(CMD_DLSTART);
@@ -427,7 +427,7 @@ int eve_init(int pwr_on) {
         int rv = _init();
         if (rv) return rv;
     } else {
-        _power_state = EVE_PSTATE_SLEEP;
+        power_state = EVE_PSTATE_SLEEP;
         eve_active();
     }
 
diff --git a/fw/fe310/eos/eve/eve_platform.c b/fw/fe310/eos/eve/eve_platform.c
index cfaf6d5..6bc87bb 100644
--- a/fw/fe310/eos/eve/eve_platform.c
+++ b/fw/fe310/eos/eve/eve_platform.c
@@ -5,10 +5,10 @@
 #include "eos.h"
 #include "interrupt.h"
 #include "event.h"
+
 #include "eve.h"
 #include "eve_platform.h"
 
-#include "irq_def.h"
 
 static void handle_time(unsigned char type) {
     eve_handle_time();
@@ -55,15 +55,15 @@ void eve_platform_init(void) {
     GPIO_REG(GPIO_LOW_IE)       |=  (1 << EVE_PIN_INTR);
     eos_intr_set(INT_GPIO_BASE + EVE_PIN_INTR, IRQ_PRIORITY_UI, handle_intr);
 
-    eos_spi_dev_set_div(EOS_DEV_DISP, 4);
+    eos_spi_set_div(EOS_SPI_DEV_EVE, 4);
 }
 
 void eve_spi_start(void) {
-    eos_spi_dev_select(EOS_DEV_DISP);
+    eos_spi_select(EOS_SPI_DEV_EVE);
 }
 
 void eve_spi_stop(void) {
-    eos_spi_dev_deselect();
+    eos_spi_deselect();
 }
 
 #include <stdio.h>
diff --git a/fw/fe310/eos/eve/eve_touch.c b/fw/fe310/eos/eve/eve_touch.c
index f777093..e75cf4e 100644
--- a/fw/fe310/eos/eve/eve_touch.c
+++ b/fw/fe310/eos/eve/eve_touch.c
@@ -4,16 +4,16 @@
 
 #include "eve.h"
 
-static int _intr_mask = EVE_INT_TAG | EVE_INT_TOUCH;
-static int _multitouch;
-static uint8_t _tag0;
+static int touch_intr_mask = EVE_INT_TAG | EVE_INT_TOUCH;
+static int touch_multi;
+static uint8_t touch_tag0;
 
-static EVETouch _touch[EVE_MAX_TOUCH];
-static EVETouchTimer _touch_timer;
+static EVETouch touch_obj[EVE_MAX_TOUCH];
+static EVETouchTimer touch_timer;
 
-static eve_touch_handler_t _touch_handler;
-static void *_touch_handler_param;
-static uint8_t _tag_opt[256];
+static eve_touch_handler_t touch_handler;
+static void *touch_handler_param;
+static uint8_t touch_tag_opt[256];
 
 static const uint32_t _reg_touch[] = {
     REG_CTOUCH_TOUCH0_XY,
@@ -46,14 +46,14 @@ void eve_handle_touch(void) {
 
     eve_spi_start();
 
-    flags = eve_read8(REG_INT_FLAGS) & _intr_mask;
-    if (!_multitouch && (flags & EVE_INT_TOUCH)) _multitouch = 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;
         uint64_t now = 0;
         uint16_t touch_evt = 0;
-        EVETouch *touch = &_touch[i];
+        EVETouch *touch = &touch_obj[i];
 
         touch_xy = i < 4 ? eve_read32(_reg_touch[i]) : (((uint32_t)eve_read16(REG_CTOUCH_TOUCH4_X) << 16) | eve_read16(REG_CTOUCH_TOUCH4_Y));
 
@@ -95,8 +95,8 @@ void eve_handle_touch(void) {
                     }
 
                     eve_touch_timer_clear(touch);
-                    if (_touch_handler && touch_evt) {
-                        _touch_handler(_touch_timer.touch, touch_evt, _touch_timer.tag0, _touch_handler_param);
+                    if (touch_handler && touch_evt) {
+                        touch_handler(touch_timer.touch, touch_evt, touch_timer.tag0, touch_handler_param);
                     }
                 }
                 touch_evt = EVE_TOUCH_ETYPE_POINT | _evt;
@@ -122,7 +122,7 @@ void eve_handle_touch(void) {
             }
             touch->x = touch_x;
             touch->y = touch_y;
-            if (_multitouch || (flags & EVE_INT_TAG)) {
+            if (touch_multi || (flags & EVE_INT_TAG)) {
                 touch_tag = eve_read8(_reg_tag[i]);
             } else {
                 touch_tag = touch->tag;
@@ -139,13 +139,13 @@ void eve_handle_touch(void) {
                     eve_touch_timer_set_evt(touch, _ttevt & ~EVE_TOUCH_ETYPE_LPRESS);
                 }
                 if (touch->tracker.tag && touch->tracker.track) {
-                    uint8_t opt = _tag_opt[touch->tracker.tag];
+                    uint8_t opt = touch_tag_opt[touch->tracker.tag];
                     char track_ext = ((opt & EVE_TOUCH_OPT_TRACK_EXT_X) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_X)) ||
                                      ((opt & EVE_TOUCH_OPT_TRACK_EXT_Y) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_Y));
                     if (!eve_touch_timer_get_evt(NULL) && track_ext) {
                         EVEVTrack *vtrack = eve_vtrack_get();
 
-                        eve_touch_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, _tag0, EVE_TOUCH_TIMEOUT_TRACK);
+                        eve_touch_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, touch_tag0, EVE_TOUCH_TIMEOUT_TRACK);
                         if (vtrack->start) vtrack->start(touch, vtrack->param);
                     } else {
                         touch_evt |= EVE_TOUCH_ETYPE_TRACK_STOP;
@@ -155,23 +155,23 @@ void eve_handle_touch(void) {
         }
         if (touch_tag != touch->tag) {
             if (touch_tag) {
-                if (!_tag0) _tag0 = touch_tag;
+                if (!touch_tag0) touch_tag0 = touch_tag;
                 if (!touch->tag0) {
                     touch->tag0 = touch_tag;
-                    if (_tag_opt[touch_tag] & (EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_REG)) {
+                    if (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_REG)) {
                         touch->tracker.tag = touch_tag;
                     }
-                    if (touch->tracker.tag && !(_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY)) {
+                    if (touch->tracker.tag && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_XY)) {
                         touch_evt |= EVE_TOUCH_ETYPE_TRACK_START;
                         touch->tracker.track = 1;
                         touch->t = now;
                     }
-                    if (!eve_touch_timer_get_evt(NULL) && (_tag_opt[touch_tag] & (EVE_TOUCH_OPT_LPRESS | EVE_TOUCH_OPT_TAP2))) {
+                    if (!eve_touch_timer_get_evt(NULL) && (touch_tag_opt[touch_tag] & (EVE_TOUCH_OPT_LPRESS | EVE_TOUCH_OPT_TAP2))) {
                         uint16_t _evt = 0;
 
-                        if (_tag_opt[touch_tag] & EVE_TOUCH_OPT_LPRESS) _evt |= EVE_TOUCH_ETYPE_LPRESS;
-                        if (_tag_opt[touch_tag] & EVE_TOUCH_OPT_TAP2) _evt |= EVE_TOUCH_ETYPE_TAP2;
-                        eve_touch_timer_set(touch, _evt, _tag0, EVE_TOUCH_TIMEOUT_TAP);
+                        if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_LPRESS) _evt |= EVE_TOUCH_ETYPE_LPRESS;
+                        if (touch_tag_opt[touch_tag] & EVE_TOUCH_OPT_TAP2) _evt |= EVE_TOUCH_ETYPE_TAP2;
+                        eve_touch_timer_set(touch, _evt, touch_tag0, EVE_TOUCH_TIMEOUT_TAP);
                     }
                 }
             }
@@ -190,10 +190,10 @@ void eve_handle_touch(void) {
                 dx = dx < 0 ? -dx : dx;
                 dy = dy < 0 ? -dy : dy;
                 if (_track) {
-                    if ((dx > EVE_TOUCH_THRESHOLD_X) && !(_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_X)) {
+                    if ((dx > EVE_TOUCH_THRESHOLD_X) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_X)) {
                         touch->tracker.tag = 0;
                     }
-                    if ((dy > EVE_TOUCH_THRESHOLD_Y) && !(_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_Y)) {
+                    if ((dy > EVE_TOUCH_THRESHOLD_Y) && !(touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_Y)) {
                         touch->tracker.tag = 0;
                     }
                     if (touch->tracker.tag && ((dx > EVE_TOUCH_THRESHOLD_X) || (dy > EVE_TOUCH_THRESHOLD_Y))) {
@@ -214,8 +214,8 @@ void eve_handle_touch(void) {
                 }
             }
             if (touch->tracker.tag && touch->tracker.track) {
-                if (_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK) touch_evt |= EVE_TOUCH_ETYPE_TRACK;
-                if (_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_REG) touch_evt |= EVE_TOUCH_ETYPE_TRACK_REG;
+                if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK) touch_evt |= EVE_TOUCH_ETYPE_TRACK;
+                if (touch_tag_opt[touch->tracker.tag] & EVE_TOUCH_OPT_TRACK_REG) touch_evt |= EVE_TOUCH_ETYPE_TRACK_REG;
             }
             if (touch_evt & EVE_TOUCH_ETYPE_TRACK_REG) {
                 uint32_t touch_track = eve_read32(_reg_track[i]);
@@ -227,48 +227,48 @@ void eve_handle_touch(void) {
             }
             if (touch->tracker.tag || _timer) int_ccomplete = 1;
         }
-        if (_touch_handler && touch_evt) {
-            _touch_handler(touch, touch_evt, _tag0, _touch_handler_param);
+        if (touch_handler && touch_evt) {
+            touch_handler(touch, touch_evt, touch_tag0, touch_handler_param);
         }
-        if (!_multitouch) break;
+        if (!touch_multi) break;
     }
 
     if (!touch_ex) {
-        _tag0 = 0;
-        _multitouch = 0;
+        touch_tag0 = 0;
+        touch_multi = 0;
     }
 
-    if (_multitouch) int_ccomplete = 1;
+    if (touch_multi) int_ccomplete = 1;
 
-    if (int_ccomplete && !(_intr_mask & EVE_INT_CONVCOMPLETE)) {
-        _intr_mask |= EVE_INT_CONVCOMPLETE;
-        eve_write8(REG_INT_MASK, _intr_mask);
+    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)) {
-        _intr_mask &= ~EVE_INT_CONVCOMPLETE;
-        eve_write8(REG_INT_MASK, _intr_mask);
+    if (!int_ccomplete && (touch_intr_mask & EVE_INT_CONVCOMPLETE)) {
+        touch_intr_mask &= ~EVE_INT_CONVCOMPLETE;
+        eve_write8(REG_INT_MASK, touch_intr_mask);
     }
 
     eve_spi_stop();
 }
 
 void eve_handle_time(void) {
-    EVETouch *touch = _touch_timer.touch;
+    EVETouch *touch = touch_timer.touch;
 
-    if (_touch_timer.evt) {
+    if (touch_timer.evt) {
         int more = 0;
         uint16_t touch_evt = 0;
 
         eve_spi_start();
 
-        if (_touch_timer.evt & EVE_TOUCH_ETYPE_LPRESS) {
+        if (touch_timer.evt & EVE_TOUCH_ETYPE_LPRESS) {
             touch_evt |= EVE_TOUCH_ETYPE_LPRESS;
             if (touch) touch->eevt |= EVE_TOUCH_EETYPE_LPRESS;
         }
-        if (_touch_timer.evt & EVE_TOUCH_ETYPE_TAP2) {
+        if (touch_timer.evt & EVE_TOUCH_ETYPE_TAP2) {
             touch_evt |= EVE_TOUCH_ETYPE_TAP1;
         }
-        if (_touch_timer.evt & EVE_TOUCH_ETYPE_TRACK) {
+        if (touch_timer.evt & EVE_TOUCH_ETYPE_TRACK) {
             EVEVTrack *vtrack = eve_vtrack_get();
 
             if (vtrack->tick) {
@@ -280,19 +280,19 @@ void eve_handle_time(void) {
                 if (vtrack->stop) vtrack->stop(touch, vtrack->param);
             }
         }
-        if (_touch_timer.evt & EVE_TOUCH_ETYPE_TIMER) {
+        if (touch_timer.evt & EVE_TOUCH_ETYPE_TIMER) {
             touch_evt |= EVE_TOUCH_ETYPE_TIMER;
             more = 1;
         }
 
         if (more) {
-            eve_timer_set(_touch_timer.to);
+            eve_timer_set(touch_timer.to);
         } else {
-            _touch_timer.evt = 0;
+            touch_timer.evt = 0;
         }
 
-        if (_touch_handler && touch_evt) {
-            _touch_handler(touch, touch_evt, _touch_timer.tag0, _touch_handler_param);
+        if (touch_handler && touch_evt) {
+            touch_handler(touch, touch_evt, touch_timer.tag0, touch_handler_param);
         }
 
         eve_spi_stop();
@@ -305,27 +305,27 @@ void eve_touch_init(void) {
     eve_vtrack_init();
 
     for (i=0; i<EVE_MAX_TOUCH; i++) {
-        EVETouch *touch = &_touch[i];
+        EVETouch *touch = &touch_obj[i];
         touch->eevt |= EVE_TOUCH_EETYPE_NOTOUCH;
     }
 
-    eve_write8(REG_INT_MASK, _intr_mask);
+    eve_write8(REG_INT_MASK, touch_intr_mask);
     eve_write8(REG_INT_EN, 0x01);
     while(eve_read8(REG_INT_FLAGS));
 }
 
 void eve_touch_set_handler(eve_touch_handler_t handler, void *param) {
-    _touch_handler = handler;
-    _touch_handler_param = param;
+    touch_handler = handler;
+    touch_handler_param = param;
 }
 
 EVETouch *eve_touch_get(int i) {
-    return &_touch[i];
+    return &touch_obj[i];
 }
 
 int8_t eve_touch_get_idx(EVETouch *touch) {
     if (touch == NULL) return -1;
-    return touch - _touch;
+    return touch - touch_obj;
 }
 
 uint16_t eve_touch_evt(EVETouch *touch, uint16_t evt, uint8_t tag0, uint8_t tag_min, uint8_t tag_n) {
@@ -363,22 +363,22 @@ uint16_t eve_touch_evt(EVETouch *touch, uint16_t evt, uint8_t tag0, uint8_t tag_
 }
 
 void eve_touch_set_opt(uint8_t tag, uint8_t opt) {
-    _tag_opt[tag] = opt;
+    touch_tag_opt[tag] = opt;
 }
 
 uint8_t eve_touch_get_opt(uint8_t tag) {
-    return _tag_opt[tag];
+    return touch_tag_opt[tag];
 }
 
 void eve_touch_clear_opt(void) {
-    memset(_tag_opt, 0, sizeof(_tag_opt));
+    memset(touch_tag_opt, 0, sizeof(touch_tag_opt));
 }
 
 void eve_touch_timer_set(EVETouch *touch, uint16_t evt, uint8_t tag0, uint32_t to) {
-    _touch_timer.touch = touch;
-    _touch_timer.evt = evt;
-    _touch_timer.tag0 = tag0;
-    _touch_timer.to = to;
+    touch_timer.touch = touch;
+    touch_timer.evt = evt;
+    touch_timer.tag0 = tag0;
+    touch_timer.to = to;
     eve_timer_set(to);
 }
 
@@ -389,21 +389,21 @@ void eve_touch_timer_clear(EVETouch *touch) {
 uint16_t eve_touch_timer_get_evt(EVETouch *touch) {
     uint16_t ret = 0;
 
-    if ((touch == NULL) || (_touch_timer.touch == touch)) {
-        ret = _touch_timer.evt;
-    } else if (_touch_timer.touch == NULL) {
-        ret = _touch_timer.evt & EVE_TOUCH_ETYPE_TIMER;
+    if ((touch == NULL) || (touch_timer.touch == touch)) {
+        ret = touch_timer.evt;
+    } else if (touch_timer.touch == NULL) {
+        ret = touch_timer.evt & EVE_TOUCH_ETYPE_TIMER;
     }
     return ret;
 }
 
 void eve_touch_timer_set_evt(EVETouch *touch, uint16_t evt) {
-    if (touch == _touch_timer.touch) {
-        _touch_timer.evt = evt;
-    } else if (_touch_timer.touch == NULL) {
-        _touch_timer.evt = evt & EVE_TOUCH_ETYPE_TIMER;
+    if (touch == touch_timer.touch) {
+        touch_timer.evt = evt;
+    } else if (touch_timer.touch == NULL) {
+        touch_timer.evt = evt & EVE_TOUCH_ETYPE_TIMER;
     }
-    if (!_touch_timer.evt) eve_timer_clear();
+    if (!touch_timer.evt) eve_timer_clear();
 }
 
 void eve_touch_timer_start(uint8_t tag0, uint32_t to) {
@@ -415,5 +415,5 @@ void eve_touch_timer_stop(void) {
 }
 
 EVETouchTimer *eve_touch_timer_get(void) {
-    return &_touch_timer;
+    return &touch_timer;
 }
diff --git a/fw/fe310/eos/eve/eve_vtrack.c b/fw/fe310/eos/eve/eve_vtrack.c
index dfa8ba8..b9f28af 100644
--- a/fw/fe310/eos/eve/eve_vtrack.c
+++ b/fw/fe310/eos/eve/eve_vtrack.c
@@ -3,32 +3,32 @@
 
 #include "eve.h"
 
-static EVEVTrack _vtrack;
-static EVEPhyAcc _vtrack_acc;
+static EVEVTrack vtrack;
+static EVEPhyAcc vtrack_acc;
 
 void eve_vtrack_init(void) {
-    eve_phy_acc_init(&_vtrack_acc, -EVE_VTRACK_ACC_A);
+    eve_phy_acc_init(&vtrack_acc, -EVE_VTRACK_ACC_A);
     eve_vtrack_reset();
 }
 
 EVEVTrack *eve_vtrack_get(void) {
-    return &_vtrack;
+    return &vtrack;
 }
 
 void eve_vtrack_set(eve_vtrack_start_t start, eve_vtrack_tick_t tick, eve_vtrack_stop_t stop, void *param) {
-    _vtrack.start = start;
-    _vtrack.tick = tick;
-    _vtrack.stop = stop;
-    _vtrack.param = param;
+    vtrack.start = start;
+    vtrack.tick = tick;
+    vtrack.stop = stop;
+    vtrack.param = param;
 }
 
 void eve_vtrack_reset(void) {
-    eve_vtrack_set(eve_vtrack_acc_start, eve_vtrack_acc_tick, NULL, &_vtrack_acc);
+    eve_vtrack_set(eve_vtrack_acc_start, eve_vtrack_acc_tick, NULL, &vtrack_acc);
 }
 
 void eve_vtrack_start(EVETouch *touch, uint8_t tag0, uint32_t to) {
     eve_touch_timer_set(touch, EVE_TOUCH_ETYPE_TRACK, tag0, to);
-    if (_vtrack.start) _vtrack.start(touch, _vtrack.param);
+    if (vtrack.start) vtrack.start(touch, vtrack.param);
 }
 
 void eve_vtrack_stop(EVETouch *touch) {
diff --git a/fw/fe310/eos/eve/screen/window.c b/fw/fe310/eos/eve/screen/window.c
index 4f059c4..63a59a9 100644
--- a/fw/fe310/eos/eve/screen/window.c
+++ b/fw/fe310/eos/eve/screen/window.c
@@ -68,7 +68,7 @@ int eve_window_visible(EVEWindow *window) {
     return 1;
 }
 
-static void _window_visible_g(EVEWindow *w, EVERect *g) {
+static void window_visible_g(EVEWindow *w, EVERect *g) {
     while (w) {
         if (eve_window_visible(w)) {
             if (w->g.x > g->x) g->w = MIN(g->w, w->g.x - g->x);
@@ -84,15 +84,15 @@ static void _window_visible_g(EVEWindow *w, EVERect *g) {
                 g->h -= y0;
             }
         }
-        if (w->child_head) _window_visible_g(w->child_head, g);
+        if (w->child_head) window_visible_g(w->child_head, g);
         w = w->next;
     }
 }
 
 void eve_window_visible_g(EVEWindow *window, EVERect *g) {
     *g = window->g;
-    if (window->child_head) _window_visible_g(window->child_head, g);
-    _window_visible_g(window->next, g);
+    if (window->child_head) window_visible_g(window->child_head, g);
+    window_visible_g(window->next, g);
 }
 
 void eve_window_append(EVEWindow *window) {
diff --git a/fw/fe310/eos/eve/widget/selectw.c b/fw/fe310/eos/eve/widget/selectw.c
index 7873e95..46ed3d1 100644
--- a/fw/fe310/eos/eve/widget/selectw.c
+++ b/fw/fe310/eos/eve/widget/selectw.c
@@ -16,7 +16,7 @@
 
 #define DIVC(x,y)               ((x) / (y) + ((x) % (y) != 0))
 
-static int _selectw_verify(utf8_t *option, uint16_t option_size) {
+static int selectw_verify(utf8_t *option, uint16_t option_size) {
     int o_len;
     uint16_t o_curr;
     int rv;
@@ -32,7 +32,7 @@ static int _selectw_verify(utf8_t *option, uint16_t option_size) {
     return EVE_OK;
 }
 
-static int _selectw_count(EVESelectWidget *widget) {
+static int selectw_count(EVESelectWidget *widget) {
     int o_len;
     int o_curr;
     int i;
@@ -51,7 +51,7 @@ static int _selectw_count(EVESelectWidget *widget) {
     return i;
 }
 
-static void _selectw_update_sz(EVESelectWidget *widget, int uievt) {
+static void selectw_update_sz(EVESelectWidget *widget, int uievt) {
     EVEWidget *_widget = &widget->w;
     EVEPage *page = _widget->page;
 
@@ -81,12 +81,12 @@ void eve_selectw_init(EVESelectWidget *widget, EVERect *g, EVEPage *page, EVEFon
     memset(widget, 0, sizeof(EVESelectWidget));
     eve_widget_init(_widget, EVE_WIDGET_TYPE_SELECT, g, page, eve_selectw_draw, eve_selectw_touch, NULL);
     widget->font = font;
-    rv = _selectw_verify(option, option_size);
+    rv = selectw_verify(option, option_size);
     if (rv == EVE_OK) {
         widget->option = option;
         widget->option_size = option_size;
-        widget->option_count = _selectw_count(widget);
-        _selectw_update_sz(widget, 0);
+        widget->option_count = selectw_count(widget);
+        selectw_update_sz(widget, 0);
     }
     widget->multi = multi;
     widget->select = widget->multi ? 0 : SELECTW_NOSELECT;
@@ -226,7 +226,7 @@ int eve_selectw_option_add(EVESelectWidget *widget, utf8_t *option) {
     strcpy(widget->option + o_curr, option);
 
     widget->option_count = i + 1;
-    _selectw_update_sz(widget, 1);
+    selectw_update_sz(widget, 1);
 
     return EVE_OK;
 }
@@ -234,15 +234,15 @@ int eve_selectw_option_add(EVESelectWidget *widget, utf8_t *option) {
 int eve_selectw_option_set(EVESelectWidget *widget, utf8_t *option, uint16_t option_size) {
     int rv, i;
 
-    rv = _selectw_verify(option, option_size);
+    rv = selectw_verify(option, option_size);
     if (rv) return rv;
     if (option_size > widget->option_size) return EVE_ERR_FULL;
 
     memcpy(widget->option, option, option_size);
     memset(widget->option + option_size, 0, widget->option_size - option_size);
 
-    widget->option_count = _selectw_count(widget);
-    _selectw_update_sz(widget, 1);
+    widget->option_count = selectw_count(widget);
+    selectw_update_sz(widget, 1);
 
     return EVE_OK;
 }
diff --git a/fw/fe310/eos/eve/widget/strw.c b/fw/fe310/eos/eve/widget/strw.c
index b169adb..232e52c 100644
--- a/fw/fe310/eos/eve/widget/strw.c
+++ b/fw/fe310/eos/eve/widget/strw.c
@@ -90,7 +90,7 @@ static EVEStrCursor *cursor_prox(EVEStrWidget *widget, EVEStrCursor *cursor, EVE
     return NULL;
 }
 
-static void _draw_str(EVEStrWidget *widget, uint16_t ch, uint16_t len, uint16_t x1, uint16_t x2, char s) {
+static void draw_string(EVEStrWidget *widget, uint16_t ch, uint16_t len, uint16_t x1, uint16_t x2, char s) {
     int16_t x;
     EVEWidget *_widget = &widget->w;
     EVEPage *page = _widget->page;
@@ -116,7 +116,7 @@ static void _draw_str(EVEStrWidget *widget, uint16_t ch, uint16_t len, uint16_t
     }
 }
 
-static void _draw_cursor(EVEStrWidget *widget, EVEStrCursor *cursor) {
+static void draw_cursor(EVEStrWidget *widget, EVEStrCursor *cursor) {
     uint16_t x, y;
     EVEWidget *_widget = &widget->w;
 
@@ -187,12 +187,12 @@ uint8_t eve_strw_draw(EVEWidget *_widget, uint8_t tag0) {
         l1 = c1->ch;
         l2 = c2->ch - c1->ch;
         l3 = widget->str_len - c2->ch;
-        _draw_str(widget, 0, l1, 0, c1->x, 0);
-        _draw_str(widget, c1->ch, l2, c1->x, c2->x, 1);
-        _draw_str(widget, c2->ch, l3, c2->x, widget->str_g.x + _widget->g.w, 0);
+        draw_string(widget, 0, l1, 0, c1->x, 0);
+        draw_string(widget, c1->ch, l2, c1->x, c2->x, 1);
+        draw_string(widget, c2->ch, l3, c2->x, widget->str_g.x + _widget->g.w, 0);
     } else {
-        if (widget->cursor1.on) _draw_cursor(widget, &widget->cursor1);
-        _draw_str(widget, 0, widget->str_len, 0, widget->str_g.x + _widget->g.w, 0);
+        if (widget->cursor1.on) draw_cursor(widget, &widget->cursor1);
+        draw_string(widget, 0, widget->str_len, 0, widget->str_g.x + _widget->g.w, 0);
     }
 
     if (cut) {
diff --git a/fw/fe310/eos/eve/widget/textw.c b/fw/fe310/eos/eve/widget/textw.c
index abf2a68..e994c0e 100644
--- a/fw/fe310/eos/eve/widget/textw.c
+++ b/fw/fe310/eos/eve/widget/textw.c
@@ -107,7 +107,7 @@ static EVETextCursor *cursor_prox(EVETextWidget *widget, EVETextCursor *cursor,
     return NULL;
 }
 
-static void _draw_line(EVETextWidget *widget, uint16_t l, uint16_t ch, uint16_t len, uint16_t x1, uint16_t x2, char s) {
+static void draw_line(EVETextWidget *widget, uint16_t l, uint16_t ch, uint16_t len, uint16_t x1, uint16_t x2, char s) {
     EVEWidget *_widget = &widget->w;
     EVEPage *page = _widget->page;
 
@@ -131,7 +131,7 @@ static void _draw_line(EVETextWidget *widget, uint16_t l, uint16_t ch, uint16_t
     }
 }
 
-static void _draw_cursor(EVETextWidget *widget, EVETextCursor *cursor) {
+static void draw_cursor(EVETextWidget *widget, EVETextCursor *cursor) {
     uint16_t x, y;
     EVEWidget *_widget = &widget->w;
 
@@ -198,10 +198,10 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) {
                     l3 = 0;
                     s = 1;
                 }
-                _draw_line(widget, i, LINE_START(widget, i), l1, 0, c1->x, 0);
-                _draw_line(widget, i, c1->ch, l2, c1->x, s ? _widget->g.w : c2->x, 1);
+                draw_line(widget, i, LINE_START(widget, i), l1, 0, c1->x, 0);
+                draw_line(widget, i, c1->ch, l2, c1->x, s ? _widget->g.w : c2->x, 1);
                 if (!s) {
-                    _draw_line(widget, i, c2->ch, l3, c2->x, _widget->g.w, 0);
+                    draw_line(widget, i, c2->ch, l3, c2->x, _widget->g.w, 0);
                     c1 = NULL;
                     c2 = NULL;
                 }
@@ -209,14 +209,14 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) {
                 int l1 = c2->ch - LINE_START(widget, i);
                 int l2 = LINE_START(widget, i) + LINE_LEN(widget, i) - c2->ch;
 
-                _draw_line(widget, i, LINE_START(widget, i), l1, 0, c2->x, 1);
-                _draw_line(widget, i, c2->ch, l2, c2->x, _widget->g.w, 0);
+                draw_line(widget, i, LINE_START(widget, i), l1, 0, c2->x, 1);
+                draw_line(widget, i, c2->ch, l2, c2->x, _widget->g.w, 0);
                 c1 = NULL;
                 c2 = NULL;
                 s = 0;
             } else {
-                if (widget->cursor1.on && (widget->cursor1.line == i)) _draw_cursor(widget, &widget->cursor1);
-                _draw_line(widget, i, LINE_START(widget, i), LINE_LEN(widget, i), 0, _widget->g.w, s);
+                if (widget->cursor1.on && (widget->cursor1.line == i)) draw_cursor(widget, &widget->cursor1);
+                draw_line(widget, i, LINE_START(widget, i), LINE_LEN(widget, i), 0, _widget->g.w, s);
             }
         }
         if (lineNvisible) {
@@ -225,7 +225,7 @@ uint8_t eve_textw_draw(EVEWidget *_widget, uint8_t tag0) {
                 eve_touch_set_opt(_widget->tagN, TEXTW_TOUCH_OPT);
                 _widget->tagN++;
             }
-            _draw_line(widget, lineN, 0, 0, 0, _widget->g.w, 0);
+            draw_line(widget, lineN, 0, 0, 0, _widget->g.w, 0);
         }
     } else {
         widget->line0 = 0;
diff --git a/fw/fe310/eos/i2s.c b/fw/fe310/eos/i2s.c
index c8216ff..b4fd277 100644
--- a/fw/fe310/eos/i2s.c
+++ b/fw/fe310/eos/i2s.c
@@ -9,13 +9,14 @@
 #include "interrupt.h"
 #include "event.h"
 
+#include "board.h"
+
 #include "i2s.h"
-#include "i2s_def.h"
-#include "irq_def.h"
+#include "i2s_priv.h"
 
-#define I2S_PWM_REG_CK      PWM0_REG
-#define I2S_PWM_REG_WS_MIC  PWM1_REG
-#define I2S_PWM_REG_WS_SPK  PWM2_REG
+#define I2S_REG_CK(o)       _REG32(I2S_CTRL_ADDR_CK, o)
+#define I2S_REG_WS_MIC(o)   _REG32(I2S_CTRL_ADDR_WS_MIC, o)
+#define I2S_REG_WS_SPK(o)   _REG32(I2S_CTRL_ADDR_WS_SPK, o)
 
 #define MIN(X, Y)           (((X) < (Y)) ? (X) : (Y))
 #define MAX(X, Y)           (((X) > (Y)) ? (X) : (Y))
@@ -112,22 +113,22 @@ static void i2s_handle_evt(unsigned char type, unsigned char *buffer, uint16_t l
 }
 
 static void _mic_vol_set(uint8_t vol) {
-    I2S_PWM_REG_WS_MIC(PWM_CMP2) = i2s_clk_period * (vol + 1);
-    I2S_PWM_REG_WS_MIC(PWM_CMP3) = I2S_PWM_REG_WS_MIC(PWM_CMP2) + i2s_clk_period * 16;
+    I2S_REG_WS_MIC(PWM_CMP2) = i2s_clk_period * (vol + 1);
+    I2S_REG_WS_MIC(PWM_CMP3) = I2S_REG_WS_MIC(PWM_CMP2) + i2s_clk_period * 16;
 }
 
 static void _spk_vol_set(uint8_t vol) {
     int spk_cmp = vol + i2s_mic_volume - 16;
 
     if (spk_cmp <= 0) {
-        I2S_PWM_REG_WS_SPK(PWM_CMP1) = i2s_clk_period * (32 + spk_cmp);
-        I2S_PWM_REG_WS_SPK(PWM_CMP2) = i2s_clk_period * (64 + spk_cmp);
-        I2S_PWM_REG_WS_SPK(PWM_CMP3) = i2s_clk_period * 33;
+        I2S_REG_WS_SPK(PWM_CMP1) = i2s_clk_period * (32 + spk_cmp);
+        I2S_REG_WS_SPK(PWM_CMP2) = i2s_clk_period * (64 + spk_cmp);
+        I2S_REG_WS_SPK(PWM_CMP3) = i2s_clk_period * 33;
         GPIO_REG(GPIO_OUTPUT_XOR) &= ~(1 << I2S_PIN_WS_SPK);
     } else {
-        I2S_PWM_REG_WS_SPK(PWM_CMP1) = i2s_clk_period * spk_cmp;
-        I2S_PWM_REG_WS_SPK(PWM_CMP2) = i2s_clk_period * (32 + spk_cmp);
-        I2S_PWM_REG_WS_SPK(PWM_CMP3) = i2s_clk_period * (33 + spk_cmp);
+        I2S_REG_WS_SPK(PWM_CMP1) = i2s_clk_period * spk_cmp;
+        I2S_REG_WS_SPK(PWM_CMP2) = i2s_clk_period * (32 + spk_cmp);
+        I2S_REG_WS_SPK(PWM_CMP3) = i2s_clk_period * (33 + spk_cmp);
         GPIO_REG(GPIO_OUTPUT_XOR) |= (1 << I2S_PIN_WS_SPK);
     }
 }
@@ -179,21 +180,21 @@ void eos_i2s_init(void) {
 void eos_i2s_start(uint32_t sample_rate, unsigned char fmt) {
     i2s_clk_period = ((PRCI_get_cpu_freq() / (sample_rate * 64)) & ~I2S_PWM_SCALE_CK_MASK) + 1;
 
-    I2S_PWM_REG_CK(PWM_CMP0)            = i2s_clk_period >> I2S_PWM_SCALE_CK;
-    I2S_PWM_REG_CK(PWM_CMP1)            = I2S_PWM_REG_CK(PWM_CMP0) / 2;
-    I2S_PWM_REG_CK(PWM_CMP2)            = 0;
-    I2S_PWM_REG_CK(PWM_CMP3)            = 0;
+    I2S_REG_CK(PWM_CMP0)        = i2s_clk_period >> I2S_PWM_SCALE_CK;
+    I2S_REG_CK(PWM_CMP1)        = I2S_REG_CK(PWM_CMP0) / 2;
+    I2S_REG_CK(PWM_CMP2)        = 0;
+    I2S_REG_CK(PWM_CMP3)        = 0;
 
-    I2S_PWM_REG_WS_MIC(PWM_CMP0)        = i2s_clk_period * 64 - 1;
-    I2S_PWM_REG_WS_MIC(PWM_CMP1)        = i2s_clk_period * 32;
+    I2S_REG_WS_MIC(PWM_CMP0)    = i2s_clk_period * 64 - 1;
+    I2S_REG_WS_MIC(PWM_CMP1)    = i2s_clk_period * 32;
     _mic_vol_set(i2s_mic_volume);
 
-    I2S_PWM_REG_WS_SPK(PWM_CMP0)        = i2s_clk_period * 64 - 1;
+    I2S_REG_WS_SPK(PWM_CMP0)    = i2s_clk_period * 64 - 1;
     _spk_vol_set(i2s_spk_volume);
 
-    I2S_PWM_REG_CK(PWM_COUNT)           = 0;
-    I2S_PWM_REG_WS_MIC(PWM_COUNT)       = 0;
-    I2S_PWM_REG_WS_SPK(PWM_COUNT)       = i2s_clk_period / 2;
+    I2S_REG_CK(PWM_COUNT)       = 0;
+    I2S_REG_WS_MIC(PWM_COUNT)   = 0;
+    I2S_REG_WS_SPK(PWM_COUNT)   = i2s_clk_period / 2;
 
     _eos_i2s_fmt = fmt;
     _eos_i2s_mic_evt_enable = 1;
@@ -206,9 +207,9 @@ void eos_i2s_start(uint32_t sample_rate, unsigned char fmt) {
 
     _eos_i2s_start_pwm();
     /*
-    I2S_PWM_REG_CK(PWM_CFG)         = PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | I2S_PWM_SCALE_CK;
-    I2S_PWM_REG_WS_MIC(PWM_CFG)     = PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | PWM_CFG_CMP2GANG;
-    I2S_PWM_REG_WS_SPK(PWM_CFG)     = PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | PWM_CFG_CMP1GANG;
+    I2S_REG_CK(PWM_CFG)         = PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | I2S_PWM_SCALE_CK;
+    I2S_REG_WS_MIC(PWM_CFG)     = PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | PWM_CFG_CMP2GANG;
+    I2S_REG_WS_SPK(PWM_CFG)     = PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | PWM_CFG_CMP1GANG;
     */
 
     GPIO_REG(GPIO_INPUT_EN)     |=  (1 << I2S_PIN_SD_IN);
@@ -228,12 +229,12 @@ void eos_i2s_start(uint32_t sample_rate, unsigned char fmt) {
 }
 
 void eos_i2s_stop(void) {
-    I2S_PWM_REG_CK(PWM_CFG)         = 0;
-    I2S_PWM_REG_WS_MIC(PWM_CFG)     = 0;
-    I2S_PWM_REG_WS_SPK(PWM_CFG)     = 0;
-    I2S_PWM_REG_CK(PWM_COUNT)       = 0;
-    I2S_PWM_REG_WS_MIC(PWM_COUNT)   = 0;
-    I2S_PWM_REG_WS_SPK(PWM_COUNT)   = 0;
+    I2S_REG_CK(PWM_CFG)         = 0;
+    I2S_REG_WS_MIC(PWM_CFG)     = 0;
+    I2S_REG_WS_SPK(PWM_CFG)     = 0;
+    I2S_REG_CK(PWM_COUNT)       = 0;
+    I2S_REG_WS_MIC(PWM_COUNT)   = 0;
+    I2S_REG_WS_SPK(PWM_COUNT)   = 0;
 
     _eos_i2s_mic_evt_enable = 0;
     _eos_i2s_spk_evt_enable = 0;
diff --git a/fw/fe310/eos/i2s.h b/fw/fe310/eos/i2s.h
index 744958e..47dc3e2 100644
--- a/fw/fe310/eos/i2s.h
+++ b/fw/fe310/eos/i2s.h
@@ -1,12 +1,6 @@
 #include <stdint.h>
 
-#define EOS_I2S_FMT_ALAW        0
-#define EOS_I2S_FMT_PCM16       1
-
-/* should match i2s_def.h definitions */
-#define EOS_I2S_ETYPE_MIC       1
-#define EOS_I2S_ETYPE_SPK       2
-
+#include "i2s_def.h"
 
 typedef struct EOSABuf {
     uint16_t idx_r;
diff --git a/fw/fe310/eos/i2s_def.h b/fw/fe310/eos/i2s_def.h
index 3a09982..1af70bb 100644
--- a/fw/fe310/eos/i2s_def.h
+++ b/fw/fe310/eos/i2s_def.h
@@ -1,24 +1,5 @@
-#define I2S_ETYPE_MIC           1
-#define I2S_ETYPE_SPK           2
+#define EOS_I2S_FMT_ALAW        0
+#define EOS_I2S_FMT_PCM16       1
 
-#define I2S_PIN_CK              1       /* PWM 0.1 */
-#define I2S_PIN_CK_SW           21      /* PWM 1.2 */
-#define I2S_PIN_CK_SR           18
-#define I2S_PIN_WS_MIC          19      /* PWM 1.1 */
-#define I2S_PIN_WS_SPK          11      /* PWM 2.1 */
-#define I2S_PIN_SD_IN           13
-#define I2S_PIN_SD_OUT          12
-
-#define I2S_IRQ_WS_ID           (INT_PWM2_BASE + 0)
-#define I2S_IRQ_SD_ID           (INT_PWM2_BASE + 3)
-
-#define I2S_IDLE_CYCLES         8
-
-#define I2S_PWM_SCALE_CK        2
-#define I2S_PWM_SCALE_CK_MASK   0x0003
-
-/* asm */
-#define I2S_ABUF_OFF_IDXR       0
-#define I2S_ABUF_OFF_IDXW       2
-#define I2S_ABUF_OFF_SIZE       4
-#define I2S_ABUF_OFF_ARRAY      8
+#define EOS_I2S_ETYPE_MIC       1
+#define EOS_I2S_ETYPE_SPK       2
diff --git a/fw/fe310/eos/i2s_priv.h b/fw/fe310/eos/i2s_priv.h
new file mode 100644
index 0000000..25237c3
--- /dev/null
+++ b/fw/fe310/eos/i2s_priv.h
@@ -0,0 +1,8 @@
+#define I2S_PWM_SCALE_CK        2
+#define I2S_PWM_SCALE_CK_MASK   0x0003
+
+/* asm */
+#define I2S_ABUF_OFF_IDXR       0
+#define I2S_ABUF_OFF_IDXW       2
+#define I2S_ABUF_OFF_SIZE       4
+#define I2S_ABUF_OFF_ARRAY      8
diff --git a/fw/fe310/eos/interrupt.h b/fw/fe310/eos/interrupt.h
index 075e7eb..feaf277 100644
--- a/fw/fe310/eos/interrupt.h
+++ b/fw/fe310/eos/interrupt.h
@@ -1,5 +1,7 @@
 #include <stdint.h>
 
+#include "irq_def.h"
+
 typedef void (*eos_intr_handler_t) (void);
 
 void eos_intr_init(void);
diff --git a/fw/fe310/eos/msgq_def.h b/fw/fe310/eos/msgq_def.h
deleted file mode 100644
index 2ad5fc5..0000000
--- a/fw/fe310/eos/msgq_def.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/* asm */
-#define MSGQ_OFF_IDXR       0
-#define MSGQ_OFF_IDXW       1
-#define MSGQ_OFF_SIZE       2
-#define MSGQ_OFF_ARRAY      4
-
-#define MSGQ_ITEM_OFF_TYPE  0
-#define MSGQ_ITEM_OFF_BUF   4
-#define MSGQ_ITEM_OFF_SIZE  8
-#define MSGQ_ITEM_SIZE      12
diff --git a/fw/fe310/eos/msgq_priv.h b/fw/fe310/eos/msgq_priv.h
new file mode 100644
index 0000000..2ad5fc5
--- /dev/null
+++ b/fw/fe310/eos/msgq_priv.h
@@ -0,0 +1,10 @@
+/* asm */
+#define MSGQ_OFF_IDXR       0
+#define MSGQ_OFF_IDXW       1
+#define MSGQ_OFF_SIZE       2
+#define MSGQ_OFF_ARRAY      4
+
+#define MSGQ_ITEM_OFF_TYPE  0
+#define MSGQ_ITEM_OFF_BUF   4
+#define MSGQ_ITEM_OFF_SIZE  8
+#define MSGQ_ITEM_SIZE      12
diff --git a/fw/fe310/eos/net.c b/fw/fe310/eos/net.c
index eb5e6f2..c9bbc63 100644
--- a/fw/fe310/eos/net.c
+++ b/fw/fe310/eos/net.c
@@ -6,17 +6,25 @@
 
 #include "eos.h"
 #include "msgq.h"
-#include "event.h"
 #include "interrupt.h"
+#include "event.h"
 #include "timer.h"
 #include "power.h"
 
+#include "board.h"
+
 #include "spi.h"
-#include "spi_def.h"
+#include "spi_priv.h"
 
 #include "net.h"
-#include "net_def.h"
-#include "irq_def.h"
+
+#define NET_STATE_FLAG_RUN      0x01
+#define NET_STATE_FLAG_RST      0x02
+#define NET_STATE_FLAG_RTS      0x04
+#define NET_STATE_FLAG_CTS      0x08
+#define NET_STATE_FLAG_INIT     0x10
+#define NET_STATE_FLAG_ONEW     0x20
+#define NET_STATE_FLAG_XCHG     0x40
 
 #define MIN(X, Y)               (((X) < (Y)) ? (X) : (Y))
 #define MAX(X, Y)               (((X) > (Y)) ? (X) : (Y))
@@ -312,8 +320,8 @@ void eos_net_init(void) {
 
 void eos_net_start(void) {
     eos_intr_set_handler(INT_SPI1_BASE, net_handle_xchg);
-    SPI1_REG(SPI_REG_SCKDIV) = NET_SPI_DIV;
-    SPI1_REG(SPI_REG_CSID) = NET_SPI_CSID;
+    SPI1_REG(SPI_REG_SCKDIV) = eos_spi_div(EOS_SPI_DEV_NET);
+    SPI1_REG(SPI_REG_CSID) = eos_spi_csid(EOS_SPI_DEV_NET);
 
     clear_csr(mstatus, MSTATUS_MIE);
     net_state_flags |= NET_STATE_FLAG_RUN;
@@ -396,8 +404,8 @@ int eos_net_wake(uint8_t source) {
     if (rv) return rv;
 
     eos_intr_set_handler(INT_SPI1_BASE, net_handle_xchg);
-    SPI1_REG(SPI_REG_SCKDIV) = NET_SPI_DIV;
-    SPI1_REG(SPI_REG_CSID) = NET_SPI_CSID;
+    SPI1_REG(SPI_REG_SCKDIV) = eos_spi_div(EOS_SPI_DEV_NET);
+    SPI1_REG(SPI_REG_CSID) = eos_spi_csid(EOS_SPI_DEV_NET);
 
     clear_csr(mstatus, MSTATUS_MIE);
     net_state_flags |= NET_STATE_FLAG_RUN;
@@ -494,7 +502,7 @@ int eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsign
 
         set_csr(mstatus, MSTATUS_MIE);
         spi_dev = eos_spi_dev();
-        rv = eos_spi_dev_deselect();
+        rv = eos_spi_deselect();
         if (rv) return rv;
 
         clear_csr(mstatus, MSTATUS_MIE);
@@ -506,7 +514,7 @@ int eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsign
         net_xchg_start(type, buffer, len);
         set_csr(mstatus, MSTATUS_MIE);
 
-        eos_spi_dev_select(spi_dev);
+        eos_spi_select(spi_dev);
     } else {
         if ((net_state_flags & NET_STATE_FLAG_RUN) && (net_state_flags & NET_STATE_FLAG_CTS)) {
             net_xchg_start(type, buffer, len);
diff --git a/fw/fe310/eos/net_def.h b/fw/fe310/eos/net_def.h
deleted file mode 100644
index 9aa25dd..0000000
--- a/fw/fe310/eos/net_def.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#define NET_PIN_RTS             20
-#define NET_PIN_CTS             22
-
-#define NET_STATE_FLAG_RUN      0x01
-#define NET_STATE_FLAG_RST      0x02
-#define NET_STATE_FLAG_RTS      0x04
-#define NET_STATE_FLAG_CTS      0x08
-#define NET_STATE_FLAG_INIT     0x10
-#define NET_STATE_FLAG_ONEW     0x20
-#define NET_STATE_FLAG_XCHG     0x40
-
-#define NET_SPI_DIV             16
-#define NET_SPI_CSID            3
diff --git a/fw/fe310/eos/power.c b/fw/fe310/eos/power.c
index 55960c9..6f292b8 100644
--- a/fw/fe310/eos/power.c
+++ b/fw/fe310/eos/power.c
@@ -74,9 +74,9 @@ uint8_t eos_power_reset_cause(void) {
 }
 
 void eos_power_sleep(void) {
-    eos_spi_dev_select(EOS_DEV_DISP);
+    eos_spi_select(EOS_SPI_DEV_EVE);
     eve_sleep();
-    eos_spi_dev_deselect();
+    eos_spi_deselect();
     eos_net_sleep(1000);
 
     AON_REG(AON_PMUKEY) = 0x51F15E;
diff --git a/fw/fe310/eos/spi.c b/fw/fe310/eos/spi.c
index 29970bd..932c5f1 100644
--- a/fw/fe310/eos/spi.c
+++ b/fw/fe310/eos/spi.c
@@ -9,18 +9,19 @@
 #include "interrupt.h"
 #include "event.h"
 
+#include "board.h"
+
 #include "net.h"
 #include "spi.h"
-#include "spi_def.h"
-#include "irq_def.h"
+#include "spi_priv.h"
 
 #define MIN(X, Y)               (((X) < (Y)) ? (X) : (Y))
 #define MAX(X, Y)               (((X) > (Y)) ? (X) : (Y))
-#define SPI_IOF_MASK            (((uint32_t)1 << IOF_SPI1_SCK) | ((uint32_t)1 << IOF_SPI1_MOSI) | ((uint32_t)1 << IOF_SPI1_MISO)) | ((uint32_t)1 << IOF_SPI1_SS0) | ((uint32_t)1 << IOF_SPI1_SS2) | ((uint32_t)1 << IOF_SPI1_SS3)
 
 static uint8_t spi_dev;
-static uint8_t spi_dev_cs_pin;
+static uint8_t spi_cspin;
 static uint8_t spi_lock;
+static uint16_t spi_div[EOS_SPI_MAX_DEV];
 static volatile uint8_t spi_state_flags;
 static unsigned char spi_in_xchg;
 
@@ -60,28 +61,45 @@ void eos_spi_init(void) {
 
     // There is no way here to change the CS polarity.
     // SPI1_REG(SPI_REG_CSDEF) = 0xFFFF;
+
+    for (i=0; i<EOS_SPI_MAX_DEV; i++) {
+        spi_div[i] = spi_cfg[i].div;
+        if (spi_cfg[i].csid == SPI_CSID_NONE) {
+            GPIO_REG(GPIO_INPUT_EN)     &= ~(1 << spi_cfg[i].cspin);
+            GPIO_REG(GPIO_OUTPUT_EN)    |=  (1 << spi_cfg[i].cspin);
+            GPIO_REG(GPIO_PULLUP_EN)    &= ~(1 << spi_cfg[i].cspin);
+            GPIO_REG(GPIO_OUTPUT_XOR)   &= ~(1 << spi_cfg[i].cspin);
+            GPIO_REG(GPIO_OUTPUT_VAL)   |=  (1 << spi_cfg[i].cspin);
+        }
+    }
 }
 
-int eos_spi_start(unsigned char dev, uint32_t div, uint32_t csid, uint8_t pin) {
-    spi_dev = dev;
+int eos_spi_select(unsigned char dev) {
+    if (dev == EOS_SPI_DEV_NET) return EOS_ERR;
+    if (spi_dev != EOS_SPI_DEV_NET) return EOS_ERR;
+
+    eos_net_stop();
     spi_state_flags = 0;
-    SPI1_REG(SPI_REG_SCKDIV) = div;
-    SPI1_REG(SPI_REG_CSID) = csid;
-    if (csid != SPI_CSID_NONE) {
+    SPI1_REG(SPI_REG_SCKDIV) = spi_div[dev];
+    SPI1_REG(SPI_REG_CSID) = spi_cfg[dev].csid;
+    if (spi_cfg[dev].csid != SPI_CSID_NONE) {
         SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO;
     } else {
         SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_OFF;
-        spi_dev_cs_pin = pin;
+        spi_cspin = spi_cfg[dev].cspin;
     }
     eos_intr_set_handler(INT_SPI1_BASE, eos_spi_handle_xchg);
 
     return EOS_OK;
 }
 
-int eos_spi_stop(void) {
+int eos_spi_deselect(void) {
+    if (spi_dev == EOS_SPI_DEV_NET) return EOS_ERR;
     if (spi_lock) return EOS_ERR_BUSY;
+
     eos_spi_flush();
-    spi_dev = 0;
+    eos_net_start();
+    spi_dev = EOS_SPI_DEV_NET;
 
     return EOS_OK;
 }
@@ -90,6 +108,18 @@ uint8_t eos_spi_dev(void) {
     return spi_dev;
 }
 
+uint16_t eos_spi_div(unsigned char dev) {
+    return spi_div[dev];
+}
+
+uint16_t eos_spi_csid(unsigned char dev) {
+    return spi_cfg[dev].csid;
+}
+
+uint16_t eos_spi_cspin(unsigned char dev) {
+    return spi_cfg[dev].cspin;
+}
+
 void eos_spi_lock(void) {
     spi_lock = 1;
 }
@@ -98,6 +128,10 @@ void eos_spi_unlock(void) {
     spi_lock = 0;
 }
 
+void eos_spi_set_div(unsigned char dev, uint16_t div) {
+    spi_div[dev] = div;
+}
+
 void eos_spi_set_handler(unsigned char dev, eos_evt_handler_t handler) {
     if (handler == NULL) handler = eos_evtq_bad_handler;
     if (dev && (dev <= EOS_SPI_MAX_DEV)) evt_handler[dev - 1] = handler;
@@ -127,7 +161,7 @@ static void spi_xchg_finish(void) {
 void eos_spi_xchg(unsigned char *buffer, uint16_t len, uint8_t flags) {
     if (spi_in_xchg) spi_xchg_finish();
 
-    spi_in_xchg=1;
+    spi_in_xchg = 1;
     _eos_spi_xchg_init(buffer, len, flags);
 
     eos_spi_cs_set();
@@ -158,7 +192,7 @@ void eos_spi_handle_xchg(void) {
             spi_state_flags &= ~SPI_FLAG_XCHG;
             if (!(spi_state_flags & EOS_SPI_FLAG_MORE)) eos_spi_cs_clear();
             SPI1_REG(SPI_REG_IE) = 0x0;
-            if (spi_dev) eos_evtq_push_isr(EOS_EVT_SPI | spi_dev, spi_state_buf, spi_state_len);
+            if (spi_dev != EOS_SPI_DEV_NET) eos_evtq_push_isr(EOS_EVT_SPI | spi_dev, spi_state_buf, spi_state_len);
         } else {
             SPI1_REG(SPI_REG_RXCTRL) = SPI_RXWM(MIN(spi_state_len - spi_state_idx_rx - 1, SPI_SIZE_WM - 1));
             SPI1_REG(SPI_REG_IE) = SPI_IP_RXWM;
@@ -169,7 +203,7 @@ void eos_spi_handle_xchg(void) {
 void eos_spi_cs_set(void) {
 	/* cs low */
     if (SPI1_REG(SPI_REG_CSMODE) == SPI_CSMODE_OFF) {
-        GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << spi_dev_cs_pin);
+        GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << spi_cspin);
     } else {
         SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD;
     }
@@ -178,7 +212,7 @@ void eos_spi_cs_set(void) {
 void eos_spi_cs_clear(void) {
 	/* cs high */
     if (SPI1_REG(SPI_REG_CSMODE) == SPI_CSMODE_OFF) {
-        GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << spi_dev_cs_pin);
+        GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << spi_cspin);
     } else {
         SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO;
     }
diff --git a/fw/fe310/eos/spi.h b/fw/fe310/eos/spi.h
index 7cbff08..ba04cc0 100644
--- a/fw/fe310/eos/spi.h
+++ b/fw/fe310/eos/spi.h
@@ -1,19 +1,29 @@
 #include <stdint.h>
 #include "event.h"
-#include "spi_dev.h"
 
-#define EOS_SPI_MAX_DEV     EOS_DEV_MAX_DEV
+#define EOS_SPI_DEV_NET         0
+#define EOS_SPI_DEV_EVE         1
+#define EOS_SPI_DEV_SDC         2
+#define EOS_SPI_DEV_CAM         3
 
-#define EOS_SPI_FLAG_TX     0x01
-#define EOS_SPI_FLAG_MORE   0x02
-#define EOS_SPI_FLAG_BSWAP  0x04
+#define EOS_SPI_MAX_DEV         4
+
+#define EOS_SPI_FLAG_TX         0x01
+#define EOS_SPI_FLAG_MORE       0x02
+#define EOS_SPI_FLAG_BSWAP      0x04
 
 void eos_spi_init(void);
-int eos_spi_start(unsigned char dev, uint32_t div, uint32_t csid, uint8_t pin);
-int eos_spi_stop(void);
+int eos_spi_select(unsigned char dev);
+int eos_spi_deselect(void);
+
 uint8_t eos_spi_dev(void);
+uint16_t eos_spi_div(unsigned char dev);
+uint16_t eos_spi_csid(unsigned char dev);
+uint16_t eos_spi_cspin(unsigned char dev);
+
 void eos_spi_lock(void);
 void eos_spi_unlock(void);
+void eos_spi_set_div(unsigned char dev, uint16_t div);
 void eos_spi_set_handler(unsigned char dev, eos_evt_handler_t handler);
 
 void _eos_spi_xchg_init(unsigned char *buffer, uint16_t len, uint8_t flags);
diff --git a/fw/fe310/eos/spi_def.h b/fw/fe310/eos/spi_def.h
deleted file mode 100644
index 06f7251..0000000
--- a/fw/fe310/eos/spi_def.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#define SPI_MODE0               0x00
-#define SPI_MODE1               0x01
-#define SPI_MODE2               0x02
-#define SPI_MODE3               0x03
-
-/* DO NOT TOUCH THEESE */
-#define SPI_SIZE_CHUNK          4
-#define SPI_SIZE_WM             2
-
-#define SPI_FLAG_XCHG           0x10
-
-#define SPI_CSID_NONE           1
\ No newline at end of file
diff --git a/fw/fe310/eos/spi_dev.c b/fw/fe310/eos/spi_dev.c
deleted file mode 100644
index 00b1a5b..0000000
--- a/fw/fe310/eos/spi_dev.c
+++ /dev/null
@@ -1,77 +0,0 @@
-#include <stdlib.h>
-#include <stdint.h>
-
-#include "encoding.h"
-#include "platform.h"
-
-#include "eos.h"
-#include "spi.h"
-#include "net.h"
-
-#include "spi_def.h"
-#include "spi_dev.h"
-
-
-#define SPI_DIV_DISP        16
-#define SPI_DIV_CARD        16
-#define SPI_DIV_CAM         16
-
-#define SPI_CSID_DISP       2
-#define SPI_CSID_CARD       0
-
-#define SPI_CSPIN_CAM       23
-
-static uint16_t spi_dev_div[EOS_DEV_MAX_DEV];
-
-int eos_spi_dev_select(unsigned char dev) {
-    uint8_t spi_dev = eos_spi_dev();
-    int rv = EOS_ERR;
-
-    if (spi_dev) {
-        int rv;
-
-        rv = eos_spi_stop();
-        if (rv) return rv;
-    } else {
-        eos_net_stop();
-    }
-    switch (dev) {
-        case EOS_DEV_DISP:
-            rv = eos_spi_start(dev, spi_dev_div[dev - 1], SPI_CSID_DISP, 0);
-            break;
-        case EOS_DEV_CARD:
-            rv = eos_spi_start(dev, spi_dev_div[dev - 1], SPI_CSID_CARD, 0);
-            break;
-        case EOS_DEV_CAM:
-            rv = eos_spi_start(dev, spi_dev_div[dev - 1], SPI_CSID_NONE, SPI_CSPIN_CAM);
-            break;
-    }
-
-    return rv;
-}
-
-int eos_spi_dev_deselect(void) {
-    int rv;
-
-    rv = eos_spi_stop();
-    if (rv) return rv;
-    eos_net_start();
-
-    return EOS_OK;
-}
-
-void eos_spi_dev_init(void) {
-    spi_dev_div[EOS_DEV_DISP - 1] = SPI_DIV_DISP;
-    spi_dev_div[EOS_DEV_CARD - 1] = SPI_DIV_CARD;
-    spi_dev_div[EOS_DEV_CAM  - 1] = SPI_DIV_CAM;
-
-    GPIO_REG(GPIO_INPUT_EN)     &= ~(1 << SPI_CSPIN_CAM);
-    GPIO_REG(GPIO_OUTPUT_EN)    |=  (1 << SPI_CSPIN_CAM);
-    GPIO_REG(GPIO_PULLUP_EN)    &= ~(1 << SPI_CSPIN_CAM);
-    GPIO_REG(GPIO_OUTPUT_XOR)   &= ~(1 << SPI_CSPIN_CAM);
-    GPIO_REG(GPIO_OUTPUT_VAL)   |=  (1 << SPI_CSPIN_CAM);
-}
-
-void eos_spi_dev_set_div(unsigned char dev, uint16_t div) {
-    spi_dev_div[dev-1] = div;
-}
diff --git a/fw/fe310/eos/spi_dev.h b/fw/fe310/eos/spi_dev.h
deleted file mode 100644
index 7882e51..0000000
--- a/fw/fe310/eos/spi_dev.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#define EOS_DEV_DISP        1
-#define EOS_DEV_CARD        2
-#define EOS_DEV_CAM         3
-
-#define EOS_DEV_MAX_DEV     3
-
-void eos_spi_dev_init(void);
-int eos_spi_dev_select(unsigned char dev);
-int eos_spi_dev_deselect(void);
-
-void eos_spi_dev_set_div(unsigned char dev, uint16_t div);
diff --git a/fw/fe310/eos/spi_priv.h b/fw/fe310/eos/spi_priv.h
new file mode 100644
index 0000000..a0344ff
--- /dev/null
+++ b/fw/fe310/eos/spi_priv.h
@@ -0,0 +1,44 @@
+#define SPI_MODE0               0x00
+#define SPI_MODE1               0x01
+#define SPI_MODE2               0x02
+#define SPI_MODE3               0x03
+
+/* DO NOT TOUCH THEESE */
+#define SPI_SIZE_CHUNK          4
+#define SPI_SIZE_WM             2
+
+#define SPI_FLAG_XCHG           0x10
+
+#define SPI_CSID_NONE           1
+#define SPI_CSPIN_NONE          0xff
+
+#define SPI_IOF_MASK            (((uint32_t)1 << IOF_SPI1_SCK) | ((uint32_t)1 << IOF_SPI1_MOSI) | ((uint32_t)1 << IOF_SPI1_MISO)) | ((uint32_t)1 << IOF_SPI1_SS0) | ((uint32_t)1 << IOF_SPI1_SS2) | ((uint32_t)1 << IOF_SPI1_SS3)
+
+typedef struct {
+    uint8_t div;
+    uint8_t csid;
+    uint8_t cspin;
+} SPIConfig;
+
+static const SPIConfig spi_cfg[] = {
+    {   // DEV_NET
+        .div = SPI_DIV_NET,
+        .csid = SPI_CSID_NET,
+        .cspin = SPI_CSPIN_NET,
+    },
+    {   // DEV_EVE
+        .div = SPI_DIV_EVE,
+        .csid = SPI_CSID_EVE,
+        .cspin = SPI_CSPIN_EVE,
+    },
+    {   // DEV_SDC
+        .div = SPI_DIV_SDC,
+        .csid = SPI_CSID_SDC,
+        .cspin = SPI_CSPIN_SDC,
+    },
+    {   // DEV_CAM
+        .div = SPI_DIV_CAM,
+        .csid = SPI_CSID_CAM,
+        .cspin = SPI_CSPIN_CAM,
+    },
+};
\ No newline at end of file
diff --git a/fw/fe310/eos/trap_entry.S b/fw/fe310/eos/trap_entry.S
index c24236b..d54243f 100644
--- a/fw/fe310/eos/trap_entry.S
+++ b/fw/fe310/eos/trap_entry.S
@@ -21,30 +21,16 @@
 #define SPI1_CTRL_ADDR    0x10024000
 #include "sifive/devices/spi.h"
 
-#include "evt_def.h"
-#include "msgq_def.h"
-#include "i2s_def.h"
-
 #define INT_PWM0_BASE     40
 #define INT_PWM1_BASE     44
 #define INT_PWM2_BASE     48
 
-#define I2S_PWM_CTRL_ADDR_CK      PWM0_CTRL_ADDR
-#define I2S_PWM_CTRL_ADDR_WS_MIC  PWM1_CTRL_ADDR
-#define I2S_PWM_CTRL_ADDR_WS_SPK  PWM2_CTRL_ADDR
-
-#define IOF_SPI1_SS0      2
-#define IOF_SPI1_SS1      8
-#define IOF_SPI1_SS2      9
-#define IOF_SPI1_SS3      10
-
-#define INT_SPI1_BASE     6
-#define INT_GPIO_BASE     8
-
-#include "net_def.h"
-#include "spi_def.h"
+#include "board.h"
 #include "irq_def.h"
-
+#include "evt_def.h"
+#include "i2s_def.h"
+#include "i2s_priv.h"
+#include "msgq_priv.h"
 
   .section      .data.entry
   .align 4
@@ -99,7 +85,7 @@ evtq_push:
 
 i2s_handle_sd:
   # exit if too early
-  li x18, I2S_PWM_CTRL_ADDR_WS_SPK
+  li x18, I2S_CTRL_ADDR_WS_SPK
   lw x8, PWM_COUNT(x18)
   lw x9, PWM_CMP3(x18)
   bltu x8, x9, i2s_handle_sd_exit
@@ -156,7 +142,7 @@ i2s_abuf_pop:
   # push to event queue
   jal x22, evtq_push
   beqz x21, i2s_decode
-  li x18, (EOS_EVT_I2S | I2S_ETYPE_SPK)
+  li x18, (EOS_EVT_I2S | EOS_I2S_ETYPE_SPK)
   sb x18, MSGQ_ITEM_OFF_TYPE(x21)
 
 i2s_decode:
@@ -349,7 +335,7 @@ i2s_abuf_push:
   # push to event queue
   jal x22, evtq_push
   beqz x21, i2s_handle_sd_exit
-  li x18, (EOS_EVT_I2S | I2S_ETYPE_MIC)
+  li x18, (EOS_EVT_I2S | EOS_I2S_ETYPE_MIC)
   sb x18, MSGQ_ITEM_OFF_TYPE(x21)
 
 i2s_handle_sd_exit:
@@ -387,9 +373,9 @@ _eos_i2s_start_pwm:
   STORE x22, 6*REGBYTES(sp)
   STORE x23, 7*REGBYTES(sp)
 
-  li x18, I2S_PWM_CTRL_ADDR_CK
-  li x19, I2S_PWM_CTRL_ADDR_WS_MIC
-  li x20, I2S_PWM_CTRL_ADDR_WS_SPK
+  li x18, I2S_CTRL_ADDR_CK
+  li x19, I2S_CTRL_ADDR_WS_MIC
+  li x20, I2S_CTRL_ADDR_WS_SPK
   li x21, PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | I2S_PWM_SCALE_CK
   li x22, PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | PWM_CFG_CMP2GANG
   li x23, PWM_CFG_ENALWAYS | PWM_CFG_ZEROCMP | PWM_CFG_CMP1GANG
diff --git a/fw/fe310/eos/uart.c b/fw/fe310/eos/uart.c
index e9349a7..c10b6d5 100644
--- a/fw/fe310/eos/uart.c
+++ b/fw/fe310/eos/uart.c
@@ -10,7 +10,6 @@
 #include "event.h"
 
 #include "uart.h"
-#include "irq_def.h"
 
 static eos_uart_handler_t uart_handler[EOS_UART_MAX_ETYPE];
 
-- 
cgit v1.2.3