diff options
Diffstat (limited to 'fw/fe310/eos/soc/spi.c')
| -rw-r--r-- | fw/fe310/eos/soc/spi.c | 32 |
1 files changed, 18 insertions, 14 deletions
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 { |
