aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/lib/peripherals
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-06-14 09:26:16 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-06-14 09:26:16 +0000
commit2d4c475d1d9a67d03193366a6a402d00de7f414a (patch)
tree3255af82e3afacb3684ec86f61df4c71ff82f823 /os/hal/lib/peripherals
parent75d0d3d59766c8834305dce0025e27a037b9408d (diff)
downloadChibiOS-2d4c475d1d9a67d03193366a6a402d00de7f414a.tar.gz
ChibiOS-2d4c475d1d9a67d03193366a6a402d00de7f414a.tar.bz2
ChibiOS-2d4c475d1d9a67d03193366a6a402d00de7f414a.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9625 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/hal/lib/peripherals')
-rw-r--r--os/hal/lib/peripherals/flash/hal_flash.c40
-rw-r--r--os/hal/lib/peripherals/flash/hal_flash.h44
-rw-r--r--os/hal/lib/peripherals/flash/hal_jesd216_flash.c16
-rw-r--r--os/hal/lib/peripherals/flash/hal_jesd216_flash.h15
4 files changed, 79 insertions, 36 deletions
diff --git a/os/hal/lib/peripherals/flash/hal_flash.c b/os/hal/lib/peripherals/flash/hal_flash.c
index b65ca3768..439a9c6aa 100644
--- a/os/hal/lib/peripherals/flash/hal_flash.c
+++ b/os/hal/lib/peripherals/flash/hal_flash.c
@@ -72,4 +72,44 @@ flash_error_t flashWaitErase(BaseFlash *devp) {
}
}
+/**
+ * @brief Returns the offset of a sector.
+ */
+flash_offset_t flashGetSectorOffset(BaseFlash *devp,
+ flash_sector_t sector) {
+ flash_offset_t offset;
+ const flash_descriptor_t *descriptor = flashGetDescriptor(devp);
+
+ osalDbgAssert(sector < descriptor->sectors_count, "invalid sector");
+
+ if (descriptor->sectors != NULL) {
+ offset = descriptor->sectors[sector].offset;
+ }
+ else {
+ offset = (flash_offset_t)sector * (flash_offset_t)descriptor->sectors_size;
+ }
+
+ return offset;
+}
+
+/**
+ * @brief Returns the size of a sector.
+ */
+uint32_t flashGetSectorSize(BaseFlash *devp,
+ flash_sector_t sector) {
+ uint32_t size;
+ const flash_descriptor_t *descriptor = flashGetDescriptor(devp);
+
+ osalDbgAssert(sector < descriptor->sectors_count, "invalid sector");
+
+ if (descriptor->sectors != NULL) {
+ size = descriptor->sectors[sector].size;
+ }
+ else {
+ size = descriptor->sectors_size;
+ }
+
+ return size;
+}
+
/** @} */
diff --git a/os/hal/lib/peripherals/flash/hal_flash.h b/os/hal/lib/peripherals/flash/hal_flash.h
index b15c18b25..f7066e2ef 100644
--- a/os/hal/lib/peripherals/flash/hal_flash.h
+++ b/os/hal/lib/peripherals/flash/hal_flash.h
@@ -78,9 +78,9 @@ typedef enum {
} flash_error_t;
/**
- * @brief Type of a flash address.
+ * @brief Type of a flash offset.
*/
-typedef uint32_t flash_address_t;
+typedef uint32_t flash_offset_t;
/**
* @brief Type of a flash sector number.
@@ -92,13 +92,13 @@ typedef uint32_t flash_sector_t;
*/
typedef struct {
/**
- * @brief Sector address.
+ * @brief Sector offset.
*/
- flash_address_t address;
+ flash_offset_t offset;
/**
* @brief Sector size.
*/
- size_t size;
+ uint32_t size;
} flash_sector_descriptor_t;
/**
@@ -112,7 +112,7 @@ typedef struct {
/**
* @brief Size of write page.
*/
- size_t page_size;
+ uint32_t page_size;
/**
* @brief Number of sectors in the device.
*/
@@ -125,15 +125,15 @@ typedef struct {
const flash_sector_descriptor_t *sectors;
/**
* @brief Size of sectors for devices with uniform sector size.
- * @note If zero then the device has non uniform sectos described
+ * @note If zero then the device has non uniform sectors described
* by the @p sectors array.
*/
- size_t sectors_size;
+ uint32_t sectors_size;
/**
* @brief Flash address if memory mapped or zero.
* @note Conventionally, non memory mapped devices have address zero.
*/
- flash_address_t address;
+ flash_offset_t address;
} flash_descriptor_t;
/**
@@ -144,11 +144,11 @@ typedef struct {
/* Get flash device attributes.*/ \
const flash_descriptor_t * (*get_descriptor)(void *instance); \
/* Read operation.*/ \
- flash_error_t (*read)(void *instance, flash_address_t addr, \
- uint8_t *rp, size_t n); \
+ flash_error_t (*read)(void *instance, flash_offset_t offset, \
+ size_t n, uint8_t *rp); \
/* Program operation.*/ \
- flash_error_t (*program)(void *instance, flash_address_t addr, \
- const uint8_t *pp, size_t n); \
+ flash_error_t (*program)(void *instance, flash_offset_t offset, \
+ size_t n, const uint8_t *pp); \
/* Erase whole flash device.*/ \
flash_error_t (*start_erase_all)(void *instance); \
/* Erase single sector.*/ \
@@ -211,9 +211,9 @@ typedef struct {
* @brief Read operation.
*
* @param[in] ip pointer to a @p BaseFlash or derived class
- * @param[in] addr flash address
- * @param[out] rp pointer to the data buffer
+ * @param[in] offset flash offset
* @param[in] n number of bytes to be read
+ * @param[out] rp pointer to the data buffer
* @return An error code.
* @retval FLASH_NO_ERROR if there is no erase operation in progress.
* @retval FLASH_BUSY_ERASING if there is an erase operation in progress.
@@ -221,16 +221,16 @@ typedef struct {
*
* @api
*/
-#define flashRead(ip, addr, rp, n) \
- (ip)->vmt->read(ip, addr, rp, n)
+#define flashRead(ip, offset, n, rp) \
+ (ip)->vmt->read(ip, offset, n, rp)
/**
* @brief Program operation.
*
* @param[in] ip pointer to a @p BaseFlash or derived class
- * @param[in] addr flash address
- * @param[in] wp pointer to the data buffer
+ * @param[in] offset flash offset
* @param[in] n number of bytes to be programmed
+ * @param[in] wp pointer to the data buffer
* @return An error code.
* @retval FLASH_NO_ERROR if there is no erase operation in progress.
* @retval FLASH_BUSY_ERASING if there is an erase operation in progress.
@@ -238,8 +238,8 @@ typedef struct {
*
* @api
*/
-#define flashProgram(ip, addr, pp, n) \
- (ip)->vmt->program(ip, addr, pp, n)
+#define flashProgram(ip, offset, n, pp) \
+ (ip)->vmt->program(ip, offset, n, pp)
/**
* @brief Starts a whole-device erase operation.
@@ -308,6 +308,8 @@ typedef struct {
extern "C" {
#endif
flash_error_t flashWaitErase(BaseFlash *devp);
+ flash_offset_t flashGetSectorOffset(BaseFlash *devp, flash_sector_t sector);
+ uint32_t flashGetSectorSize(BaseFlash *devp, flash_sector_t sector);
#ifdef __cplusplus
}
#endif
diff --git a/os/hal/lib/peripherals/flash/hal_jesd216_flash.c b/os/hal/lib/peripherals/flash/hal_jesd216_flash.c
index cd422f53b..9cc986c04 100644
--- a/os/hal/lib/peripherals/flash/hal_jesd216_flash.c
+++ b/os/hal/lib/peripherals/flash/hal_jesd216_flash.c
@@ -157,7 +157,7 @@ void jesd216_cmd_send(BUSDriver *busp,
void jesd216_cmd_addr(BUSDriver *busp,
uint32_t cmd,
- flash_address_t addr) {
+ flash_offset_t offset) {
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
qspi_command_t mode;
@@ -176,7 +176,7 @@ void jesd216_cmd_addr(BUSDriver *busp,
QSPI_CFG_ADDR_SIZE_24;
#endif
- mode.addr = addr;
+ mode.addr = offset;
mode.alt = 0U;
qspiCommand(busp, &mode);
#else
@@ -194,7 +194,7 @@ void jesd216_cmd_addr(BUSDriver *busp,
void jesd216_cmd_addr_send(BUSDriver *busp,
uint32_t cmd,
- flash_address_t addr,
+ flash_offset_t offset,
size_t n,
const uint8_t *p) {
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
@@ -223,7 +223,7 @@ void jesd216_cmd_addr_send(BUSDriver *busp,
mode .cfg |= QSPI_CFG_ADDR_SIZE_32;
}
- mode.addr = addr;
+ mode.addr = offset;
mode.alt = 0U;
qspiSend(busp, &mode, n, p);
#else
@@ -242,7 +242,7 @@ void jesd216_cmd_addr_send(BUSDriver *busp,
void jesd216_cmd_addr_receive(BUSDriver *busp,
uint32_t cmd,
- flash_address_t addr,
+ flash_offset_t offset,
size_t n,
uint8_t *p) {
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
@@ -272,7 +272,7 @@ void jesd216_cmd_addr_receive(BUSDriver *busp,
mode .cfg |= QSPI_CFG_ADDR_SIZE_32;
}
- mode.addr = addr;
+ mode.addr = offset;
mode.alt = 0U;
qspiReceive(busp, &mode, n, p);
#else
@@ -292,7 +292,7 @@ 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,
uint32_t cmd,
- flash_address_t addr,
+ flash_offset_t offset,
uint8_t dummy,
size_t n,
uint8_t *p) {
@@ -324,7 +324,7 @@ void jesd216_cmd_addr_dummy_receive(BUSDriver *busp,
mode .cfg |= QSPI_CFG_ADDR_SIZE_32;
}
- mode.addr = addr;
+ mode.addr = offset;
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 1cff3cc32..371892ec1 100644
--- a/os/hal/lib/peripherals/flash/hal_jesd216_flash.h
+++ b/os/hal/lib/peripherals/flash/hal_jesd216_flash.h
@@ -141,9 +141,10 @@
*/
#define _jesd216_flash_methods_alone \
/* Read SFDP.*/ \
- flash_error_t (*read_sfdp)(void *instance, uint8_t *rp, \
- flash_address_t addr, \
- size_t n);
+ flash_error_t (*read_sfdp)(void *instance, \
+ flash_offset_t offset, \
+ size_t n, \
+ uint8_t *rp);
/**
* @brief @p JESD215Flash specific methods with inherited ones.
@@ -198,14 +199,14 @@ extern "C" {
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(BUSDriver *busp, uint32_t cmd, flash_offset_t offset);
void jesd216_cmd_addr_send(BUSDriver *busp, uint32_t cmd,
- flash_address_t addr, size_t n, const uint8_t *p);
+ flash_offset_t offset, 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);
+ flash_offset_t offset, size_t n, uint8_t *p);
#if JESD216_BUS_MODE != JESD216_BUS_MODE_SPI
void jesd216_cmd_addr_dummy_receive(BUSDriver *busp, uint32_t cmd,
- flash_address_t addr, uint8_t dummy,
+ flash_offset_t offset, uint8_t dummy,
size_t n, uint8_t *p);
#endif /* JESD216_BUS_MODE != JESD216_BUS_MODE_SPI */
#if JESD216_SHARED_BUS == TRUE