flash_internal: add page size method
This commit is contained in:
parent
822b66ea8f
commit
5ed491defb
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue