From edec491d59697a635ddce7a19a870dd3e8d2f3ed Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Tue, 15 Oct 2019 18:11:40 +0200 Subject: event handler flags per evt subtype timer has evt subtypes i2s refactor i2s has spk event i2s fixed intr handler audio buf push msgq fixed get message --- code/fe310/eos/i2s.c | 61 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 25 deletions(-) (limited to 'code/fe310/eos/i2s.c') diff --git a/code/fe310/eos/i2s.c b/code/fe310/eos/i2s.c index cb25493..d171a45 100644 --- a/code/fe310/eos/i2s.c +++ b/code/fe310/eos/i2s.c @@ -22,9 +22,13 @@ EOSABuf _eos_i2s_spk_buf; uint32_t _eos_i2s_ck_period = 0; uint32_t _eos_i2s_mic_volume = 0; uint32_t _eos_i2s_spk_volume = 0; -static eos_evt_fptr_t evt_handler[I2S_MAX_HANDLER]; -uint32_t _eos_i2s_evt_enable[I2S_MAX_HANDLER]; -uint32_t _eos_i2s_wm[I2S_MAX_HANDLER]; +uint32_t _eos_i2s_mic_wm; +uint32_t _eos_i2s_spk_wm; +uint32_t _eos_i2s_mic_evt_enable; +uint32_t _eos_i2s_spk_evt_enable; + +static eos_evt_fptr_t spk_evt_handler; +static eos_evt_fptr_t mic_evt_handler; static void _abuf_init(EOSABuf *buf, uint8_t *array, uint16_t size) { buf->idx_r = 0; @@ -77,14 +81,23 @@ static uint16_t _abuf_len(EOSABuf *buf) { return buf->idx_w - buf->idx_r; } -static void audio_handler(unsigned char type, unsigned char *buffer, uint16_t len) { - type = type & ~EOS_EVT_MASK; - - if (type < I2S_MAX_HANDLER) { - evt_handler[type](type, buffer, len); - _eos_i2s_evt_enable[type] = 1; - } else { - eos_evtq_bad_handler(type, buffer, len); +static void i2s_handler_evt(unsigned char type, unsigned char *buffer, uint16_t len) { + switch(type & ~EOS_EVT_MASK) { + case I2S_ETYPE_MIC: + mic_evt_handler(type, buffer, len); + clear_csr(mstatus, MSTATUS_MIE); + _eos_i2s_mic_evt_enable = 1; + set_csr(mstatus, MSTATUS_MIE); + break; + case I2S_ETYPE_SPK: + spk_evt_handler(type, buffer, len); + clear_csr(mstatus, MSTATUS_MIE); + _eos_i2s_spk_evt_enable = 1; + set_csr(mstatus, MSTATUS_MIE); + break; + default: + eos_evtq_bad_handler(type, buffer, len); + break; } } @@ -144,24 +157,22 @@ void eos_i2s_init(uint32_t sample_rate) { I2S_PWM_REG_WS_SPK(PWM_CMP1) = (_eos_i2s_ck_period + 1) * 32; I2S_PWM_REG_WS_SPK(PWM_CMP2) = (_eos_i2s_ck_period + 1) * 33; - _eos_i2s_evt_enable[I2S_EVT_MIC] = 0; - _eos_i2s_evt_enable[I2S_EVT_SPK] = 0; - evt_handler[I2S_EVT_MIC] = NULL; - evt_handler[I2S_EVT_SPK] = NULL; + _eos_i2s_mic_evt_enable = 0; + _eos_i2s_spk_evt_enable = 0; + mic_evt_handler = eos_evtq_bad_handler; + spk_evt_handler = eos_evtq_bad_handler; eos_intr_set(I2S_IRQ_WS_ID, 0, NULL); eos_intr_set(I2S_IRQ_SD_ID, 0, NULL); - for (i=0; i