summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Majstorovic <majstor@majstor.org>2026-01-07 22:58:33 +0100
committerUros Majstorovic <majstor@majstor.org>2026-01-07 22:58:33 +0100
commit46b08fc235f3f068034355970697acc0956e5c99 (patch)
tree96e2bde5d95c295a57afae353684a25544fb09fa
parent285ddd410a559449b7e2cbab9b2b10e850efbd08 (diff)
introduced EOSMessage struct for SPI and Event queue messages; added APP <-> FE310 bridge SPI messages; LCD/touch panel driver for app module; save relevant state to AON module before sleep;
-rw-r--r--fw/fe310/eos/dev/aon.c71
-rw-r--r--fw/fe310/eos/dev/aon.h15
-rw-r--r--fw/fe310/eos/dev/app.c94
-rw-r--r--fw/fe310/eos/dev/app.h4
-rw-r--r--fw/fe310/eos/dev/ctp.c46
-rw-r--r--fw/fe310/eos/dev/ctp.h7
-rw-r--r--fw/fe310/eos/dev/egpio.c11
-rw-r--r--fw/fe310/eos/dev/eve.c64
-rw-r--r--fw/fe310/eos/dev/eve.h3
-rw-r--r--fw/fe310/eos/dev/eve_priv.h1
-rw-r--r--fw/fe310/eos/dev/lcd.c38
-rw-r--r--fw/fe310/eos/dev/lcd.h2
-rw-r--r--fw/fe310/eos/dev/net.c282
-rw-r--r--fw/fe310/eos/dev/net.h44
-rw-r--r--fw/fe310/eos/dev/pwr.c2
-rw-r--r--fw/fe310/eos/dev/spi.c1
-rw-r--r--fw/fe310/eos/dev/spi_cfg.h4
-rw-r--r--fw/fe310/eos/eos.c2
-rw-r--r--fw/fe310/eos/eve/eve.c36
-rw-r--r--fw/fe310/eos/eve/eve.h7
-rwxr-xr-xfw/fe310/eos/eve/eve_config.h28
-rw-r--r--fw/fe310/eos/eve/eve_platform.h5
-rw-r--r--fw/fe310/eos/eve/eve_touch_engine.c5
-rw-r--r--fw/fe310/eos/eve/eve_touch_engine.h1
-rw-r--r--fw/fe310/eos/eve/widget/selectw.c113
-rw-r--r--fw/fe310/eos/eve/widget/selectw.h4
-rw-r--r--fw/fe310/eos/event.c105
-rw-r--r--fw/fe310/eos/event.h28
-rw-r--r--fw/fe310/eos/msgq.c94
-rw-r--r--fw/fe310/eos/msgq.h22
-rw-r--r--fw/fe310/eos/msgq_priv.h1
-rw-r--r--fw/fe310/eos/net/Makefile2
-rw-r--r--fw/fe310/eos/net/cell.c350
-rw-r--r--fw/fe310/eos/net/cell.h59
-rw-r--r--fw/fe310/eos/net/rng.c24
-rw-r--r--fw/fe310/eos/net/sock.c158
-rw-r--r--fw/fe310/eos/net/sock.h15
-rw-r--r--fw/fe310/eos/net/wifi.c161
-rw-r--r--fw/fe310/eos/net/wifi.h15
-rw-r--r--fw/fe310/eos/soc/i2s.c16
-rw-r--r--fw/fe310/eos/soc/i2s.h7
-rw-r--r--fw/fe310/eos/soc/spi.c32
-rw-r--r--fw/fe310/eos/soc/spi.h10
-rw-r--r--fw/fe310/eos/soc/timer.c13
-rw-r--r--fw/fe310/eos/soc/timer.h6
-rw-r--r--fw/fe310/eos/soc/uart.c14
-rw-r--r--fw/fe310/eos/soc/uart.h6
47 files changed, 1057 insertions, 971 deletions
diff --git a/fw/fe310/eos/dev/aon.c b/fw/fe310/eos/dev/aon.c
index 7e4f5ec..abf75d3 100644
--- a/fw/fe310/eos/dev/aon.c
+++ b/fw/fe310/eos/dev/aon.c
@@ -7,24 +7,62 @@
#include "aon.h"
#define AON_EVE_REG 0
-#define AON_EVE_MASK 0x03
-
#define AON_NET_REG 0
-#define AON_NET_MASK 0x04
+#define AON_APP_REG 0
+
+#define AON_EVE_PWM_MASK 0x000000FF
+#define AON_EVE_PWR_MASK 0x00000300
+#define AON_EVE_LCD_MASK 0x00000400
+#define AON_NET_MASK 0x00000800
+#define AON_APP_MASK 0x00001000
+
+void eos_aon_save4eve_pwm(uint8_t brightness) {
+ uint32_t reg;
+
+ reg = eos_aon_get_reg(AON_EVE_REG);
+ reg &= ~AON_EVE_PWM_MASK;
+ reg |= brightness;
+
+ eos_aon_set_reg(AON_EVE_REG, reg);
+}
+
+uint8_t eos_aon_load4eve_pwm(void) {
+ uint32_t reg;
+
+ reg = eos_aon_get_reg(AON_EVE_REG) & AON_EVE_PWM_MASK;
+ return reg;
+}
+
+void eos_aon_save4eve_pwr(uint8_t power_state) {
+ uint32_t reg;
+
+ reg = eos_aon_get_reg(AON_EVE_REG);
+ reg &= ~AON_EVE_PWR_MASK;
+ reg |= ((uint32_t)power_state << 8) & AON_EVE_PWR_MASK;
+
+ eos_aon_set_reg(AON_EVE_REG, reg);
+}
+
+uint8_t eos_aon_load4eve_pwr(void) {
+ uint32_t reg;
+
+ reg = eos_aon_get_reg(AON_EVE_REG) & AON_EVE_PWR_MASK;
+ reg = reg >> 8;
+ return reg;
+}
-void eos_aon_save4eve(uint8_t power_state) {
+void eos_aon_save4eve_lcd(int absent) {
uint32_t reg;
- power_state &= AON_EVE_MASK;
reg = eos_aon_get_reg(AON_EVE_REG);
- reg &= ~AON_EVE_MASK;
- reg |= power_state;
+ reg &= ~AON_EVE_LCD_MASK;
+ if (absent) reg |= AON_EVE_LCD_MASK;
eos_aon_set_reg(AON_EVE_REG, reg);
}
-uint8_t eos_aon_load4eve(void) {
- return (eos_aon_get_reg(AON_EVE_REG) & AON_EVE_MASK);
+int eos_aon_load4eve_lcd(void) {
+ return !!(eos_aon_get_reg(AON_EVE_REG) & AON_EVE_LCD_MASK);
}
void eos_aon_save4net(int absent) {
@@ -39,4 +77,19 @@ void eos_aon_save4net(int absent) {
int eos_aon_load4net(void) {
return !!(eos_aon_get_reg(AON_NET_REG) & AON_NET_MASK);
+}
+
+void eos_aon_save4app(int ctp_sel) {
+ uint32_t reg;
+
+ reg = eos_aon_get_reg(AON_APP_REG);
+ reg &= ~AON_APP_MASK;
+ if (ctp_sel) reg |= AON_APP_MASK;
+
+ eos_aon_set_reg(AON_APP_REG, reg);
+
+}
+
+int eos_aon_load4app(void) {
+ return !!(eos_aon_get_reg(AON_APP_REG) & AON_APP_MASK);
} \ No newline at end of file
diff --git a/fw/fe310/eos/dev/aon.h b/fw/fe310/eos/dev/aon.h
index 4551cc0..eb3953c 100644
--- a/fw/fe310/eos/dev/aon.h
+++ b/fw/fe310/eos/dev/aon.h
@@ -1,7 +1,16 @@
#include <stdint.h>
-void eos_aon_save4eve(uint8_t power_state);
-uint8_t eos_aon_load4eve(void);
+void eos_aon_save4eve_pwm(uint8_t brightness);
+uint8_t eos_aon_load4eve_pwm(void);
+
+void eos_aon_save4eve_pwr(uint8_t power_state);
+uint8_t eos_aon_load4eve_pwr(void);
+
+void eos_aon_save4eve_lcd(int absent);
+int eos_aon_load4eve_lcd(void);
void eos_aon_save4net(int absent);
-int eos_aon_load4net(void); \ No newline at end of file
+int eos_aon_load4net(void);
+
+void eos_aon_save4app(int ctp_sel);
+int eos_aon_load4app(void); \ No newline at end of file
diff --git a/fw/fe310/eos/dev/app.c b/fw/fe310/eos/dev/app.c
index ce2cf05..4c6b7cd 100644
--- a/fw/fe310/eos/dev/app.c
+++ b/fw/fe310/eos/dev/app.c
@@ -4,7 +4,18 @@
#include "eos.h"
#include "log.h"
+#include "eve/eve.h"
+#include "eve/eve_touch_engine.h"
+
+#include "egpio.h"
+#include "egpio_priv.h"
+#include "eve.h"
+
+#include "aon.h"
+#include "ctp.h"
+#include "lcd.h"
#include "hpamp.h"
+
#include "app.h"
void eos_app_hp_change(int hp_det) {
@@ -18,3 +29,86 @@ void eos_app_hp_change(int hp_det) {
}
}
}
+
+int eos_app_give(void) {
+ int rv, _rv;
+
+ if (!eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR;
+
+ eos_aon_save4app(eos_egpio_get_val(EGPIO_PIN_CTP_SEL));
+
+ rv = eos_egpio_intr_disable();
+ if (rv) return rv;
+
+ rv = eve_select();
+ if (rv) goto app_give_err_select;
+
+ _eos_eve_sleep();
+
+ rv = eos_lcd_give();
+ if (rv) goto app_give_err;
+
+ rv = eos_egpio_set_val(EGPIO_PIN_CTP_SEL, 0);
+ if (rv) goto app_give_err;
+
+ rv = eos_egpio_set_val(EGPIO_PIN_DISP_SEL, 0);
+ if (rv) goto app_give_err;
+
+ eve_pwr_sleep();
+
+app_give_err:
+ if (rv) _eos_eve_wake();
+ eve_deselect();
+
+app_give_err_select:
+ _rv = eos_egpio_intr_set();
+ if (!rv && _rv) return _rv;
+
+ return rv;
+}
+
+int eos_app_take(void) {
+ int rv, _rv, ctp_sel;
+
+ if (eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR;
+
+ ctp_sel = eos_aon_load4app();
+
+ rv = eos_egpio_intr_disable();
+ if (rv) return rv;
+
+ rv = eve_select();
+ if (rv) goto app_take_err_select;
+
+ eve_pwr_wake();
+
+ rv = eos_egpio_set_val(EGPIO_PIN_DISP_SEL, 1);
+ if (rv) goto app_take_err;
+
+ rv = eos_egpio_set_val(EGPIO_PIN_CTP_SEL, ctp_sel);
+ if (rv) goto app_take_err;
+
+ if (!ctp_sel) {
+ eve_touch_reset_engine();
+ }
+
+ rv = eos_lcd_take();
+ if (rv) goto app_take_err;
+
+ _eos_eve_wake();
+
+app_take_err:
+ if (rv) eve_pwr_sleep();
+ eve_deselect();
+
+ if (!rv && ctp_sel) {
+ _rv = _eos_ctp_reset();
+ if (_rv) rv = _rv;
+ }
+
+app_take_err_select:
+ _rv = eos_egpio_intr_set();
+ if (!rv && _rv) return _rv;
+
+ return rv;
+}
diff --git a/fw/fe310/eos/dev/app.h b/fw/fe310/eos/dev/app.h
index 4ee2e8d..e88ba20 100644
--- a/fw/fe310/eos/dev/app.h
+++ b/fw/fe310/eos/dev/app.h
@@ -1,3 +1,5 @@
#include <stdint.h>
-void eos_app_hp_change(int hp_det); \ No newline at end of file
+void eos_app_hp_change(int hp_det);
+int eos_app_give(void);
+int eos_app_take(void); \ No newline at end of file
diff --git a/fw/fe310/eos/dev/ctp.c b/fw/fe310/eos/dev/ctp.c
index b6459b4..e58f929 100644
--- a/fw/fe310/eos/dev/ctp.c
+++ b/fw/fe310/eos/dev/ctp.c
@@ -32,6 +32,13 @@ int eos_ctp_init(void) {
return rv;
}
+int _eos_ctp_reset(void) {
+ if (eos_i2s_running() || !eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) return EOS_ERR_BUSY;
+
+ gt911_reset();
+ return EOS_OK;
+}
+
int eos_ctp_reset(void) {
uint8_t status = 0;
int rv;
@@ -49,6 +56,12 @@ int eos_ctp_reset(void) {
return EOS_OK;
}
+int _eos_ctp_sleep(void) {
+ if (eos_i2s_running() || !eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) return EOS_ERR_BUSY;
+
+ return gt911_sleep();
+}
+
int eos_ctp_sleep(void) {
int rv;
@@ -67,6 +80,13 @@ int eos_ctp_sleep(void) {
return EOS_OK;
}
+int _eos_ctp_wake(void) {
+ if (eos_i2s_running() || !eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) return EOS_ERR_BUSY;
+
+ gt911_wake();
+ return EOS_OK;
+}
+
int eos_ctp_wake(void) {
int rv;
@@ -85,7 +105,7 @@ int eos_ctp_wake(void) {
}
int eos_ctp_give(void) {
- int rv;
+ int rv, _rv;
if (!eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
if (!eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) return EOS_ERR;
@@ -94,22 +114,23 @@ int eos_ctp_give(void) {
if (rv) return rv;
rv = eos_egpio_set_val(EGPIO_PIN_CTP_SEL, 0);
- if (rv) return rv;
+ if (rv) goto ctp_give_err;
rv = eve_select();
- if (rv) return rv;
+ if (rv) goto ctp_give_err;
eve_touch_set_engine(EVE_TOUCH_ENGINE_GOODIX);
eve_deselect();
- rv = eos_egpio_intr_set();
- if (rv) return rv;
+ctp_give_err:
+ _rv = eos_egpio_intr_set();
+ if (!rv && _rv) return _rv;
- return EOS_OK;
+ return rv;
}
int eos_ctp_take(void) {
- int rv;
+ int rv, _rv;
if (eos_i2s_running() || !eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
if (eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) return EOS_ERR;
@@ -118,20 +139,21 @@ int eos_ctp_take(void) {
if (rv) return rv;
rv = eve_select();
- if (rv) return rv;
+ if (rv) goto ctp_take_err;
eve_touch_set_engine(EVE_TOUCH_ENGINE_HOST);
eve_deselect();
rv = eos_egpio_set_val(EGPIO_PIN_CTP_SEL, 1);
- if (rv) return rv;
+ if (rv) goto ctp_take_err;
gt911_reset();
- rv = eos_egpio_intr_set();
- if (rv) return rv;
+ctp_take_err:
+ _rv = eos_egpio_intr_set();
+ if (!rv && _rv) return _rv;
- return EOS_OK;
+ return rv;
}
int eos_ctp_handle_intr(void) {
diff --git a/fw/fe310/eos/dev/ctp.h b/fw/fe310/eos/dev/ctp.h
index 72a0a75..c17f1e4 100644
--- a/fw/fe310/eos/dev/ctp.h
+++ b/fw/fe310/eos/dev/ctp.h
@@ -1,7 +1,14 @@
#include <stdint.h>
int eos_ctp_init(void);
+
+int _eos_ctp_reset(void);
int eos_ctp_reset(void);
+
+int _eos_ctp_sleep(void);
int eos_ctp_sleep(void);
+
+int _eos_ctp_wake(void);
int eos_ctp_wake(void);
+
int eos_ctp_handle_intr(void); \ No newline at end of file
diff --git a/fw/fe310/eos/dev/egpio.c b/fw/fe310/eos/dev/egpio.c
index cfcd0f3..076986a 100644
--- a/fw/fe310/eos/dev/egpio.c
+++ b/fw/fe310/eos/dev/egpio.c
@@ -177,12 +177,10 @@ static int handle_egpio_evt(uint8_t chip_id) {
return EOS_OK;
}
-static void handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) {
+static void handle_evt(unsigned char type, EOSMessage *msg, uint16_t len) {
int rv;
- type &= ~EOS_EVT_MASK;
-
- switch (type) {
+ switch (type & ~EOS_EVT_MASK) {
case EOS_EGPIO_ETYPE_INT: {
rv = handle_egpio_evt(EGPIO_CHIP_FXL0);
if (rv) goto handle_evt_fin;
@@ -217,6 +215,11 @@ handle_evt_fin:
if (rv < 0) EOS_LOG(EOS_LOG_ERR, "CTP/EVE HANDLE INTR ERR:%d\n", rv);
break;
}
+
+ default:
+ eos_evtq_bad_handler(type, msg, len);
+ break;
+
}
}
diff --git a/fw/fe310/eos/dev/eve.c b/fw/fe310/eos/dev/eve.c
index 25a3558..873cd7a 100644
--- a/fw/fe310/eos/dev/eve.c
+++ b/fw/fe310/eos/dev/eve.c
@@ -61,14 +61,9 @@ int eos_eve_init(void) {
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 {
- eve_pwr_set_state(eos_aon_load4eve());
-
eve_activate();
gpio_reg = eve_gpio_read();
eve_cmd_set_offset();
- if (gpio_reg & (1 << EVE_GPIO_DISP)) {
- eve_pwr_set_state(EVE_PSTATE_ACTIVE);
- }
eve_deactivate();
}
@@ -94,24 +89,32 @@ int eos_eve_run(void) {
if (!rst) {
/* was active before sleep */
- if (eos_aon_load4eve() == EVE_PSTATE_ACTIVE) return EOS_OK;
+ if (eve_pwr_state() == EVE_PSTATE_ACTIVE) return EOS_OK;
- /* DISP pin is off */
- if (eve_pwr_state() != EVE_PSTATE_ACTIVE) return EOS_ERR_BUSY;
+ /* Display is attached to app module */
+ if (!eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
}
rv = eve_select();
if (rv) return rv;
- eve_touch_intr_enable();
- eve_touch_start();
- eve_intr_enable();
- eve_clk_start();
+ if (!rst) eve_pwr_wake();
+ _eos_eve_wake();
+ if (rst) eve_set_brightness(0x40);
eve_deselect();
return EOS_OK;
}
+void _eos_eve_sleep(void) {
+ eos_aon_save4eve_pwm(eve_get_brightness());
+ eve_set_brightness(0);
+ eve_clk_stop();
+ eve_intr_disable();
+ eve_touch_stop();
+ eve_touch_intr_disable();
+}
+
int eos_eve_sleep(void) {
int rv;
@@ -120,51 +123,38 @@ int eos_eve_sleep(void) {
rv = eve_select();
if (rv) return rv;
- eve_brightness(0);
- eve_clk_stop();
- eve_intr_disable();
- eve_touch_stop();
- eve_touch_intr_disable();
+ _eos_eve_sleep();
eve_pwr_sleep();
eve_deselect();
return EOS_OK;
}
+void _eos_eve_wake(void) {
+ eve_touch_intr_enable();
+ eve_touch_start();
+ eve_intr_enable();
+ eve_clk_start();
+ eve_set_brightness(eos_aon_load4eve_pwm());
+}
+
int eos_eve_wake(void) {
int disp, rv;
if (eve_pwr_state() == EVE_PSTATE_ACTIVE) return EOS_ERR;
+ if (!eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
rv = eve_select();
if (rv) return rv;
- eve_activate();
- disp = eve_gpio_get(EVE_GPIO_DISP);
- if (disp) {
- eve_pwr_set_state(EVE_PSTATE_ACTIVE);
- }
- eve_deactivate();
+ eve_pwr_wake();
+ _eos_eve_wake();
- if (eve_pwr_state() != EVE_PSTATE_ACTIVE) {
- rv = EOS_ERR_BUSY;
- goto eve_wake_fin;
- }
-
- eve_touch_intr_enable();
- eve_touch_start();
- eve_intr_enable();
- eve_clk_start();
-eve_wake_fin:
eve_deselect();
return rv;
}
-void eos_eve_save2aon(void) {
- eos_aon_save4eve(eve_pwr_state());
-}
-
void eve_calibrate(void) {
int rv, d;
uint32_t matrix[6];
diff --git a/fw/fe310/eos/dev/eve.h b/fw/fe310/eos/dev/eve.h
index 564e8c1..11d7cc9 100644
--- a/fw/fe310/eos/dev/eve.h
+++ b/fw/fe310/eos/dev/eve.h
@@ -4,9 +4,10 @@ int eos_eve_handle_intr(void);
int eos_eve_init(void);
int eos_eve_run(void);
+void _eos_eve_sleep(void);
int eos_eve_sleep(void);
+void _eos_eve_wake(void);
int eos_eve_wake(void);
-void eos_eve_save2aon(void);
void eve_calibrate(void);
int eve_select(void);
diff --git a/fw/fe310/eos/dev/eve_priv.h b/fw/fe310/eos/dev/eve_priv.h
index 3863f5d..8baf6a4 100644
--- a/fw/fe310/eos/dev/eve_priv.h
+++ b/fw/fe310/eos/dev/eve_priv.h
@@ -1,6 +1,5 @@
#define EVE_GPIO_DIR 0x800f
#define EVE_GPIO_DEFAULT 0x8002 /* DISP on, EVEAUDIO_DIS */
-#define EVE_GPIO_MASK 0x800f
#define EVE_GPIO_USR 0
#define EVE_GPIO_EVEAUDIO_DIS 1 /* only when lspk is off */
diff --git a/fw/fe310/eos/dev/lcd.c b/fw/fe310/eos/dev/lcd.c
index 01d86e9..9fb8767 100644
--- a/fw/fe310/eos/dev/lcd.c
+++ b/fw/fe310/eos/dev/lcd.c
@@ -22,8 +22,6 @@
static int lcd_enable(void) {
int rv;
- if (eos_i2s_running() || !eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
-
rv = eos_egpio_set_val(EGPIO_PIN_LCD_EN, 1);
return rv;
}
@@ -31,8 +29,6 @@ static int lcd_enable(void) {
static int lcd_disable(void) {
int rv;
- if (eos_i2s_running() || !eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
-
rv = eos_egpio_set_val(EGPIO_PIN_LCD_EN, 0);
return rv;
}
@@ -44,7 +40,7 @@ static int lcd_enabled(void) {
static int lcd_select(void) {
int rv;
- if (eos_i2s_running() || !eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
+ if (eos_i2s_running()) return EOS_ERR_BUSY;
GPIO_REG(GPIO_OUTPUT_XOR) |= (1 << SPI_CSPIN_LCD);
GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << SPI_CSPIN_LCD);
@@ -85,13 +81,32 @@ static int lcd_init(void) {
}
rv = ili9806e_init();
- if (rv == EOS_ERR_NOTFOUND) eve_lcd_absent();
+ if (rv == EOS_ERR_NOTFOUND) eve_lcd_set_absent(1);
lcd_deselect();
if (rv) lcd_disable();
return rv;
}
+static int lcd_reset(void) {
+ int rv;
+
+ if (!lcd_enabled()) return EOS_ERR;
+
+ rv = lcd_disable();
+ if (rv) return rv;
+
+ eos_sleep(10);
+
+ rv = lcd_init();
+ if (rv) {
+ lcd_enable();
+ return rv;
+ }
+
+ return EOS_OK;
+}
+
static int lcd_sleep(void) {
int rv;
@@ -109,6 +124,9 @@ int eos_lcd_init(void) {
uint8_t wakeup_cause;
int rv, rst;
+ if (!eos_egpio_get_val(EGPIO_PIN_DISP_SEL)) return EOS_ERR_BUSY;
+ if (lcd_enabled()) return EOS_ERR;
+
wakeup_cause = eos_pwr_wakeup_cause();
rst = (wakeup_cause == EOS_PWR_WAKE_RST);
if (rst) {
@@ -137,3 +155,11 @@ int eos_lcd_wake(void) {
rv = lcd_init();
return rv;
}
+
+int eos_lcd_take(void) {
+ return lcd_reset();
+}
+
+int eos_lcd_give(void) {
+ return lcd_reset();
+}
diff --git a/fw/fe310/eos/dev/lcd.h b/fw/fe310/eos/dev/lcd.h
index fafe2b4..f52ee8a 100644
--- a/fw/fe310/eos/dev/lcd.h
+++ b/fw/fe310/eos/dev/lcd.h
@@ -3,3 +3,5 @@
int eos_lcd_init(void);
int eos_lcd_sleep(void);
int eos_lcd_wake(void);
+int eos_lcd_take(void);
+int eos_lcd_give(void);
diff --git a/fw/fe310/eos/dev/net.c b/fw/fe310/eos/dev/net.c
index c1fd9b5..7ab4947 100644
--- a/fw/fe310/eos/dev/net.c
+++ b/fw/fe310/eos/dev/net.c
@@ -7,7 +7,6 @@
#include "eos.h"
#include "log.h"
-#include "msgq.h"
#include "event.h"
#include "soc/interrupt.h"
@@ -24,36 +23,36 @@
#define NET_DETECT_TIMEOUT 1000
#define NET_SIZE_HDR 3
+#define NET_SIZE_BUFQ 2
+
#define NET_STATE_FLAG_RUN 0x0001
-#define NET_STATE_FLAG_INIT 0x0002
-#define NET_STATE_FLAG_XCHG 0x0004
-#define NET_STATE_FLAG_ONEW 0x0010
-#define NET_STATE_FLAG_SYNC 0x0020
-#define NET_STATE_FLAG_RTS 0x0040
-#define NET_STATE_FLAG_CTS 0x0080
+#define NET_STATE_FLAG_RTS 0x0002
+#define NET_STATE_FLAG_CTS 0x0004
+#define NET_STATE_FLAG_INIT 0x0010
+#define NET_STATE_FLAG_XCHG 0x0020
+#define NET_STATE_FLAG_ONEW 0x0040
+#define NET_STATE_FLAG_SYNC 0x0080
#define NET_STATE_FLAG_SLEEP 0x0100
#define NET_STATE_FLAG_SLEEP_REQ 0x0200
#define NET_STATE_FLAG_ABSENT 0x0400
-
-#define NET_FLAG_MORE 0x01
-#define NET_FLAG_SYNC 0x02
-#define NET_FLAG_REPL 0x04
+#define NET_STATE_FLAG_ERR_SIZE 0x0800
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
static EOSBufQ net_buf_q;
-static unsigned char *net_bufq_array[EOS_NET_SIZE_BUFQ];
-static unsigned char net_bufq_buffer[EOS_NET_SIZE_BUFQ][EOS_NET_SIZE_BUF] __attribute__((section (".itim2")));
+static unsigned char *net_bufq_array[NET_SIZE_BUFQ];
+static unsigned char net_bufq_buffer[NET_SIZE_BUFQ][EOS_NET_MTU] __attribute__((section (".itim2")));
static EOSMsgQ net_send_q;
-static EOSMsgItem net_sndq_array[EOS_NET_SIZE_BUFQ];
+static EOSMsgItem net_sndq_array[NET_SIZE_BUFQ];
static volatile uint16_t net_state_flags = 0;
static volatile unsigned char net_state_type = 0;
static uint32_t net_state_len_tx = 0;
static volatile uint32_t net_state_len_rx = 0;
static unsigned char *net_state_buf = NULL;
+static uint16_t net_state_buf_sz = 0;
static volatile uint8_t net_state_next_cnt = 0;
static unsigned char * volatile net_state_next_buf = NULL;
@@ -96,8 +95,8 @@ static void net_xchg_sleep_req(void) {
SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO;
}
-static void net_xchg_start(unsigned char type, unsigned char *buffer, uint16_t len) {
- net_state_flags &= ~NET_STATE_FLAG_CTS;
+static void net_xchg_start(unsigned char type, EOSMessage *msg, uint16_t len) {
+ net_state_flags &= ~(NET_STATE_FLAG_CTS | NET_STATE_FLAG_ERR_SIZE);
net_state_flags |= (NET_STATE_FLAG_INIT | NET_STATE_FLAG_XCHG);
if (net_state_next_cnt && (net_state_next_buf == NULL)) type |= EOS_NET_MTYPE_FLAG_ONEW;
@@ -106,7 +105,8 @@ static void net_xchg_start(unsigned char type, unsigned char *buffer, uint16_t l
net_state_type = type;
net_state_len_tx = len;
net_state_len_rx = 0;
- net_state_buf = buffer;
+ net_state_buf = msg->buffer;
+ net_state_buf_sz = msg->size;
SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD;
SPI1_REG(SPI_REG_TXFIFO) = type;
@@ -116,23 +116,24 @@ static void net_xchg_start(unsigned char type, unsigned char *buffer, uint16_t l
SPI1_REG(SPI_REG_IE) = SPI_IP_RXWM;
}
-static int net_xchg_next(unsigned char *_buffer) {
+static int net_xchg_next(EOSMessage *_msg) {
unsigned char type;
- unsigned char *buffer = NULL;
+ EOSMessage msg;
uint16_t len;
- int do_release = _buffer ? 1 : 0;
+ int do_release = _msg ? 1 : 0;
- eos_msgq_pop(&net_send_q, &type, &buffer, &len);
+ eos_msgq_pop(&net_send_q, &type, &msg, &len);
if (type) {
- net_xchg_start(type, buffer, len);
+ net_xchg_start(type, &msg, len);
} else if (net_state_flags & NET_STATE_FLAG_RTS) {
- if (_buffer) {
- buffer = _buffer;
+ if (_msg) {
+ msg = *_msg;
do_release = 0;
} else {
- buffer = eos_bufq_pop(&net_buf_q);
+ msg.buffer = eos_bufq_pop(&net_buf_q);
+ msg.size = EOS_NET_MTU;
}
- if (buffer) net_xchg_start(0, buffer, 0);
+ if (msg.buffer) net_xchg_start(0, &msg, 0);
}
return do_release;
@@ -155,42 +156,50 @@ static void net_handle_xchg(void) {
r3 = 0;
}
- net_state_type = (r1 & EOS_NET_MTYPE_MASK);
+ net_state_type = r1;
net_state_len_rx = (r2 & 0xFF) << 8;
net_state_len_rx |= (r3 & 0xFF);
len = MAX(net_state_len_tx, net_state_len_rx);
- // esp32 dma workaraund
+ /* esp32 dma workaraund */
if (len < 8 - NET_SIZE_HDR) {
len = 8 - NET_SIZE_HDR;
} else if ((len + NET_SIZE_HDR) % 4 != 0) {
len = ((len + NET_SIZE_HDR)/4 + 1) * 4 - NET_SIZE_HDR;
}
- if (len > EOS_NET_MTU) {
+ if (len > net_state_buf_sz) {
+ net_state_type = 0;
+ net_state_len_tx = 0;
+ net_state_len_rx = 0;
+ net_state_flags |= NET_STATE_FLAG_ERR_SIZE;
net_state_flags &= ~NET_STATE_FLAG_XCHG;
SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO;
SPI1_REG(SPI_REG_IE) = 0x0;
return;
}
- _eos_spi_xchg_init(net_state_buf, len, 0);
+ _eos_spi_xchg_init(net_state_buf, net_state_buf_sz, len, 0);
SPI1_REG(SPI_REG_TXCTRL) = SPI_TXWM(SPI_SIZE_WM);
SPI1_REG(SPI_REG_IE) = SPI_IP_TXWM;
return;
}
eos_spi_handle_xchg();
- if (SPI1_REG(SPI_REG_CSMODE) == SPI_CSMODE_AUTO) { // exchange done
+ if (SPI1_REG(SPI_REG_CSMODE) == SPI_CSMODE_AUTO) {
+ /* exchange done */
if (!(net_state_flags & NET_STATE_FLAG_SYNC)) {
if (net_state_type) {
if (net_state_type == EOS_NET_MTYPE_SLEEP) {
net_state_flags |= NET_STATE_FLAG_SLEEP;
eos_bufq_push(&net_buf_q, net_state_buf);
} else {
+ EOSMessage msg;
int rv;
- rv = eos_evtq_push_isr(EOS_EVT_NET | (net_state_type & ~EOS_EVT_MASK), net_state_buf, net_state_len_rx);
+ msg.buffer = net_state_buf;
+ msg.size = net_state_buf_sz;
+ rv = eos_evtq_push_isr(EOS_EVT_NET | (net_state_type & EOS_NET_MTYPE_MASK), &msg, net_state_len_rx);
if (rv) {
EOS_LOG(EOS_LOG_ERR, "NET XCHG EVTQ PUSH ERR:%d\n", rv);
eos_bufq_push(&net_buf_q, net_state_buf);
@@ -202,7 +211,7 @@ static void net_handle_xchg(void) {
eos_bufq_push(&net_buf_q, net_state_buf);
}
}
- net_state_flags &= ~(NET_STATE_FLAG_ONEW | NET_STATE_FLAG_XCHG);
+ net_state_flags &= ~(NET_STATE_FLAG_XCHG | NET_STATE_FLAG_ONEW);
}
}
@@ -232,13 +241,20 @@ static void net_handle_rts(void) {
}
}
-static void net_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) {
- unsigned char idx = (type & ~EOS_EVT_MASK);
+static void net_handle_evt(unsigned char type, EOSMessage *msg, uint16_t len) {
+ unsigned char idx;
- if (idx && (idx <= EOS_NET_MAX_MTYPE)) {
- net_handler[idx - 1](type, buffer, len);
+ idx = type & EOS_NET_MTYPE_FLAG_BRIDGE ? EOS_NET_MTYPE_BRIDGE : (type & ~EOS_EVT_MASK);
+ type &= ~EOS_EVT_MASK;
+ if (msg && (idx < EOS_NET_MAX_MTYPE)) {
+ net_handler[idx](type, msg, len);
} else {
- eos_net_bad_handler(type, buffer, len);
+ eos_net_bad_handler(type, msg, len);
+ }
+ if (msg && msg->buffer) {
+ eos_net_free(msg, 0);
+ } else {
+ eos_net_release();
}
}
@@ -268,17 +284,17 @@ static int net_acquire(unsigned char reserved) {
return ret;
}
-static void evt_handler_wrapper(unsigned char type, unsigned char *buffer, uint16_t len, uint8_t idx) {
+static void evt_handler_wrapper(unsigned char type, EOSMessage *msg, uint16_t len, uint8_t idx) {
uint16_t flag = (uint16_t)1 << idx;
int rv;
rv = net_acquire(net_wrapper_acq & flag);
if (rv) {
- eos_evtq_get_handler(type)(type, buffer, len);
+ eos_evtq_get_handler(type)(type, msg, len);
eos_net_release();
net_wrapper_acq &= ~flag;
} else {
- rv = eos_evtq_push_widx(type, buffer, len, &idx);
+ rv = eos_evtq_push_widx(type, msg, len, &idx);
if (rv) {
EOS_LOG(EOS_LOG_ERR, "NET WRAPPER EVTQ PUSH ERR:%d\n", rv);
return;
@@ -288,7 +304,7 @@ static void evt_handler_wrapper(unsigned char type, unsigned char *buffer, uint1
}
}
-static void evt_handler(unsigned char type, unsigned char *buffer, uint16_t len, uint8_t _idx) {
+static void evt_handler(unsigned char type, EOSMessage *msg, uint16_t len, uint8_t _idx) {
unsigned char idx = (type & EOS_EVT_MASK) >> 4;
if (idx && (idx <= EOS_EVT_MAX)) {
@@ -296,12 +312,12 @@ static void evt_handler(unsigned char type, unsigned char *buffer, uint16_t len,
idx--;
if (flag & net_flags_acq[idx]) {
- evt_handler_wrapper(type, buffer, len, _idx);
+ evt_handler_wrapper(type, msg, len, _idx);
} else {
- eos_evtq_get_handler(type)(type, buffer, len);
+ eos_evtq_get_handler(type)(type, msg, len);
}
} else {
- eos_evtq_bad_handler(type, buffer, len);
+ eos_evtq_bad_handler(type, msg, len);
}
}
@@ -329,23 +345,31 @@ static void net_wait4cts(void) {
}
}
-static void net_wake(void) {
+static int net_wake(void) {
+ uint32_t start, timeout;
+
+ start = eos_get_tick();
+ timeout = NET_DETECT_TIMEOUT;
while (net_state_flags & NET_STATE_FLAG_SLEEP) {
+ if (timeout && (eos_tdelta_ms(start) > timeout)) return EOS_ERR_NOTFOUND;
net_xchg_reset();
eos_sleep(10);
set_csr(mstatus, MSTATUS_MIE);
clear_csr(mstatus, MSTATUS_MIE);
}
+
+ return EOS_OK;
}
static int net_select(int *dsel) {
+ int rv;
+
*dsel = 0;
if (net_state_flags & NET_STATE_FLAG_ABSENT) return EOS_ERR_NOTFOUND;
if (net_state_flags & NET_STATE_FLAG_SLEEP_REQ) return EOS_ERR_BUSY;
+ rv = EOS_OK;
if (!(net_state_flags & NET_STATE_FLAG_RUN)) {
- int rv;
-
set_csr(mstatus, MSTATUS_MIE);
rv = eos_spi_select(EOS_SPI_DEV_NET);
clear_csr(mstatus, MSTATUS_MIE);
@@ -353,9 +377,9 @@ static int net_select(int *dsel) {
*dsel = 1;
}
/* wake up remote if sleeping */
- net_wake();
+ if (net_state_flags & NET_STATE_FLAG_SLEEP) rv = net_wake();
- return EOS_OK;
+ return rv;
}
static void net_deselect(void) {
@@ -388,9 +412,9 @@ static void net_stop(void) {
int eos_net_init(void) {
int i;
- eos_msgq_init(&net_send_q, net_sndq_array, EOS_NET_SIZE_BUFQ);
- eos_bufq_init(&net_buf_q, net_bufq_array, EOS_NET_SIZE_BUFQ);
- for (i=0; i<EOS_NET_SIZE_BUFQ; i++) {
+ eos_msgq_init(&net_send_q, net_sndq_array, NET_SIZE_BUFQ);
+ eos_bufq_init(&net_buf_q, net_bufq_array, NET_SIZE_BUFQ);
+ for (i=0; i<NET_SIZE_BUFQ; i++) {
eos_bufq_push(&net_buf_q, net_bufq_buffer[i]);
}
@@ -417,15 +441,16 @@ int eos_net_init(void) {
int eos_net_run(void) {
uint8_t wakeup_cause;
- int rv;
+ int rv, rst;
rv = EOS_OK;
net_start();
wakeup_cause = eos_pwr_wakeup_cause();
+ rst = (wakeup_cause == EOS_PWR_WAKE_RST);
clear_csr(mstatus, MSTATUS_MIE);
- if (wakeup_cause == EOS_PWR_WAKE_RST) {
+ if (rst) {
uint32_t start, timeout;
start = eos_get_tick();
@@ -436,18 +461,11 @@ int eos_net_run(void) {
break;
}
}
- if (!rv) {
- GPIO_REG(GPIO_PULLUP_EN) &= ~(1 << NET_PIN_CTS);
- } else {
- net_state_flags |= NET_STATE_FLAG_ABSENT;
- EOS_LOG(EOS_LOG_ERR, "NET DEVICE ABSENT\n");
- }
} else {
if (eos_aon_load4net()) {
/* device previously declared as absent */
- net_state_flags |= NET_STATE_FLAG_ABSENT;
- } else if (!(net_state_flags & NET_STATE_FLAG_CTS)) {
- /* will assume that remote device is sleeping */
+ rv = EOS_ERR_NOTFOUND;
+ } else {
net_state_flags |= NET_STATE_FLAG_SLEEP;
}
}
@@ -455,14 +473,26 @@ int eos_net_run(void) {
/* set initial state */
if (!(GPIO_REG(GPIO_INPUT_VAL) & (1 << NET_PIN_CTS))) net_state_flags |= NET_STATE_FLAG_CTS;
if (!(GPIO_REG(GPIO_INPUT_VAL) & (1 << NET_PIN_RTS))) net_state_flags |= NET_STATE_FLAG_RTS;
- net_resume();
+ GPIO_REG(GPIO_PULLUP_EN) &= ~(1 << NET_PIN_CTS);
+ /* wake up remote */
+ if (!rst) rv = net_wake();
+ if (!rv) net_resume();
+ } else {
+ net_state_flags |= NET_STATE_FLAG_ABSENT;
+ EOS_LOG(EOS_LOG_ERR, "NET DEVICE ABSENT\n");
}
set_csr(mstatus, MSTATUS_MIE);
+ /* save absent state */
+ if (rst) eos_aon_save4net(!!rv);
+
+ if (rv) net_stop();
return rv;
}
void eos_net_start(void) {
+ if (net_state_flags & NET_STATE_FLAG_ABSENT) return;
+
net_start();
clear_csr(mstatus, MSTATUS_MIE);
@@ -471,6 +501,8 @@ void eos_net_start(void) {
}
void eos_net_stop(void) {
+ if (net_state_flags & NET_STATE_FLAG_ABSENT) return;
+
clear_csr(mstatus, MSTATUS_MIE);
net_pause();
set_csr(mstatus, MSTATUS_MIE);
@@ -516,26 +548,16 @@ void eos_net_wake(void) {
set_csr(mstatus, MSTATUS_MIE);
}
-void eos_net_save2aon(void) {
- int absent;
-
- clear_csr(mstatus, MSTATUS_MIE);
- absent = !!(net_state_flags & NET_STATE_FLAG_ABSENT);
- set_csr(mstatus, MSTATUS_MIE);
- eos_aon_save4net(absent);
-}
-
-void eos_net_bad_handler(unsigned char type, unsigned char *buffer, uint16_t len) {
- eos_evtq_bad_handler(type, buffer, len);
- if (buffer) eos_net_free(buffer, 0);
+void eos_net_bad_handler(unsigned char type, EOSMessage *msg, uint16_t len) {
+ eos_evtq_bad_handler(type, msg, len);
}
void eos_net_set_handler(unsigned char mtype, eos_evt_handler_t handler) {
if (handler == NULL) handler = eos_net_bad_handler;
- if (mtype && (mtype <= EOS_NET_MAX_MTYPE)) net_handler[mtype - 1] = handler;
+ if (mtype < EOS_NET_MAX_MTYPE) net_handler[mtype] = handler;
}
-void eos_net_acquire_for_evt(unsigned char type, char acq) {
+void eos_net_acquire_for_evt(unsigned char type, int acq) {
unsigned char idx = (type & EOS_EVT_MASK) >> 4;
uint16_t flag = type & ~EOS_EVT_MASK ? (uint16_t)1 << (type & ~EOS_EVT_MASK) : 0xFFFF;
@@ -547,7 +569,9 @@ void eos_net_acquire_for_evt(unsigned char type, char acq) {
}
void eos_net_acquire(void) {
- unsigned char acq = net_acquire(0);
+ int acq;
+
+ acq = net_acquire(0);
if (!acq) net_acquire(1);
}
@@ -560,56 +584,59 @@ void eos_net_release(void) {
set_csr(mstatus, MSTATUS_MIE);
}
-unsigned char *eos_net_alloc(void) {
- unsigned char *rv = NULL;
+void eos_net_alloc(EOSMessage *msg) {
+ msg->buffer = NULL;
+ msg->size = 0;
- while (rv == NULL) {
+ while (msg->buffer == NULL) {
clear_csr(mstatus, MSTATUS_MIE);
if (net_state_next_buf) {
- rv = net_state_next_buf;
+ msg->buffer = net_state_next_buf;
+ msg->size = EOS_NET_MTU;
net_state_next_buf = NULL;
} else {
asm volatile ("wfi");
}
set_csr(mstatus, MSTATUS_MIE);
}
-
- return rv;
}
-void eos_net_free(unsigned char *buffer, unsigned char more) {
- uint8_t do_release = 1;
-
+void eos_net_free(EOSMessage *msg, int more) {
clear_csr(mstatus, MSTATUS_MIE);
if ((more || net_state_next_cnt) && (net_state_next_buf == NULL)) {
- net_state_next_buf = buffer;
+ net_state_next_buf = msg->buffer;
} else {
+ int do_release = 1;
+
if ((net_state_flags & NET_STATE_FLAG_RUN) && (net_state_flags & NET_STATE_FLAG_CTS)) {
- do_release = net_xchg_next(buffer);
+ do_release = net_xchg_next(msg);
}
if (do_release) {
- eos_bufq_push(&net_buf_q, buffer);
+ eos_bufq_push(&net_buf_q, msg->buffer);
}
}
+ msg->buffer = NULL;
+ msg->size = 0;
set_csr(mstatus, MSTATUS_MIE);
}
-static int net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len, unsigned char flags) {
+static int net_xchg(unsigned char *type, EOSMessage *msg, uint16_t *len, unsigned char flags) {
int rv = EOS_OK;
int sync = 0, dsel = 0;
unsigned char _type = *type & EOS_NET_MTYPE_MASK;
uint16_t _len = *len;
- if (flags & NET_FLAG_MORE) _type |= EOS_NET_MTYPE_FLAG_ONEW;
- if (flags & NET_FLAG_REPL) _type |= EOS_NET_MTYPE_FLAG_REPL;
- if (flags & NET_FLAG_SYNC) sync = 1;
+ if ((flags & EOS_NET_FLAG_REPL) && (_type & EOS_NET_MTYPE_FLAG_BRIDGE)) return EOS_ERR;
+
+ if (flags & EOS_NET_FLAG_REPL) flags |= EOS_NET_FLAG_SYNC;
+
+ if (flags & EOS_NET_FLAG_MORE) _type |= EOS_NET_MTYPE_FLAG_ONEW;
+ if (flags & EOS_NET_FLAG_REPL) _type |= EOS_NET_MTYPE_FLAG_REPL;
+ if (flags & EOS_NET_FLAG_SYNC) sync = 1;
clear_csr(mstatus, MSTATUS_MIE);
rv = net_select(&dsel);
- if (rv) {
- set_csr(mstatus, MSTATUS_MIE);
- return rv;
- }
+ if (rv) goto net_xchg_fin;
if (dsel) sync = 1;
if (sync) {
@@ -617,51 +644,58 @@ static int net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len, u
net_pause();
net_wait4cts();
net_state_flags |= NET_STATE_FLAG_SYNC;
- net_xchg_start(_type, buffer, _len);
- if (flags & NET_FLAG_REPL) {
+ net_xchg_start(_type, msg, _len);
+ if (flags & EOS_NET_FLAG_REPL) {
net_wait4cts();
- net_xchg_start(0, buffer, 0);
+ net_xchg_start(0, msg, 0);
}
net_wait4xchg();
net_state_flags &= ~NET_STATE_FLAG_SYNC;
- *type = net_state_type & EOS_NET_MTYPE_MASK;
- *len = net_state_len_rx;
+ if (flags & EOS_NET_FLAG_REPL) {
+ *type = 0;
+ *len = 0;
+ rv = (net_state_flags & NET_STATE_FLAG_ERR_SIZE) ? EOS_ERR_SIZE : EOS_OK;
+ if (!rv) {
+ *type = net_state_type & EOS_NET_MTYPE_MASK;
+ *len = net_state_len_rx;
+ }
+ }
net_resume();
} else {
if ((net_state_flags & NET_STATE_FLAG_RUN) && (net_state_flags & NET_STATE_FLAG_CTS)) {
- net_xchg_start(_type, buffer, _len);
+ net_xchg_start(_type, msg, _len);
} else {
- rv = eos_msgq_push(&net_send_q, _type, buffer, _len);
+ rv = eos_msgq_push(&net_send_q, _type, msg, _len);
}
}
+net_xchg_fin:
set_csr(mstatus, MSTATUS_MIE);
- if (sync && !(flags & NET_FLAG_SYNC)) eos_net_free(buffer, !!(flags & NET_FLAG_MORE));
+ if (!(flags & EOS_NET_FLAG_SYNC)) {
+ if (sync || rv) {
+ eos_net_free(msg, !!(flags & EOS_NET_FLAG_MORE));
+ } else {
+ msg->buffer = NULL;
+ msg->size = 0;
+ }
+ }
if (dsel) net_deselect();
return rv;
}
-int eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char more) {
- int rv;
-
- rv = net_xchg(&type, buffer, &len, more ? NET_FLAG_MORE : 0);
- if (rv) eos_net_free(buffer, more);
- return rv;
+int eos_net_send(unsigned char type, EOSMessage *msg, uint16_t len, int more) {
+ return net_xchg(&type, msg, &len, more ? EOS_NET_FLAG_MORE : 0);
}
-int eos_net_send_sync(unsigned char type, unsigned char *buffer, uint16_t len) {
- return net_xchg(&type, buffer, &len, NET_FLAG_SYNC);
+int eos_net_send_sync(unsigned char type, EOSMessage *msg, uint16_t len) {
+ return net_xchg(&type, msg, &len, EOS_NET_FLAG_SYNC);
}
-int eos_net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len) {
- return net_xchg(type, buffer, len, (NET_FLAG_SYNC | NET_FLAG_REPL));
+int eos_net_xchg(unsigned char *type, EOSMessage *msg, uint16_t *len) {
+ return net_xchg(type, msg, len, EOS_NET_FLAG_REPL);
}
-int _eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char async, unsigned char more) {
- if (async) {
- return eos_net_send(type, buffer, len, more);
- } else {
- return eos_net_send_sync(type, buffer, len);
- }
+int _eos_net_send(unsigned char type, EOSMessage *msg, uint16_t len, unsigned char flags) {
+ return net_xchg(&type, msg, &len, flags);
}
diff --git a/fw/fe310/eos/dev/net.h b/fw/fe310/eos/dev/net.h
index 12b4d14..ad544a3 100644
--- a/fw/fe310/eos/dev/net.h
+++ b/fw/fe310/eos/dev/net.h
@@ -2,26 +2,27 @@
#include "../event.h"
-/* common */
#define EOS_NET_MTU 1500
-#define EOS_NET_SIZE_BUF EOS_NET_MTU
-#define EOS_NET_MTYPE_SOCK 1
-#define EOS_NET_MTYPE_WIFI 2
-#define EOS_NET_MTYPE_CELL 3
-#define EOS_NET_MTYPE_APP 4
-#define EOS_NET_MTYPE_RNG 5
+#define EOS_NET_MTYPE_BRIDGE 0 /* handler only */
+#define EOS_NET_MTYPE_WIFI 1
+#define EOS_NET_MTYPE_CELL 2
+#define EOS_NET_MTYPE_SOCK 3
+#define EOS_NET_MTYPE_RNG 4
#define EOS_NET_MAX_MTYPE 5
-#define EOS_NET_MTYPE_SLEEP 0x10 /* does not have net handler */
+#define EOS_NET_MTYPE_SLEEP 0x20 /* does not have net handler */
-#define EOS_NET_MTYPE_FLAG_ONEW 0x40
-#define EOS_NET_MTYPE_FLAG_REPL 0x80
-#define EOS_NET_MTYPE_MASK 0x3F /* 0x0F if mtype is handled by evtq */
+#define EOS_NET_MTYPE_FLAG_ONEW 0x80
+#define EOS_NET_MTYPE_FLAG_REPL 0x40
+#define EOS_NET_MTYPE_FLAG_BRIDGE 0x08
-/* fe310 specific */
-#define EOS_NET_SIZE_BUFQ 2
+#define EOS_NET_MTYPE_MASK 0x0F /* must be the same as ~EOS_EVT_MASK */
+
+#define EOS_NET_FLAG_MORE 0x01
+#define EOS_NET_FLAG_SYNC 0x02
+#define EOS_NET_FLAG_REPL 0x04
int eos_net_init(void);
int eos_net_run(void);
@@ -30,17 +31,16 @@ void eos_net_stop(void);
int eos_net_sleep(void);
int eos_net_sleep_rdy(void);
void eos_net_wake(void);
-void eos_net_save2aon(void);
-void eos_net_bad_handler(unsigned char type, unsigned char *buffer, uint16_t len);
+void eos_net_bad_handler(unsigned char type, EOSMessage *msg, uint16_t len);
void eos_net_set_handler(unsigned char type, eos_evt_handler_t handler);
-void eos_net_acquire_for_evt(unsigned char type, char acq);
+void eos_net_acquire_for_evt(unsigned char type, int acq);
void eos_net_acquire(void);
void eos_net_release(void);
-unsigned char *eos_net_alloc(void);
-void eos_net_free(unsigned char *buffer, unsigned char more);
-int eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char more);
-int eos_net_send_sync(unsigned char type, unsigned char *buffer, uint16_t len);
-int eos_net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len);
-int _eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char async, unsigned char more);
+void eos_net_alloc(EOSMessage *msg);
+void eos_net_free(EOSMessage *msg, int more);
+int eos_net_send(unsigned char type, EOSMessage *msg, uint16_t len, int more);
+int eos_net_send_sync(unsigned char type, EOSMessage *msg, uint16_t len);
+int eos_net_xchg(unsigned char *type, EOSMessage *msg, uint16_t *len);
+int _eos_net_send(unsigned char type, EOSMessage *msg, uint16_t len, unsigned char flags); \ No newline at end of file
diff --git a/fw/fe310/eos/dev/pwr.c b/fw/fe310/eos/dev/pwr.c
index 06a76d8..b60e35c 100644
--- a/fw/fe310/eos/dev/pwr.c
+++ b/fw/fe310/eos/dev/pwr.c
@@ -19,8 +19,6 @@
static void pwr_sleep_rdy(void) {
if ((eos_evtq_len() == 0) && eos_net_sleep_rdy()) {
- eos_eve_save2aon();
- eos_net_save2aon();
eos_flash_norm();
#ifdef EOS_DEBUG
EOS_LOG(EOS_LOG_INFO, "PWR SLEEP\n");
diff --git a/fw/fe310/eos/dev/spi.c b/fw/fe310/eos/dev/spi.c
index 319816d..ea6d74a 100644
--- a/fw/fe310/eos/dev/spi.c
+++ b/fw/fe310/eos/dev/spi.c
@@ -6,7 +6,6 @@
#include "eos.h"
#include "log.h"
-#include "msgq.h"
#include "event.h"
#include "board.h"
diff --git a/fw/fe310/eos/dev/spi_cfg.h b/fw/fe310/eos/dev/spi_cfg.h
index 0320aa6..906de24 100644
--- a/fw/fe310/eos/dev/spi_cfg.h
+++ b/fw/fe310/eos/dev/spi_cfg.h
@@ -32,14 +32,14 @@ static const SPIConfig spi_cfg[SPI_MAX_DEV] = {
.csid = SPI_CSID_SDC,
.cspin = SPI_CSPIN_SDC,
.flags = 0,
- .evt = EOS_SPI_EVT_SDC,
+ .evt = EOS_SPI_ETYPE_SDC,
},
{ // DEV_CAM
.div = SPI_DIV_CAM,
.csid = SPI_CSID_CAM,
.cspin = SPI_CSPIN_CAM,
.flags = 0,
- .evt = EOS_SPI_EVT_CAM,
+ .evt = EOS_SPI_ETYPE_CAM,
},
{ // DEV_HPAMP
.div = SPI_DIV_HPAMP,
diff --git a/fw/fe310/eos/eos.c b/fw/fe310/eos/eos.c
index 73ab29c..0f6aeb6 100644
--- a/fw/fe310/eos/eos.c
+++ b/fw/fe310/eos/eos.c
@@ -126,8 +126,6 @@ void eos_run_once(void) {
gt911_cfg_print();
eve_select();
- eve_brightness(0x40);
eve_calibrate();
- eve_brightness(0);
eve_deselect();
}
diff --git a/fw/fe310/eos/eve/eve.c b/fw/fe310/eos/eve/eve.c
index e5c5f80..2f01358 100644
--- a/fw/fe310/eos/eve/eve.c
+++ b/fw/fe310/eos/eve/eve.c
@@ -12,9 +12,6 @@ static uint16_t cmd_offset;
static char dl_burst;
static uint32_t dl_addr;
-static uint8_t power_state = EVE_PSTATE_ACTIVE;
-static int lcd_absent = 0;
-
void eve_command(uint8_t command, uint8_t parameter) {
eve_spi_set_cs();
eve_spi_xchg24(((uint32_t)command << 16) | ((uint32_t)parameter << 8), 0);
@@ -384,7 +381,7 @@ int eve_init(void) {
#endif
/* nothing is being displayed yet... the pixel clock is still 0x00 */
- power_state = EVE_PSTATE_ACTIVE;
+ eve_pwr_set_state(EVE_PSTATE_ACTIVE);
return EVE_OK;
}
@@ -408,16 +405,16 @@ void eve_intr_disable(void) {
}
void eve_activate(void) {
- if (power_state == EVE_PSTATE_ACTIVE) return;
+ if (eve_pwr_get_state() == EVE_PSTATE_ACTIVE) return;
eve_command(EVE_ACTIVE, 0);
- if (power_state == EVE_PSTATE_SLEEP) {
+ if (eve_pwr_get_state() == EVE_PSTATE_SLEEP) {
eve_sleep(20);
}
}
void eve_deactivate(void) {
- switch (power_state) {
+ switch (eve_pwr_get_state()) {
case EVE_PSTATE_ACTIVE:
return;
@@ -432,33 +429,29 @@ void eve_deactivate(void) {
}
void eve_pwr_standby(void) {
- if (power_state != EVE_PSTATE_ACTIVE) return;
+ if (eve_pwr_get_state() != EVE_PSTATE_ACTIVE) return;
eve_command(EVE_STANDBY, 0);
- power_state = EVE_PSTATE_STANDBY;
+ eve_pwr_set_state(EVE_PSTATE_STANDBY);
}
void eve_pwr_sleep(void) {
- if (power_state != EVE_PSTATE_ACTIVE) return;
+ if (eve_pwr_get_state() != EVE_PSTATE_ACTIVE) return;
eve_command(EVE_SLEEP, 0);
- power_state = EVE_PSTATE_SLEEP;
+ eve_pwr_set_state(EVE_PSTATE_SLEEP);
}
void eve_pwr_wake(void) {
eve_activate();
- power_state = EVE_PSTATE_ACTIVE;
-}
-
-void eve_pwr_set_state(uint8_t state) {
- power_state = state;
+ eve_pwr_set_state(EVE_PSTATE_ACTIVE);
}
uint8_t eve_pwr_state(void) {
- return power_state;
+ return eve_pwr_get_state();
}
int eve_gpio_get(int gpio) {
@@ -505,13 +498,14 @@ void eve_gpio_write_dir(uint16_t dir) {
eve_write16(REG_GPIOX_DIR, reg);
}
-void eve_brightness(uint8_t b) {
- if (lcd_absent) b = 0;
+void eve_set_brightness(uint8_t b) {
+ if (eve_lcd_get_absent()) b = 0;
+ if (b > 0x80) b = 0x80;
eve_write8(REG_PWM_DUTY, b);
}
-void eve_lcd_absent(void) {
- lcd_absent = 1;
+uint8_t eve_get_brightness(void) {
+ return eve_read8(REG_PWM_DUTY);
}
void eve_copro_reset(void) {
diff --git a/fw/fe310/eos/eve/eve.h b/fw/fe310/eos/eve/eve.h
index 02388bb..7936fc2 100644
--- a/fw/fe310/eos/eve/eve.h
+++ b/fw/fe310/eos/eve/eve.h
@@ -8,7 +8,6 @@
/* defined in eve_platform.h */
#define EVE_GPIO_MASK 0x800f
-#define EVE_GPIO_DISP 15
#define EVE_PSTATE_ACTIVE 0
#define EVE_PSTATE_STANDBY 1
@@ -69,8 +68,6 @@ void eve_deactivate(void);
void eve_pwr_standby(void);
void eve_pwr_sleep(void);
void eve_pwr_wake(void);
-void eve_pwr_set_state(uint8_t state);
-
uint8_t eve_pwr_state(void);
int eve_gpio_get(int gpio);
@@ -80,6 +77,6 @@ void eve_gpio_write(uint16_t gpio);
uint16_t eve_gpio_read_dir(void);
void eve_gpio_write_dir(uint16_t dir);
-void eve_brightness(uint8_t b);
-void eve_lcd_absent(void);
+void eve_set_brightness(uint8_t b);
+uint8_t eve_get_brightness(void);
void eve_copro_reset(void);
diff --git a/fw/fe310/eos/eve/eve_config.h b/fw/fe310/eos/eve/eve_config.h
index 1126277..4a99992 100755
--- a/fw/fe310/eos/eve/eve_config.h
+++ b/fw/fe310/eos/eve/eve_config.h
@@ -3,31 +3,31 @@
/* FocusLCDs E50RG84885LWAM520-CA */
+#define EVE_HFP 8 /* horizontal front porch */
#define EVE_HLPW 6 /* horizontal low pulse width */
#define EVE_HBP 6 /* horizontal back porch */
-#define EVE_HFP 6 /* horizontal front porch */
#define EVE_HACT 480 /* horizontal active pixels */
-#define EVE_HTOT (EVE_HLPW + EVE_HBP + EVE_HFP + EVE_HACT + 10)
+#define EVE_HTOT (EVE_HLPW + EVE_HBP + EVE_HFP + EVE_HACT)
+#define EVE_HFPX (EVE_HFP - 2) /* refer to AN_336 - FT8xx - Selecting an LCD Display */
-
-#define EVE_VLPW 6 /* vertical low pulse width */
-#define EVE_VBP 6 /* vertical back porch */
-#define EVE_VFP 6 /* vertical front porch */
+#define EVE_VFP 26 /* vertical front porch */
+#define EVE_VLPW 10 /* vertical low pulse width */
+#define EVE_VBP 10 /* vertical back porch */
#define EVE_VACT 854 /* vertical active pixels */
-#define EVE_VTOT (EVE_VLPW + EVE_VBP + EVE_VFP + EVE_VACT + 10)
-
+#define EVE_VTOT (EVE_VLPW + EVE_VBP + EVE_VFP + EVE_VACT)
+#define EVE_VFPY (EVE_VFP - 2) /* refer to AN_336 - FT8xx - Selecting an LCD Display */
#define EVE_HCYCLE (EVE_HTOT) /* Th Total length of line (visible and non-visible) (in PCLKs) */
#define EVE_HSIZE (EVE_HACT) /* Length of visible part of line (in PCLKs) - display width */
-#define EVE_HOFFSET (EVE_HFP + EVE_HLPW + EVE_HBP) /* Length of non-visible part of line (in PCLK cycles) */
-#define EVE_HSYNC0 (EVE_HFP) /* Horizontal Front Porch */
-#define EVE_HSYNC1 (EVE_HFP + EVE_HLPW) /* Horizontal Front Porch plus Hsync Pulse width */
+#define EVE_HOFFSET (EVE_HFPX + EVE_HLPW + EVE_HBP) /* Length of non-visible part of line (in PCLK cycles) */
+#define EVE_HSYNC0 (EVE_HFPX) /* Horizontal Front Porch */
+#define EVE_HSYNC1 (EVE_HFPX + EVE_HLPW) /* Horizontal Front Porch plus Hsync Pulse width */
#define EVE_VCYCLE (EVE_VTOT) /* Total number of lines (visible and non-visible) (in lines) */
#define EVE_VSIZE (EVE_VACT) /* Number of visible lines (in lines) - display height */
-#define EVE_VOFFSET (EVE_VFP + EVE_VLPW + EVE_VBP) /* Number of non-visible lines (in lines) */
-#define EVE_VSYNC0 (EVE_VFP) /* Vertical Front Porch */
-#define EVE_VSYNC1 (EVE_VFP + EVE_VLPW) /* Vertical Front Porch plus Vsync Pulse width */
+#define EVE_VOFFSET (EVE_VFPY + EVE_VLPW + EVE_VBP) /* Number of non-visible lines (in lines) */
+#define EVE_VSYNC0 (EVE_VFPY) /* Vertical Front Porch */
+#define EVE_VSYNC1 (EVE_VFPY + EVE_VLPW) /* Vertical Front Porch plus Vsync Pulse width */
#define EVE_PCLKPOL 1 /* PCLK polarity (0 = rising edge, 1 = falling edge) */
#define EVE_SWIZZLE 0 /* Defines the arrangement of the RGB pins */
diff --git a/fw/fe310/eos/eve/eve_platform.h b/fw/fe310/eos/eve/eve_platform.h
index 6f34b81..49c87dc 100644
--- a/fw/fe310/eos/eve/eve_platform.h
+++ b/fw/fe310/eos/eve/eve_platform.h
@@ -6,6 +6,7 @@
#include "../log.h"
#include "../soc/timer.h"
#include "../soc/spi.h"
+#include "../dev/aon.h"
#ifdef EOS_DEBUG
#define EVE_DEBUG 1
@@ -49,6 +50,10 @@ void eve_free(void *);
#define eve_spi_xchg16 eos_spi_xchg16
#define eve_spi_xchg24 eos_spi_xchg24
#define eve_spi_xchg32 eos_spi_xchg32
+#define eve_pwr_get_state eos_aon_load4eve_pwr
+#define eve_pwr_set_state eos_aon_save4eve_pwr
+#define eve_lcd_get_absent eos_aon_load4eve_lcd
+#define eve_lcd_set_absent eos_aon_save4eve_lcd
void eve_sleep(uint32_t ms);
uint32_t eve_get_tick(void);
diff --git a/fw/fe310/eos/eve/eve_touch_engine.c b/fw/fe310/eos/eve/eve_touch_engine.c
index 7c5b39f..aadd07d 100644
--- a/fw/fe310/eos/eve/eve_touch_engine.c
+++ b/fw/fe310/eos/eve/eve_touch_engine.c
@@ -59,6 +59,11 @@ void eve_touch_set_engine(uint16_t engine) {
}
}
+void eve_touch_reset_engine(void) {
+ eve_write8(REG_CPURESET, 2); /* touch engine reset */
+ eve_write8(REG_CPURESET, 0); /* clear reset */
+}
+
void eve_touch_intr_enable(void) {
uint16_t intr_mask;
diff --git a/fw/fe310/eos/eve/eve_touch_engine.h b/fw/fe310/eos/eve/eve_touch_engine.h
index 8eb7333..a144885 100644
--- a/fw/fe310/eos/eve/eve_touch_engine.h
+++ b/fw/fe310/eos/eve/eve_touch_engine.h
@@ -9,6 +9,7 @@
void eve_touch_init_engine(uint16_t engine);
uint16_t eve_touch_get_engine(void);
void eve_touch_set_engine(uint16_t engine);
+void eve_touch_reset_engine(void);
void eve_touch_intr_enable(void);
void eve_touch_intr_disable(void);
void eve_touch_start(void);
diff --git a/fw/fe310/eos/eve/widget/selectw.c b/fw/fe310/eos/eve/widget/selectw.c
index c0e2bfe..ee924c7 100644
--- a/fw/fe310/eos/eve/widget/selectw.c
+++ b/fw/fe310/eos/eve/widget/selectw.c
@@ -14,44 +14,42 @@
#define DIVC(x,y) ((x) / (y) + ((x) % (y) != 0))
-static int selectw_verify(utf8_t *option, uint16_t option_size, EVEFont *font, size_t *_o_len) {
- size_t o_len;
- uint16_t o_curr;
+static int selectw_verify(utf8_t *option, uint16_t option_size, EVEFont *font, size_t *len) {
+ size_t _len, curr;
int rv;
- o_curr = 0;
- while (o_curr < option_size) {
- rv = eve_font_verify(font, option + o_curr, option_size - o_curr, NULL, &o_len);
+ curr = 0;
+ while (curr < option_size) {
+ rv = eve_font_verify(font, option + curr, option_size - curr, NULL, &_len);
if (rv) {
- if (_o_len) *_o_len = o_curr;
+ if (len) *len = curr;
return rv;
}
- o_curr += o_len + 1;
- if (o_len == 0) {
- if (_o_len) *_o_len = o_curr;
+ curr += _len + 1;
+ if (_len == 0) {
+ if (len) *len = curr;
return EVE_OK;
}
}
- if (_o_len) *_o_len = o_curr;
+ if (len) *len = curr;
return EVE_OK;
}
static int selectw_count(EVESelectWidget *widget) {
- int o_len;
- int o_curr;
+ size_t len, curr;
int i;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (o_len == widget->option_size - o_curr) return i;
- if (o_len) {
- o_curr += o_len + 1;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (len == widget->option_size - curr) return i;
+ if (len) {
+ curr += len + 1;
i++;
}
- } while (o_len);
+ } while (len);
return i;
}
@@ -124,11 +122,10 @@ void eve_selectw_destroy(EVEWidget *_widget) {
uint8_t eve_selectw_draw(EVEWidget *_widget, uint8_t tag0) {
EVESelectWidget *widget = (EVESelectWidget *)_widget;
EVEPage *page = _widget->page;
- int o_len;
- int o_curr;
- int i, s;
+ size_t len, curr;
int16_t x1, x2, y1, y2;
uint16_t new_h;
+ int i, s;
int line0, lineN;
@@ -143,11 +140,11 @@ uint8_t eve_selectw_draw(EVEWidget *_widget, uint8_t tag0) {
_widget->tagN = tag0;
widget->line0 = line0;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (!o_len || (o_len == widget->option_size - o_curr)) break;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (!len || (len == widget->option_size - curr)) break;
if ((i >= line0) && (i < lineN)) {
if (_widget->tagN != EVE_NOTAG) {
eve_cmd_dl(TAG(_widget->tagN));
@@ -170,13 +167,13 @@ uint8_t eve_selectw_draw(EVEWidget *_widget, uint8_t tag0) {
}
eve_cmd_dl(END());
if (s) eve_cmd_dl(COLOR_RGBC(page->v.color_bg));
- eve_cmd(CMD_TEXT, "hhhhs", x1, y1, widget->font->id, 0, widget->option + o_curr);
+ eve_cmd(CMD_TEXT, "hhhhs", x1, y1, widget->font->id, 0, widget->option + curr);
if (s) eve_cmd_dl(COLOR_RGBC(page->v.color_fg));
}
- o_curr += o_len + 1;
+ curr += len + 1;
i++;
- } while (o_len);
+ } while (len);
return _widget->tagN;
}
@@ -216,19 +213,18 @@ int eve_selectw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt) {
}
utf8_t *eve_selectw_option(EVESelectWidget *widget, int idx) {
- int o_len;
- int o_curr;
+ size_t len, curr;
int i;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (o_len == widget->option_size - o_curr) return NULL;
- if (o_len && (i == idx)) return widget->option + o_curr;
- o_curr += o_len + 1;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (len == widget->option_size - curr) return NULL;
+ if (len && (i == idx)) return widget->option + curr;
+ curr += len + 1;
i++;
- } while (o_len);
+ } while (len);
return NULL;
}
@@ -239,26 +235,25 @@ utf8_t *eve_selectw_option_selected(EVESelectWidget *widget) {
}
int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option) {
- int o_len;
- int o_curr;
+ size_t len, curr;
int rv, i;
rv = eve_font_verify(widget->font, option, 0, NULL, NULL);
if (rv) return rv;
- o_curr = 0;
+ curr = 0;
i = 0;
do {
- o_len = strnlen(widget->option + o_curr, widget->option_size - o_curr);
- if (o_len == widget->option_size - o_curr) return EVE_ERR_FULL;
- if (o_len) {
- o_curr += o_len + 1;
+ len = strnlen(widget->option + curr, widget->option_size - curr);
+ if (len == widget->option_size - curr) return EVE_ERR_FULL;
+ if (len) {
+ curr += len + 1;
i++;
}
- } while (o_len);
+ } while (len);
- if (o_curr + strlen(option) + 1 > widget->option_size) return EVE_ERR_FULL;
- strcpy(widget->option + o_curr, option);
+ if (curr + strlen(option) + 1 > widget->option_size) return EVE_ERR_FULL;
+ strcpy(widget->option + curr, option);
widget->option_count = i + 1;
selectw_update_sz(widget, 1);
@@ -266,16 +261,16 @@ int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option) {
return EVE_OK;
}
-int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size) {
+int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t len) {
int rv, i;
- if (option_size > widget->option_size) return EVE_ERR_FULL;
+ if (len > widget->option_size) return EVE_ERR_FULL;
- rv = selectw_verify(option, option_size, widget->font, NULL);
+ rv = selectw_verify(option, len, widget->font, NULL);
if (rv) return rv;
- memcpy(widget->option, option, option_size);
- memset(widget->option + option_size, 0, widget->option_size - option_size);
+ memcpy(widget->option, option, len);
+ memset(widget->option + len, 0, widget->option_size - len);
widget->option_count = selectw_count(widget);
selectw_update_sz(widget, 1);
@@ -283,22 +278,22 @@ int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t opt
return EVE_OK;
}
-void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size) {
+void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t len) {
size_t good_l, bad_l;
int rv;
do {
- rv = selectw_verify(option, option_size, widget->font, &good_l);
+ rv = selectw_verify(option, len, widget->font, &good_l);
if (rv == EVE_OK) return;
option += good_l;
- option_size -= good_l;
+ len -= good_l;
- bad_l = strnlen(option, option_size);
- if (bad_l != option_size) {
+ bad_l = strnlen(option, len);
+ if (bad_l != len) {
bad_l++;
}
- memmove(option, option + bad_l, option_size - bad_l);
- memset(option + option_size - bad_l, 0, bad_l);
- } while (bad_l != option_size);
+ memmove(option, option + bad_l, len - bad_l);
+ memset(option + len - bad_l, 0, bad_l);
+ } while (bad_l != len);
}
diff --git a/fw/fe310/eos/eve/widget/selectw.h b/fw/fe310/eos/eve/widget/selectw.h
index 185d787..577fb86 100644
--- a/fw/fe310/eos/eve/widget/selectw.h
+++ b/fw/fe310/eos/eve/widget/selectw.h
@@ -30,5 +30,5 @@ int eve_selectw_touch(EVEWidget *_widget, EVETouch *touch, uint16_t evt);
utf8_t *eve_selectw_option(EVESelectWidget *widget, int idx);
utf8_t *eve_selectw_option_selected(EVESelectWidget *widget);
int eve_selectw_add_option(EVESelectWidget *widget, utf8_t *option);
-int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size);
-void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t option_size);
+int eve_selectw_set_option(EVESelectWidget *widget, utf8_t *option, uint16_t len);
+void eve_selectw_fix_option(EVESelectWidget *widget, utf8_t *option, uint16_t len);
diff --git a/fw/fe310/eos/event.c b/fw/fe310/eos/event.c
index b21e5ea..1af51da 100644
--- a/fw/fe310/eos/event.c
+++ b/fw/fe310/eos/event.c
@@ -7,7 +7,7 @@
#include "eos.h"
#include "log.h"
-#include "msgq.h"
+
#include "event.h"
EOSMsgQ _eos_event_q;
@@ -17,13 +17,13 @@ static eos_evt_handler_t evt_handler[EOS_EVT_MAX];
static eos_evt_handler_global_t evt_handler_global;
static eos_evt_loopf_t evt_loop_f;
-static void evtq_handler(unsigned char type, unsigned char *buffer, uint16_t len, uint8_t _idx) {
+static void evtq_handler(unsigned char type, EOSMessage *msg, uint16_t len, uint8_t _idx) {
unsigned char idx = (type & EOS_EVT_MASK) >> 4;
if (idx && (idx <= EOS_EVT_MAX)) {
- evt_handler[idx - 1](type, buffer, len);
+ evt_handler[idx - 1](type, msg, len);
} else {
- eos_evtq_bad_handler(type, buffer, len);
+ eos_evtq_bad_handler(type, msg, len);
}
}
@@ -49,102 +49,52 @@ int eos_evtq_len(void) {
return rv;
}
-int eos_evtq_push(unsigned char type, unsigned char *buffer, uint16_t len) {
+int eos_evtq_push(unsigned char type, EOSMessage *msg, uint16_t len) {
int rv;
clear_csr(mstatus, MSTATUS_MIE);
- rv = eos_msgq_push(&_eos_event_q, type, buffer, len);
+ rv = eos_msgq_push(&_eos_event_q, type, msg, len);
set_csr(mstatus, MSTATUS_MIE);
return rv;
}
-int eos_evtq_push_widx(unsigned char type, unsigned char *buffer, uint16_t len, uint8_t *idx) {
+int eos_evtq_push_widx(unsigned char type, EOSMessage *msg, uint16_t len, uint8_t *idx) {
int rv;
clear_csr(mstatus, MSTATUS_MIE);
- rv = eos_msgq_push_widx(&_eos_event_q, type, buffer, len, idx);
+ rv = eos_msgq_push_widx(&_eos_event_q, type, msg, len, idx);
set_csr(mstatus, MSTATUS_MIE);
return rv;
}
-int eos_evtq_push_isr(unsigned char type, unsigned char *buffer, uint16_t len) {
- return eos_msgq_push(&_eos_event_q, type, buffer, len);
-}
-
-int eos_evtq_push_widx_isr(unsigned char type, unsigned char *buffer, uint16_t len, uint8_t *idx) {
- return eos_msgq_push_widx(&_eos_event_q, type, buffer, len, idx);
+int eos_evtq_push_isr(unsigned char type, EOSMessage *msg, uint16_t len) {
+ return eos_msgq_push(&_eos_event_q, type, msg, len);
}
-void eos_evtq_pop(unsigned char *type, unsigned char **buffer, uint16_t *len) {
- clear_csr(mstatus, MSTATUS_MIE);
- eos_msgq_pop(&_eos_event_q, type, buffer, len);
- set_csr(mstatus, MSTATUS_MIE);
+int eos_evtq_push_widx_isr(unsigned char type, EOSMessage *msg, uint16_t len, uint8_t *idx) {
+ return eos_msgq_push_widx(&_eos_event_q, type, msg, len, idx);
}
-void eos_evtq_pop_widx(unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *idx) {
+void eos_evtq_pop(unsigned char *type, EOSMessage *msg, uint16_t *len) {
clear_csr(mstatus, MSTATUS_MIE);
- eos_msgq_pop_widx(&_eos_event_q, type, buffer, len, idx);
+ eos_msgq_pop(&_eos_event_q, type, msg, len);
set_csr(mstatus, MSTATUS_MIE);
}
-void eos_evtq_pop_isr(unsigned char *type, unsigned char **buffer, uint16_t *len) {
- eos_msgq_pop(&_eos_event_q, type, buffer, len);
-}
-
-void eos_evtq_pop_widx_isr(unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *idx) {
- eos_msgq_pop_widx(&_eos_event_q, type, buffer, len, idx);
-}
-
-int eos_evtq_get(unsigned char type, unsigned char **buffer, uint16_t *len) {
- int rv = 0;
-
+void eos_evtq_pop_widx(unsigned char *type, EOSMessage *msg, uint16_t *len, uint8_t *idx) {
clear_csr(mstatus, MSTATUS_MIE);
- rv = eos_msgq_find(&_eos_event_q, type, NULL, 0, buffer, len);
+ eos_msgq_pop_widx(&_eos_event_q, type, msg, len, idx);
set_csr(mstatus, MSTATUS_MIE);
-
- return rv;
}
-int eos_evtq_find(unsigned char type, unsigned char *selector, uint16_t sel_len, unsigned char **buffer, uint16_t *len) {
- int rv = 0;
-
- clear_csr(mstatus, MSTATUS_MIE);
- rv = eos_msgq_find(&_eos_event_q, type, selector, sel_len, buffer, len);
- set_csr(mstatus, MSTATUS_MIE);
-
- return rv;
+void eos_evtq_pop_isr(unsigned char *type, EOSMessage *msg, uint16_t *len) {
+ eos_msgq_pop(&_eos_event_q, type, msg, len);
}
-int eos_evtq_wait(unsigned char type, unsigned char *selector, uint16_t sel_len, unsigned char **buffer, uint16_t *len) {
- int rv = 0;
-
- while(!rv) {
- clear_csr(mstatus, MSTATUS_MIE);
- rv = eos_msgq_find(&_eos_event_q, type, selector, sel_len, buffer, len);
- if (rv && (rv != EOS_ERR_NOTFOUND)) {
- set_csr(mstatus, MSTATUS_MIE);
- return rv;
- }
- if (rv) {
- unsigned char _type;
- unsigned char *_buffer;
- uint16_t _len;
- uint8_t idx;
-
- eos_msgq_pop_widx(&_eos_event_q, &_type, &_buffer, &_len, &idx);
- if (_type) {
- set_csr(mstatus, MSTATUS_MIE);
- evt_handler_global(_type, _buffer, _len, idx);
- } else {
- asm volatile ("wfi");
- set_csr(mstatus, MSTATUS_MIE);
- }
- } else {
- set_csr(mstatus, MSTATUS_MIE);
- }
- }
+void eos_evtq_pop_widx_isr(unsigned char *type, EOSMessage *msg, uint16_t *len, uint8_t *idx) {
+ eos_msgq_pop_widx(&_eos_event_q, type, msg, len, idx);
}
void eos_evtq_flush(void) {
@@ -155,15 +105,15 @@ void eos_evtq_flush(void) {
void eos_evtq_flush_isr(void) {
unsigned char type;
- unsigned char *buffer;
+ EOSMessage msg;
uint16_t len;
uint8_t idx;
do {
- eos_msgq_pop_widx(&_eos_event_q, &type, &buffer, &len, &idx);
+ eos_msgq_pop_widx(&_eos_event_q, &type, &msg, &len, &idx);
if (type) {
set_csr(mstatus, MSTATUS_MIE);
- evt_handler_global(type, buffer, len, idx);
+ evt_handler_global(type, &msg, len, idx);
clear_csr(mstatus, MSTATUS_MIE);
}
} while (type);
@@ -180,15 +130,15 @@ void eos_evtq_loop(void) {
void eos_evtq_exec(void) {
unsigned char type;
- unsigned char *buffer;
+ EOSMessage msg;
uint16_t len;
uint8_t idx;
clear_csr(mstatus, MSTATUS_MIE);
- eos_msgq_pop_widx(&_eos_event_q, &type, &buffer, &len, &idx);
+ eos_msgq_pop_widx(&_eos_event_q, &type, &msg, &len, &idx);
if (type) {
set_csr(mstatus, MSTATUS_MIE);
- evt_handler_global(type, buffer, len, idx);
+ evt_handler_global(type, &msg, len, idx);
} else {
asm volatile ("wfi");
set_csr(mstatus, MSTATUS_MIE);
@@ -199,8 +149,7 @@ void eos_evtq_set_loopf(eos_evt_loopf_t loop_f) {
evt_loop_f = loop_f;
}
-
-void eos_evtq_bad_handler(unsigned char type, unsigned char *buffer, uint16_t len) {
+void eos_evtq_bad_handler(unsigned char type, EOSMessage *msg, uint16_t len) {
EOS_LOG(EOS_LOG_ERR, "EVT BAD HANDLER:0x%.2X\n", type);
}
diff --git a/fw/fe310/eos/event.h b/fw/fe310/eos/event.h
index bdc1af1..df2f546 100644
--- a/fw/fe310/eos/event.h
+++ b/fw/fe310/eos/event.h
@@ -1,28 +1,26 @@
#include <stdint.h>
#include "evt_def.h"
+#include "msgq.h"
-typedef void (*eos_evt_handler_t) (unsigned char, unsigned char *, uint16_t);
-typedef void (*eos_evt_handler_global_t) (unsigned char, unsigned char *, uint16_t, uint8_t);
+typedef void (*eos_evt_handler_t) (unsigned char, EOSMessage *, uint16_t);
+typedef void (*eos_evt_handler_global_t) (unsigned char, EOSMessage *, uint16_t, uint8_t);
+typedef void (*eos_evt_simple_handler_t) (unsigned char);
typedef void (*eos_evt_loopf_t) (void);
int eos_evtq_init(void);
int eos_evtq_len(void);
-int eos_evtq_push(unsigned char type, unsigned char *buffer, uint16_t len);
-int eos_evtq_push_widx(unsigned char type, unsigned char *buffer, uint16_t len, uint8_t *idx);
-int eos_evtq_push_isr(unsigned char type, unsigned char *buffer, uint16_t len);
-int eos_evtq_push_widx_isr(unsigned char type, unsigned char *buffer, uint16_t len, uint8_t *idx);
+int eos_evtq_push(unsigned char type, EOSMessage *msg, uint16_t len);
+int eos_evtq_push_widx(unsigned char type, EOSMessage *msg, uint16_t len, uint8_t *idx);
+int eos_evtq_push_isr(unsigned char type, EOSMessage *msg, uint16_t len);
+int eos_evtq_push_widx_isr(unsigned char type, EOSMessage *msg, uint16_t len, uint8_t *idx);
-void eos_evtq_pop(unsigned char *type, unsigned char **buffer, uint16_t *len);
-void eos_evtq_pop_widx(unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *idx) ;
-void eos_evtq_pop_isr(unsigned char *type, unsigned char **buffer, uint16_t *len);
-void eos_evtq_pop_widx_isr(unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *idx);
-
-int eos_evtq_get(unsigned char type, unsigned char **buffer, uint16_t *len);
-int eos_evtq_find(unsigned char type, unsigned char *selector, uint16_t sel_len, unsigned char **buffer, uint16_t *len);
-int eos_evtq_wait(unsigned char type, unsigned char *selector, uint16_t sel_len, unsigned char **buffer, uint16_t *len);
+void eos_evtq_pop(unsigned char *type, EOSMessage *msg, uint16_t *len);
+void eos_evtq_pop_widx(unsigned char *type, EOSMessage *msg, uint16_t *len, uint8_t *idx) ;
+void eos_evtq_pop_isr(unsigned char *type, EOSMessage *msg, uint16_t *len);
+void eos_evtq_pop_widx_isr(unsigned char *type, EOSMessage *msg, uint16_t *len, uint8_t *idx);
void eos_evtq_flush(void);
void eos_evtq_flush_isr(void);
@@ -30,7 +28,7 @@ void eos_evtq_loop(void);
void eos_evtq_exec(void);
void eos_evtq_set_loopf(eos_evt_loopf_t loop_f);
-void eos_evtq_bad_handler(unsigned char type, unsigned char *buffer, uint16_t len);
+void eos_evtq_bad_handler(unsigned char type, EOSMessage *msg, uint16_t len);
void eos_evtq_set_handler(unsigned char type, eos_evt_handler_t handler);
eos_evt_handler_t eos_evtq_get_handler(unsigned char type);
void eos_evtq_set_handler_global(eos_evt_handler_global_t handler);
diff --git a/fw/fe310/eos/msgq.c b/fw/fe310/eos/msgq.c
index 2af3b14..8964046 100644
--- a/fw/fe310/eos/msgq.c
+++ b/fw/fe310/eos/msgq.c
@@ -3,13 +3,19 @@
#include <string.h>
#include "eos.h"
-#include "msgq.h"
+
+#include "event.h"
#define IDX_MASK(IDX, SIZE) ((IDX) & ((SIZE) - 1))
#define IDX_HALF ((uint8_t)1 << (sizeof(uint8_t) * 8 - 1))
#define IDX_LT(a,b) ((uint8_t)((uint8_t)(a) - (uint8_t)(b)) > IDX_HALF)
#define IDX_LTE(a,b) ((uint8_t)((uint8_t)(b) - (uint8_t)(a)) < IDX_HALF)
+void eos_msg_init(EOSMessage *msg, unsigned char *buffer, uint16_t size) {
+ msg->buffer = buffer;
+ msg->size = size;
+}
+
void eos_msgq_init(EOSMsgQ *msgq, EOSMsgItem *array, uint8_t size) {
msgq->idx_r = 0;
msgq->idx_w = 0;
@@ -21,92 +27,54 @@ uint8_t eos_msgq_len(EOSMsgQ *msgq) {
return (uint8_t)(msgq->idx_w - msgq->idx_r);
}
-int eos_msgq_push(EOSMsgQ *msgq, unsigned char type, unsigned char *buffer, uint16_t len) {
- return eos_msgq_push_widx(msgq, type, buffer, len, NULL);
+int eos_msgq_push(EOSMsgQ *msgq, unsigned char type, EOSMessage *msg, uint16_t len) {
+ return eos_msgq_push_widx(msgq, type, msg, len, NULL);
}
-int eos_msgq_push_widx(EOSMsgQ *msgq, unsigned char type, unsigned char *buffer, uint16_t len, uint8_t *_idx) {
+int eos_msgq_push_widx(EOSMsgQ *msgq, unsigned char type, EOSMessage *msg, uint16_t len, uint8_t *_idx) {
+ uint8_t idx;
+
if ((uint8_t)(msgq->idx_w - msgq->idx_r) == msgq->size) return EOS_ERR_FULL;
- uint8_t idx = IDX_MASK(msgq->idx_w, msgq->size);
+ idx = IDX_MASK(msgq->idx_w, msgq->size);
msgq->array[idx].type = type;
- msgq->array[idx].buffer = buffer;
- msgq->array[idx].len = len;
+ if (msg) {
+ msgq->array[idx].buffer = msg->buffer;
+ msgq->array[idx].size = msg->size;
+ msgq->array[idx].len = len;
+ } else {
+ msgq->array[idx].buffer = NULL;
+ msgq->array[idx].size = 0;
+ msgq->array[idx].len = 0;
+ }
msgq->idx_w++;
if (_idx) *_idx = idx;
+
return EOS_OK;
}
-void eos_msgq_pop(EOSMsgQ *msgq, unsigned char *type, unsigned char **buffer, uint16_t *len) {
- eos_msgq_pop_widx(msgq, type, buffer, len, NULL);
+void eos_msgq_pop(EOSMsgQ *msgq, unsigned char *type, EOSMessage *msg, uint16_t *len) {
+ eos_msgq_pop_widx(msgq, type, msg, len, NULL);
}
-void eos_msgq_pop_widx(EOSMsgQ *msgq, unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *_idx) {
+void eos_msgq_pop_widx(EOSMsgQ *msgq, unsigned char *type, EOSMessage *msg, uint16_t *len, uint8_t *_idx) {
if (msgq->idx_r == msgq->idx_w) {
*type = 0;
- *buffer = NULL;
+ msg->buffer = NULL;
+ msg->size = 0;
*len = 0;
} else {
uint8_t idx = IDX_MASK(msgq->idx_r, msgq->size);
+
*type = msgq->array[idx].type;
- *buffer = msgq->array[idx].buffer;
+ msg->buffer = msgq->array[idx].buffer;
+ msg->size = msgq->array[idx].size;
*len = msgq->array[idx].len;
msgq->idx_r++;
if (_idx) *_idx = idx;
}
}
-int eos_msgq_find(EOSMsgQ *msgq, unsigned char type, unsigned char *selector, uint16_t sel_len, unsigned char **buffer, uint16_t *len) {
- uint8_t i, j, idx;
- unsigned char *_buffer;
- uint16_t _len;
-
- if (msgq->idx_r == msgq->idx_w) {
- if (buffer && len) {
- *buffer = NULL;
- *len = 0;
- }
- return EOS_ERR_NOTFOUND;
- }
-
- idx = IDX_MASK(msgq->idx_r, msgq->size);
- if (type == msgq->array[idx].type) {
- _buffer = msgq->array[idx].buffer;
- _len = msgq->array[idx].len;
- if ((selector == NULL) || (sel_len == 0) || ((sel_len <= _len) && (memcmp(selector, _buffer, sel_len) == 0))) {
- msgq->idx_r++;
- if (buffer && len) {
- *buffer = _buffer;
- *len = _len;
- }
- return EOS_OK;
- }
- }
- for (i = msgq->idx_r + 1; IDX_LT(i, msgq->idx_w); i++) {
- idx = IDX_MASK(i, msgq->size);
- if (type== msgq->array[idx].type) {
- _buffer = msgq->array[idx].buffer;
- _len = msgq->array[idx].len;
- if ((selector == NULL) || (sel_len == 0) || ((sel_len <= _len) && (memcmp(selector, _buffer, sel_len) == 0))) {
- for (j = i + 1; IDX_LT(j, msgq->idx_w); j++) {
- msgq->array[IDX_MASK(j - 1, msgq->size)] = msgq->array[IDX_MASK(j, msgq->size)];
- }
- msgq->idx_w--;
- if (buffer && len) {
- *buffer = _buffer;
- *len = _len;
- }
- return EOS_OK;
- }
- }
- }
- if (buffer && len) {
- *buffer = NULL;
- *len = 0;
- }
- return EOS_ERR_NOTFOUND;
-}
-
void eos_bufq_init(EOSBufQ *bufq, unsigned char **array, uint8_t size) {
bufq->idx_r = 0;
bufq->idx_w = 0;
diff --git a/fw/fe310/eos/msgq.h b/fw/fe310/eos/msgq.h
index 0634144..3a4084c 100644
--- a/fw/fe310/eos/msgq.h
+++ b/fw/fe310/eos/msgq.h
@@ -1,8 +1,19 @@
#include <stdint.h>
+#ifndef _EOS_MSGQ_H_
+#define _EOS_MSGQ_H_
+
+typedef struct EOSMessage {
+ unsigned char *buffer;
+ uint16_t size;
+} EOSMessage;
+
+void eos_msg_init(EOSMessage *msg, unsigned char *buffer, uint16_t size);
+
typedef struct EOSMsgItem {
unsigned char type;
unsigned char *buffer;
+ uint16_t size;
uint16_t len;
} EOSMsgItem;
@@ -15,11 +26,10 @@ typedef struct EOSMsgQ {
void eos_msgq_init(EOSMsgQ *msgq, EOSMsgItem *array, uint8_t size);
uint8_t eos_msgq_len(EOSMsgQ *msgq);
-int eos_msgq_push(EOSMsgQ *msgq, unsigned char type, unsigned char *buffer, uint16_t len);
-int eos_msgq_push_widx(EOSMsgQ *msgq, unsigned char type, unsigned char *buffer, uint16_t len, uint8_t *_idx);
-void eos_msgq_pop(EOSMsgQ *msgq, unsigned char *type, unsigned char **buffer, uint16_t *len);
-void eos_msgq_pop_widx(EOSMsgQ *msgq, unsigned char *type, unsigned char **buffer, uint16_t *len, uint8_t *_idx);
-int eos_msgq_find(EOSMsgQ *msgq, unsigned char type, unsigned char *selector, uint16_t sel_len, unsigned char **buffer, uint16_t *len);
+int eos_msgq_push(EOSMsgQ *msgq, unsigned char type, EOSMessage *msg, uint16_t len);
+int eos_msgq_push_widx(EOSMsgQ *msgq, unsigned char type, EOSMessage *msg, uint16_t len, uint8_t *_idx);
+void eos_msgq_pop(EOSMsgQ *msgq, unsigned char *type, EOSMessage *msg, uint16_t *len);
+void eos_msgq_pop_widx(EOSMsgQ *msgq, unsigned char *type, EOSMessage *msg, uint16_t *len, uint8_t *_idx);
typedef struct EOSBufQ {
uint8_t idx_r;
@@ -32,3 +42,5 @@ void eos_bufq_init(EOSBufQ *bufq, unsigned char **array, uint8_t size);
uint8_t eos_bufq_len(EOSBufQ *bufq);
int eos_bufq_push(EOSBufQ *bufq, unsigned char *buffer);
unsigned char *eos_bufq_pop(EOSBufQ *bufq);
+
+#endif /* _EOS_MSGQ_H_ */
diff --git a/fw/fe310/eos/msgq_priv.h b/fw/fe310/eos/msgq_priv.h
index 2ad5fc5..bce7d3c 100644
--- a/fw/fe310/eos/msgq_priv.h
+++ b/fw/fe310/eos/msgq_priv.h
@@ -7,4 +7,5 @@
#define MSGQ_ITEM_OFF_TYPE 0
#define MSGQ_ITEM_OFF_BUF 4
#define MSGQ_ITEM_OFF_SIZE 8
+#define MSGQ_ITEM_OFF_LEN 10
#define MSGQ_ITEM_SIZE 12
diff --git a/fw/fe310/eos/net/Makefile b/fw/fe310/eos/net/Makefile
index 0646956..d743a54 100644
--- a/fw/fe310/eos/net/Makefile
+++ b/fw/fe310/eos/net/Makefile
@@ -1,6 +1,6 @@
include ../../common.mk
-obj = rng.o wifi.o sock.o cell.o
+obj = rng.o wifi.o cell.o sock.o
lib = ../../libeos-net.a
diff --git a/fw/fe310/eos/net/cell.c b/fw/fe310/eos/net/cell.c
index c0c77af..aa1200d 100644
--- a/fw/fe310/eos/net/cell.c
+++ b/fw/fe310/eos/net/cell.c
@@ -10,21 +10,21 @@
static eos_evt_handler_t evt_handler[EOS_CELL_MAX_MTYPE];
-static void cell_handle_msg(unsigned char type, unsigned char *buffer, uint16_t buf_len) {
+static void cell_handle_msg(unsigned char type, EOSMessage *msg, uint16_t len) {
unsigned char mtype;
unsigned char idx;
- if ((buffer == NULL) || (buf_len < 1)) {
- eos_net_bad_handler(type, buffer, buf_len);
+ if ((msg == NULL) || (len < 1)) {
+ eos_net_bad_handler(type, msg, len);
return;
}
- mtype = buffer[0];
+ mtype = msg->buffer[0];
idx = (mtype & EOS_CELL_MTYPE_MASK) >> 4;
if ((idx < EOS_CELL_MAX_MTYPE) && evt_handler[idx]) {
- evt_handler[idx](mtype & ~EOS_CELL_MTYPE_MASK, buffer, buf_len);
+ evt_handler[idx](mtype & ~EOS_CELL_MTYPE_MASK, msg, len);
} else {
- eos_net_bad_handler(type, buffer, buf_len);
+ eos_net_bad_handler(type, msg, len);
}
}
@@ -50,166 +50,141 @@ eos_evt_handler_t eos_cell_get_handler(unsigned char mtype) {
return NULL;
}
-int eos_cell_send_buffer(unsigned char *buffer, uint16_t buf_len, uint16_t offset, int sync) {
- buffer -= offset;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, buf_len + offset, !sync, 1);
-}
+int eos_cell_status_parse(EOSMessage *msg, uint16_t len, uint8_t *status, uint8_t *connected) {
+ unsigned char *buffer = msg->buffer;
-int eos_cell_status_parse(unsigned char *buffer, uint16_t buf_len, uint8_t *status, uint8_t *connected) {
- if (buf_len < 2) return EOS_ERR_SIZE;
+ if (len < 2) return EOS_ERR_SIZE;
if (buffer[0] != (EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_STATUS)) return EOS_ERR_NET;
buffer++;
- buf_len--;
+ len--;
*status = buffer[0];
buffer++;
- buf_len--;
+ len--;
if (*status == EOS_CELL_STATUS_PPP) {
- if (buf_len < 1) return EOS_ERR_SIZE;
+ if (len < 1) return EOS_ERR_SIZE;
if (connected) *connected = buffer[0];
buffer++;
- buf_len--;
+ len--;
}
return EOS_OK;
}
-int eos_cell_status(uint8_t *status, uint8_t *connected, unsigned char *buffer) {
+int eos_cell_status(uint8_t *status, uint8_t *connected, EOSMessage *msg) {
unsigned char type;
- uint16_t buf_len;
- int do_release;
+ uint16_t len;
int rv;
- do_release = 0;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- do_release = 1;
- }
+ if (msg->size < 1) return EOS_ERR_SIZE;
type = EOS_NET_MTYPE_CELL;
- buf_len = 1;
- buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_STATUS;
+ len = 1;
+ msg->buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_STATUS;
- rv = eos_net_xchg(&type, buffer, &buf_len);
- if (rv) goto cell_status_fin;
+ rv = eos_net_xchg(&type, msg, &len);
+ if (rv) return rv;
- if (type != EOS_NET_MTYPE_CELL) {
- rv = EOS_ERR_NET;
- goto cell_status_fin;
- }
+ if (type != EOS_NET_MTYPE_CELL) return EOS_ERR_NET;
- rv = eos_cell_status_parse(buffer, buf_len, status, connected);
+ return eos_cell_status_parse(msg, len, status, connected);
+}
+
+int eos_cell_uart_take(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
-cell_status_fin:
- if (do_release) eos_net_free(buffer, 1);
- return rv;
+ msg->buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_TAKE;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1);
}
-int eos_cell_uart_take(unsigned char *buffer, int sync) {
- int async;
+int eos_cell_uart_give(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_TAKE;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_GIVE;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1);
}
-int eos_cell_uart_give(unsigned char *buffer, int sync) {
- int async;
+unsigned char *eos_cell_uart_msg2data(EOSMessage *msg, uint16_t *len, uint16_t *size) {
+ if (len && (*len < 1)) return NULL;
+ if (msg->size < 1) return NULL;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_GIVE;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, async, 1);
+ if (len && (msg->buffer[0] != (EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_DATA))) return NULL;
+
+ if (len) *len -= 1;
+ if (size) *size = msg->size - 1;
+ return msg->buffer + 1;
}
-unsigned char *eos_cell_uart_data_alloc(uint16_t *offset) {
- unsigned char *buffer;
+int eos_cell_uart_send(EOSMessage *msg, uint16_t len) {
+ msg->buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_DATA;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, len + 1);
+}
- buffer = eos_net_alloc();
- buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_DATA;
- *offset = 1;
- return buffer + *offset;
+int eos_cell_uart_send_async(EOSMessage *msg, uint16_t len, int more) {
+ msg->buffer[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_DATA;
+ return eos_net_send(EOS_NET_MTYPE_CELL, msg, len + 1, more);
}
-int eos_cell_voice_dial(char *num, unsigned char *buffer, int sync) {
+int eos_cell_voice_dial(char *num, EOSMessage *msg) {
int async;
size_t num_len;
num_len = strlen(num);
if (num_len > EOS_CELL_SIZE_PHNUM) return EOS_ERR_SIZE;
+ if (msg->size < 1 + num_len) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_DIAL;
- memcpy(buffer + 1, num, num_len);
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1 + num_len, async, 1);
+ msg->buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_DIAL;
+ memcpy(msg->buffer + 1, num, num_len);
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1 + num_len);
}
-int eos_cell_voice_answer(unsigned char *buffer, int sync) {
- int async;
+int eos_cell_voice_answer(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_ANSWER;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_ANSWER;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1);
}
-int eos_cell_voice_hangup(unsigned char *buffer, int sync) {
- int async;
+int eos_cell_voice_hangup(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_HANGUP;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_HANGUP;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1);
}
-unsigned char *eos_cell_voice_pcm_alloc(uint16_t *offset) {
- unsigned char *buffer;
+unsigned char *eos_cell_voice_msg2pcm(EOSMessage *msg, uint16_t *len, uint16_t *size) {
+ if (len && (*len < 1)) return NULL;
+ if (msg->size < 1) return NULL;
+
+ if (len && (msg->buffer[0] != (EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_PCM))) return NULL;
- buffer = eos_net_alloc();
- buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_PCM;
- *offset = 1;
- return buffer + *offset;
+ if (len) *len -= 1;
+ if (size) *size = msg->size - 1;
+ return msg->buffer + 1;
}
-int eos_cell_sms_send(char *addr, char *txt, unsigned char *buffer, int sync) {
- int async;
+int eos_cell_voice_pcm_send(EOSMessage *msg, uint16_t len) {
+ msg->buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_PCM;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, len + 1);
+}
+
+int eos_cell_voice_pcm_send_async(EOSMessage *msg, uint16_t len, int more) {
+ msg->buffer[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_PCM;
+ return eos_net_send(EOS_NET_MTYPE_CELL, msg, len + 1, more);
+}
+
+int eos_cell_sms_send(char *addr, char *txt, EOSMessage *msg) {
+ unsigned char *buffer = msg->buffer;
size_t addr_len, txt_len;
- uint16_t buf_len;
+ uint16_t len;
addr_len = strlen(addr);
txt_len = strlen(txt);
if (addr_len > EOS_CELL_SMS_SIZE_ADDR) return EOS_ERR_SIZE;
if (txt_len > EOS_CELL_SMS_SIZE_TXT) return EOS_ERR_SIZE;
+ if (msg->size < 5) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
buffer[0] = EOS_CELL_MTYPE_SMS | EOS_CELL_MTYPE_SMS_MSG;
buffer[1] = 0;
buffer[2] = 0;
@@ -221,49 +196,60 @@ int eos_cell_sms_send(char *addr, char *txt, unsigned char *buffer, int sync) {
buffer[3] = EOS_CELL_SMS_ADDRTYPE_OTHER;
}
buffer[4] = addr_len;
- buf_len = 5;
- memcpy(buffer + buf_len, addr, addr_len);
- buf_len += addr_len;
- memcpy(buffer + buf_len, txt, txt_len);
- buf_len += txt_len;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, buf_len, async, 1);
+
+ buffer += 5;
+ len = 5;
+
+ if (msg->size < 5 + addr_len + txt_len) return EOS_ERR_SIZE;
+
+ memcpy(buffer, addr, addr_len);
+ buffer += addr_len;
+ len += addr_len;
+
+ memcpy(buffer, txt, txt_len);
+ buffer += txt_len;
+ len += txt_len;
+
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, len);
}
-int _eos_cell_sms_parse(unsigned char *buffer, uint16_t buf_len, char **addr, uint16_t *addr_len, char **txt, uint16_t *txt_len) {
+int _eos_cell_sms_parse(EOSMessage *msg, uint16_t len, char **addr, uint16_t *addr_len, char **txt, uint16_t *txt_len) {
+ unsigned char *buffer = msg->buffer;
uint16_t _addr_len;
- if (buf_len < 4 + EOS_CELL_SMS_SIZE_TS) return EOS_ERR_SIZE;
+ if (len < 4 + EOS_CELL_SMS_SIZE_TS) return EOS_ERR_SIZE;
if (buffer[0] != (EOS_CELL_MTYPE_SMS | EOS_CELL_MTYPE_SMS_MSG)) return EOS_ERR_NET;
buffer += 3 + EOS_CELL_SMS_SIZE_TS;
- buf_len -= 3 + EOS_CELL_SMS_SIZE_TS;
+ len -= 3 + EOS_CELL_SMS_SIZE_TS;
_addr_len = *buffer;
if (_addr_len > EOS_CELL_SMS_SIZE_ADDR) return EOS_ERR_SIZE;
- if ((_addr_len == 0) || (buf_len < (_addr_len + 1))) return EOS_ERR_SIZE;
+ if ((_addr_len == 0) || (len < (_addr_len + 1))) return EOS_ERR_SIZE;
if (addr && addr_len) {
*addr = buffer + 1;
*addr_len = _addr_len;
}
buffer += _addr_len + 1;
- buf_len -= _addr_len + 1;
+ len -= _addr_len + 1;
- if (buf_len > EOS_CELL_SMS_SIZE_TXT) return EOS_ERR_SIZE;
+ if (len > EOS_CELL_SMS_SIZE_TXT) return EOS_ERR_SIZE;
if (txt && txt_len) {
*txt = buffer;
- *txt_len = buf_len;
+ *txt_len = len;
}
return EOS_OK;
}
-int eos_cell_sms_parse(unsigned char *buffer, uint16_t buf_len, char *addr, uint16_t addr_size, char *txt, uint16_t txt_size) {
+int eos_cell_sms_parse(EOSMessage *msg, uint16_t len, char *addr, uint16_t addr_size, char *txt, uint16_t txt_size) {
char *_addr, *_txt;
uint16_t _addr_len, _txt_len;
int rv;
- rv = _eos_cell_sms_parse(buffer, buf_len, &_addr, &_addr_len, &_txt, &_txt_len);
+ rv = _eos_cell_sms_parse(msg, len, &_addr, &_addr_len, &_txt, &_txt_len);
if (rv) return rv;
+
if (addr_size < _addr_len + 1) return EOS_ERR_SIZE;
if (txt_size < _txt_len + 1) return EOS_ERR_SIZE;
memcpy(addr, _addr, _addr_len);
@@ -274,107 +260,89 @@ int eos_cell_sms_parse(unsigned char *buffer, uint16_t buf_len, char *addr, uint
return EOS_OK;
}
-int eos_cell_pdp_get(unsigned char atype, char *arg, uint16_t arg_size, unsigned char *buffer) {
+char *eos_cell_sms_msg2txt(EOSMessage *msg, uint16_t *len) {
+ char *txt;
+ uint16_t txt_len;
+ int rv;
+
+ rv = _eos_cell_sms_parse(msg, *len, NULL, NULL, &txt, &txt_len);
+ if (rv) return NULL;
+
+ *len = txt_len;
+ return txt;
+}
+
+int eos_cell_pdp_get(unsigned char atype, char *arg, uint16_t arg_size, EOSMessage *msg) {
unsigned char type;
- uint16_t buf_len;
- int do_release;
+ uint16_t len;
int rv;
- do_release = 0;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- do_release = 1;
- }
+ if (msg->size < 1) return EOS_ERR_SIZE;
type = EOS_NET_MTYPE_CELL;
- buf_len = 1;
- buffer[0] = EOS_CELL_MTYPE_PDP | atype;
+ len = 1;
+ msg->buffer[0] = EOS_CELL_MTYPE_PDP | atype;
- rv = eos_net_xchg(&type, buffer, &buf_len);
- if (rv) goto cell_pdp_get_fin;
+ rv = eos_net_xchg(&type, msg, &len);
+ if (rv) return rv;
- if ((type != EOS_NET_MTYPE_CELL) || (buf_len == 0) || (buffer[0] != EOS_CELL_MTYPE_PDP | atype)) {
- rv = EOS_ERR_NET;
- goto cell_pdp_get_fin;
- }
+ if ((type != EOS_NET_MTYPE_CELL) || (len < 1) || (msg->buffer[0] != EOS_CELL_MTYPE_PDP | atype)) return EOS_ERR_NET;
- buf_len--;
- if ((buf_len > EOS_CELL_PDP_SIZE_ARG) || (buf_len > arg_size - 1)) {
- rv = EOS_ERR_SIZE;
- goto cell_pdp_get_fin;
- }
- memcpy(buffer + 1, arg, buf_len);
- arg[buf_len] = '\0';
+ len--;
+ if ((len > EOS_CELL_PDP_SIZE_ARG) || (len > arg_size - 1)) return EOS_ERR_SIZE;
+
+ memcpy(msg->buffer + 1, arg, len);
+ arg[len] = '\0';
-cell_pdp_get_fin:
- if (do_release) eos_net_free(buffer, 1);
- return rv;
+ return EOS_OK;
}
-int eos_cell_pdp_set(unsigned char atype, char *arg, unsigned char *buffer, int sync) {
- int async;
+int eos_cell_pdp_set(unsigned char atype, char *arg, EOSMessage *msg) {
size_t arg_len;
arg_len = strlen(arg);
if (arg_len > EOS_CELL_PDP_SIZE_ARG) return EOS_ERR_SIZE;
+ if (msg->size < 1 + arg_len) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_PDP | atype;
- memcpy(buffer + 1, arg, arg_len);
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1 + arg_len, async, 1);
+ msg->buffer[0] = EOS_CELL_MTYPE_PDP | atype;
+ memcpy(msg->buffer + 1, arg, arg_len);
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1 + arg_len);
}
-int eos_cell_pdp_get_apn(char *apn, uint16_t apn_size, unsigned char *buffer) {
- return eos_cell_pdp_get(EOS_CELL_MTYPE_PDP_GET_APN, apn, apn_size, buffer);
+int eos_cell_pdp_get_apn(char *apn, uint16_t apn_size, EOSMessage *msg) {
+ return eos_cell_pdp_get(EOS_CELL_MTYPE_PDP_GET_APN, apn, apn_size, msg);
}
-int eos_cell_pdp_set_apn(char *apn, unsigned char *buffer, int sync) {
- return eos_cell_pdp_set(EOS_CELL_MTYPE_PDP_SET_APN, apn, buffer, sync);
+int eos_cell_pdp_set_apn(char *apn, EOSMessage *msg) {
+ return eos_cell_pdp_set(EOS_CELL_MTYPE_PDP_SET_APN, apn, msg);
}
-int eos_cell_pdp_get_usr(char *usr, uint16_t usr_size, unsigned char *buffer) {
- return eos_cell_pdp_get(EOS_CELL_MTYPE_PDP_GET_USR, usr, usr_size, buffer);
+int eos_cell_pdp_get_usr(char *usr, uint16_t usr_size, EOSMessage *msg) {
+ return eos_cell_pdp_get(EOS_CELL_MTYPE_PDP_GET_USR, usr, usr_size, msg);
}
-int eos_cell_pdp_set_usr(char *usr, unsigned char *buffer, int sync) {
- return eos_cell_pdp_set(EOS_CELL_MTYPE_PDP_SET_USR, usr, buffer, sync);
+int eos_cell_pdp_set_usr(char *usr, EOSMessage *msg) {
+ return eos_cell_pdp_set(EOS_CELL_MTYPE_PDP_SET_USR, usr, msg);
}
-int eos_cell_pdp_get_pwd(char *pwd, uint16_t pwd_size, unsigned char *buffer) {
- return eos_cell_pdp_get(EOS_CELL_MTYPE_PDP_GET_PWD, pwd, pwd_size, buffer);
+int eos_cell_pdp_get_pwd(char *pwd, uint16_t pwd_size, EOSMessage *msg) {
+ return eos_cell_pdp_get(EOS_CELL_MTYPE_PDP_GET_PWD, pwd, pwd_size, msg);
}
-int eos_cell_pdp_set_pwd(char *pwd, unsigned char *buffer, int sync) {
- return eos_cell_pdp_set(EOS_CELL_MTYPE_PDP_SET_PWD, pwd, buffer, sync);
+int eos_cell_pdp_set_pwd(char *pwd, EOSMessage *msg) {
+ return eos_cell_pdp_set(EOS_CELL_MTYPE_PDP_SET_PWD, pwd, msg);
}
-int eos_cell_pdp_connect(unsigned char *buffer, int sync) {
- int async;
+int eos_cell_pdp_connect(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_PDP | EOS_CELL_MTYPE_PDP_CONNECT;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_CELL_MTYPE_PDP | EOS_CELL_MTYPE_PDP_CONNECT;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1);
}
-int eos_cell_pdp_disconnect(unsigned char *buffer, int sync) {
- int async;
+int eos_cell_pdp_disconnect(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_CELL_MTYPE_PDP | EOS_CELL_MTYPE_PDP_DISCONNECT;
- return _eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_CELL_MTYPE_PDP | EOS_CELL_MTYPE_PDP_DISCONNECT;
+ return eos_net_send_sync(EOS_NET_MTYPE_CELL, msg, 1);
}
diff --git a/fw/fe310/eos/net/cell.h b/fw/fe310/eos/net/cell.h
index 3264022..9517d8e 100644
--- a/fw/fe310/eos/net/cell.h
+++ b/fw/fe310/eos/net/cell.h
@@ -71,30 +71,35 @@
void eos_cell_init(void);
void eos_cell_set_handler(unsigned char mtype, eos_evt_handler_t handler);
eos_evt_handler_t eos_cell_get_handler(unsigned char mtype);
-int eos_cell_send_buffer(unsigned char *buffer, uint16_t buf_len, uint16_t offset, int sync);
-
-int eos_cell_status_parse(unsigned char *buffer, uint16_t buf_len, uint8_t *status, uint8_t *connected);
-int eos_cell_status(uint8_t *status, uint8_t *connected, unsigned char *buffer);
-
-int eos_cell_uart_take(unsigned char *buffer, int sync);
-int eos_cell_uart_give(unsigned char *buffer, int sync);
-unsigned char *eos_cell_uart_data_alloc(uint16_t *offset);
-
-int eos_cell_voice_dial(char *num, unsigned char *buffer, int sync);
-int eos_cell_voice_answer(unsigned char *buffer, int sync);
-int eos_cell_voice_hangup(unsigned char *buffer, int sync);
-unsigned char *eos_cell_voice_pcm_alloc(uint16_t *offset);
-int eos_cell_sms_send(char *addr, char *txt, unsigned char *buffer, int sync);
-int _eos_cell_sms_parse(unsigned char *buffer, uint16_t buf_len, char **addr, uint16_t *addr_len, char **txt, uint16_t *txt_len);
-int eos_cell_sms_parse(unsigned char *buffer, uint16_t buf_len, char *addr, uint16_t addr_size, char *txt, uint16_t txt_size);
-
-int eos_cell_pdp_get(unsigned char atype, char *arg, uint16_t arg_size, unsigned char *buffer);
-int eos_cell_pdp_set(unsigned char atype, char *arg, unsigned char *buffer, int sync);
-int eos_cell_pdp_get_apn(char *apn, uint16_t apn_size, unsigned char *buffer);
-int eos_cell_pdp_set_apn(char *apn, unsigned char *buffer, int sync);
-int eos_cell_pdp_get_usr(char *usr, uint16_t usr_size, unsigned char *buffer);
-int eos_cell_pdp_set_usr(char *usr, unsigned char *buffer, int sync);
-int eos_cell_pdp_get_pwd(char *pwd, uint16_t pwd_size, unsigned char *buffer);
-int eos_cell_pdp_set_pwd(char *pwd, unsigned char *buffer, int sync);
-int eos_cell_pdp_connect(unsigned char *buffer, int sync);
-int eos_cell_pdp_disconnect(unsigned char *buffer, int sync);
+
+int eos_cell_status_parse(EOSMessage *msg, uint16_t len, uint8_t *status, uint8_t *connected);
+int eos_cell_status(uint8_t *status, uint8_t *connected, EOSMessage *msg);
+
+int eos_cell_uart_take(EOSMessage *msg);
+int eos_cell_uart_give(EOSMessage *msg);
+unsigned char *eos_cell_uart_msg2data(EOSMessage *msg, uint16_t *len, uint16_t *size);
+int eos_cell_uart_send(EOSMessage *msg, uint16_t len);
+int eos_cell_uart_send_async(EOSMessage *msg, uint16_t len, int more);
+
+int eos_cell_voice_dial(char *num, EOSMessage *msg);
+int eos_cell_voice_answer(EOSMessage *msg);
+int eos_cell_voice_hangup(EOSMessage *msg);
+unsigned char *eos_cell_voice_msg2pcm(EOSMessage *msg, uint16_t *len, uint16_t *size);
+int eos_cell_voice_pcm_send(EOSMessage *msg, uint16_t len);
+int eos_cell_voice_pcm_send_async(EOSMessage *msg, uint16_t len, int more);
+
+int eos_cell_sms_send(char *addr, char *txt, EOSMessage *msg);
+int _eos_cell_sms_parse(EOSMessage *msg, uint16_t len, char **addr, uint16_t *addr_len, char **txt, uint16_t *txt_len);
+int eos_cell_sms_parse(EOSMessage *msg, uint16_t len, char *addr, uint16_t addr_size, char *txt, uint16_t txt_size);
+char *eos_cell_sms_msg2txt(EOSMessage *msg, uint16_t *len);
+
+int eos_cell_pdp_get(unsigned char atype, char *arg, uint16_t arg_size, EOSMessage *msg);
+int eos_cell_pdp_set(unsigned char atype, char *arg, EOSMessage *msg);
+int eos_cell_pdp_get_apn(char *apn, uint16_t apn_size, EOSMessage *msg);
+int eos_cell_pdp_set_apn(char *apn, EOSMessage *msg);
+int eos_cell_pdp_get_usr(char *usr, uint16_t usr_size, EOSMessage *msg);
+int eos_cell_pdp_set_usr(char *usr, EOSMessage *msg);
+int eos_cell_pdp_get_pwd(char *pwd, uint16_t pwd_size, EOSMessage *msg);
+int eos_cell_pdp_set_pwd(char *pwd, EOSMessage *msg);
+int eos_cell_pdp_connect(EOSMessage *msg);
+int eos_cell_pdp_disconnect(EOSMessage *msg);
diff --git a/fw/fe310/eos/net/rng.c b/fw/fe310/eos/net/rng.c
index 7d05a81..414a6fa 100644
--- a/fw/fe310/eos/net/rng.c
+++ b/fw/fe310/eos/net/rng.c
@@ -2,26 +2,34 @@
#include <stdint.h>
#include <string.h>
+#include "eos.h"
+#include "event.h"
#include "dev/net.h"
int getentropy(unsigned char *b, size_t sz) {
unsigned char type;
- unsigned char *buffer;
+ EOSMessage msg;
uint16_t len;
int rv;
- buffer = eos_net_alloc();
-
type = EOS_NET_MTYPE_RNG;
len = sizeof(uint16_t);
- buffer[0] = sz >> 8;
- buffer[1] = sz;
- rv = eos_net_xchg(&type, buffer, &len);
+ eos_net_alloc(&msg);
+
+ if ((msg.size < len) || (msg.size < sz)) {
+ eos_net_free(&msg, 1);
+ return -1;
+ }
+
+ msg.buffer[0] = sz >> 8;
+ msg.buffer[1] = sz;
+
+ rv = eos_net_xchg(&type, &msg, &len);
if (rv || (len != sz)) rv = -1;
- if (!rv) memcpy(b, buffer, sz);
- eos_net_free(buffer, 1);
+ if (!rv) memcpy(b, msg.buffer, sz);
+ eos_net_free(&msg, 1);
return rv;
}
diff --git a/fw/fe310/eos/net/sock.c b/fw/fe310/eos/net/sock.c
index c55b8e8..0c2f07d 100644
--- a/fw/fe310/eos/net/sock.c
+++ b/fw/fe310/eos/net/sock.c
@@ -10,40 +10,41 @@
static eos_evt_handler_t evt_handler[EOS_SOCK_MAX_SOCK];
-static void sock_handle_msg(unsigned char type, unsigned char *buffer, uint16_t buf_len) {
+static void sock_handle_msg(unsigned char type, EOSMessage *msg, uint16_t len) {
unsigned char sock;
int i;
- if ((buffer == NULL) || (buf_len < 2)) {
- eos_net_bad_handler(type, buffer, buf_len);
+ if ((msg == NULL) || (len < 2)) {
+ eos_net_bad_handler(type, msg, len);
return;
}
- switch(buffer[0]) {
+ switch(msg->buffer[0]) {
case EOS_SOCK_MTYPE_PKT: {
- sock = buffer[1];
+ sock = msg->buffer[1];
if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK) || (evt_handler[sock - 1] == NULL)) {
- eos_net_bad_handler(type, buffer, buf_len);
+ eos_net_bad_handler(type, msg, len);
return;
}
- evt_handler[sock - 1](type, buffer, buf_len);
+ evt_handler[sock - 1](type, msg, len);
break;
}
case EOS_SOCK_MTYPE_CLOSE: {
- for (i=1; i<buf_len; i++) {
- sock = buffer[i];
+ for (i=1; i<len; i++) {
+ sock = msg->buffer[i];
if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK) || (evt_handler[sock - 1] == NULL)) {
- eos_net_bad_handler(type, buffer, buf_len);
- return;
+ eos_net_bad_handler(type, msg, len);
+ continue;
}
- evt_handler[sock - 1](type, buffer, buf_len);
+ evt_handler[sock - 1](type, msg, len);
+ evt_handler[sock - 1] = NULL;
}
break;
}
default:
- eos_net_bad_handler(type, buffer, buf_len);
+ eos_net_bad_handler(type, msg, len);
break;
}
}
@@ -66,85 +67,44 @@ eos_evt_handler_t eos_sock_get_handler(unsigned char sock) {
return NULL;
}
-int eos_sock_open_udp(eos_evt_handler_t handler, unsigned char *buffer) {
+int eos_sock_open_udp(eos_evt_handler_t handler, EOSMessage *msg) {
unsigned char type;
- uint16_t buf_len;
- int do_release;
+ uint16_t len;
int rv, sock;
- do_release = 0;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- do_release = 1;
- }
+ if (msg->size < 2) return EOS_ERR_SIZE;
type = EOS_NET_MTYPE_SOCK;
- buf_len = 1;
- buffer[0] = EOS_SOCK_MTYPE_OPEN_DGRAM;
+ len = 1;
+ msg->buffer[0] = EOS_SOCK_MTYPE_OPEN_DGRAM;
- rv = eos_net_xchg(&type, buffer, &buf_len);
- if (rv) goto sock_open_udp_fin;
+ rv = eos_net_xchg(&type, msg, &len);
+ if (rv) return rv;
- if (type != EOS_NET_MTYPE_SOCK) {
- rv = EOS_ERR_NET;
- goto sock_open_udp_fin;
- }
- if (buf_len < 2) {
- rv = EOS_ERR_SIZE;
- goto sock_open_udp_fin;
- }
+ if (type != EOS_NET_MTYPE_SOCK) return EOS_ERR_NET;
+ if (len < 2) return EOS_ERR_SIZE;
- sock = buffer[1];
- if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) {
- rv = EOS_ERR_NET;
- goto sock_open_udp_fin;
- }
+ sock = msg->buffer[1];
+ if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return EOS_ERR_NET;
- rv = sock;
eos_sock_set_handler(sock, handler);
-
-sock_open_udp_fin:
- if (do_release) eos_net_free(buffer, 1);
- return rv;
+ return sock;
}
-void eos_sock_close(unsigned char sock, unsigned char *buffer) {
- int async;
+void eos_sock_close(unsigned char sock, EOSMessage *msg) {
+ if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return;
+ if (msg->size < 2) return;
- async = 0;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- }
- buffer[0] = EOS_SOCK_MTYPE_CLOSE;
- buffer[1] = sock;
- _eos_net_send(EOS_NET_MTYPE_SOCK, buffer, 2, async, 1);
+ msg->buffer[0] = EOS_SOCK_MTYPE_CLOSE;
+ msg->buffer[1] = sock;
+ eos_net_send_sync(EOS_NET_MTYPE_SOCK, msg, 2);
eos_sock_set_handler(sock, NULL);
}
-int eos_sock_pkt_alloc(unsigned char **buffer, unsigned char *pkt, size_t pkt_len) {
- *buffer = NULL;
-
- if (pkt && (pkt_len + EOS_SOCK_SIZE_UDP_HDR > EOS_NET_SIZE_BUF)) return EOS_ERR_SIZE;
-
- *buffer = eos_net_alloc();
- *buffer += EOS_SOCK_SIZE_UDP_HDR;
- if (pkt) memcpy(*buffer, pkt, pkt_len);
-
- return EOS_OK;
-}
-
-unsigned char *eos_sock_buf2pkt(unsigned char *buf, uint16_t buf_len) {
- if (buf_len < EOS_SOCK_SIZE_UDP_HDR) return NULL;
+static void sock_sendto(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg) {
+ unsigned char *buffer;
- return buf + EOS_SOCK_SIZE_UDP_HDR;
-}
-
-unsigned char *eos_sock_pkt2buf(unsigned char *pkt) {
- return pkt - EOS_SOCK_SIZE_UDP_HDR;
-}
-
-static void sock_sendto(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer) {
+ buffer = msg->buffer;
buffer[0] = EOS_SOCK_MTYPE_PKT;
buffer[1] = sock;
buffer += 2;
@@ -155,28 +115,24 @@ static void sock_sendto(unsigned char sock, EOSNetAddr *addr, unsigned char *buf
buffer += sizeof(addr->port);
}
-int eos_sock_sendto(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer, uint16_t buf_len, unsigned char more) {
- int rv;
+int eos_sock_sendto(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg, uint16_t pkt_len) {
+ if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return EOS_ERR_NET;
- buffer -= EOS_SOCK_SIZE_UDP_HDR;
- sock_sendto(sock, addr, buffer);
-
- rv = eos_net_send(EOS_NET_MTYPE_SOCK, buffer, buf_len + EOS_SOCK_SIZE_UDP_HDR, more);
- return rv;
+ sock_sendto(sock, addr, msg);
+ return eos_net_send_sync(EOS_NET_MTYPE_SOCK, msg, pkt_len + EOS_SOCK_SIZE_UDP_HDR);
}
-int eos_sock_sendto_sync(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer, uint16_t buf_len) {
- int rv;
-
- buffer -= EOS_SOCK_SIZE_UDP_HDR;
- sock_sendto(sock, addr, buffer);
+int eos_sock_sendto_async(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg, uint16_t pkt_len, int more) {
+ if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return EOS_ERR_NET;
- rv = eos_net_send_sync(EOS_NET_MTYPE_SOCK, buffer, buf_len + EOS_SOCK_SIZE_UDP_HDR);
- return rv;
+ sock_sendto(sock, addr, msg);
+ return eos_net_send(EOS_NET_MTYPE_SOCK, msg, pkt_len + EOS_SOCK_SIZE_UDP_HDR, more);
}
-int eos_sock_recvfrom(unsigned char *buffer, uint16_t buf_len, EOSNetAddr *addr, unsigned char *pkt, size_t pkt_size) {
- if (buf_len < EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE;
+int eos_sock_recvfrom(EOSMessage *msg, uint16_t len, EOSNetAddr *addr, unsigned char *pkt, size_t pkt_size) {
+ char *buffer = msg->buffer;
+
+ if (len < EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE;
if (buffer[0] == EOS_SOCK_MTYPE_CLOSE) return EOS_SOCK_ERR_CLOSED;
if (buffer[0] != EOS_SOCK_MTYPE_PKT) return EOS_ERR_NET;
@@ -192,9 +148,25 @@ int eos_sock_recvfrom(unsigned char *buffer, uint16_t buf_len, EOSNetAddr *addr,
}
buffer += sizeof(addr->port);
if (pkt) {
- if (pkt_size < buf_len - EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE;
- memcpy(pkt, buffer, buf_len - EOS_SOCK_SIZE_UDP_HDR);
+ if (pkt_size < len - EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE;
+ memcpy(pkt, buffer, len - EOS_SOCK_SIZE_UDP_HDR);
}
return EOS_OK;
}
+
+unsigned char *eos_sock_msg2pkt(EOSMessage *msg, uint16_t *len, uint16_t *pkt_size) {
+ if (len && (*len < EOS_SOCK_SIZE_UDP_HDR)) return NULL;
+ if (msg->size < EOS_SOCK_SIZE_UDP_HDR) return NULL;
+
+ if (len && (msg->buffer[0] != EOS_SOCK_MTYPE_PKT)) return NULL;
+
+ if (len) *len -= EOS_SOCK_SIZE_UDP_HDR;
+ if (pkt_size) *pkt_size = msg->size - EOS_SOCK_SIZE_UDP_HDR;
+ return msg->buffer + EOS_SOCK_SIZE_UDP_HDR;
+}
+
+void eos_sock_pkt2msg(EOSMessage *msg, unsigned char *pkt, uint16_t pkt_size) {
+ msg->buffer = pkt - EOS_SOCK_SIZE_UDP_HDR;
+ msg->size = pkt_size + EOS_SOCK_SIZE_UDP_HDR;
+}
diff --git a/fw/fe310/eos/net/sock.h b/fw/fe310/eos/net/sock.h
index 8dbb111..e873a7d 100644
--- a/fw/fe310/eos/net/sock.h
+++ b/fw/fe310/eos/net/sock.h
@@ -23,13 +23,12 @@ void eos_sock_init(void);
void eos_sock_set_handler(unsigned char sock, eos_evt_handler_t handler);
eos_evt_handler_t eos_sock_get_handler(unsigned char sock);
-int eos_sock_open_udp(eos_evt_handler_t handler, unsigned char *buffer);
-void eos_sock_close(unsigned char sock, unsigned char *buffer);
+int eos_sock_open_udp(eos_evt_handler_t handler, EOSMessage *msg);
+void eos_sock_close(unsigned char sock, EOSMessage *msg);
-int eos_sock_pkt_alloc(unsigned char **buffer, unsigned char *pkt, size_t pkt_len);
-unsigned char *eos_sock_buf2pkt(unsigned char *buf, uint16_t buf_len);
-unsigned char *eos_sock_pkt2buf(unsigned char *pkt);
+int eos_sock_sendto(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg, uint16_t pkt_len);
+int eos_sock_sendto_async(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg, uint16_t pkt_len, int more);
+int eos_sock_recvfrom(EOSMessage *msg, uint16_t len, EOSNetAddr *addr, unsigned char *pkt, size_t pkt_size);
-int eos_sock_sendto(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer, uint16_t buf_len, unsigned char more);
-int eos_sock_sendto_sync(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer, uint16_t buf_len);
-int eos_sock_recvfrom(unsigned char *buffer, uint16_t buf_len, EOSNetAddr *addr, unsigned char *pkt, size_t pkt_size);
+unsigned char *eos_sock_msg2pkt(EOSMessage *msg, uint16_t *len, uint16_t *pkt_size);
+void eos_sock_pkt2msg(EOSMessage *msg, unsigned char *pkt, uint16_t pkt_size);
diff --git a/fw/fe310/eos/net/wifi.c b/fw/fe310/eos/net/wifi.c
index 1391121..59f149c 100644
--- a/fw/fe310/eos/net/wifi.c
+++ b/fw/fe310/eos/net/wifi.c
@@ -10,19 +10,19 @@
static eos_evt_handler_t evt_handler[EOS_WIFI_MAX_MTYPE];
-static void wifi_handle_msg(unsigned char type, unsigned char *buffer, uint16_t buf_len) {
+static void wifi_handle_msg(unsigned char type, EOSMessage *msg, uint16_t len) {
unsigned char mtype;
- if ((buffer == NULL) || (buf_len < 1)) {
- eos_net_bad_handler(type, buffer, buf_len);
+ if ((msg == NULL) || (len < 1)) {
+ eos_net_bad_handler(type, msg, len);
return;
}
- mtype = buffer[0];
+ mtype = msg->buffer[0];
if ((mtype < EOS_WIFI_MAX_MTYPE) && evt_handler[mtype]) {
- evt_handler[mtype](mtype, buffer, buf_len);
+ evt_handler[mtype](mtype, msg, len);
} else {
- eos_net_bad_handler(type, buffer, buf_len);
+ eos_net_bad_handler(type, msg, len);
}
}
@@ -44,147 +44,116 @@ eos_evt_handler_t eos_wifi_get_handler(unsigned char mtype) {
return NULL;
}
-int eos_wifi_status_parse(unsigned char *buffer, uint16_t buf_len, uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size) {
- if (buf_len < 2) return EOS_ERR_SIZE;
+int eos_wifi_status_parse(EOSMessage *msg, uint16_t len, uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size) {
+ unsigned char *buffer = msg->buffer;
+
+ if (len < 2) return EOS_ERR_SIZE;
if (buffer[0] != EOS_WIFI_MTYPE_STATUS) return EOS_ERR_NET;
buffer++;
- buf_len--;
+ len--;
*status = buffer[0];
buffer++;
- buf_len--;
+ len--;
switch (*status) {
case EOS_WIFI_STATUS_GOT_IP:
- if (buf_len < sizeof(uint32_t)) return EOS_ERR_SIZE;
+ if (len < sizeof(uint32_t)) return EOS_ERR_SIZE;
if (ip_addr) memcpy(ip_addr, buffer, sizeof(uint32_t));
buffer += sizeof(uint32_t);
- buf_len -= sizeof(uint32_t);
+ len -= sizeof(uint32_t);
case EOS_WIFI_STATUS_CONNECTED:
if (ssid) {
- if ((buf_len == 0) || (buf_len > EOS_WIFI_SIZE_SSID) || (buf_len > ssid_size - 1)) return EOS_ERR_SIZE;
- memcpy(ssid, buffer, buf_len);
- ssid[buf_len] = '\0';
+ if ((len == 0) || (len > EOS_WIFI_SIZE_SSID) || (len > ssid_size - 1)) return EOS_ERR_SIZE;
+ memcpy(ssid, buffer, len);
+ ssid[len] = '\0';
}
break;
}
return EOS_OK;
}
-int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size, unsigned char *buffer) {
+int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size, EOSMessage *msg) {
unsigned char type;
- uint16_t buf_len;
- int do_release;
+ uint16_t len;
int rv;
- do_release = 0;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- do_release = 1;
- }
+ if (msg->size < 1) return EOS_ERR_SIZE;
type = EOS_NET_MTYPE_WIFI;
- buf_len = 1;
- buffer[0] = EOS_WIFI_MTYPE_STATUS;
+ len = 1;
+ msg->buffer[0] = EOS_WIFI_MTYPE_STATUS;
- rv = eos_net_xchg(&type, buffer, &buf_len);
- if (rv) goto wifi_status_fin;
+ rv = eos_net_xchg(&type, msg, &len);
+ if (rv) return rv;
- if (type != EOS_NET_MTYPE_WIFI) {
- rv = EOS_ERR_NET;
- goto wifi_status_fin;
- }
- rv = eos_wifi_status_parse(buffer, buf_len, status, ip_addr, ssid, ssid_size);
+ if (type != EOS_NET_MTYPE_WIFI) return EOS_ERR_NET;
-wifi_status_fin:
- if (do_release) eos_net_free(buffer, 1);
- return rv;
+ return eos_wifi_status_parse(msg, len, status, ip_addr, ssid, ssid_size);
}
-int eos_wifi_start(unsigned char *buffer, int sync) {
- int async;
+int eos_wifi_start(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_WIFI_MTYPE_START;
- return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_WIFI_MTYPE_START;
+ return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1);
}
-int eos_wifi_stop(unsigned char *buffer, int sync) {
- int async;
+int eos_wifi_stop(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_WIFI_MTYPE_STOP;
- return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_WIFI_MTYPE_STOP;
+ return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1);
}
-int eos_wifi_scan(unsigned char *buffer, int sync) {
- int async;
+int eos_wifi_scan(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_WIFI_MTYPE_SCAN;
- return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_WIFI_MTYPE_SCAN;
+ return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1);
+}
+
+unsigned char *eos_wifi_scan2data(EOSMessage *msg, uint16_t *len) {
+ if (*len < 1) return NULL;
+
+ if (msg->buffer[0] != EOS_WIFI_MTYPE_SCAN) return NULL;
+
+ if (len) *len -= 1;
+ return msg->buffer + 1;
}
-int eos_wifi_connect(char *ssid, char *pwd, unsigned char *buffer, int sync) {
- unsigned char *buf;
+int eos_wifi_connect(char *ssid, char *pwd, EOSMessage *msg) {
+ unsigned char *buffer = msg->buffer;
size_t ssid_len, pwd_len;
- int async;
ssid_len = strlen(ssid);
pwd_len = strlen(pwd);
if (ssid_len > EOS_WIFI_SIZE_SSID) return EOS_ERR_SIZE;
if (pwd_len > EOS_WIFI_SIZE_PWD) return EOS_ERR_SIZE;
+ if (msg->size < 3 + ssid_len + pwd_len) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buf = buffer;
- buf[0] = EOS_WIFI_MTYPE_CONNECT;
- buf++;
+ buffer[0] = EOS_WIFI_MTYPE_CONNECT;
+ buffer++;
- *buf = ssid_len;
- buf++;
+ *buffer = ssid_len;
+ buffer++;
- memcpy(buf, ssid, ssid_len);
- buf += ssid_len;
+ memcpy(buffer, ssid, ssid_len);
+ buffer += ssid_len;
- *buf = pwd_len;
- buf++;
+ *buffer = pwd_len;
+ buffer++;
- memcpy(buf, pwd, pwd_len);
- buf += pwd_len;
+ memcpy(buffer, pwd, pwd_len);
+ buffer += pwd_len;
- return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 3 + ssid_len + pwd_len, async, 1);
+ return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 3 + ssid_len + pwd_len);
}
-int eos_wifi_disconnect(unsigned char *buffer, int sync) {
- int async;
+int eos_wifi_disconnect(EOSMessage *msg) {
+ if (msg->size < 1) return EOS_ERR_SIZE;
- if (buffer == NULL) {
- buffer = eos_net_alloc();
- async = 1;
- } else {
- async = !sync;
- }
- buffer[0] = EOS_WIFI_MTYPE_DISCONNECT;
- return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1);
+ msg->buffer[0] = EOS_WIFI_MTYPE_DISCONNECT;
+ return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1);
}
diff --git a/fw/fe310/eos/net/wifi.h b/fw/fe310/eos/net/wifi.h
index 800723e..1f64d73 100644
--- a/fw/fe310/eos/net/wifi.h
+++ b/fw/fe310/eos/net/wifi.h
@@ -25,10 +25,11 @@ void eos_wifi_init(void);
void eos_wifi_set_handler(unsigned char mtype, eos_evt_handler_t handler);
eos_evt_handler_t eos_wifi_get_handler(unsigned char mtype);
-int eos_wifi_status_parse(unsigned char *buffer, uint16_t buf_len, uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size);
-int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size, unsigned char *buffer);
-int eos_wifi_start(unsigned char *buffer, int sync);
-int eos_wifi_stop(unsigned char *buffer, int sync);
-int eos_wifi_scan(unsigned char *buffer, int sync);
-int eos_wifi_connect(char *ssid, char *pwd, unsigned char *buffer, int sync);
-int eos_wifi_disconnect(unsigned char *buffer, int sync);
+int eos_wifi_status_parse(EOSMessage *msg, uint16_t len, uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size);
+int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size, EOSMessage *msg);
+int eos_wifi_start(EOSMessage *msg);
+int eos_wifi_stop(EOSMessage *msg);
+int eos_wifi_scan(EOSMessage *msg);
+unsigned char *eos_wifi_scan2data(EOSMessage *msg, uint16_t *len);
+int eos_wifi_connect(char *ssid, char *pwd, EOSMessage *msg);
+int eos_wifi_disconnect(EOSMessage *msg);
diff --git a/fw/fe310/eos/soc/i2s.c b/fw/fe310/eos/soc/i2s.c
index 8bd5600..52c7a8b 100644
--- a/fw/fe310/eos/soc/i2s.c
+++ b/fw/fe310/eos/soc/i2s.c
@@ -31,8 +31,8 @@
#define EOS_ABUF_IDX_MASK(IDX, SIZE) ((IDX) & ((SIZE) - 1))
-static eos_i2s_handler_t i2s_mic_handler = NULL;
-static eos_i2s_handler_t i2s_spk_handler = NULL;
+static eos_evt_simple_handler_t i2s_mic_handler = NULL;
+static eos_evt_simple_handler_t i2s_spk_handler = NULL;
static uint32_t i2s_clk_period;
static uint8_t i2s_mic_volume = 0; /* 0 - 8 */
static uint8_t i2s_spk_volume = 16; /* 0 - 16 */
@@ -93,11 +93,11 @@ static int _sbuf_push(uint16_t sample) {
return EOS_OK;
}
-static void i2s_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) {
+static void i2s_handle_evt(unsigned char type, EOSMessage *msg, uint16_t len) {
switch(type & ~EOS_EVT_MASK) {
case EOS_I2S_ETYPE_MIC:
if (i2s_mic_handler) {
- i2s_mic_handler(type);
+ i2s_mic_handler(type & ~EOS_EVT_MASK);
clear_csr(mstatus, MSTATUS_MIE);
_eos_i2s_drvr[I2S_MIC_EVT] = 1;
set_csr(mstatus, MSTATUS_MIE);
@@ -106,7 +106,7 @@ static void i2s_handle_evt(unsigned char type, unsigned char *buffer, uint16_t l
case EOS_I2S_ETYPE_SPK:
if (i2s_spk_handler) {
- i2s_spk_handler(type);
+ i2s_spk_handler(type & ~EOS_EVT_MASK);
clear_csr(mstatus, MSTATUS_MIE);
_eos_i2s_drvr[I2S_SPK_EVT] = 1;
set_csr(mstatus, MSTATUS_MIE);
@@ -114,7 +114,7 @@ static void i2s_handle_evt(unsigned char type, unsigned char *buffer, uint16_t l
break;
default:
- eos_evtq_bad_handler(type, buffer, len);
+ eos_evtq_bad_handler(type, msg, len);
break;
}
}
@@ -281,7 +281,7 @@ int eos_i2s_set_lsgain(int gain) {
return eos_egpio_set_val(EGPIO_PIN_LSGAIN_SEL, gain);
}
-void eos_i2s_mic_set_handler(eos_i2s_handler_t handler, uint16_t wm) {
+void eos_i2s_mic_set_handler(eos_evt_simple_handler_t handler, uint16_t wm) {
clear_csr(mstatus, MSTATUS_MIE);
if ((i2s_mic_handler == NULL) && handler) _eos_i2s_drvr[I2S_MIC_EVT] = 1;
if (i2s_mic_handler && (handler == NULL)) _eos_i2s_drvr[I2S_MIC_EVT] = 0;
@@ -355,7 +355,7 @@ void eos_i2s_mic_set_vol(int vol) {
set_csr(mstatus, MSTATUS_MIE);
}
-void eos_i2s_spk_set_handler(eos_i2s_handler_t handler, uint16_t wm) {
+void eos_i2s_spk_set_handler(eos_evt_simple_handler_t handler, uint16_t wm) {
clear_csr(mstatus, MSTATUS_MIE);
if ((i2s_spk_handler == NULL) && handler) _eos_i2s_drvr[I2S_SPK_EVT] = 1;
if (i2s_spk_handler && (handler == NULL)) _eos_i2s_drvr[I2S_SPK_EVT] = 0;
diff --git a/fw/fe310/eos/soc/i2s.h b/fw/fe310/eos/soc/i2s.h
index e2155a4..ef2b966 100644
--- a/fw/fe310/eos/soc/i2s.h
+++ b/fw/fe310/eos/soc/i2s.h
@@ -1,6 +1,7 @@
#include <stdint.h>
#include "i2s_def.h"
+#include "../event.h"
#define EOS_I2S_MODE_STEREO 0
#define EOS_I2S_MODE_MONO_L 1
@@ -13,15 +14,13 @@ typedef struct EOSABuf {
uint16_t *array;
} EOSABuf;
-typedef void (*eos_i2s_handler_t) (unsigned char);
-
int eos_i2s_init(void);
int eos_i2s_start(uint32_t sample_rate, int mode);
void eos_i2s_stop(void);
int eos_i2s_running(void);
int eos_i2s_set_lsgain(int gain);
-void eos_i2s_mic_set_handler(eos_i2s_handler_t handler, uint16_t wm);
+void eos_i2s_mic_set_handler(eos_evt_simple_handler_t handler, uint16_t wm);
void eos_i2s_mic_set_buf(uint16_t *mic_arr, uint16_t mic_arr_size);
uint16_t *eos_i2s_mic_get_buf(void);
uint16_t eos_i2s_mic_len(void);
@@ -30,7 +29,7 @@ int eos_i2s_mic_pop(uint16_t *sample);
int eos_i2s_mic_get_vol(void);
void eos_i2s_mic_set_vol(int vol);
-void eos_i2s_spk_set_handler(eos_i2s_handler_t handler, uint16_t wm);
+void eos_i2s_spk_set_handler(eos_evt_simple_handler_t handler, uint16_t wm);
void eos_i2s_spk_set_buf(uint16_t *spk_arr, uint16_t spk_arr_size);
uint16_t *eos_i2s_spk_get_buf(void);
uint16_t eos_i2s_spk_len(void);
diff --git a/fw/fe310/eos/soc/spi.c b/fw/fe310/eos/soc/spi.c
index 64a057b..a337924 100644
--- a/fw/fe310/eos/soc/spi.c
+++ b/fw/fe310/eos/soc/spi.c
@@ -7,7 +7,6 @@
#include "eos.h"
#include "log.h"
-#include "msgq.h"
#include "interrupt.h"
#include "event.h"
@@ -35,24 +34,25 @@ static uint32_t spi_state_len = 0;
static uint32_t spi_state_idx_tx = 0;
static uint32_t spi_state_idx_rx = 0;
static unsigned char *spi_state_buf = NULL;
+static uint16_t spi_state_buf_sz = 0;
-static eos_evt_handler_t evt_handler[EOS_SPI_MAX_EVT];
+static eos_evt_handler_t spi_handler[EOS_SPI_MAX_ETYPE];
-static void spi_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) {
- unsigned char idx = (type & ~EOS_EVT_MASK) - 1;
+static void spi_handle_evt(unsigned char type, EOSMessage *msg, uint16_t len) {
+ unsigned char idx = type & ~EOS_EVT_MASK;
- if (idx < EOS_SPI_MAX_EVT) {
- evt_handler[idx](type, buffer, len);
+ if (idx && (idx <= EOS_SPI_MAX_ETYPE) && spi_handler[idx - 1]) {
+ spi_handler[idx - 1](type & ~EOS_EVT_MASK, msg, len);
} else {
- eos_evtq_bad_handler(type, buffer, len);
+ eos_evtq_bad_handler(type, msg, len);
}
}
int eos_spi_init(void) {
int i;
- for (i=0; i<EOS_SPI_MAX_EVT; i++) {
- evt_handler[i] = eos_evtq_bad_handler;
+ for (i=0; i<EOS_SPI_MAX_ETYPE; i++) {
+ spi_handler[i] = eos_evtq_bad_handler;
}
eos_evtq_set_handler(EOS_EVT_SPI, spi_handle_evt);
eos_intr_set_priority(INT_SPI1_BASE, IRQ_PRIORITY_SPI_XCHG);
@@ -114,13 +114,14 @@ void eos_spi_disable(void) {
void eos_spi_set_handler(unsigned char evt, eos_evt_handler_t handler) {
if (handler == NULL) handler = eos_evtq_bad_handler;
- if (evt && (evt <= EOS_SPI_MAX_EVT)) evt_handler[evt - 1] = handler;
+ if (evt && (evt <= EOS_SPI_MAX_ETYPE)) spi_handler[evt - 1] = handler;
}
-void _eos_spi_xchg_init(unsigned char *buffer, uint16_t len, uint8_t flags) {
+void _eos_spi_xchg_init(unsigned char *buffer, uint16_t size, uint16_t len, uint8_t flags) {
spi_state_flags &= 0xF0;
spi_state_flags |= (SPI_FLAG_XCHG | flags);
spi_state_buf = buffer;
+ spi_state_buf_sz = size;
spi_state_len = len;
spi_state_idx_tx = 0;
spi_state_idx_rx = 0;
@@ -137,12 +138,12 @@ static void spi_wait4xchg(void) {
}
}
-int eos_spi_xchg(unsigned char *buffer, uint16_t len, uint8_t flags) {
+int eos_spi_xchg(EOSMessage *msg, uint16_t len, uint8_t flags) {
if (!spi_evt) return EOS_ERR;
spi_wait4xchg();
- _eos_spi_xchg_init(buffer, len, flags);
+ _eos_spi_xchg_init(msg->buffer, msg->size, len, flags);
eos_spi_set_cs();
SPI1_REG(SPI_REG_TXCTRL) = SPI_TXWM(SPI_SIZE_WM);
@@ -184,9 +185,12 @@ void eos_spi_handle_xchg(void) {
spi_state_flags &= (~SPI_FLAG_XCHG & 0xF0);
if (spi_evt) {
+ EOSMessage msg;
int rv;
- rv = eos_evtq_push_isr(EOS_EVT_SPI | spi_evt, spi_state_buf, spi_state_len);
+ msg.buffer = spi_state_buf;
+ msg.size = spi_state_buf_sz;
+ rv = eos_evtq_push_isr(EOS_EVT_SPI | spi_evt, &msg, spi_state_len);
if (rv) EOS_LOG(EOS_LOG_ERR, "SPI XCHG EVTQ PUSH ERR:%d\n", rv);
}
} else {
diff --git a/fw/fe310/eos/soc/spi.h b/fw/fe310/eos/soc/spi.h
index 20999b5..6ded15f 100644
--- a/fw/fe310/eos/soc/spi.h
+++ b/fw/fe310/eos/soc/spi.h
@@ -6,10 +6,10 @@
#define EOS_SPI_FLAG_MORE 0x02
#define EOS_SPI_FLAG_BSWAP 0x04
-#define EOS_SPI_EVT_SDC 1
-#define EOS_SPI_EVT_CAM 2
+#define EOS_SPI_ETYPE_SDC 1
+#define EOS_SPI_ETYPE_CAM 2
-#define EOS_SPI_MAX_EVT 2
+#define EOS_SPI_MAX_ETYPE 2
int eos_spi_init(void);
void eos_spi_configure(uint16_t div, uint8_t csid, uint8_t cspin, unsigned char evt);
@@ -20,8 +20,8 @@ void eos_spi_disable(void);
void eos_spi_set_handler(unsigned char evt, eos_evt_handler_t handler);
-void _eos_spi_xchg_init(unsigned char *buffer, uint16_t len, uint8_t flags);
-int eos_spi_xchg(unsigned char *buffer, uint16_t len, uint8_t flags);
+void _eos_spi_xchg_init(unsigned char *buffer, uint16_t size, uint16_t len, uint8_t flags);
+int eos_spi_xchg(EOSMessage *msg, uint16_t len, uint8_t flags);
void eos_spi_handle_xchg(void);
int eos_spi_get_cs(void);
diff --git a/fw/fe310/eos/soc/timer.c b/fw/fe310/eos/soc/timer.c
index 0573e84..f26f601 100644
--- a/fw/fe310/eos/soc/timer.c
+++ b/fw/fe310/eos/soc/timer.c
@@ -5,23 +5,22 @@
#include "platform.h"
#include "eos.h"
-#include "msgq.h"
#include "event.h"
#include "timer.h"
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
-static eos_timer_handler_t timer_handler[EOS_TIMER_MAX_ETYPE + 1];
+static eos_evt_simple_handler_t timer_handler[EOS_TIMER_MAX_ETYPE + 1];
static uint64_t timer_next[EOS_TIMER_MAX_ETYPE + 1];
-static void timer_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) {
- unsigned char idx = (type & ~EOS_EVT_MASK);
+static void timer_handle_evt(unsigned char type, EOSMessage *msg, uint16_t len) {
+ unsigned char idx = type & ~EOS_EVT_MASK;
if (idx && (idx <= EOS_TIMER_MAX_ETYPE) && timer_handler[idx]) {
- timer_handler[idx](type);
+ timer_handler[idx](type & ~EOS_EVT_MASK);
} else {
- eos_evtq_bad_handler(type, buffer, len);
+ eos_evtq_bad_handler(type, msg, len);
}
}
@@ -63,7 +62,7 @@ int eos_timer_init(void) {
return EOS_OK;
}
-void eos_timer_set_handler(unsigned char evt, eos_timer_handler_t handler) {
+void eos_timer_set_handler(unsigned char evt, eos_evt_simple_handler_t handler) {
uint64_t *mtimecmp = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIMECMP);
if (!evt && (*mtimecmp != 0)) clear_csr(mie, MIP_MTIP);
diff --git a/fw/fe310/eos/soc/timer.h b/fw/fe310/eos/soc/timer.h
index f5c7b4e..ef4005c 100644
--- a/fw/fe310/eos/soc/timer.h
+++ b/fw/fe310/eos/soc/timer.h
@@ -1,5 +1,7 @@
#include <stdint.h>
+#include "../event.h"
+
#define EOS_TIMER_ETYPE_UI 1
#define EOS_TIMER_ETYPE_EVE 2
#define EOS_TIMER_ETYPE_ECP 3
@@ -10,10 +12,8 @@
#define EOS_TIMER_NONE -1
#define EOS_TIMER_RTC_FREQ 32768
-typedef void (*eos_timer_handler_t) (unsigned char);
-
int eos_timer_init(void);
-void eos_timer_set_handler(unsigned char evt, eos_timer_handler_t handler);
+void eos_timer_set_handler(unsigned char evt, eos_evt_simple_handler_t handler);
uint32_t eos_timer_get(unsigned char evt);
void eos_timer_set(unsigned char evt, uint32_t msec);
diff --git a/fw/fe310/eos/soc/uart.c b/fw/fe310/eos/soc/uart.c
index 44c9a52..a5ba35f 100644
--- a/fw/fe310/eos/soc/uart.c
+++ b/fw/fe310/eos/soc/uart.c
@@ -13,15 +13,15 @@
#include "uart.h"
-static eos_uart_handler_t uart_handler[EOS_UART_MAX_ETYPE];
+static eos_evt_simple_handler_t uart_handler[EOS_UART_MAX_ETYPE];
-static void uart_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) {
- unsigned char idx = (type & ~EOS_EVT_MASK) - 1;
+static void uart_handle_evt(unsigned char type, EOSMessage *msg, uint16_t len) {
+ unsigned char idx = type & ~EOS_EVT_MASK;
- if ((idx < EOS_UART_MAX_ETYPE) && uart_handler[idx]) {
- uart_handler[idx](type);
+ if (idx && (idx <= EOS_UART_MAX_ETYPE) && uart_handler[idx - 1]) {
+ uart_handler[idx - 1](type & ~EOS_EVT_MASK);
} else {
- eos_evtq_bad_handler(type, buffer, len);
+ eos_evtq_bad_handler(type, msg, len);
}
}
@@ -76,7 +76,7 @@ void eos_uart_speed(uint32_t baud_rate) {
UART0_REG(UART_REG_DIV) = PRCI_get_cpu_freq() / baud_rate - 1;
}
-void eos_uart_set_handler(unsigned char type, eos_uart_handler_t handler) {
+void eos_uart_set_handler(unsigned char type, eos_evt_simple_handler_t handler) {
if (type && (type <= EOS_UART_MAX_ETYPE)) uart_handler[type - 1] = handler;
}
diff --git a/fw/fe310/eos/soc/uart.h b/fw/fe310/eos/soc/uart.h
index 474942d..93866af 100644
--- a/fw/fe310/eos/soc/uart.h
+++ b/fw/fe310/eos/soc/uart.h
@@ -1,5 +1,7 @@
#include <stdint.h>
+#include "../event.h"
+
#define EOS_UART_ETYPE_TX 1
#define EOS_UART_ETYPE_RX 2
@@ -7,8 +9,6 @@
#define EOS_UART_SPEED 115200
-typedef void (*eos_uart_handler_t) (unsigned char);
-
void eos_uart_preinit(void);
int eos_uart_init(void);
void eos_uart_enable(void);
@@ -16,7 +16,7 @@ void eos_uart_disable(void);
int eos_uart_enabled(void);
void eos_uart_speed(uint32_t baud_rate);
-void eos_uart_set_handler(unsigned char type, eos_uart_handler_t handler);
+void eos_uart_set_handler(unsigned char type, eos_evt_simple_handler_t handler);
void eos_uart_txwm_set(uint8_t wm);
void eos_uart_txwm_clear(void);