flash_internal: add page size method

This commit is contained in:
King Kévin 2020-01-02 13:42:02 +01:00
parent 822b66ea8f
commit 5ed491defb
2 changed files with 34 additions and 15 deletions

View File

@ -36,7 +36,8 @@
* @param[in] size how much data to read or write, in bytes
* @return if the data is in the internal flash area
*/
static bool flash_internal_range(uint32_t address, size_t size) {
static bool flash_internal_range(uint32_t address, size_t size)
{
if (address > (UINT32_MAX - size)) { // on integer overflow will occur
return false;
}
@ -55,6 +56,33 @@ static bool flash_internal_range(uint32_t address, size_t size) {
return true;
}
/** get flash page size
* @return flash page size (in bytes)
*/
uint16_t flash_internal_page_size(void)
{
static uint16_t page_size = 0; // remember page size
if (page_size) { // we already determined the size
return page_size;
}
if (0 == page_size) { // we don't know the page size yet
if ((0x410 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK)) || (0x412 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK))) { // low-density (16-32 KB flash) and medium-density (64-128 KB flash) devices have 1 KB flash pages
page_size = 1024;
} else if ((0x414 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK)) || (0x430 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK)) || (0x418==(DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK))) { // high-density (256-512 KB flash), XL-density (768-1024 KB flash) devices and connectivity line have 2 KB flash pages
page_size = 2048;
} else { // unknown device type (or unreadable type, see errata), deduce page size from flash size
if (DESIG_FLASH_SIZE < 256) {
page_size = 1024;
} else {
page_size = 2048;
}
}
}
return page_size;
}
bool flash_internal_read(uint32_t address, uint8_t *buffer, size_t size)
{
// sanity checks
@ -92,20 +120,7 @@ int32_t flash_internal_write(uint32_t address, const uint8_t *buffer, size_t siz
return -5;
}
// get page size
uint16_t page_size = 0;
if ((0x410 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK)) || (0x412 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK))) { // low-density (16-32 KB flash) and medium-density (64-128 KB flash) devices have 1 KB flash pages
page_size = 1024;
} else if ((0x414 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK)) || (0x430 == (DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK)) || (0x418==(DBGMCU_IDCODE&DBGMCU_IDCODE_DEV_ID_MASK))) { // high-density (256-512 KB flash), XL-density (768-1024 KB flash) devices and connectivity line have 2 KB flash pages
page_size = 2048;
} else { // unknown device type (or unreadable type, see errata), deduce page size from flash size
if (DESIG_FLASH_SIZE < 256) {
page_size = 1024;
} else {
page_size = 2048;
}
}
uint16_t page_size = flash_internal_page_size(); // get page size
uint32_t written = 0; // number of bytes written
flash_unlock(); // unlock flash to be able to write it
while (size) { // write page by page until all data has been written

View File

@ -36,3 +36,7 @@ bool flash_internal_read(uint32_t address, uint8_t *buffer, size_t size);
* @note the page will be erased if needed to write the data to the flash
*/
int32_t flash_internal_write(uint32_t address, const uint8_t *buffer, size_t size, bool preserve);
/** get flash page size
* @return flash page size (in bytes)
*/
uint16_t flash_internal_page_size(void);