Better abstracted flash bus code.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9581 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
63f5989cd2
commit
07d81aae52
|
@ -648,15 +648,13 @@ void m25qStart(M25QDriver *devp, const M25QConfig *config) {
|
|||
/* Bus acquisition.*/
|
||||
jesd216_bus_acquire(devp->config->busp);
|
||||
|
||||
/* Starting bus device.*/
|
||||
jesd216_start(devp->config->busp, devp->config->buscfg);
|
||||
|
||||
#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI
|
||||
/* SPI initialization.*/
|
||||
spiStart(devp->config->busp, devp->config->buscfg);
|
||||
|
||||
/* Reading device ID.*/
|
||||
#else /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */
|
||||
/* QSPI initialization.*/
|
||||
qspiStart(devp->config->busp, devp->config->buscfg);
|
||||
|
||||
#else /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */
|
||||
/* Attempting a reset of the XIP mode, it could be in an unexpected state
|
||||
because a CPU reset does not reset the memory too.*/
|
||||
m25q_reset_xip(devp);
|
||||
|
@ -740,12 +738,10 @@ void m25qStop(M25QDriver *devp) {
|
|||
/* Bus acquisition.*/
|
||||
jesd216_bus_acquire(devp->config->busp);
|
||||
|
||||
#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI
|
||||
spiStop(devp->config->busp);
|
||||
#else
|
||||
qspiStop(devp->config->busp);
|
||||
#endif
|
||||
/* Stopping bus device.*/
|
||||
jesd216_stop(devp->config->busp);
|
||||
|
||||
/* Deleting current configuration.*/
|
||||
devp->config = NULL;
|
||||
|
||||
/* Driver stopped.*/
|
||||
|
|
|
@ -46,7 +46,25 @@
|
|||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
void jesd216_cmd(BUSDriver *busp, uint8_t cmd) {
|
||||
void jesd216_start(BUSDriver *busp, const BUSConfig *config) {
|
||||
|
||||
#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI
|
||||
spiStart(busp, config);
|
||||
#else
|
||||
qspiStart(busp, config);
|
||||
#endif
|
||||
}
|
||||
|
||||
void jesd216_stop(BUSDriver *busp) {
|
||||
|
||||
#if JESD216_BUS_MODE == JESD216_BUS_MODE_SPI
|
||||
spiStop(busp);
|
||||
#else
|
||||
qspiStop(busp);
|
||||
#endif
|
||||
}
|
||||
|
||||
void jesd216_cmd(BUSDriver *busp, uint32_t cmd) {
|
||||
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
|
||||
qspi_command_t mode;
|
||||
|
||||
|
@ -72,7 +90,7 @@ void jesd216_cmd(BUSDriver *busp, uint8_t cmd) {
|
|||
}
|
||||
|
||||
void jesd216_cmd_receive(BUSDriver *busp,
|
||||
uint8_t cmd,
|
||||
uint32_t cmd,
|
||||
size_t n,
|
||||
uint8_t *p) {
|
||||
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
|
||||
|
@ -105,7 +123,7 @@ void jesd216_cmd_receive(BUSDriver *busp,
|
|||
}
|
||||
|
||||
void jesd216_cmd_send(BUSDriver *busp,
|
||||
uint8_t cmd,
|
||||
uint32_t cmd,
|
||||
size_t n,
|
||||
const uint8_t *p) {
|
||||
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
|
||||
|
@ -138,7 +156,7 @@ void jesd216_cmd_send(BUSDriver *busp,
|
|||
}
|
||||
|
||||
void jesd216_cmd_addr(BUSDriver *busp,
|
||||
uint8_t cmd,
|
||||
uint32_t cmd,
|
||||
flash_address_t addr) {
|
||||
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
|
||||
qspi_command_t mode;
|
||||
|
@ -175,31 +193,36 @@ void jesd216_cmd_addr(BUSDriver *busp,
|
|||
}
|
||||
|
||||
void jesd216_cmd_addr_send(BUSDriver *busp,
|
||||
uint8_t cmd,
|
||||
uint32_t cmd,
|
||||
flash_address_t addr,
|
||||
size_t n,
|
||||
const uint8_t *p) {
|
||||
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
|
||||
qspi_command_t mode;
|
||||
|
||||
mode.cfg = QSPI_CFG_CMD(cmd) |
|
||||
mode.cfg = QSPI_CFG_CMD(cmd & 0xFFU) |
|
||||
#if JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI1L
|
||||
QSPI_CFG_CMD_MODE_ONE_LINE |
|
||||
QSPI_CFG_ADDR_MODE_ONE_LINE |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DATA_MODE_ONE_LINE;
|
||||
#elif JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI2L
|
||||
QSPI_CFG_CMD_MODE_TWO_LINES |
|
||||
QSPI_CFG_ADDR_MODE_TWO_LINES |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DATA_MODE_TWO_LINES;
|
||||
#else
|
||||
QSPI_CFG_CMD_MODE_FOUR_LINES |
|
||||
QSPI_CFG_ADDR_MODE_FOUR_LINES |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DATA_MODE_FOUR_LINES;
|
||||
|
||||
#endif
|
||||
|
||||
/* Handling 32 bits addressing.*/
|
||||
if ((cmd & JESD216_CMD_EXTENDED_ADDRESSING) == 0) {
|
||||
mode .cfg |= QSPI_CFG_ADDR_SIZE_24;
|
||||
}
|
||||
else {
|
||||
mode .cfg |= QSPI_CFG_ADDR_SIZE_32;
|
||||
}
|
||||
|
||||
mode.addr = addr;
|
||||
mode.alt = 0U;
|
||||
qspiSend(busp, &mode, n, p);
|
||||
|
@ -218,18 +241,17 @@ void jesd216_cmd_addr_send(BUSDriver *busp,
|
|||
}
|
||||
|
||||
void jesd216_cmd_addr_receive(BUSDriver *busp,
|
||||
uint8_t cmd,
|
||||
uint32_t cmd,
|
||||
flash_address_t addr,
|
||||
size_t n,
|
||||
uint8_t *p) {
|
||||
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
|
||||
qspi_command_t mode;
|
||||
|
||||
mode.cfg = QSPI_CFG_CMD(cmd) |
|
||||
mode.cfg = QSPI_CFG_CMD(cmd & 0xFFU) |
|
||||
#if JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI1L
|
||||
QSPI_CFG_CMD_MODE_ONE_LINE |
|
||||
QSPI_CFG_ADDR_MODE_ONE_LINE |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DATA_MODE_ONE_LINE;
|
||||
#elif JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI2L
|
||||
QSPI_CFG_CMD_MODE_TWO_LINES |
|
||||
|
@ -239,10 +261,17 @@ void jesd216_cmd_addr_receive(BUSDriver *busp,
|
|||
#else
|
||||
QSPI_CFG_CMD_MODE_FOUR_LINES |
|
||||
QSPI_CFG_ADDR_MODE_FOUR_LINES |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DATA_MODE_FOUR_LINES;
|
||||
|
||||
#endif
|
||||
|
||||
/* Handling 32 bits addressing.*/
|
||||
if ((cmd & JESD216_CMD_EXTENDED_ADDRESSING) == 0) {
|
||||
mode .cfg |= QSPI_CFG_ADDR_SIZE_24;
|
||||
}
|
||||
else {
|
||||
mode .cfg |= QSPI_CFG_ADDR_SIZE_32;
|
||||
}
|
||||
|
||||
mode.addr = addr;
|
||||
mode.alt = 0U;
|
||||
qspiReceive(busp, &mode, n, p);
|
||||
|
@ -262,33 +291,39 @@ void jesd216_cmd_addr_receive(BUSDriver *busp,
|
|||
|
||||
#if (JESD216_BUS_MODE != JESD216_BUS_MODE_SPI) || defined(__DOXYGEN__)
|
||||
void jesd216_cmd_addr_dummy_receive(BUSDriver *busp,
|
||||
uint8_t cmd,
|
||||
uint32_t cmd,
|
||||
flash_address_t addr,
|
||||
uint8_t dummy,
|
||||
size_t n,
|
||||
uint8_t *p) {
|
||||
qspi_command_t mode;
|
||||
|
||||
mode.cfg = QSPI_CFG_CMD(cmd) |
|
||||
mode.cfg = QSPI_CFG_CMD(cmd & 0xFFU) |
|
||||
#if JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI1L
|
||||
QSPI_CFG_CMD_MODE_ONE_LINE |
|
||||
QSPI_CFG_ADDR_MODE_ONE_LINE |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DUMMY_CYCLES(dummy) |
|
||||
QSPI_CFG_DATA_MODE_ONE_LINE;
|
||||
#elif JESD216_BUS_MODE == JESD216_BUS_MODE_QSPI2L
|
||||
QSPI_CFG_CMD_MODE_TWO_LINES |
|
||||
QSPI_CFG_ADDR_MODE_TWO_LINES |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DUMMY_CYCLES(dummy) |
|
||||
QSPI_CFG_DATA_MODE_TWO_LINES;
|
||||
#else
|
||||
QSPI_CFG_CMD_MODE_FOUR_LINES |
|
||||
QSPI_CFG_ADDR_MODE_FOUR_LINES |
|
||||
QSPI_CFG_ADDR_SIZE_24 |
|
||||
QSPI_CFG_DUMMY_CYCLES(dummy) |
|
||||
QSPI_CFG_DATA_MODE_FOUR_LINES;
|
||||
#endif
|
||||
|
||||
/* Handling 32 bits addressing.*/
|
||||
if ((cmd & JESD216_CMD_EXTENDED_ADDRESSING) == 0) {
|
||||
mode .cfg |= QSPI_CFG_ADDR_SIZE_24;
|
||||
}
|
||||
else {
|
||||
mode .cfg |= QSPI_CFG_ADDR_SIZE_32;
|
||||
}
|
||||
|
||||
mode.addr = addr;
|
||||
mode.alt = 0U;
|
||||
qspiReceive(busp, &mode, n, p);
|
||||
|
|
|
@ -35,29 +35,36 @@
|
|||
* @name Common command codes
|
||||
* @{
|
||||
*/
|
||||
#define JESD216_CMD_READ_ID 0x9F
|
||||
#define JESD216_CMD_READ 0x03
|
||||
#define JESD216_CMD_WRITE_ENABLE 0x06
|
||||
#define JESD216_CMD_WRITE_DISABLE 0x04
|
||||
#define JESD216_CMD_READ_STATUS_REGISTER 0x05
|
||||
#define JESD216_CMD_WRITE_STATUS_REGISTER 0x01
|
||||
#define JESD216_CMD_PAGE_PROGRAM 0x02
|
||||
#define JESD216_CMD_ERASE_4K 0x20
|
||||
#define JESD216_CMD_ERASE_BULK 0xC7
|
||||
#define JESD216_CMD_PROGRAM_ERASE_RESUME 0x7A
|
||||
#define JESD216_CMD_PROGRAM_ERASE_SUSPEND 0x75
|
||||
#define JESD216_CMD_READ_OTP_ARRAY 0x4B
|
||||
#define JESD216_CMD_PROGRAM_OTP_ARRAY 0x42
|
||||
#define JESD216_CMD_READ_ID 0x9FU
|
||||
#define JESD216_CMD_READ 0x03U
|
||||
#define JESD216_CMD_WRITE_ENABLE 0x06U
|
||||
#define JESD216_CMD_WRITE_DISABLE 0x04U
|
||||
#define JESD216_CMD_READ_STATUS_REGISTER 0x05U
|
||||
#define JESD216_CMD_WRITE_STATUS_REGISTER 0x01U
|
||||
#define JESD216_CMD_PAGE_PROGRAM 0x02U
|
||||
#define JESD216_CMD_ERASE_4K 0x20U
|
||||
#define JESD216_CMD_ERASE_BULK 0xC7U
|
||||
#define JESD216_CMD_PROGRAM_ERASE_RESUME 0x7AU
|
||||
#define JESD216_CMD_PROGRAM_ERASE_SUSPEND 0x75U
|
||||
#define JESD216_CMD_READ_OTP_ARRAY 0x4BU
|
||||
#define JESD216_CMD_PROGRAM_OTP_ARRAY 0x42U
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Command options
|
||||
* @{
|
||||
*/
|
||||
#define JESD216_CMD_EXTENDED_ADDRESSING 0x80000000U
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @name Bus interface.
|
||||
* @{
|
||||
*/
|
||||
#define JESD216_BUS_MODE_SPI 0
|
||||
#define JESD216_BUS_MODE_QSPI1L 1
|
||||
#define JESD216_BUS_MODE_QSPI2L 2
|
||||
#define JESD216_BUS_MODE_QSPI4L 4
|
||||
#define JESD216_BUS_MODE_SPI 0U
|
||||
#define JESD216_BUS_MODE_QSPI1L 1U
|
||||
#define JESD216_BUS_MODE_QSPI2L 2U
|
||||
#define JESD216_BUS_MODE_QSPI4L 4U
|
||||
/** @} */
|
||||
|
||||
/*===========================================================================*/
|
||||
|
@ -184,17 +191,22 @@ typedef struct {
|
|||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void jesd216_cmd(BUSDriver *busp, uint8_t cmd);
|
||||
void jesd216_cmd_receive(BUSDriver *busp, uint8_t cmd, size_t n, uint8_t *p);
|
||||
void jesd216_cmd_send(BUSDriver *busp, uint8_t cmd, size_t n, const uint8_t *p);
|
||||
void jesd216_cmd_addr(BUSDriver *busp, uint8_t cmd, flash_address_t addr);
|
||||
void jesd216_cmd_addr_send(BUSDriver *busp, uint8_t cmd, flash_address_t addr,
|
||||
size_t n, const uint8_t *p);
|
||||
void jesd216_cmd_addr_receive(BUSDriver *busp, uint8_t cmd, flash_address_t addr,
|
||||
void jesd216_start(BUSDriver *busp, const BUSConfig *config);
|
||||
void jesd216_stop(BUSDriver *busp);
|
||||
void jesd216_cmd(BUSDriver *busp, uint32_t cmd);
|
||||
void jesd216_cmd_receive(BUSDriver *busp, uint32_t cmd,
|
||||
size_t n, uint8_t *p);
|
||||
void jesd216_cmd_send(BUSDriver *busp, uint32_t cmd,
|
||||
size_t n, const uint8_t *p);
|
||||
void jesd216_cmd_addr(BUSDriver *busp, uint32_t cmd, flash_address_t addr);
|
||||
void jesd216_cmd_addr_send(BUSDriver *busp, uint32_t cmd,
|
||||
flash_address_t addr, size_t n, const uint8_t *p);
|
||||
void jesd216_cmd_addr_receive(BUSDriver *busp, uint32_t cmd,
|
||||
flash_address_t addr, size_t n, uint8_t *p);
|
||||
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
|
||||
void jesd216_cmd_addr_dummy_receive(BUSDriver *busp, uint8_t cmd, flash_address_t addr,
|
||||
uint8_t dummy, size_t n, uint8_t *p);
|
||||
void jesd216_cmd_addr_dummy_receive(BUSDriver *busp, uint32_t cmd,
|
||||
flash_address_t addr, uint8_t dummy,
|
||||
size_t n, uint8_t *p);
|
||||
#endif /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */
|
||||
#if JESD216_SHARED_BUS == TRUE
|
||||
void jesd216_bus_acquire(BUSDriver *busp);
|
||||
|
|
Loading…
Reference in New Issue