From b8015c9579d88bb7c5f0637c1bac836ec71bda1d Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Thu, 13 Feb 2025 20:53:49 +0100 Subject: moved flash driver back to dev --- fw/fe310/eos/dev/drv/flash.c | 162 ------------------------------------------- fw/fe310/eos/dev/drv/flash.h | 25 ------- fw/fe310/eos/dev/flash.c | 162 +++++++++++++++++++++++++++++++++++++++++++ fw/fe310/eos/dev/flash.h | 25 +++++++ 4 files changed, 187 insertions(+), 187 deletions(-) delete mode 100644 fw/fe310/eos/dev/drv/flash.c delete mode 100644 fw/fe310/eos/dev/drv/flash.h create mode 100644 fw/fe310/eos/dev/flash.c create mode 100644 fw/fe310/eos/dev/flash.h diff --git a/fw/fe310/eos/dev/drv/flash.c b/fw/fe310/eos/dev/drv/flash.c deleted file mode 100644 index 4f017b3..0000000 --- a/fw/fe310/eos/dev/drv/flash.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include - -#include "encoding.h" -#include "platform.h" - -#include "eos.h" -#include "soc/timer.h" - -#include "flash.h" - -#define IDLE_TICKS 10 - -__attribute__ ((section (".itim.flash"))) -static void send(uint8_t data) { - while (SPI0_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); - SPI0_REG(SPI_REG_TXFIFO) = data; -} - -__attribute__ ((section (".itim.flash"))) -static uint8_t xfer(uint8_t data) { - volatile uint32_t x = 0; - - send(data); - while ((x = SPI0_REG(SPI_REG_RXFIFO)) & SPI_RXFIFO_EMPTY); - return x; -} - -void eos_flash_init(void) { - SPI0_REG(SPI_REG_FMT) |= SPI_FMT_DIR(SPI_DIR_TX); - SPI0_REG(SPI_REG_TXCTRL) = SPI_TXWM(1); - eos_flash_norm(); -} - -__attribute__ ((section (".itim.flash"))) -void eos_flash_norm(void) { - volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); - uint32_t mtime0; - - clear_csr(mstatus, MSTATUS_MIE); - SPI0_REG(SPI_REG_FCTRL) = 0; - - SPI0_REG(SPI_REG_SCKDIV) = 3; - if (SPI0_REG(SPI_REG_FMT) & SPI_FMT_PROTO(SPI_PROTO_Q)) { - send(EOS_FLASH_QPIDI); - while (!(SPI0_REG(SPI_REG_IP) & SPI_IP_TXWM)); - } - - SPI0_REG(SPI_REG_FMT) = \ - SPI_FMT_PROTO(SPI_PROTO_S) | - SPI_FMT_ENDIAN(SPI_ENDIAN_MSB) | - SPI_FMT_DIR(SPI_DIR_TX) | - SPI_FMT_LEN(8); - - SPI0_REG(SPI_REG_FFMT) = - SPI_INSN_CMD_EN | - SPI_INSN_ADDR_LEN(3) | - SPI_INSN_PAD_CNT(0) | - SPI_INSN_CMD_PROTO(SPI_PROTO_S) | - SPI_INSN_ADDR_PROTO(SPI_PROTO_S) | - SPI_INSN_DATA_PROTO(SPI_PROTO_S) | - SPI_INSN_CMD_CODE(EOS_FLASH_NORD) | - SPI_INSN_PAD_CODE(0x00); - - mtime0 = *mtime; - while ((*mtime - mtime0) < IDLE_TICKS); - - SPI0_REG(SPI_REG_FCTRL) = SPI_FCTRL_EN; - set_csr(mstatus, MSTATUS_MIE); -} - -__attribute__ ((section (".itim.flash"))) -void eos_flash_fast(void) { - volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); - uint32_t mtime0; - - clear_csr(mstatus, MSTATUS_MIE); - SPI0_REG(SPI_REG_FCTRL) = 0; - - SPI0_REG(SPI_REG_SCKDIV) = 2; - if (!(SPI0_REG(SPI_REG_FMT) & SPI_FMT_PROTO(SPI_PROTO_Q))) { - send(EOS_FLASH_QPIEN); - while (!(SPI0_REG(SPI_REG_IP) & SPI_IP_TXWM)); - } - - SPI0_REG(SPI_REG_FMT) = \ - SPI_FMT_PROTO(SPI_PROTO_Q) | - SPI_FMT_ENDIAN(SPI_ENDIAN_MSB) | - SPI_FMT_DIR(SPI_DIR_TX) | - SPI_FMT_LEN(8); - - SPI0_REG(SPI_REG_FFMT) = - SPI_INSN_CMD_EN | - SPI_INSN_ADDR_LEN(3) | - SPI_INSN_PAD_CNT(6) | - SPI_INSN_CMD_PROTO(SPI_PROTO_Q) | - SPI_INSN_ADDR_PROTO(SPI_PROTO_Q) | - SPI_INSN_DATA_PROTO(SPI_PROTO_Q) | - SPI_INSN_CMD_CODE(EOS_FLASH_FRD) | - SPI_INSN_PAD_CODE(0x00); - - mtime0 = *mtime; - while ((*mtime - mtime0) < IDLE_TICKS); - - SPI0_REG(SPI_REG_FCTRL) = SPI_FCTRL_EN; - set_csr(mstatus, MSTATUS_MIE); -} - -__attribute__ ((section (".itim.flash"))) -void eos_flash_wip(void) { - uint8_t status; - - do { - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; - xfer(EOS_FLASH_RDSR); - status = xfer(0); - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; - } while (status & EOS_FLASH_WIP); -} - -__attribute__ ((section (".itim.flash"))) -void eos_flash_wren(void) { - uint8_t status; - - xfer(EOS_FLASH_WREN); -#if 0 - do { - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; - xfer(EOS_FLASH_RDSR); - status = xfer(0); - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; - } while (!(status & EOS_FLASH_WEL)); -#endif -} - -__attribute__ ((section (".itim.flash"))) -void eos_flash_ser(uint32_t addr) { - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; - xfer(EOS_FLASH_SER); - xfer(addr >> 16); - xfer(addr >> 8); - xfer(addr); - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; -} - -__attribute__ ((section (".itim.flash"))) -void eos_flash_pp(uint32_t addr, uint8_t *buf) { - int i; - - SPI0_REG(SPI_REG_FMT) |= SPI_FMT_DIR(SPI_DIR_TX); - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; - send(EOS_FLASH_PP); - send(addr >> 16); - send(addr >> 8); - send(addr); - for (i=0; i<256; i++) { - send(buf[i]); - } - while (!(SPI0_REG(SPI_REG_IP) & SPI_IP_TXWM)); - SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; - SPI0_REG(SPI_REG_FMT) &= ~SPI_FMT_DIR(SPI_DIR_TX); -} diff --git a/fw/fe310/eos/dev/drv/flash.h b/fw/fe310/eos/dev/drv/flash.h deleted file mode 100644 index 6f792cb..0000000 --- a/fw/fe310/eos/dev/drv/flash.h +++ /dev/null @@ -1,25 +0,0 @@ -#include - -#define EOS_FLASH_RDSR 0x05 - -#define EOS_FLASH_NORD 0x03 -#define EOS_FLASH_FRD 0x0b - -#define EOS_FLASH_WREN 0x06 -#define EOS_FLASH_SER 0x20 -#define EOS_FLASH_PP 0x02 - -#define EOS_FLASH_QPIEN 0x35 -#define EOS_FLASH_QPIDI 0xF5 - -#define EOS_FLASH_WIP 0x01 -#define EOS_FLASH_WEL 0x02 - -void eos_flash_init(void); -void eos_flash_norm(void); -void eos_flash_fast(void); - -void eos_flash_wip(void); -void eos_flash_wren(void); -void eos_flash_ser(uint32_t addr); -void eos_flash_pp(uint32_t addr, uint8_t *buf); \ No newline at end of file diff --git a/fw/fe310/eos/dev/flash.c b/fw/fe310/eos/dev/flash.c new file mode 100644 index 0000000..c8f4c98 --- /dev/null +++ b/fw/fe310/eos/dev/flash.c @@ -0,0 +1,162 @@ +#include +#include + +#include "encoding.h" +#include "platform.h" + +#include "eos.h" +#include "soc/timer.h" + +#include "flash.h" + +#define IDLE_TICKS 10 + +__attribute__ ((section (".itim.flash"))) +static void send(uint8_t data) { + while (SPI0_REG(SPI_REG_TXFIFO) & SPI_TXFIFO_FULL); + SPI0_REG(SPI_REG_TXFIFO) = data; +} + +__attribute__ ((section (".itim.flash"))) +static uint8_t xfer(uint8_t data) { + volatile uint32_t x = 0; + + send(data); + while ((x = SPI0_REG(SPI_REG_RXFIFO)) & SPI_RXFIFO_EMPTY); + return x; +} + +void eos_flash_init(void) { + SPI0_REG(SPI_REG_FMT) |= SPI_FMT_DIR(SPI_DIR_TX); + SPI0_REG(SPI_REG_TXCTRL) = SPI_TXWM(1); + eos_flash_norm(); +} + +__attribute__ ((section (".itim.flash"))) +void eos_flash_norm(void) { + volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); + uint32_t mtime0; + + clear_csr(mstatus, MSTATUS_MIE); + SPI0_REG(SPI_REG_FCTRL) = 0; + + SPI0_REG(SPI_REG_SCKDIV) = 3; + if (SPI0_REG(SPI_REG_FMT) & SPI_FMT_PROTO(SPI_PROTO_Q)) { + send(EOS_FLASH_QPIDI); + while (!(SPI0_REG(SPI_REG_IP) & SPI_IP_TXWM)); + } + + SPI0_REG(SPI_REG_FMT) = \ + SPI_FMT_PROTO(SPI_PROTO_S) | + SPI_FMT_ENDIAN(SPI_ENDIAN_MSB) | + SPI_FMT_DIR(SPI_DIR_TX) | + SPI_FMT_LEN(8); + + SPI0_REG(SPI_REG_FFMT) = + SPI_INSN_CMD_EN | + SPI_INSN_ADDR_LEN(3) | + SPI_INSN_PAD_CNT(0) | + SPI_INSN_CMD_PROTO(SPI_PROTO_S) | + SPI_INSN_ADDR_PROTO(SPI_PROTO_S) | + SPI_INSN_DATA_PROTO(SPI_PROTO_S) | + SPI_INSN_CMD_CODE(EOS_FLASH_NORD) | + SPI_INSN_PAD_CODE(0x00); + + mtime0 = *mtime; + while ((*mtime - mtime0) < IDLE_TICKS); + + SPI0_REG(SPI_REG_FCTRL) = SPI_FCTRL_EN; + set_csr(mstatus, MSTATUS_MIE); +} + +__attribute__ ((section (".itim.flash"))) +void eos_flash_fast(void) { + volatile uint64_t *mtime = (uint64_t *) (CLINT_CTRL_ADDR + CLINT_MTIME); + uint32_t mtime0; + + clear_csr(mstatus, MSTATUS_MIE); + SPI0_REG(SPI_REG_FCTRL) = 0; + + SPI0_REG(SPI_REG_SCKDIV) = 2; + if (!(SPI0_REG(SPI_REG_FMT) & SPI_FMT_PROTO(SPI_PROTO_Q))) { + send(EOS_FLASH_QPIEN); + while (!(SPI0_REG(SPI_REG_IP) & SPI_IP_TXWM)); + } + + SPI0_REG(SPI_REG_FMT) = \ + SPI_FMT_PROTO(SPI_PROTO_Q) | + SPI_FMT_ENDIAN(SPI_ENDIAN_MSB) | + SPI_FMT_DIR(SPI_DIR_TX) | + SPI_FMT_LEN(8); + + SPI0_REG(SPI_REG_FFMT) = + SPI_INSN_CMD_EN | + SPI_INSN_ADDR_LEN(3) | + SPI_INSN_PAD_CNT(6) | + SPI_INSN_CMD_PROTO(SPI_PROTO_Q) | + SPI_INSN_ADDR_PROTO(SPI_PROTO_Q) | + SPI_INSN_DATA_PROTO(SPI_PROTO_Q) | + SPI_INSN_CMD_CODE(EOS_FLASH_FRD) | + SPI_INSN_PAD_CODE(0x00); + + mtime0 = *mtime; + while ((*mtime - mtime0) < IDLE_TICKS); + + SPI0_REG(SPI_REG_FCTRL) = SPI_FCTRL_EN; + set_csr(mstatus, MSTATUS_MIE); +} + +__attribute__ ((section (".itim.flash"))) +void eos_flash_wip(void) { + uint8_t status; + + do { + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; + xfer(EOS_FLASH_RDSR); + status = xfer(0); + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; + } while (status & EOS_FLASH_WIP); +} + +__attribute__ ((section (".itim.flash"))) +void eos_flash_wren(void) { + uint8_t status; + + xfer(EOS_FLASH_WREN); +#if 0 + do { + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; + xfer(EOS_FLASH_RDSR); + status = xfer(0); + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; + } while (!(status & EOS_FLASH_WEL)); +#endif +} + +__attribute__ ((section (".itim.flash"))) +void eos_flash_ser(uint32_t addr) { + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; + xfer(EOS_FLASH_SER); + xfer(addr >> 16); + xfer(addr >> 8); + xfer(addr); + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; +} + +__attribute__ ((section (".itim.flash"))) +void eos_flash_pp(uint32_t addr, uint8_t *buf) { + int i; + + SPI0_REG(SPI_REG_FMT) |= SPI_FMT_DIR(SPI_DIR_TX); + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_HOLD; + send(EOS_FLASH_PP); + send(addr >> 16); + send(addr >> 8); + send(addr); + for (i=0; i<256; i++) { + send(buf[i]); + } + while (!(SPI0_REG(SPI_REG_IP) & SPI_IP_TXWM)); + SPI0_REG(SPI_REG_CSMODE) = SPI_CSMODE_AUTO; + SPI0_REG(SPI_REG_FMT) &= ~SPI_FMT_DIR(SPI_DIR_TX); +} diff --git a/fw/fe310/eos/dev/flash.h b/fw/fe310/eos/dev/flash.h new file mode 100644 index 0000000..6f792cb --- /dev/null +++ b/fw/fe310/eos/dev/flash.h @@ -0,0 +1,25 @@ +#include + +#define EOS_FLASH_RDSR 0x05 + +#define EOS_FLASH_NORD 0x03 +#define EOS_FLASH_FRD 0x0b + +#define EOS_FLASH_WREN 0x06 +#define EOS_FLASH_SER 0x20 +#define EOS_FLASH_PP 0x02 + +#define EOS_FLASH_QPIEN 0x35 +#define EOS_FLASH_QPIDI 0xF5 + +#define EOS_FLASH_WIP 0x01 +#define EOS_FLASH_WEL 0x02 + +void eos_flash_init(void); +void eos_flash_norm(void); +void eos_flash_fast(void); + +void eos_flash_wip(void); +void eos_flash_wren(void); +void eos_flash_ser(uint32_t addr); +void eos_flash_pp(uint32_t addr, uint8_t *buf); \ No newline at end of file -- cgit v1.2.3