summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/soc/spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/soc/spi.c')
-rw-r--r--fw/fe310/eos/soc/spi.c32
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 {