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:
Giovanni Di Sirio 2016-06-05 08:05:25 +00:00
parent 63f5989cd2
commit 07d81aae52
3 changed files with 101 additions and 58 deletions

View File

@ -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.*/

View File

@ -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);

View File

@ -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,
size_t n, uint8_t *p);
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);