From 6666a131ab36b1d96a854da80524d860f9a3884b Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Wed, 19 Feb 2020 06:47:43 +0100 Subject: eve long press/double tap/inertial scroll spi flush bugfix resolved dependecies: spi -> net; event -> net renamed various handlers --- code/fe310/eos/spi.c | 231 ++++++++++++++++++++------------------------------- 1 file changed, 89 insertions(+), 142 deletions(-) (limited to 'code/fe310/eos/spi.c') diff --git a/code/fe310/eos/spi.c b/code/fe310/eos/spi.c index ae12f40..725db13 100644 --- a/code/fe310/eos/spi.c +++ b/code/fe310/eos/spi.c @@ -23,14 +23,14 @@ static uint8_t spi_dev_cs_pin; static uint8_t spi_state_flags; static unsigned char spi_in_xchg; -uint32_t _eos_spi_state_len = 0; -uint32_t _eos_spi_state_idx_tx = 0; -uint32_t _eos_spi_state_idx_rx = 0; -unsigned char *_eos_spi_state_buf = NULL; +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 eos_evt_fptr_t evt_handler[EOS_SPI_MAX_DEV]; +static eos_evt_handler_t evt_handler[EOS_SPI_MAX_DEV]; -static void spi_handler_evt(unsigned char type, unsigned char *buffer, uint16_t len) { +static void spi_handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) { unsigned char idx = (type & ~EOS_EVT_MASK) - 1; if (idx < EOS_SPI_MAX_DEV) { evt_handler[idx](type, buffer, len); @@ -39,39 +39,15 @@ static void spi_handler_evt(unsigned char type, unsigned char *buffer, uint16_t } } -static void spi_flush(void) { - SPI1_REG(SPI_REG_TXCTRL) = SPI_TXWM(1); - while (!(SPI1_REG(SPI_REG_IP) & SPI_IP_TXWM)); - while (!(SPI1_REG(SPI_REG_RXFIFO) & SPI_RXFIFO_EMPTY)); -} - -static void spi_xchg_wait(void) { - volatile uint8_t done = 0; - - while (!done) { - clear_csr(mstatus, MSTATUS_MIE); - done = !(spi_state_flags & SPI_FLAG_XCHG); - if (!done) asm volatile ("wfi"); - set_csr(mstatus, MSTATUS_MIE); - } - spi_in_xchg = 0; -} - void eos_spi_init(void) { int i; for (i=0; i> 8; } else { - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0xFF00) >> 8; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x00FF); } @@ -267,8 +217,6 @@ uint16_t eos_spi_xchg16(uint16_t data, uint8_t flags) { } } - if ((flags & EOS_SPI_FLAG_AUTOCS) && !(flags & EOS_SPI_FLAG_MORE)) eos_spi_cs_clear(); - return r; } @@ -277,26 +225,22 @@ uint32_t eos_spi_xchg24(uint32_t data, uint8_t flags) { uint8_t rx = !(flags & EOS_SPI_FLAG_TX); uint32_t r = 0; - if (spi_in_xchg) spi_xchg_wait(); - if (rx && (spi_state_flags & EOS_SPI_FLAG_TX)) spi_flush(); - spi_state_flags &= 0xF0; spi_state_flags |= flags; - if ((flags & EOS_SPI_FLAG_AUTOCS) && (spi_state_flags & SPI_FLAG_CS)) eos_spi_cs_set(); if (flags & EOS_SPI_FLAG_BSWAP) { - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x000000FF); - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x0000FF00) >> 8; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x00FF0000) >> 16; } else { - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x00FF0000) >> 16; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x0000FF00) >> 8; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x000000FF); } @@ -318,8 +262,6 @@ uint32_t eos_spi_xchg24(uint32_t data, uint8_t flags) { } } - if ((flags & EOS_SPI_FLAG_AUTOCS) && !(flags & EOS_SPI_FLAG_MORE)) eos_spi_cs_clear(); - return r; } @@ -328,30 +270,26 @@ uint32_t eos_spi_xchg32(uint32_t data, uint8_t flags) { uint8_t rx = !(flags & EOS_SPI_FLAG_TX); uint32_t r = 0; - if (spi_in_xchg) spi_xchg_wait(); - if (rx && (spi_state_flags & EOS_SPI_FLAG_TX)) spi_flush(); - spi_state_flags &= 0xF0; spi_state_flags |= flags; - if ((flags & EOS_SPI_FLAG_AUTOCS) && (spi_state_flags & SPI_FLAG_CS)) eos_spi_cs_set(); if (flags & EOS_SPI_FLAG_BSWAP) { - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x000000FF); - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x0000FF00) >> 8; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x00FF0000) >> 16; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0xFF000000) >> 24; } else { - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0xFF000000) >> 24; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x00FF0000) >> 16; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x0000FF00) >> 8; - while (SPI1_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + while ((x = SPI1_REG(SPI_REG_TXFIFO)) & SPI_TXFIFO_FULL); SPI1_REG(SPI_REG_TXFIFO) = (data & 0x000000FF); } @@ -377,7 +315,16 @@ uint32_t eos_spi_xchg32(uint32_t data, uint8_t flags) { } } - if ((flags & EOS_SPI_FLAG_AUTOCS) && !(flags & EOS_SPI_FLAG_MORE)) eos_spi_cs_clear(); - return r; } + +void eos_spi_flush(void) { + volatile uint32_t x = 0; + + if (spi_in_xchg) spi_xchg_wait(); + + SPI1_REG(SPI_REG_TXCTRL) = SPI_TXWM(1); + while (!x) { + if (SPI1_REG(SPI_REG_IP) & SPI_IP_TXWM) x = SPI1_REG(SPI_REG_RXFIFO) & SPI_RXFIFO_EMPTY; + } +} -- cgit v1.2.3