aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/lib/peripherals
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-06-05 08:05:25 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-06-05 08:05:25 +0000
commit07d81aae52dc92707aa732de75baf8b9fa5988b5 (patch)
treeb37c79271a06373b4ff2686c5bb2387099ebca2e /os/hal/lib/peripherals
parent63f5989cd28e0ffd997b9d599c0d96b6402f5aa5 (diff)
downloadChibiOS-07d81aae52dc92707aa732de75baf8b9fa5988b5.tar.gz
ChibiOS-07d81aae52dc92707aa732de75baf8b9fa5988b5.tar.bz2
ChibiOS-07d81aae52dc92707aa732de75baf8b9fa5988b5.zip
Better abstracted flash bus code.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9581 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/hal/lib/peripherals')
-rw-r--r--os/hal/lib/peripherals/flash/hal_jesd216_flash.c75
-rw-r--r--os/hal/lib/peripherals/flash/hal_jesd216_flash.h66
2 files changed, 94 insertions, 47 deletions
diff --git a/os/hal/lib/peripherals/flash/hal_jesd216_flash.c b/os/hal/lib/peripherals/flash/hal_jesd216_flash.c
index 07d4aad80..53f458c03 100644
--- a/os/hal/lib/peripherals/flash/hal_jesd216_flash.c
+++ b/os/hal/lib/peripherals/flash/hal_jesd216_flash.c
@@ -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);
diff --git a/os/hal/lib/peripherals/flash/hal_jesd216_flash.h b/os/hal/lib/peripherals/flash/hal_jesd216_flash.h
index 69d8a8533..bb2214e81 100644
--- a/os/hal/lib/peripherals/flash/hal_jesd216_flash.h
+++ b/os/hal/lib/peripherals/flash/hal_jesd216_flash.h
@@ -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);