diff options
| -rw-r--r-- | code/fe310/eos/net.c | 29 | ||||
| -rw-r--r-- | code/fe310/eos/net_def.h | 1 | ||||
| -rw-r--r-- | code/fe310/eos/spi.c | 21 | ||||
| -rw-r--r-- | code/fe310/eos/spi.h | 1 | 
4 files changed, 29 insertions, 23 deletions
| diff --git a/code/fe310/eos/net.c b/code/fe310/eos/net.c index b6f5722..1b9e34a 100644 --- a/code/fe310/eos/net.c +++ b/code/fe310/eos/net.c @@ -72,7 +72,7 @@ static unsigned char *net_bufq_pop(void) {  static void net_xchg_reset(void) {      net_state_flags &= ~NET_STATE_FLAG_CTS; -    net_state_flags |= NET_STATE_FLAG_RST; +    net_state_flags |= (NET_STATE_FLAG_RST | NET_STATE_FLAG_XCHG);      // before starting a transaction, set SPI peripheral to desired mode      SPI1_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; @@ -85,7 +85,7 @@ static void net_xchg_reset(void) {  static void net_xchg_start(unsigned char type, unsigned char *buffer, uint16_t len) {      net_state_flags &= ~NET_STATE_FLAG_CTS; -    net_state_flags |= NET_STATE_FLAG_INIT; +    net_state_flags |= (NET_STATE_FLAG_INIT | NET_STATE_FLAG_XCHG);      if (net_state_next_cnt && (net_state_next_buf == NULL)) type |= NET_MTYPE_FLAG_ONEW;      if (type & NET_MTYPE_FLAG_ONEW) net_state_flags |= NET_STATE_FLAG_ONEW; @@ -183,6 +183,7 @@ void eos_net_xchg_done(void) {      } else {          net_bufq_push(_eos_spi_state_buf);      } +    net_state_flags &= ~NET_STATE_FLAG_XCHG;  }  static void net_handler_cts(void) { @@ -244,6 +245,13 @@ void eos_net_set_handler(unsigned char mtype, eos_evt_fptr_t handler, uint8_t fl  void eos_net_init(void) {      int i; +    net_bufq_init(); +    eos_msgq_init(&net_send_q, net_sndq_array, NET_SIZE_BUFQ); +    for (i=0; i<EOS_NET_MAX_MTYPE; i++) { +        evt_handler[i] = eos_evtq_bad_handler; +    } +    eos_evtq_set_handler(EOS_EVT_NET, net_handler_evt); +      GPIO_REG(GPIO_OUTPUT_EN) &= ~(1 << NET_PIN_CTS);      GPIO_REG(GPIO_PULLUP_EN) |=  (1 << NET_PIN_CTS);      GPIO_REG(GPIO_INPUT_EN)  |=  (1 << NET_PIN_CTS); @@ -256,13 +264,6 @@ void eos_net_init(void) {      GPIO_REG(GPIO_RISE_IE)   |=  (1 << NET_PIN_RTS);      GPIO_REG(GPIO_FALL_IE)   |=  (1 << NET_PIN_RTS);      eos_intr_set(INT_GPIO_BASE + NET_PIN_RTS, IRQ_PRIORITY_NET_RTS, net_handler_rts); - -    net_bufq_init(); -    eos_msgq_init(&net_send_q, net_sndq_array, NET_SIZE_BUFQ); -    for (i=0; i<EOS_NET_MAX_MTYPE; i++) { -        evt_handler[i] = eos_evtq_bad_handler; -    } -    eos_evtq_set_handler(EOS_EVT_NET, net_handler_evt);  }  void eos_net_start(void) { @@ -271,16 +272,20 @@ void eos_net_start(void) {      SPI1_REG(SPI_REG_CSID) = SPI_CS_IDX_NET;      net_state_flags |= NET_STATE_FLAG_RUN; -    if (net_state_flags & NET_STATE_FLAG_CTS) net_xchg_next(NULL); +    if (net_state_flags & NET_STATE_FLAG_CTS) { +        clear_csr(mstatus, MSTATUS_MIE); +        net_xchg_next(NULL); +        set_csr(mstatus, MSTATUS_MIE); +    }  }  void eos_net_stop(void) { -    volatile uint8_t done = 0; +    uint8_t done = 0;      while (!done) {          clear_csr(mstatus, MSTATUS_MIE);          net_state_flags &= ~NET_STATE_FLAG_RUN; -        done = net_state_flags & NET_STATE_FLAG_CTS; +        done = !(net_state_flags & NET_STATE_FLAG_XCHG);          if (!done) asm volatile ("wfi");          set_csr(mstatus, MSTATUS_MIE);      } diff --git a/code/fe310/eos/net_def.h b/code/fe310/eos/net_def.h index 473714c..e38216d 100644 --- a/code/fe310/eos/net_def.h +++ b/code/fe310/eos/net_def.h @@ -10,6 +10,7 @@  #define NET_STATE_FLAG_CTS      0x08  #define NET_STATE_FLAG_INIT     0x10  #define NET_STATE_FLAG_ONEW     0x20 +#define NET_STATE_FLAG_XCHG     0x40  #define NET_MTYPE_FLAG_ONEW     0x10 diff --git a/code/fe310/eos/spi.c b/code/fe310/eos/spi.c index 034ae99..2928e82 100644 --- a/code/fe310/eos/spi.c +++ b/code/fe310/eos/spi.c @@ -136,6 +136,11 @@ static void spi_xchg_done(void) {      spi_state_flags &= ~SPI_FLAG_XCHG;      if (!(spi_state_flags & (EOS_SPI_FLAG_MORE | SPI_FLAG_CS))) eos_spi_cs_clear();      SPI1_REG(SPI_REG_IE) = 0x0; +    if (spi_dev == EOS_SPI_DEV_NET) { +        eos_net_xchg_done(); +    } else { +        eos_msgq_push(&_eos_event_q, EOS_EVT_SPI | spi_dev, _eos_spi_state_buf, _eos_spi_state_len); +    }  }  void eos_spi_xchg_handler(void) { @@ -156,19 +161,13 @@ void eos_spi_xchg_handler(void) {      }      _eos_spi_state_idx_rx += i; -    if ((spi_state_flags & EOS_SPI_FLAG_TX) && _eos_spi_state_idx_tx == _eos_spi_state_len) { -        spi_state_flags &= ~EOS_SPI_FLAG_TX; -        spi_xchg_done(); -    } else if (_eos_spi_state_idx_rx == _eos_spi_state_len) { -        spi_xchg_done(); -        if (spi_dev == EOS_SPI_DEV_NET) { -            eos_net_xchg_done(); +    if (_eos_spi_state_idx_tx == _eos_spi_state_len) { +        if ((_eos_spi_state_idx_rx == _eos_spi_state_len) || (spi_state_flags & EOS_SPI_FLAG_TX)) { +            spi_xchg_done();          } else { -            eos_msgq_push(&_eos_event_q, EOS_EVT_SPI | spi_dev, _eos_spi_state_buf, _eos_spi_state_len); +            SPI1_REG(SPI_REG_RXCTRL) = SPI_RXWM(MIN(_eos_spi_state_len - _eos_spi_state_idx_rx - 1, SPI_SIZE_WM - 1)); +            SPI1_REG(SPI_REG_IE) = SPI_IP_RXWM;          } -    } else if (_eos_spi_state_idx_tx == _eos_spi_state_len) { -        SPI1_REG(SPI_REG_RXCTRL) = SPI_RXWM(MIN(_eos_spi_state_len - _eos_spi_state_idx_rx - 1, SPI_SIZE_WM - 1)); -        SPI1_REG(SPI_REG_IE) = SPI_IP_RXWM;      }  } diff --git a/code/fe310/eos/spi.h b/code/fe310/eos/spi.h index 2327413..24d7996 100644 --- a/code/fe310/eos/spi.h +++ b/code/fe310/eos/spi.h @@ -1,4 +1,5 @@  #include <stdint.h> +#include "event.h"  #define EOS_SPI_DEV_NET     0  #define EOS_SPI_DEV_DISP    1 | 
