diff options
| author | Uros Majstorovic <majstor@majstor.org> | 2026-01-07 22:58:33 +0100 |
|---|---|---|
| committer | Uros Majstorovic <majstor@majstor.org> | 2026-01-07 22:58:33 +0100 |
| commit | 46b08fc235f3f068034355970697acc0956e5c99 (patch) | |
| tree | 96e2bde5d95c295a57afae353684a25544fb09fa /fw | |
| parent | 285ddd410a559449b7e2cbab9b2b10e850efbd08 (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;
Diffstat (limited to 'fw')
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); |
