From c6962c5700f99441538dafa346626bb7e6d12488 Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Wed, 30 Mar 2022 13:22:19 +0200 Subject: sock api fixed; net reply messages fixed --- fw/fe310/Makefile | 2 +- fw/fe310/bsp/drivers/prci_driver.c | 16 ++-- fw/fe310/common.mk | 1 + fw/fe310/eos/Makefile | 2 +- fw/fe310/eos/app/Makefile | 15 --- fw/fe310/eos/app/app_root.c | 88 ----------------- fw/fe310/eos/app/app_root.h | 12 --- fw/fe310/eos/app/app_status.c | 17 ---- fw/fe310/eos/app/app_status.h | 4 - fw/fe310/eos/board.h | 4 +- fw/fe310/eos/eos.h | 7 +- fw/fe310/eos/eve/eve_eos.c | 2 +- fw/fe310/eos/event.c | 2 +- fw/fe310/eos/i2s.c | 177 +++++++++++++++++++++++----------- fw/fe310/eos/i2s.h | 4 +- fw/fe310/eos/i2s_def.h | 3 + fw/fe310/eos/interrupt.c | 2 +- fw/fe310/eos/net.c | 62 +++++++----- fw/fe310/eos/net.h | 13 ++- fw/fe310/eos/sock.c | 101 ++++++++++++++----- fw/fe310/eos/sock.h | 10 +- fw/fe310/eos/trap_entry.S | 192 +++++++++++++++++++------------------ fw/fe310/eos/wifi.c | 61 ++++++++++++ fw/fe310/eos/wifi.h | 7 +- fw/fe310/test/Makefile | 14 ++- fw/fe310/test/app/Makefile | 15 +++ fw/fe310/test/app/app_root.c | 88 +++++++++++++++++ fw/fe310/test/app/app_root.h | 12 +++ fw/fe310/test/app/app_status.c | 76 +++++++++++++++ fw/fe310/test/app/app_status.h | 5 + fw/fe310/test/cam.c | 5 +- fw/fe310/test/cell_dev.c | 9 +- fw/fe310/test/cell_pdp.c | 11 +-- fw/fe310/test/fs.c | 2 +- fw/fe310/test/main.c | 27 +++--- fw/fe310/test/modem.c | 10 +- fw/fe310/test/phone.c | 21 ++-- fw/fe310/test/status.c | 81 ---------------- fw/fe310/test/status.h | 2 - fw/fe310/test/test.c | 7 +- fw/fe310/test/wifi.c | 42 ++------ 41 files changed, 703 insertions(+), 528 deletions(-) delete mode 100644 fw/fe310/eos/app/Makefile delete mode 100644 fw/fe310/eos/app/app_root.c delete mode 100644 fw/fe310/eos/app/app_root.h delete mode 100644 fw/fe310/eos/app/app_status.c delete mode 100644 fw/fe310/eos/app/app_status.h create mode 100644 fw/fe310/test/app/Makefile create mode 100644 fw/fe310/test/app/app_root.c create mode 100644 fw/fe310/test/app/app_root.h create mode 100644 fw/fe310/test/app/app_status.c create mode 100644 fw/fe310/test/app/app_status.h delete mode 100644 fw/fe310/test/status.c delete mode 100644 fw/fe310/test/status.h (limited to 'fw') diff --git a/fw/fe310/Makefile b/fw/fe310/Makefile index a4f5d1e..f9da883 100644 --- a/fw/fe310/Makefile +++ b/fw/fe310/Makefile @@ -5,7 +5,7 @@ MAKEFLAGS += -I$(fe310_dir) include $(crypto_dir)/crypto_obj.mk obj_crypto = $(addprefix $(crypto_dir)/,$(obj_dep)) -subdirs = bsp/drivers bsp/gloss bsp/metal eos eos/i2c eos/eve eos/eve/screen eos/eve/widget eos/app $(ext_dir)/fsfat +subdirs = bsp/drivers bsp/gloss bsp/metal eos eos/i2c eos/eve eos/eve/screen eos/eve/widget $(ext_dir)/fsfat all: libeos.a diff --git a/fw/fe310/bsp/drivers/prci_driver.c b/fw/fe310/bsp/drivers/prci_driver.c index c2df2c9..29118a2 100644 --- a/fw/fe310/bsp/drivers/prci_driver.c +++ b/fw/fe310/bsp/drivers/prci_driver.c @@ -51,16 +51,16 @@ uint32_t PRCI_measure_mcycle_freq(uint32_t mtime_ticks, uint32_t mtime_freq) unsigned long PRCI_get_cpu_freq() { - static uint32_t cpu_freq; + static uint32_t cpu_freq; - if (!cpu_freq) { - // warm up I$ - PRCI_measure_mcycle_freq(3000, RTC_FREQ); - // measure for real - cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); - } + if (!cpu_freq) { + // warm up I$ + PRCI_measure_mcycle_freq(3000, RTC_FREQ); + // measure for real + cpu_freq = PRCI_measure_mcycle_freq(3000, RTC_FREQ); + } - return cpu_freq; + return cpu_freq; } void PRCI_use_hfrosc(int div, int trim) diff --git a/fw/fe310/common.mk b/fw/fe310/common.mk index 80a34a9..dbfda51 100644 --- a/fw/fe310/common.mk +++ b/fw/fe310/common.mk @@ -2,6 +2,7 @@ fe310_dir := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) bsp_dir := $(abspath $(fe310_dir)/bsp) eos_dir := $(abspath $(fe310_dir)/eos) ext_dir := $(abspath $(fe310_dir)/../../ext) +ecp_dir := $(abspath $(fe310_dir)/../../ecp) include $(fe310_dir)/platform.mk CFLAGS += -I$(eos_dir) diff --git a/fw/fe310/eos/Makefile b/fw/fe310/eos/Makefile index 01318de..a52b5db 100644 --- a/fw/fe310/eos/Makefile +++ b/fw/fe310/eos/Makefile @@ -1,7 +1,7 @@ include ../common.mk CFLAGS += -I. -I$(bsp_dir)/include -I$(bsp_dir)/drivers -I$(ext_dir)/crypto -obj = trap_entry.o eos.o msgq.o event.o interrupt.o timer.o pwr.o i2s.o i2c.o uart.o spi.o spi_dev.o lcd.o sdcard.o sdc_crypto.o cam.o net.o wifi.o cell.o sock.o unicode.o +obj = trap_entry.o eos.o msgq.o event.o interrupt.o timer.o pwr.o i2s.o i2c.o uart.o spi.o spi_dev.o lcd.o sdcard.o sdc_crypto.o cam.o net.o rng.o wifi.o cell.o sock.o unicode.o %.o: %.c %.h diff --git a/fw/fe310/eos/app/Makefile b/fw/fe310/eos/app/Makefile deleted file mode 100644 index fe0ba21..0000000 --- a/fw/fe310/eos/app/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -include ../../common.mk - -obj = app_root.o app_status.o - - -%.o: %.c %.h - $(CC) $(CFLAGS) -c $< - -%.o: %.S - $(CC) $(CFLAGS) -c $< - -all: $(obj) - -clean: - rm -f *.o diff --git a/fw/fe310/eos/app/app_root.c b/fw/fe310/eos/app/app_root.c deleted file mode 100644 index fac9548..0000000 --- a/fw/fe310/eos/app/app_root.c +++ /dev/null @@ -1,88 +0,0 @@ -#include - -#include "net.h" - -#include "eve/eve.h" -#include "eve/eve_kbd.h" -#include "eve/eve_font.h" - -#include "eve/screen/window.h" -#include "eve/screen/page.h" -#include "eve/screen/form.h" - -#include "eve/widget/widgets.h" - -#include "app_status.h" -#include "app_root.h" - -#define KBD_X 0 -#define KBD_Y 575 -#define KBD_W 480 -#define KBD_H 225 - -static EVEKbd kbd; -static EVEFont font; -static EVEWindowRoot win_root; -static EVEWindowKbd win_kbd; -static EVEWindow win_status; -static EVEWindow win_main; -static EVEView view_status; -static EVEViewStack view_stack; - -EVEWindowRoot *app_root(void) { - return &win_root; -} - -void app_root_refresh(void) { - eve_spi_start(); - eve_window_root_draw(app_root()); - eve_spi_stop(); -} - -void app_root_init(eve_view_constructor_t home_page, int b) { - EVERect g; - - eve_spi_start(); - - if (b >= 0) eve_brightness(b); - - eve_font_init(&font, APP_FONT_HANDLE); - - g.x = 0; - g.y = 0; - g.w = APP_SCREEN_W; - g.h = APP_SCREEN_H; - eve_window_init_root(&win_root, &g, "root", &font); - - g.x = KBD_X; - g.y = KBD_Y; - g.w = KBD_W; - g.h = KBD_H; - eve_kbd_init(&kbd, &g, win_root.mem_next, &win_root.mem_next); - eve_window_init_kbd(&win_kbd, &g, &win_root, "kbd", &kbd); - - g.x = 0; - g.y = 0; - g.w = APP_SCREEN_W; - g.h = APP_STATUS_H; - eve_window_init(&win_status, &g, (EVEWindow *)&win_root, "status"); - eve_view_init(&view_status, &win_status, app_status_draw, app_status_touch, NULL, NULL); - - g.x = 0; - g.y = APP_STATUS_H; - g.w = APP_SCREEN_W; - g.h = APP_SCREEN_H - APP_STATUS_H; - eve_window_init(&win_main, &g, (EVEWindow *)&win_root, "main"); - - eve_view_stack_init(&view_stack); - eve_view_create(&win_main, &view_stack, home_page); - - eve_window_append(&win_status); - eve_window_append(&win_main); - - eve_window_root_draw(&win_root); - - eve_spi_stop(); - - eos_net_acquire_for_evt(EOS_EVT_UI | EVE_ETYPE_INTR, 1); -} diff --git a/fw/fe310/eos/app/app_root.h b/fw/fe310/eos/app/app_root.h deleted file mode 100644 index b085344..0000000 --- a/fw/fe310/eos/app/app_root.h +++ /dev/null @@ -1,12 +0,0 @@ -#include - -#define APP_SCREEN_W 480 -#define APP_SCREEN_H 800 -#define APP_STATUS_H 60 - -#define APP_FONT_HANDLE 31 - -EVEWindowRoot *app_root(void); -void app_root_refresh(void); - -void app_root_init(eve_view_constructor_t home_page, int b); diff --git a/fw/fe310/eos/app/app_status.c b/fw/fe310/eos/app/app_status.c deleted file mode 100644 index 4ab0a97..0000000 --- a/fw/fe310/eos/app/app_status.c +++ /dev/null @@ -1,17 +0,0 @@ -#include - -#include "eve/eve.h" -#include "eve/eve_kbd.h" -#include "eve/eve_font.h" - -#include "eve/screen/window.h" - -#include "app_status.h" - -uint8_t app_status_draw(EVEView *view, uint8_t tag0) { - return eve_view_clear(view, tag0, 0); -} - -int app_status_touch(EVEView *view, EVETouch *touch, uint16_t evt, uint8_t tag0) { - return 0; -} diff --git a/fw/fe310/eos/app/app_status.h b/fw/fe310/eos/app/app_status.h deleted file mode 100644 index 9b2ac66..0000000 --- a/fw/fe310/eos/app/app_status.h +++ /dev/null @@ -1,4 +0,0 @@ -#include - -int app_status_touch(EVEView *view, EVETouch *touch, uint16_t evt, uint8_t tag0); -uint8_t app_status_draw(EVEView *view, uint8_t tag0); diff --git a/fw/fe310/eos/board.h b/fw/fe310/eos/board.h index a18b58f..99832a7 100644 --- a/fw/fe310/eos/board.h +++ b/fw/fe310/eos/board.h @@ -30,8 +30,8 @@ #define I2S_PIN_SD_IN 13 #define I2S_PIN_SD_OUT 12 -#define I2S_IRQ_WS_ID (INT_PWM1_BASE + 0) -#define I2S_IRQ_SD_ID (INT_PWM1_BASE + 3) +#define I2S_IRQ_WS_ID (INT_PWM2_BASE + 0) +#define I2S_IRQ_SD_ID (INT_PWM2_BASE + 3) #define I2S_CTRL_ADDR_CK PWM0_CTRL_ADDR #define I2S_CTRL_ADDR_WS_MIC PWM1_CTRL_ADDR diff --git a/fw/fe310/eos/eos.h b/fw/fe310/eos/eos.h index 6c061d5..87a7e27 100644 --- a/fw/fe310/eos/eos.h +++ b/fw/fe310/eos/eos.h @@ -5,9 +5,10 @@ #define EOS_ERR_TIMEOUT -2 #define EOS_ERR_BUSY -3 -#define EOS_ERR_FULL -10 -#define EOS_ERR_EMPTY -11 -#define EOS_ERR_NOTFOUND -12 +#define EOS_ERR_SIZE -10 +#define EOS_ERR_FULL -11 +#define EOS_ERR_EMPTY -12 +#define EOS_ERR_NOTFOUND -13 #define EOS_ERR_NET -20 diff --git a/fw/fe310/eos/eve/eve_eos.c b/fw/fe310/eos/eve/eve_eos.c index 283aa6a..2e13cd2 100644 --- a/fw/fe310/eos/eve/eve_eos.c +++ b/fw/fe310/eos/eve/eve_eos.c @@ -101,4 +101,4 @@ void eos_eve_stop(void) { eve_spi_start(); _stop(); eve_spi_stop(); -} \ No newline at end of file +} diff --git a/fw/fe310/eos/event.c b/fw/fe310/eos/event.c index 4a6493f..753cdb4 100644 --- a/fw/fe310/eos/event.c +++ b/fw/fe310/eos/event.c @@ -140,7 +140,7 @@ void eos_evtq_loop(void) { } void eos_evtq_bad_handler(unsigned char type, unsigned char *buffer, uint16_t len) { - printf("evt bad handler:0x%x\n", type); + printf("EVT BAD HANDLER:0x%x\n", type); } void eos_evtq_set_handler(unsigned char type, eos_evt_handler_t handler) { diff --git a/fw/fe310/eos/i2s.c b/fw/fe310/eos/i2s.c index 9cc32e0..9cc9d9c 100644 --- a/fw/fe310/eos/i2s.c +++ b/fw/fe310/eos/i2s.c @@ -25,22 +25,41 @@ #define EOS_ABUF_IDX_MASK(IDX, SIZE) ((IDX) & ((SIZE) - 1)) -EOSABuf _eos_i2s_mic_buf; -EOSABuf _eos_i2s_spk_buf; -uint32_t _eos_i2s_fmt = 0; -uint32_t _eos_i2s_mode = 0; -uint32_t _eos_i2s_sample = 0; -uint32_t _eos_i2s_mic_wm = 0; -uint32_t _eos_i2s_spk_wm = 0; -uint32_t _eos_i2s_mic_evt_enable = 0; -uint32_t _eos_i2s_spk_evt_enable = 0; +EOSABuf i2s_mic_buf; +EOSABuf i2s_spk_buf; -static eos_i2s_handler_t i2s_spk_handler = NULL; static eos_i2s_handler_t i2s_mic_handler = NULL; +static eos_i2s_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 */ +uint32_t _eos_i2s_drvr[] = { + 0, /* I2S_MIC_BUF */ + 0, /* I2S_SPK_BUF */ + EOS_I2S_FMT_PCM16, /* I2S_FMT */ + EOS_I2S_MODE_STEREO, /* I2S_MODE */ + 0, /* I2S_MIC_WM */ + 0, /* I2S_SPK_WM */ + 0, /* I2S_MIC_EVT */ + 0, /* I2S_SPK_EVT */ + 0, /* I2S_MIC_CMP2 */ + 0, /* I2S_MIC_CMP3 */ + 0, /* I2S_SAMPLE */ +}; + +#define I2S_MIC_BUF 0 +#define I2S_SPK_BUF 1 +#define I2S_FMT 2 +#define I2S_MODE 3 +#define I2S_MIC_WM 4 +#define I2S_SPK_WM 5 +#define I2S_MIC_EVT 6 +#define I2S_SPK_EVT 7 +#define I2S_MIC_CMP2 8 +#define I2S_MIC_CMP3 9 +#define I2S_SAMPLE 10 + static void _abuf_init(EOSABuf *buf, uint8_t *array, uint16_t size) { buf->idx_r = 0; buf->idx_w = 0; @@ -86,7 +105,6 @@ static int _abuf_pop16(EOSABuf *buf, uint16_t *sample) { } } - static void _abuf_flush(EOSABuf *buf) { buf->idx_r = 0; buf->idx_w = 0; @@ -99,17 +117,21 @@ static uint16_t _abuf_len(EOSABuf *buf) { static void i2s_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) { switch(type & ~EOS_EVT_MASK) { case EOS_I2S_ETYPE_MIC: - if (i2s_mic_handler) i2s_mic_handler(type); - clear_csr(mstatus, MSTATUS_MIE); - _eos_i2s_mic_evt_enable = 1; - set_csr(mstatus, MSTATUS_MIE); + if (i2s_mic_handler) { + i2s_mic_handler(type); + clear_csr(mstatus, MSTATUS_MIE); + _eos_i2s_drvr[I2S_MIC_EVT] = 1; + set_csr(mstatus, MSTATUS_MIE); + } break; case EOS_I2S_ETYPE_SPK: - if (i2s_spk_handler) i2s_spk_handler(type); - clear_csr(mstatus, MSTATUS_MIE); - _eos_i2s_spk_evt_enable = 1; - set_csr(mstatus, MSTATUS_MIE); + if (i2s_spk_handler) { + i2s_spk_handler(type); + clear_csr(mstatus, MSTATUS_MIE); + _eos_i2s_drvr[I2S_SPK_EVT] = 1; + set_csr(mstatus, MSTATUS_MIE); + } break; default: @@ -118,23 +140,40 @@ static void i2s_handle_evt(unsigned char type, unsigned char *buffer, uint16_t l } } -static void _mic_vol_set(uint8_t vol) { - I2S_REG_WS_MIC(PWM_CMP2) = i2s_clk_period * (vol + 1); - I2S_REG_WS_MIC(PWM_CMP3) = I2S_REG_WS_MIC(PWM_CMP2) + i2s_clk_period * 16; -} +#define PLIC_PRIORITY 0x0C000000 + +static void i2s_cmp_set(void) { + int c = 7; /* interrupt will trigger c i2s clocks before spk ws */ + int spk_ws_offset = i2s_spk_volume - 16 + i2s_mic_volume; + volatile uint32_t *p = (uint32_t *)PLIC_PRIORITY+I2S_IRQ_SD_ID; + + /* interrupt trigger - will start with left channel */ + if (spk_ws_offset - c < 0) { + I2S_REG_WS_SPK(PWM_CMP3) = i2s_clk_period * (64 + spk_ws_offset - c); + } else { + I2S_REG_WS_SPK(PWM_CMP3) = i2s_clk_period * (spk_ws_offset - c); + } -static void _spk_vol_set(uint8_t vol) { - int spk_cmp = vol + i2s_mic_volume - 16; + /* disable interrupt for this cycle */ + *p = 0; - if (spk_cmp <= 0) { - I2S_REG_WS_SPK(PWM_CMP1) = i2s_clk_period * (32 + spk_cmp); - I2S_REG_WS_SPK(PWM_CMP2) = i2s_clk_period * (64 + spk_cmp); + /* empty buffers */ + // i2s_mic_buf.idx_r = i2s_mic_buf.idx_w; + // i2s_spk_buf.idx_w = i2s_spk_buf.idx_r; + + /* adjust spk ws relative to mic ws */ + if (spk_ws_offset <= 0) { + spk_ws_offset += 32; GPIO_REG(GPIO_OUTPUT_XOR) &= ~(1 << I2S_PIN_WS_SPK); } else { - I2S_REG_WS_SPK(PWM_CMP1) = i2s_clk_period * spk_cmp; - I2S_REG_WS_SPK(PWM_CMP2) = i2s_clk_period * (32 + spk_cmp); - GPIO_REG(GPIO_OUTPUT_XOR) |= (1 << I2S_PIN_WS_SPK); + GPIO_REG(GPIO_OUTPUT_XOR) |= (1 << I2S_PIN_WS_SPK); } + I2S_REG_WS_SPK(PWM_CMP1) = i2s_clk_period * spk_ws_offset; + I2S_REG_WS_SPK(PWM_CMP2) = i2s_clk_period * (32 + spk_ws_offset); + + /* mic cmp2 relative to interrupt trigger */ + _eos_i2s_drvr[I2S_MIC_CMP2] = (17 + c - i2s_spk_volume) * i2s_clk_period; /* (17 + c - i2s_spk_volume) == (1 + i2s_mic_volume) - (spk_ws_offset - c) */ + _eos_i2s_drvr[I2S_MIC_CMP3] = 16 * i2s_clk_period; } extern void _eos_i2s_start_pwm(void); @@ -179,7 +218,7 @@ void eos_i2s_init_mux(void) { GPIO_REG(GPIO_OUTPUT_EN) &= ~(1 << I2S_PIN_SD_OUT); } -void eos_i2s_start(uint32_t sample_rate, unsigned char fmt) { +void eos_i2s_start(uint32_t sample_rate) { i2s_clk_period = ((PRCI_get_cpu_freq() / (sample_rate * 64)) & ~I2S_PWM_SCALE_CK_MASK) + 1; GPIO_REG(GPIO_INPUT_EN) |= (1 << I2S_PIN_SD_IN); @@ -195,18 +234,28 @@ void eos_i2s_start(uint32_t sample_rate, unsigned char fmt) { I2S_REG_WS_MIC(PWM_CMP0) = i2s_clk_period * 64 - 1; I2S_REG_WS_MIC(PWM_CMP1) = i2s_clk_period * 32; - _mic_vol_set(i2s_mic_volume); I2S_REG_WS_SPK(PWM_CMP0) = i2s_clk_period * 64 - 1; - _spk_vol_set(i2s_spk_volume); + i2s_cmp_set(); I2S_REG_CK(PWM_COUNT) = 0; I2S_REG_WS_MIC(PWM_COUNT) = 0; I2S_REG_WS_SPK(PWM_COUNT) = i2s_clk_period / 2; - _eos_i2s_fmt = fmt; - _eos_i2s_mic_evt_enable = 1; - _eos_i2s_spk_evt_enable = 1; + if (i2s_mic_buf.array && i2s_mic_buf.size) { + _eos_i2s_drvr[I2S_MIC_BUF] = (uint32_t)&i2s_mic_buf; + if (_eos_i2s_drvr[I2S_MIC_WM] == 0) { + _eos_i2s_drvr[I2S_MIC_WM] = i2s_mic_buf.size / 2; + } + } + if (i2s_spk_buf.array && i2s_spk_buf.size) { + _eos_i2s_drvr[I2S_SPK_BUF] = (uint32_t)&i2s_spk_buf; + if (_eos_i2s_drvr[I2S_SPK_WM] == 0) { + _eos_i2s_drvr[I2S_SPK_WM] = i2s_spk_buf.size / 2; + } + } + if (i2s_mic_handler) _eos_i2s_drvr[I2S_MIC_EVT] = 1; + if (i2s_spk_handler) _eos_i2s_drvr[I2S_SPK_EVT] = 1; eos_intr_set_priority(I2S_IRQ_SD_ID, IRQ_PRIORITY_I2S_SD); eos_intr_set_priority(I2S_IRQ_WS_ID, IRQ_PRIORITY_I2S_WS); @@ -237,8 +286,13 @@ void eos_i2s_stop(void) { I2S_REG_WS_MIC(PWM_COUNT) = 0; I2S_REG_WS_SPK(PWM_COUNT) = 0; - _eos_i2s_mic_evt_enable = 0; - _eos_i2s_spk_evt_enable = 0; + _eos_i2s_drvr[I2S_MIC_BUF] = 0; + _eos_i2s_drvr[I2S_MIC_EVT] = 0; + _eos_i2s_drvr[I2S_MIC_WM] = 0; + + _eos_i2s_drvr[I2S_SPK_BUF] = 0; + _eos_i2s_drvr[I2S_SPK_EVT] = 0; + _eos_i2s_drvr[I2S_SPK_WM] = 0; eos_intr_disable(I2S_IRQ_WS_ID); eos_intr_disable(I2S_IRQ_SD_ID); @@ -257,9 +311,17 @@ int eos_i2s_running(void) { return !!(GPIO_REG(GPIO_IOF_EN) & (1 << I2S_PIN_CK)); } +void eos_i2s_set_fmt(unsigned char fmt) { + _eos_i2s_drvr[I2S_FMT] = fmt; +} + +void eos_i2s_set_mode(unsigned char mode) { + _eos_i2s_drvr[I2S_MODE] = mode; +} + void eos_i2s_mic_init(uint8_t *mic_arr, uint16_t mic_arr_size) { clear_csr(mstatus, MSTATUS_MIE); - _abuf_init(&_eos_i2s_mic_buf, mic_arr, mic_arr_size); + _abuf_init(&i2s_mic_buf, mic_arr, mic_arr_size); set_csr(mstatus, MSTATUS_MIE); } @@ -271,14 +333,14 @@ void eos_i2s_mic_set_handler(eos_i2s_handler_t wm_handler) { void eos_i2s_mic_set_wm(uint16_t wm) { clear_csr(mstatus, MSTATUS_MIE); - _eos_i2s_mic_wm = wm; + _eos_i2s_drvr[I2S_MIC_WM] = wm; set_csr(mstatus, MSTATUS_MIE); } uint16_t eos_i2s_mic_len(void) { clear_csr(mstatus, MSTATUS_MIE); - uint16_t ret = _abuf_len(&_eos_i2s_mic_buf); + uint16_t ret = _abuf_len(&i2s_mic_buf); set_csr(mstatus, MSTATUS_MIE); return ret; } @@ -288,15 +350,15 @@ uint16_t eos_i2s_mic_read(uint8_t *sample, uint16_t ssize) { uint16_t _ssize = 0; clear_csr(mstatus, MSTATUS_MIE); - _ssize = MIN(ssize, _abuf_len(&_eos_i2s_mic_buf)); + _ssize = MIN(ssize, _abuf_len(&i2s_mic_buf)); set_csr(mstatus, MSTATUS_MIE); for (i=0; i<_ssize; i++) { - sample[i] = _eos_i2s_mic_buf.array[EOS_ABUF_IDX_MASK(_eos_i2s_mic_buf.idx_r + i, _eos_i2s_mic_buf.size)]; + sample[i] = i2s_mic_buf.array[EOS_ABUF_IDX_MASK(i2s_mic_buf.idx_r + i, i2s_mic_buf.size)]; } clear_csr(mstatus, MSTATUS_MIE); - _eos_i2s_mic_buf.idx_r += _ssize; + i2s_mic_buf.idx_r += _ssize; set_csr(mstatus, MSTATUS_MIE); return _ssize; @@ -306,7 +368,7 @@ int eos_i2s_mic_pop8(uint8_t *sample) { int ret; clear_csr(mstatus, MSTATUS_MIE); - ret = _abuf_pop8(&_eos_i2s_mic_buf, sample); + ret = _abuf_pop8(&i2s_mic_buf, sample); set_csr(mstatus, MSTATUS_MIE); return ret; @@ -316,7 +378,7 @@ int eos_i2s_mic_pop16(uint16_t *sample) { int ret; clear_csr(mstatus, MSTATUS_MIE); - ret = _abuf_pop16(&_eos_i2s_mic_buf, sample); + ret = _abuf_pop16(&i2s_mic_buf, sample); set_csr(mstatus, MSTATUS_MIE); return ret; @@ -332,14 +394,13 @@ void eos_i2s_mic_vol_set(int vol) { i2s_mic_volume = vol; clear_csr(mstatus, MSTATUS_MIE); - _mic_vol_set(vol); - _spk_vol_set(i2s_spk_volume); + i2s_cmp_set(); set_csr(mstatus, MSTATUS_MIE); } void eos_i2s_spk_init(uint8_t *spk_arr, uint16_t spk_arr_size) { clear_csr(mstatus, MSTATUS_MIE); - _abuf_init(&_eos_i2s_spk_buf, spk_arr, spk_arr_size); + _abuf_init(&i2s_spk_buf, spk_arr, spk_arr_size); set_csr(mstatus, MSTATUS_MIE); } @@ -351,13 +412,13 @@ void eos_i2s_spk_set_handler(eos_i2s_handler_t wm_handler) { void eos_i2s_spk_set_wm(uint16_t wm) { clear_csr(mstatus, MSTATUS_MIE); - _eos_i2s_spk_wm = wm; + _eos_i2s_drvr[I2S_SPK_WM] = wm; set_csr(mstatus, MSTATUS_MIE); } uint16_t eos_i2s_spk_len(void) { clear_csr(mstatus, MSTATUS_MIE); - uint16_t ret = _abuf_len(&_eos_i2s_spk_buf); + uint16_t ret = _abuf_len(&i2s_spk_buf); set_csr(mstatus, MSTATUS_MIE); return ret; } @@ -367,15 +428,15 @@ uint16_t eos_i2s_spk_write(uint8_t *sample, uint16_t ssize) { uint16_t _ssize = 0; clear_csr(mstatus, MSTATUS_MIE); - _ssize = MIN(ssize, _eos_i2s_spk_buf.size - _abuf_len(&_eos_i2s_spk_buf)); + _ssize = MIN(ssize, i2s_spk_buf.size - _abuf_len(&i2s_spk_buf)); set_csr(mstatus, MSTATUS_MIE); for (i=0; i<_ssize; i++) { - _eos_i2s_spk_buf.array[EOS_ABUF_IDX_MASK(_eos_i2s_spk_buf.idx_w + i, _eos_i2s_spk_buf.size)] = sample[i]; + i2s_spk_buf.array[EOS_ABUF_IDX_MASK(i2s_spk_buf.idx_w + i, i2s_spk_buf.size)] = sample[i]; } clear_csr(mstatus, MSTATUS_MIE); - _eos_i2s_spk_buf.idx_w += _ssize; + i2s_spk_buf.idx_w += _ssize; set_csr(mstatus, MSTATUS_MIE); return _ssize; @@ -385,7 +446,7 @@ int eos_i2s_spk_push8(uint8_t sample) { int ret; clear_csr(mstatus, MSTATUS_MIE); - ret = _abuf_push8(&_eos_i2s_spk_buf, sample); + ret = _abuf_push8(&i2s_spk_buf, sample); set_csr(mstatus, MSTATUS_MIE); return ret; @@ -395,7 +456,7 @@ int eos_i2s_spk_push16(uint16_t sample) { int ret; clear_csr(mstatus, MSTATUS_MIE); - ret = _abuf_push16(&_eos_i2s_spk_buf, sample); + ret = _abuf_push16(&i2s_spk_buf, sample); set_csr(mstatus, MSTATUS_MIE); return ret; @@ -411,6 +472,6 @@ void eos_i2s_spk_vol_set(int vol) { i2s_spk_volume = vol; clear_csr(mstatus, MSTATUS_MIE); - _spk_vol_set(vol); + i2s_cmp_set(); set_csr(mstatus, MSTATUS_MIE); } diff --git a/fw/fe310/eos/i2s.h b/fw/fe310/eos/i2s.h index f53e183..81b4ade 100644 --- a/fw/fe310/eos/i2s.h +++ b/fw/fe310/eos/i2s.h @@ -13,9 +13,11 @@ typedef void (*eos_i2s_handler_t) (unsigned char); int eos_i2s_init(uint8_t wakeup_cause); void eos_i2s_init_mux(void); -void eos_i2s_start(uint32_t sample_rate, unsigned char fmt); +void eos_i2s_start(uint32_t sample_rate); void eos_i2s_stop(void); int eos_i2s_running(void); +void eos_i2s_set_fmt(unsigned char fmt); +void eos_i2s_set_mode(unsigned char mode); void eos_i2s_mic_init(uint8_t *mic_arr, uint16_t mic_arr_size); void eos_i2s_mic_set_handler(eos_i2s_handler_t wm_handler); void eos_i2s_mic_set_wm(uint16_t wm); diff --git a/fw/fe310/eos/i2s_def.h b/fw/fe310/eos/i2s_def.h index a338828..3529be1 100644 --- a/fw/fe310/eos/i2s_def.h +++ b/fw/fe310/eos/i2s_def.h @@ -1,5 +1,8 @@ #define EOS_I2S_FMT_PCM16 0 #define EOS_I2S_FMT_ALAW 1 +#define EOS_I2S_MODE_STEREO 0 +#define EOS_I2S_MODE_MONO 1 + #define EOS_I2S_ETYPE_MIC 1 #define EOS_I2S_ETYPE_SPK 2 diff --git a/fw/fe310/eos/interrupt.c b/fw/fe310/eos/interrupt.c index 8af492b..dab6fab 100644 --- a/fw/fe310/eos/interrupt.c +++ b/fw/fe310/eos/interrupt.c @@ -20,7 +20,7 @@ uintptr_t eos_intr_handle(uintptr_t int_num) { if ((int_num >=1) && (int_num <= PLIC_NUM_INTERRUPTS) && (ext_interrupt_handler[int_num-1])) { ext_interrupt_handler[int_num-1](); } else { - printf("error:%d\n", int_num); + printf("INTR ERROR:%d\n", int_num); exit(int_num); } return int_num; diff --git a/fw/fe310/eos/net.c b/fw/fe310/eos/net.c index e65bcd2..e10414c 100644 --- a/fw/fe310/eos/net.c +++ b/fw/fe310/eos/net.c @@ -24,7 +24,7 @@ #define NET_STATE_FLAG_INIT 0x02 #define NET_STATE_FLAG_XCHG 0x04 #define NET_STATE_FLAG_ONEW 0x10 -#define NET_STATE_FLAG_REPW 0x20 +#define NET_STATE_FLAG_SYNC 0x20 #define NET_STATE_FLAG_RTS 0x40 #define NET_STATE_FLAG_CTS 0x80 @@ -108,7 +108,6 @@ static void net_xchg_start(unsigned char type, unsigned char *buffer, uint16_t l if (net_state_next_cnt && (net_state_next_buf == NULL)) type |= EOS_NET_MTYPE_FLAG_ONEW; if (type & EOS_NET_MTYPE_FLAG_ONEW) net_state_flags |= NET_STATE_FLAG_ONEW; - if (type & EOS_NET_MTYPE_FLAG_REPW) net_state_flags |= NET_STATE_FLAG_REPW; net_state_type = type; net_state_len_tx = len; @@ -156,7 +155,7 @@ static void net_handle_xchg(void) { r2 = SPI1_REG(SPI_REG_RXFIFO); r3 = SPI1_REG(SPI_REG_RXFIFO); - if (net_state_flags & (NET_STATE_FLAG_ONEW | NET_STATE_FLAG_REPW)) { + if (net_state_flags & NET_STATE_FLAG_ONEW) { r1 = 0; r2 = 0; r3 = 0; @@ -189,20 +188,17 @@ static void net_handle_xchg(void) { eos_spi_handle_xchg(); if (SPI1_REG(SPI_REG_CSMODE) == SPI_CSMODE_AUTO) { // exchange done - if (net_state_flags & NET_STATE_FLAG_REPW) { - net_state_flags &= ~NET_STATE_FLAG_REPW; - } else { + if (!(net_state_flags & NET_STATE_FLAG_SYNC)) { if (net_state_type) { int r = eos_evtq_push_isr(EOS_EVT_NET | net_state_type, net_state_buf, net_state_len_rx); if (r) eos_bufq_push(&net_buf_q, net_state_buf); } else if (((net_state_flags & NET_STATE_FLAG_ONEW) || net_state_next_cnt) && (net_state_next_buf == NULL)) { net_state_next_buf = net_state_buf; - net_state_flags &= ~NET_STATE_FLAG_ONEW; } else { eos_bufq_push(&net_buf_q, net_state_buf); } } - net_state_flags &= ~NET_STATE_FLAG_XCHG; + net_state_flags &= ~(NET_STATE_FLAG_ONEW | NET_STATE_FLAG_XCHG); } } @@ -515,17 +511,21 @@ void eos_net_free(unsigned char *buffer, unsigned char more) { set_csr(mstatus, MSTATUS_MIE); } -static int net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len) { +static int net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len, unsigned char flags) { int rv = EOS_OK; int _sync = 0; unsigned char _type = *type; uint16_t _len = *len; uint8_t spi_dev = EOS_SPI_DEV_NET; + if (flags & EOS_NET_FLAG_ONEW) _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); - if ((_type & EOS_NET_MTYPE_FLAG_REPW) || ((_type & EOS_NET_MTYPE_FLAG_ONEW) && !(net_state_flags & NET_STATE_FLAG_RUN))) _sync = 1; + if ((flags & EOS_NET_FLAG_ONEW) && !(net_state_flags & NET_STATE_FLAG_RUN)) _sync = 1; - if (!(net_state_flags & NET_STATE_FLAG_RUN) && _sync) { + if (_sync && !(net_state_flags & NET_STATE_FLAG_RUN)) { int _rv; set_csr(mstatus, MSTATUS_MIE); @@ -542,19 +542,25 @@ static int net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len) { set_csr(mstatus, MSTATUS_MIE); clear_csr(mstatus, MSTATUS_MIE); } + if (flags & EOS_NET_FLAG_SYNC) { + net_state_flags |= NET_STATE_FLAG_SYNC; + } net_xchg_start(_type, buffer, _len); - if (_type & EOS_NET_MTYPE_FLAG_REPW) { - while (!(net_state_flags & NET_STATE_FLAG_CTS)) { - asm volatile ("wfi"); - set_csr(mstatus, MSTATUS_MIE); - clear_csr(mstatus, MSTATUS_MIE); + if (flags & EOS_NET_FLAG_SYNC) { + if (flags & EOS_NET_FLAG_REPL) { + while (!(net_state_flags & NET_STATE_FLAG_CTS)) { + asm volatile ("wfi"); + set_csr(mstatus, MSTATUS_MIE); + clear_csr(mstatus, MSTATUS_MIE); + } + net_xchg_start(0, buffer, 0); } - net_xchg_start(0, buffer, 0); while (net_state_flags & NET_STATE_FLAG_XCHG) { asm volatile ("wfi"); set_csr(mstatus, MSTATUS_MIE); clear_csr(mstatus, MSTATUS_MIE); } + net_state_flags &= ~NET_STATE_FLAG_SYNC; *type = net_state_type; *len = net_state_len_rx; } @@ -574,12 +580,22 @@ static int net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len) { return rv; } -int eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char more) { - if (more) type |= EOS_NET_MTYPE_FLAG_ONEW; - return net_xchg(&type, buffer, &len); +int eos_net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len) { + return net_xchg(type, buffer, len, (EOS_NET_FLAG_ONEW | EOS_NET_FLAG_SYNC | EOS_NET_FLAG_REPL)); +} + +int eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len) { + return net_xchg(&type, buffer, &len, (EOS_NET_FLAG_ONEW | EOS_NET_FLAG_SYNC)); } -int eos_net_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len) { - *type |= EOS_NET_MTYPE_FLAG_REPW; - return net_xchg(type, buffer, len); +int eos_net_send_async(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char more) { + return net_xchg(&type, buffer, &len, more ? EOS_NET_FLAG_ONEW : 0); +} + +int _eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char async, unsigned char more) { + if (async) { + eos_net_send_async(type, buffer, len, more); + } else { + eos_net_send(type, buffer, len); + } } diff --git a/fw/fe310/eos/net.h b/fw/fe310/eos/net.h index 86496bb..79caf4b 100644 --- a/fw/fe310/eos/net.h +++ b/fw/fe310/eos/net.h @@ -3,9 +3,10 @@ /* common */ #define EOS_NET_MTU 1500 -#define EOS_NET_SIZE_BUF (EOS_NET_MTU + 4) +#define EOS_NET_SIZE_BUF EOS_NET_MTU #define EOS_NET_MTYPE_SOCK 1 +#define EOS_NET_MTYPE_RNG 3 #define EOS_NET_MTYPE_POWER 4 #define EOS_NET_MTYPE_WIFI 5 @@ -16,12 +17,16 @@ #define EOS_NET_MAX_MTYPE 8 #define EOS_NET_MTYPE_FLAG_ONEW 0x40 -#define EOS_NET_MTYPE_FLAG_REPW 0x80 +#define EOS_NET_MTYPE_FLAG_REPL 0x80 #define EOS_NET_MTYPE_FLAG_MASK 0xc0 /* fe310 specific */ #define EOS_NET_SIZE_BUFQ 2 +#define EOS_NET_FLAG_ONEW 0x1 +#define EOS_NET_FLAG_SYNC 0x2 +#define EOS_NET_FLAG_REPL 0x4 + int eos_net_init(uint8_t wakeup_cause); int eos_net_run(uint8_t wakeup_cause); void eos_net_start(void); @@ -36,5 +41,7 @@ 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_xchg(unsigned char *type, unsigned char *buffer, uint16_t *len); +int eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len); +int eos_net_send_async(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char more); +int _eos_net_send(unsigned char type, unsigned char *buffer, uint16_t len, unsigned char async, unsigned char more); diff --git a/fw/fe310/eos/sock.c b/fw/fe310/eos/sock.c index ef043d1..7365c97 100644 --- a/fw/fe310/eos/sock.c +++ b/fw/fe310/eos/sock.c @@ -52,52 +52,103 @@ 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 type = EOS_SOCK_MTYPE_OPEN_DGRAM; - unsigned char *buffer = eos_net_alloc(); - uint16_t buf_size; +int eos_sock_open_udp(eos_evt_handler_t handler, unsigned char *buffer) { + unsigned char type; + uint16_t len; + int do_release; int rv, sock; - buffer[0] = type; - rv = eos_net_send(EOS_NET_MTYPE_SOCK, buffer, 1, 0); + do_release = 0; + if (buffer == NULL) { + buffer = eos_net_alloc(); + do_release = 1; + } + + type = EOS_NET_MTYPE_SOCK; + len = 1; + buffer[0] = EOS_SOCK_MTYPE_OPEN_DGRAM; + + rv = eos_net_xchg(&type, buffer, &len); if (rv) return rv; - eos_evtq_wait(EOS_NET_MTYPE_SOCK, &type, 1, &buffer, &buf_size); - if (buf_size < 2) { - eos_net_free(buffer, 0); - return EOS_ERR_NET; - } + if (type != EOS_NET_MTYPE_SOCK) return EOS_ERR_NET; + if (len < 2) return EOS_ERR_SIZE; sock = buffer[1]; - eos_net_free(buffer, 1); - if (sock == 0) return EOS_ERR_NET; + if (do_release) { + eos_net_free(buffer, 1); + } eos_sock_set_handler(sock, handler); + return sock; } -void eos_sock_close(unsigned char sock) { - unsigned char *buffer = eos_net_alloc(); +void eos_sock_close(unsigned char sock, unsigned char *buffer) { + int async; + + 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, 1); + _eos_net_send(EOS_NET_MTYPE_SOCK, buffer, 2, async, 1); eos_sock_set_handler(sock, NULL); } -int eos_sock_sendto(unsigned char sock, unsigned char *buffer, uint16_t size, unsigned char more, EOSNetAddr *addr) { - unsigned char type = EOS_NET_MTYPE_SOCK; - +static int sock_send(unsigned char sock, unsigned char *msg, uint16_t msg_len, EOSNetAddr *addr, unsigned char *buffer) { buffer[0] = EOS_SOCK_MTYPE_PKT; buffer[1] = sock; - memcpy(buffer+2, addr->host, sizeof(addr->host)); - memcpy(buffer+2+sizeof(addr->host), &addr->port, sizeof(addr->port)); - return eos_net_send(type, buffer, size, more); + buffer += 2; + memcpy(buffer, addr->host, sizeof(addr->host)); + buffer += sizeof(addr->host); + buffer[0] = addr->port >> 8; + buffer[1] = addr->port; + buffer += sizeof(addr->port); + if (msg) { + if (msg_len + EOS_SOCK_SIZE_UDP_HDR > EOS_NET_MTU) return EOS_ERR_SIZE; + memcpy(buffer, msg, msg_len); + } + + return EOS_OK; } -void eos_sock_getfrom(unsigned char *buffer, EOSNetAddr *addr) { - memcpy(addr->host, buffer+2, sizeof(addr->host)); - memcpy(&addr->port, buffer+2+sizeof(addr->host), sizeof(addr->port)); +int eos_sock_sendto(unsigned char sock, unsigned char *msg, size_t msg_len, EOSNetAddr *addr, unsigned char *buffer) { + int rv; + + rv = sock_send(sock, msg, msg_len, addr, buffer); + if (rv) return rv; + + return eos_net_send(EOS_NET_MTYPE_SOCK, buffer, msg_len + EOS_SOCK_SIZE_UDP_HDR); +} + +int eos_sock_sendto_async(unsigned char sock, unsigned char *msg, size_t msg_len, EOSNetAddr *addr, unsigned char *buffer, unsigned char more) { + int rv; + + rv = sock_send(sock, msg, msg_len, addr, buffer); + if (rv) return rv; + + return eos_net_send_async(EOS_NET_MTYPE_SOCK, buffer, msg_len + EOS_SOCK_SIZE_UDP_HDR, more); } +int eos_sock_recvfrom(unsigned char *buffer, uint16_t len, unsigned char *msg, size_t msg_size, EOSNetAddr *addr) { + if (len < EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE; + + if (buffer[0] != EOS_SOCK_MTYPE_PKT) return EOS_ERR_NET; + buffer += 2; + memcpy(addr->host, buffer, sizeof(addr->host)); + buffer += sizeof(addr->host); + addr->port = (uint16_t)buffer[0] << 8; + addr->port |= (uint16_t)buffer[1]; + buffer += sizeof(addr->port); + if (msg) { + if (msg_size < len - EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE; + memcpy(msg, buffer, len - EOS_SOCK_SIZE_UDP_HDR); + } + + return EOS_OK; +} diff --git a/fw/fe310/eos/sock.h b/fw/fe310/eos/sock.h index 66fa2e1..5ef42e3 100644 --- a/fw/fe310/eos/sock.h +++ b/fw/fe310/eos/sock.h @@ -20,7 +20,9 @@ void eos_sock_netinit(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); -void eos_sock_close(unsigned char sock); -int eos_sock_sendto(unsigned char sock, unsigned char *buffer, uint16_t size, unsigned char more, EOSNetAddr *addr); -void eos_sock_getfrom(unsigned char *buffer, EOSNetAddr *addr); +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_sendto(unsigned char sock, unsigned char *msg, size_t msg_len, EOSNetAddr *addr, unsigned char *buffer); +int eos_sock_sendto_async(unsigned char sock, unsigned char *msg, size_t msg_len, EOSNetAddr *addr, unsigned char *buffer, unsigned char more); +int eos_sock_recvfrom(unsigned char *buffer, uint16_t len, unsigned char *msg, size_t msg_size, EOSNetAddr *addr); diff --git a/fw/fe310/eos/trap_entry.S b/fw/fe310/eos/trap_entry.S index 506683b..fb2b121 100644 --- a/fw/fe310/eos/trap_entry.S +++ b/fw/fe310/eos/trap_entry.S @@ -25,6 +25,18 @@ #define INT_PWM1_BASE 44 #define INT_PWM2_BASE 48 +#define I2S_MIC_BUF (0*4) +#define I2S_SPK_BUF (1*4) +#define I2S_FMT (2*4) +#define I2S_MODE (3*4) +#define I2S_MIC_WM (4*4) +#define I2S_SPK_WM (5*4) +#define I2S_MIC_EVT (6*4) +#define I2S_SPK_EVT (7*4) +#define I2S_MIC_CMP2 (8*4) +#define I2S_MIC_CMP3 (9*4) +#define I2S_SAMPLE (10*4) + #include "board.h" #include "irq_def.h" #include "evt_def.h" @@ -37,7 +49,7 @@ .global eos_trap_entry eos_trap_entry: - addi sp, sp, -10*REGBYTES + addi sp, sp, -12*REGBYTES STORE x8, 0*REGBYTES(sp) STORE x9, 1*REGBYTES(sp) STORE x18, 2*REGBYTES(sp) @@ -46,8 +58,10 @@ eos_trap_entry: STORE x21, 5*REGBYTES(sp) STORE x22, 6*REGBYTES(sp) STORE x23, 7*REGBYTES(sp) - STORE x24, 8*REGBYTES(sp) - STORE x25, 9*REGBYTES(sp) + STORE x24, 8*REGBYTES(sp) # format: 0 - PCM16; 1 - ALAW + STORE x25, 9*REGBYTES(sp) # mode: 0 - stereo; 1 - mono + STORE x26, 10*REGBYTES(sp) # channel: 0 - left; 1 - right + STORE x27, 11*REGBYTES(sp) # _eos_event_q addr csrr x8, mcause li x18, MCAUSE_EXT @@ -86,51 +100,57 @@ evtq_push: jalr x0, x21 i2s_handle_sd: - li x9, I2S_CTRL_ADDR_WS_MIC - lw x18, PWM_COUNT(x9) - lw x19, PWM_CMP1(x9) - lw x20, PWM_CMP2(x9) - lw x21, PWM_CMP3(x9) + li x8, I2S_CTRL_ADDR_WS_SPK + lw x18, PWM_COUNT(x8) + lw x19, PWM_CMP3(x8) # exit if too early - bltu x18, x21, i2s_sd_exit - - # move CMPs for next channel and store parity to x25 - li x25, 0 - bltu x20, x19, 0f - li x25, 1 - neg x19, x19 - li x22, PLIC_PRIORITY - sw x0, 4*I2S_IRQ_SD_ID(x22) + bltu x18, x19, i2s_sd_exit + + la x27, _eos_i2s_drvr + + # move CMPs for next channel and store channel bit to x26 + lw x20, I2S_MIC_CMP2(x27) + lw x21, I2S_MIC_CMP3(x27) # 16-bit period + + add x23, x19, x20 + add x24, x23, x21 + slli x20, x21, 1 # 32-bit period + slli x21, x20, 1 # 64-bit period + bltu x24, x21, 0f + neg x21, x21 + add x23, x23, x21 + add x24, x24, x21 0: - add x20, x20, x19 - add x21, x21, x19 - sw x20, PWM_CMP2(x9) - sw x21, PWM_CMP3(x9) + li x26, 0 + bltu x23, x20, 0f + li x26, 1 +0: + bltu x19, x20, 0f + neg x20, x20 + li x18, PLIC_PRIORITY + sw x0, 4*I2S_IRQ_SD_ID(x18) +0: + add x19, x19, x20 + + li x9, I2S_CTRL_ADDR_WS_MIC + sw x19, PWM_CMP3(x8) + sw x23, PWM_CMP2(x9) + sw x24, PWM_CMP3(x9) - la x9, _eos_i2s_fmt - lw x24, 0(x9) + lw x24, I2S_FMT(x27) + lw x25, I2S_MODE(x27) i2s_abuf_pop: - la x9, _eos_i2s_mode - lw x22, 0(x9) - and x22, x22, x25 - beqz x22, 0f + and x8, x25, x26 + beqz x8, 0f - la x9, _eos_i2s_sample - lw x8, 0(x9) + lw x8, I2S_SAMPLE(x27) j i2s_sd_xchg - 0: - mv x8, x0 - - # check for pop from spk buf - la x9, _eos_i2s_spk_wm - lw x22, 0(x9) - beqz x22, i2s_sd_xchg - # pop from spk buf -> x8 - la x9, _eos_i2s_spk_buf + lw x9, I2S_SPK_BUF(x27) + beqz x9, i2s_sd_xchg lhu x18, I2S_ABUF_OFF_IDXR(x9) lhu x19, I2S_ABUF_OFF_IDXW(x9) lhu x20, I2S_ABUF_OFF_SIZE(x9) @@ -160,12 +180,12 @@ i2s_abuf_pop: and x18, x18, x21 # check for push to event queue - bgtu x18, x22, i2s_decode + lw x9, I2S_SPK_WM(x27) + bgtu x18, x9, i2s_decode - la x9, _eos_i2s_spk_evt_enable - lw x18, 0(x9) - beqz x18, i2s_decode - sw x0, 0(x9) + lw x9, I2S_SPK_EVT(x27) + beqz x9, i2s_decode + sw x0, I2S_SPK_EVT(x27) # push to event queue jal x22, evtq_push @@ -212,8 +232,8 @@ i2s_decode: beqz x9, 3f mul x8, x8, x9 3: - la x9, _eos_i2s_sample - sw x8, 0(x9) + beqz x25, i2s_sd_xchg + sw x8, I2S_SAMPLE(x27) i2s_sd_xchg: # read/write shift reg: x8 -> sr -> x8 @@ -318,16 +338,12 @@ i2s_encode: andi x8, x8, 0xff i2s_abuf_push: - # check parity - # bnez x25, i2s_sd_exit - - # check for push to mic buf - la x9, _eos_i2s_mic_wm - lw x22, 0(x9) - beqz x22, i2s_sd_exit + # check channel + # bnez x26, i2s_sd_exit # push to mic buf - la x9, _eos_i2s_mic_buf + lw x9, I2S_MIC_BUF(x27) + beqz x9, i2s_sd_exit lhu x18, I2S_ABUF_OFF_IDXR(x9) lhu x19, I2S_ABUF_OFF_IDXW(x9) lhu x20, I2S_ABUF_OFF_SIZE(x9) @@ -357,12 +373,12 @@ i2s_abuf_push: 2: # check for push to event queue - bltu x18, x22, i2s_sd_exit + lw x9, I2S_MIC_WM(x27) + bltu x18, x9, i2s_sd_exit - la x9, _eos_i2s_mic_evt_enable - lw x18, 0(x9) - beqz x18, i2s_sd_exit - sw x0, 0(x9) + lw x9, I2S_MIC_EVT(x27) + beqz x9, i2s_sd_exit + sw x0, I2S_MIC_EVT(x27) # push to event queue jal x22, evtq_push @@ -427,16 +443,6 @@ _eos_i2s_start_pwm: ret -.global _eos_flash_set -_eos_flash_set: - li a3, SPI0_CTRL_ADDR - sw x0, SPI_REG_FCTRL(a3) - sw a0, SPI_REG_SCKDIV(a3) - sw a1, SPI_REG_FFMT(a3) - li a0, 1 - sw a0, SPI_REG_FCTRL(a3) - ret - trap_exit_data: # Remain in M-mode after mret li x18, MSTATUS_MPP @@ -452,7 +458,9 @@ trap_exit_data: LOAD x23, 7*REGBYTES(sp) LOAD x24, 8*REGBYTES(sp) LOAD x25, 9*REGBYTES(sp) - addi sp, sp, 10*REGBYTES + LOAD x26, 10*REGBYTES(sp) + LOAD x27, 11*REGBYTES(sp) + addi sp, sp, 12*REGBYTES mret @@ -465,7 +473,7 @@ handle_intr: .align 4 trap_entry_text: - addi sp, sp, -22*REGBYTES + addi sp, sp, -20*REGBYTES STORE x1, 0*REGBYTES(sp) STORE x2, 1*REGBYTES(sp) @@ -482,12 +490,10 @@ trap_entry_text: STORE x15, 12*REGBYTES(sp) STORE x16, 13*REGBYTES(sp) STORE x17, 14*REGBYTES(sp) - STORE x26, 15*REGBYTES(sp) - STORE x27, 16*REGBYTES(sp) - STORE x28, 17*REGBYTES(sp) - STORE x29, 18*REGBYTES(sp) - STORE x30, 19*REGBYTES(sp) - STORE x31, 20*REGBYTES(sp) + STORE x28, 15*REGBYTES(sp) + STORE x29, 16*REGBYTES(sp) + STORE x30, 17*REGBYTES(sp) + STORE x31, 18*REGBYTES(sp) li x18, MCAUSE_TIMER beq x8, x18, handle_timer @@ -526,23 +532,23 @@ trap_exit_text: LOAD x15, 12*REGBYTES(sp) LOAD x16, 13*REGBYTES(sp) LOAD x17, 14*REGBYTES(sp) - LOAD x26, 15*REGBYTES(sp) - LOAD x27, 16*REGBYTES(sp) - LOAD x28, 17*REGBYTES(sp) - LOAD x29, 18*REGBYTES(sp) - LOAD x30, 19*REGBYTES(sp) - LOAD x31, 20*REGBYTES(sp) - - LOAD x8, 22*REGBYTES(sp) - LOAD x9, 23*REGBYTES(sp) - LOAD x18, 24*REGBYTES(sp) - LOAD x19, 25*REGBYTES(sp) - LOAD x20, 26*REGBYTES(sp) - LOAD x21, 27*REGBYTES(sp) - LOAD x22, 28*REGBYTES(sp) - LOAD x23, 29*REGBYTES(sp) - LOAD x24, 30*REGBYTES(sp) - LOAD x25, 31*REGBYTES(sp) + LOAD x28, 15*REGBYTES(sp) + LOAD x29, 16*REGBYTES(sp) + LOAD x30, 17*REGBYTES(sp) + LOAD x31, 18*REGBYTES(sp) + + LOAD x8, 20*REGBYTES(sp) + LOAD x9, 21*REGBYTES(sp) + LOAD x18, 22*REGBYTES(sp) + LOAD x19, 23*REGBYTES(sp) + LOAD x20, 24*REGBYTES(sp) + LOAD x21, 25*REGBYTES(sp) + LOAD x22, 26*REGBYTES(sp) + LOAD x23, 27*REGBYTES(sp) + LOAD x24, 28*REGBYTES(sp) + LOAD x25, 29*REGBYTES(sp) + LOAD x26, 30*REGBYTES(sp) + LOAD x27, 31*REGBYTES(sp) addi sp, sp, 32*REGBYTES mret diff --git a/fw/fe310/eos/wifi.c b/fw/fe310/eos/wifi.c index d7c1824..0663582 100644 --- a/fw/fe310/eos/wifi.c +++ b/fw/fe310/eos/wifi.c @@ -43,3 +43,64 @@ eos_evt_handler_t eos_wifi_get_handler(unsigned char mtype) { if (mtype < EOS_WIFI_MAX_MTYPE) return evt_handler[mtype]; return NULL; } + +int eos_wifi_scan(unsigned char *buffer) { + int async; + + async = 0; + if (buffer == NULL) { + buffer = eos_net_alloc(); + async = 1; + } + buffer[0] = EOS_WIFI_MTYPE_SCAN; + return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1); +} + +int eos_wifi_auth(const char *ssid, const char *pass, unsigned char *buffer) { + unsigned char *buf; + size_t ssid_len, pass_len; + int async; + + async = 0; + if (buffer == NULL) { + buffer = eos_net_alloc(); + async = 1; + } + ssid_len = strlen(ssid) + 1; + pass_len = strlen(pass) + 1; + if ((1 + ssid_len + pass_len) > EOS_NET_MTU) return EOS_ERR_SIZE; + + buf = buffer; + buf[0] = EOS_WIFI_MTYPE_AUTH; + buf++; + strcpy(buf, ssid); + buf += ssid_len; + strcpy(buf, pass); + buf += pass_len; + + return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1 + ssid_len + pass_len, async, 1); +} + +int eos_wifi_connect(unsigned char *buffer) { + int async; + + async = 0; + if (buffer == NULL) { + buffer = eos_net_alloc(); + async = 1; + } + buffer[0] = EOS_WIFI_MTYPE_CONNECT; + return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1); +} + +int eos_wifi_disconnect(unsigned char *buffer) { + int async; + + async = 0; + if (buffer == NULL) { + buffer = eos_net_alloc(); + async = 1; + } + buffer[0] = EOS_WIFI_MTYPE_DISCONNECT; + return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1); +} diff --git a/fw/fe310/eos/wifi.h b/fw/fe310/eos/wifi.h index 87f418f..4a49518 100644 --- a/fw/fe310/eos/wifi.h +++ b/fw/fe310/eos/wifi.h @@ -2,7 +2,7 @@ #include "event.h" #define EOS_WIFI_MTYPE_SCAN 1 -#define EOS_WIFI_MTYPE_CONFIG 2 +#define EOS_WIFI_MTYPE_AUTH 2 #define EOS_WIFI_MTYPE_CONNECT 3 #define EOS_WIFI_MTYPE_DISCONNECT 4 @@ -11,3 +11,8 @@ void eos_wifi_netinit(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_scan(unsigned char *buffer); +int eos_wifi_auth(const char *ssid, const char *pass, unsigned char *buffer); +int eos_wifi_connect(unsigned char *buffer); +int eos_wifi_disconnect(unsigned char *buffer); diff --git a/fw/fe310/test/Makefile b/fw/fe310/test/Makefile index 3b32c73..5e708ed 100644 --- a/fw/fe310/test/Makefile +++ b/fw/fe310/test/Makefile @@ -1,20 +1,24 @@ include ../common.mk -CFLAGS += -I$(bsp_dir)/include -I$(bsp_dir)/drivers -I$(ext_dir)/crypto -LDFLAGS = $(CFLAGS) -L.. -Wl,--gc-sections -nostartfiles -nostdlib -Wl,--start-group -lc -lm -lgcc -leos -Wl,--end-group -T../bsp/default.lds +CFLAGS += -I$(bsp_dir)/include -I$(bsp_dir)/drivers -I$(ext_dir)/crypto -I$(ext_dir)/fsfat -I$(ecp_dir)/src -I$(ecp_dir)/src/platform/fe310 -I.. +LDFLAGS = app/*.o $(CFLAGS) -L.. -L$(ecp_dir)/build-fe310 -Wl,--gc-sections -nostartfiles -nostdlib -Wl,--start-group -lc -lm -lgcc -leos -lecp -lecpcr -lecptr -lecptm -lecpdir -lecpvconn -Wl,--end-group -T../bsp/default.lds -DEPS = main.o status.o cell_dev.o cell_pdp.o phone.o modem.o wifi.o cam.o audio.o test.o -# DEPS = main.o status.o cell_dev.o cell_pdp.o phone.o modem.o wifi.o cam.o fs.o test.o +DEPS = main.o mem.o cell_dev.o cell_pdp.o phone.o modem.o wifi.o cam.o fs.o ecp.o ecp_init.o audio.o test.o TARGET = phone + all: $(TARGET) +app_: + (cd app && $(MAKE)) || exit; + %.o: %.c $(CC) $(CFLAGS) -c $< -$(TARGET): $(DEPS) +$(TARGET): app_ $(DEPS) $(CC) $(DEPS) $(LDFLAGS) -o $@ clean: + (cd app && $(MAKE) clean) || exit; rm -f *.o *.a $(TARGET) upload: $(TARGET) diff --git a/fw/fe310/test/app/Makefile b/fw/fe310/test/app/Makefile new file mode 100644 index 0000000..fe0ba21 --- /dev/null +++ b/fw/fe310/test/app/Makefile @@ -0,0 +1,15 @@ +include ../../common.mk + +obj = app_root.o app_status.o + + +%.o: %.c %.h + $(CC) $(CFLAGS) -c $< + +%.o: %.S + $(CC) $(CFLAGS) -c $< + +all: $(obj) + +clean: + rm -f *.o diff --git a/fw/fe310/test/app/app_root.c b/fw/fe310/test/app/app_root.c new file mode 100644 index 0000000..7dda3c7 --- /dev/null +++ b/fw/fe310/test/app/app_root.c @@ -0,0 +1,88 @@ +#include + +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include "app_status.h" +#include "app_root.h" + +#define KBD_X 0 +#define KBD_Y 575 +#define KBD_W 480 +#define KBD_H 225 + +static EVEKbd kbd; +static EVEFont font; +static EVEWindowRoot win_root; +static EVEWindowKbd win_kbd; +static EVEWindow win_status; +static EVEWindow win_main; +static EVEView view_status; +static EVEViewStack view_stack; + +EVEWindowRoot *app_root(void) { + return &win_root; +} + +void app_root_refresh(void) { + eve_spi_start(); + eve_window_root_draw(app_root()); + eve_spi_stop(); +} + +void app_root_init(eve_view_constructor_t home_page, int b) { + EVERect g; + + eve_spi_start(); + + if (b >= 0) eve_brightness(b); + + eve_font_init(&font, APP_FONT_HANDLE); + + g.x = 0; + g.y = 0; + g.w = APP_SCREEN_W; + g.h = APP_SCREEN_H; + eve_window_init_root(&win_root, &g, "root", &font); + + g.x = KBD_X; + g.y = KBD_Y; + g.w = KBD_W; + g.h = KBD_H; + eve_kbd_init(&kbd, &g, win_root.mem_next, &win_root.mem_next); + eve_window_init_kbd(&win_kbd, &g, &win_root, "kbd", &kbd); + + g.x = 0; + g.y = 0; + g.w = APP_SCREEN_W; + g.h = APP_STATUS_H; + eve_window_init(&win_status, &g, (EVEWindow *)&win_root, "status"); + eve_view_init(&view_status, &win_status, app_status_draw, app_status_touch, NULL, NULL); + + g.x = 0; + g.y = APP_STATUS_H; + g.w = APP_SCREEN_W; + g.h = APP_SCREEN_H - APP_STATUS_H; + eve_window_init(&win_main, &g, (EVEWindow *)&win_root, "main"); + + eve_view_stack_init(&view_stack); + eve_view_create(&win_main, &view_stack, home_page); + + eve_window_append(&win_status); + eve_window_append(&win_main); + + eve_window_root_draw(&win_root); + + eve_spi_stop(); + + eos_net_acquire_for_evt(EOS_EVT_UI | EVE_ETYPE_INTR, 1); +} diff --git a/fw/fe310/test/app/app_root.h b/fw/fe310/test/app/app_root.h new file mode 100644 index 0000000..b085344 --- /dev/null +++ b/fw/fe310/test/app/app_root.h @@ -0,0 +1,12 @@ +#include + +#define APP_SCREEN_W 480 +#define APP_SCREEN_H 800 +#define APP_STATUS_H 60 + +#define APP_FONT_HANDLE 31 + +EVEWindowRoot *app_root(void); +void app_root_refresh(void); + +void app_root_init(eve_view_constructor_t home_page, int b); diff --git a/fw/fe310/test/app/app_status.c b/fw/fe310/test/app/app_status.c new file mode 100644 index 0000000..cc25599 --- /dev/null +++ b/fw/fe310/test/app/app_status.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include "app_root.h" +#include "app_status.h" + +#include "../phone.h" + +static char status_msg[128]; + +int app_status_touch(EVEView *view, EVETouch *touch, uint16_t evt, uint8_t tag0) { + unsigned char state = 0; + int8_t touch_idx; + + // state = app_phone_state_get(); + touch_idx = eve_touch_get_idx(touch); + if (touch_idx != 0) return 0; + + evt = eve_touch_evt(touch, evt, tag0, view->tag, 2); + if (touch && (evt & EVE_TOUCH_ETYPE_POINT_UP)) { + if ((state == VOICE_STATE_RING) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_LEFT)) { + unsigned char *buf = eos_net_alloc(); + + buf[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_ANSWER; + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, 1, 0); + status_msg[0] = '\0'; + } + if ((state != VOICE_STATE_IDLE) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_RIGHT)) { + unsigned char *buf = eos_net_alloc(); + + buf[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_HANGUP; + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, 1, 0); + status_msg[0] = '\0'; + } + return 1; + } + return 0; +} + +uint8_t app_status_draw(EVEView *view, uint8_t tag0) { + uint8_t tag_opt = EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY; + + tag0 = eve_view_clear(view, tag0, tag_opt); + + if (tag0 != EVE_NOTAG) { + eve_touch_set_opt(tag0, eve_touch_get_opt(tag0) | tag_opt); + eve_cmd_dl(TAG(tag0)); + tag0++; + } + + eve_cmd(CMD_TEXT, "hhhhs", 0, 0, 31, 0, status_msg); + + return tag0; +} + +void app_status_msg_set(char *msg, int refresh) { + strcpy(status_msg, msg); + + if (refresh) app_root_refresh(); +} diff --git a/fw/fe310/test/app/app_status.h b/fw/fe310/test/app/app_status.h new file mode 100644 index 0000000..262d29c --- /dev/null +++ b/fw/fe310/test/app/app_status.h @@ -0,0 +1,5 @@ +#include + +int app_status_touch(EVEView *view, EVETouch *touch, uint16_t evt, uint8_t tag0); +uint8_t app_status_draw(EVEView *view, uint8_t tag0); +void app_status_msg_set(char *msg, int refresh); diff --git a/fw/fe310/test/cam.c b/fw/fe310/test/cam.c index 9338ae9..766884b 100644 --- a/fw/fe310/test/cam.c +++ b/fw/fe310/test/cam.c @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -19,9 +20,7 @@ #include -#include - -#include +#include "app/app_root.h" #include "cam.h" diff --git a/fw/fe310/test/cell_dev.c b/fw/fe310/test/cell_dev.c index 40f2736..492ba22 100644 --- a/fw/fe310/test/cell_dev.c +++ b/fw/fe310/test/cell_dev.c @@ -7,7 +7,14 @@ #include #include -#include "status.h" +#include +#include +#include +#include + +#include "app/app_root.h" +#include "app/app_status.h" + #include "cell_dev.h" static void cell_dev_handler(unsigned char type, unsigned char *buffer, uint16_t len) { diff --git a/fw/fe310/test/cell_pdp.c b/fw/fe310/test/cell_pdp.c index 9fc4a21..724cca7 100644 --- a/fw/fe310/test/cell_pdp.c +++ b/fw/fe310/test/cell_pdp.c @@ -17,9 +17,9 @@ #include -#include +#include "app/app_root.h" +#include "app/app_status.h" -#include "status.h" #include "cell_pdp.h" static void cell_pdp_connect(char *apn, char *user, char *pass) { @@ -34,17 +34,16 @@ static void cell_pdp_connect(char *apn, char *user, char *pass) { p += strlen(user) + 1; strcpy(p, pass); p += strlen(pass) + 1; - eos_net_send(EOS_NET_MTYPE_CELL, buffer, p - buffer, 1); + eos_net_send(EOS_NET_MTYPE_CELL, buffer, p - buffer); - buffer = eos_net_alloc(); buffer[0] = EOS_CELL_MTYPE_PDP | EOS_CELL_MTYPE_PDP_CONNECT; - eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, 0); + eos_net_send_async(EOS_NET_MTYPE_CELL, buffer, 1, 0); } static void cell_pdp_disconnect(void) { unsigned char *buffer = eos_net_alloc(); buffer[0] = EOS_CELL_MTYPE_PDP | EOS_CELL_MTYPE_PDP_DISCONNECT; - eos_net_send(EOS_NET_MTYPE_CELL, buffer, 1, 0); + eos_net_send_async(EOS_NET_MTYPE_CELL, buffer, 1, 0); } static void cell_pdp_handler(unsigned char type, unsigned char *buffer, uint16_t size) { diff --git a/fw/fe310/test/fs.c b/fw/fe310/test/fs.c index e8b3587..222833b 100644 --- a/fw/fe310/test/fs.c +++ b/fw/fe310/test/fs.c @@ -16,7 +16,7 @@ #include #include -#include +#include #include "fs.h" diff --git a/fw/fe310/test/main.c b/fw/fe310/test/main.c index 13c113e..d1409f7 100644 --- a/fw/fe310/test/main.c +++ b/fw/fe310/test/main.c @@ -17,23 +17,24 @@ #include -#include - #include -#include "status.h" +#include "app/app_root.h" + #include "cell_dev.h" #include "cell_pdp.h" #include "phone.h" #include "modem.h" #include "wifi.h" #include "cam.h" -// #include "fs.h" +#include "fs.h" #include "audio.h" +#include "ecp.h" #include "test.h" void app_home_page(EVEWindow *window, EVEViewStack *stack) { EVEWidgetSpec spec[] = { + /* { .widget.type = EVE_WIDGET_TYPE_PAGE, .widget.g.w = APP_SCREEN_W, @@ -64,7 +65,6 @@ void app_home_page(EVEWindow *window, EVEViewStack *stack) { .widget.spec.page.title = "Camera", .widget.spec.page.constructor = app_cam }, - /* { .widget.type = EVE_WIDGET_TYPE_PAGE, .widget.g.w = APP_SCREEN_W, @@ -80,21 +80,24 @@ void app_home_page(EVEWindow *window, EVEViewStack *stack) { }, }; - EVEForm *form = eve_form_create(window, stack, spec, 6, NULL, NULL, NULL); + EVEForm *form = eve_form_create(window, stack, spec, 1, NULL, NULL, NULL); } +void print_mem(void); + int main() { eos_init(); printf("FREQ:%lu\n", PRCI_get_cpu_freq()); printf("\nREADY.\n"); app_root_init(app_home_page, 0x20); - app_status_init(); - app_phone_init(); - app_wifi_init(); - app_cell_dev_init(); - app_cell_pdp_init(); + // app_phone_init(); + // app_wifi_init(); + // app_cell_dev_init(); + // app_cell_pdp_init(); // app_fs_init(); - audio_start(); + // audio_start(); + app_ecp_init(); + eos_evtq_loop(); } diff --git a/fw/fe310/test/modem.c b/fw/fe310/test/modem.c index b9fd1b1..89ff32a 100644 --- a/fw/fe310/test/modem.c +++ b/fw/fe310/test/modem.c @@ -19,7 +19,7 @@ #include -#include +#include "app/app_root.h" #include "modem.h" @@ -50,7 +50,7 @@ static void key_down(void *p, int c) { buf[1] = c; } - eos_net_send(EOS_NET_MTYPE_CELL, buf, i, 0); + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, i, 0); eve_text_scroll0(text); } @@ -71,7 +71,7 @@ static void handle_uart(unsigned char type) { i++; if (i == EOS_NET_MTU) break; } - eos_net_send(EOS_NET_MTYPE_CELL, buf, i, 0); + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, i, 0); eos_uart_rxwm_set(0); } @@ -139,7 +139,7 @@ void app_modem(EVEWindow *window, EVEViewStack *stack) { buf = eos_net_alloc(); buf[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_UART_TAKE; - eos_net_send(EOS_NET_MTYPE_CELL, buf, 1, 0); + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, 1, 0); eos_uart_rxwm_set(0); } @@ -152,7 +152,7 @@ void app_modem_close(EVEView *view) { EVEViewStack *stack = param->stack; buf[0] = EOS_CELL_MTYPE_DEV | EOS_CELL_MTYPE_RESET; - eos_net_send(EOS_NET_MTYPE_CELL, buf, 1, 0); + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, 1, 0); eos_uart_rxwm_clear(); eos_uart_set_handler(EOS_UART_ETYPE_RX, NULL); eos_cell_set_handler(EOS_CELL_MTYPE_DEV, param->cell_dev_handler); diff --git a/fw/fe310/test/phone.c b/fw/fe310/test/phone.c index 78531b5..0027d77 100644 --- a/fw/fe310/test/phone.c +++ b/fw/fe310/test/phone.c @@ -18,9 +18,9 @@ #include -#include +#include "app/app_root.h" +#include "app/app_status.h" -#include "status.h" #include "phone.h" #define ABUF_SIZE 128 @@ -41,8 +41,8 @@ static void handle_mic(unsigned char type) { unsigned char *buf = eos_net_alloc(); buf[0] = EOS_CELL_MTYPE_VOICE_PCM; - size = eos_i2s_mic_read(buf+1, MIC_WM); - eos_net_send(EOS_NET_MTYPE_CELL, buf, size+1, 0); + size = eos_i2s_mic_read(buf + 1, MIC_WM); + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, size + 1, 0); } static void cell_voice_handler(unsigned char type, unsigned char *buffer, uint16_t len) { @@ -62,7 +62,11 @@ static void cell_voice_handler(unsigned char type, unsigned char *buffer, uint16 case EOS_CELL_MTYPE_VOICE_BEGIN: printf("VOICE BEGIN\n"); voice_state = VOICE_STATE_CIP; - eos_i2s_start(8000, EOS_I2S_FMT_PCM16); + eos_i2s_mic_init(mic_arr, ABUF_SIZE); + eos_i2s_mic_set_wm(MIC_WM); + eos_i2s_mic_set_handler(handle_mic); + eos_i2s_spk_init(spk_arr, ABUF_SIZE); + eos_i2s_start(8000); break; case EOS_CELL_MTYPE_VOICE_END: @@ -100,7 +104,7 @@ void app_phone_action(EVEForm *form) { buf[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_DIAL; strcpy(buf + 1, w->str); - eos_net_send(EOS_NET_MTYPE_CELL, buf, 1 + strlen(w->str), 0); + eos_net_send_async(EOS_NET_MTYPE_CELL, buf, 1 + strlen(w->str), 0); voice_state = VOICE_STATE_DIAL; sprintf(msg, "DIAL:%s", w->str); @@ -109,11 +113,6 @@ void app_phone_action(EVEForm *form) { void app_phone_init(void) { eos_cell_set_handler(EOS_CELL_MTYPE_VOICE, cell_voice_handler); - - eos_i2s_mic_init(mic_arr, ABUF_SIZE); - eos_i2s_mic_set_wm(MIC_WM); - eos_i2s_mic_set_handler(handle_mic); - eos_i2s_spk_init(spk_arr, ABUF_SIZE); eos_net_acquire_for_evt(EOS_EVT_I2S | EOS_I2S_ETYPE_MIC, 1); } diff --git a/fw/fe310/test/status.c b/fw/fe310/test/status.c deleted file mode 100644 index 42d193a..0000000 --- a/fw/fe310/test/status.c +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include - -#include - -#include "phone.h" -#include "status.h" - -static char status_msg[128]; - -static int status_touch(EVEView *view, EVETouch *touch, uint16_t evt, uint8_t tag0) { - unsigned char state = app_phone_state_get(); - int8_t touch_idx = eve_touch_get_idx(touch); - - if (touch_idx != 0) return 0; - - evt = eve_touch_evt(touch, evt, tag0, view->tag, 2); - if (touch && (evt & EVE_TOUCH_ETYPE_POINT_UP)) { - if ((state == VOICE_STATE_RING) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_LEFT)) { - unsigned char *buf = eos_net_alloc(); - - buf[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_ANSWER; - eos_net_send(EOS_NET_MTYPE_CELL, buf, 1, 0); - status_msg[0] = '\0'; - } - if ((state != VOICE_STATE_IDLE) && (touch->eevt & EVE_TOUCH_EETYPE_TRACK_RIGHT)) { - unsigned char *buf = eos_net_alloc(); - - buf[0] = EOS_CELL_MTYPE_VOICE | EOS_CELL_MTYPE_VOICE_HANGUP; - eos_net_send(EOS_NET_MTYPE_CELL, buf, 1, 0); - status_msg[0] = '\0'; - } - return 1; - } - return 0; -} - -static uint8_t status_draw(EVEView *view, uint8_t tag0) { - uint8_t tag_opt = EVE_TOUCH_OPT_TRACK | EVE_TOUCH_OPT_TRACK_XY; - - tag0 = eve_view_clear(view, tag0, tag_opt); - - if (tag0 != EVE_NOTAG) { - eve_touch_set_opt(tag0, eve_touch_get_opt(tag0) | tag_opt); - eve_cmd_dl(TAG(tag0)); - tag0++; - } - - eve_cmd(CMD_TEXT, "hhhhs", 0, 0, 31, 0, status_msg); - - return tag0; -} - -void app_status_msg_set(char *msg, int refresh) { - strcpy(status_msg, msg); - - if (refresh) app_root_refresh(); -} - -void app_status_init(void) { - EVEWindowRoot *root = app_root(); - EVEWindow *status = eve_window_search(&root->w, "status"); - status->view->touch = status_touch; - status->view->draw = status_draw; -} diff --git a/fw/fe310/test/status.h b/fw/fe310/test/status.h deleted file mode 100644 index c891b7d..0000000 --- a/fw/fe310/test/status.h +++ /dev/null @@ -1,2 +0,0 @@ -void app_status_msg_set(char *msg, int refresh); -void app_status_init(void); diff --git a/fw/fe310/test/test.c b/fw/fe310/test/test.c index 9cf7605..fddbbc1 100644 --- a/fw/fe310/test/test.c +++ b/fw/fe310/test/test.c @@ -4,6 +4,7 @@ #include #include + #include #include #include @@ -16,14 +17,10 @@ #include -#include - -#include +#include "app/app_root.h" #include "test.h" -#include - static int reg_read(uint8_t reg, uint8_t *data) { return eos_i2c_read8(BQ25895_ADDR, reg, data, 1); } diff --git a/fw/fe310/test/wifi.c b/fw/fe310/test/wifi.c index 814d808..e7522e3 100644 --- a/fw/fe310/test/wifi.c +++ b/fw/fe310/test/wifi.c @@ -17,41 +17,12 @@ #include -#include +#include "app/app_root.h" +#include "app/app_status.h" -#include "status.h" #include "wifi.h" -static void wifi_scan(void) { - unsigned char *buffer = eos_net_alloc(); - buffer[0] = EOS_WIFI_MTYPE_SCAN; - eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, 0); -} - -static void wifi_connect(const char *ssid, const char *pass) { - unsigned char *buffer, *p; - - buffer = eos_net_alloc(); - buffer[0] = EOS_WIFI_MTYPE_CONFIG; - p = buffer + 1; - strcpy(p, ssid); - p += strlen(ssid) + 1; - strcpy(p, pass); - p += strlen(pass) + 1; - eos_net_send(EOS_NET_MTYPE_WIFI, buffer, p - buffer, 1); - - buffer = eos_net_alloc(); - buffer[0] = EOS_WIFI_MTYPE_CONNECT; - eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, 0); -} - -static void wifi_disconnect(void) { - unsigned char *buffer = eos_net_alloc(); - buffer[0] = EOS_WIFI_MTYPE_DISCONNECT; - eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, 0); -} - -void wifi_scan_handler(unsigned char type, unsigned char *buffer, uint16_t size) { +static void wifi_scan_handler(unsigned char type, unsigned char *buffer, uint16_t size) { EVEWindowRoot *root = app_root(); EVEWindow *window = eve_window_search(&root->w, "main"); EVEForm *form = (EVEForm *)window->view; @@ -97,7 +68,7 @@ void app_wifi(EVEWindow *window, EVEViewStack *stack) { }; EVEForm *form = eve_form_create(window, stack, spec, 3, NULL, app_wifi_action, app_wifi_close); - wifi_scan(); + eos_wifi_scan(NULL); } void app_wifi_action(EVEForm *form) { @@ -105,7 +76,10 @@ void app_wifi_action(EVEForm *form) { EVEStrWidget *str = (EVEStrWidget *)eve_page_widget(&form->p, 2); char *ssid = eve_selectw_option_get_select(sel); - if (ssid) wifi_connect(ssid, str->str); + if (ssid) { + eos_wifi_auth(ssid, str->str, NULL); + eos_wifi_connect(NULL); + } } void app_wifi_close(EVEForm *form) { -- cgit v1.2.3