cpu/sam0_common: add alignment and minimum size write block constants
This commit is contained in:
parent
fcb3fd9e70
commit
adc08d6578
@ -45,6 +45,12 @@ extern "C" {
|
|||||||
#define FLASHPAGE_SIZE (256U)
|
#define FLASHPAGE_SIZE (256U)
|
||||||
/* one SAM0 row contains 4 SAM0 pages -> 4x the amount of RIOT flashpages */
|
/* one SAM0 row contains 4 SAM0 pages -> 4x the amount of RIOT flashpages */
|
||||||
#define FLASHPAGE_NUMOF (FLASH_NB_OF_PAGES / 4)
|
#define FLASHPAGE_NUMOF (FLASH_NB_OF_PAGES / 4)
|
||||||
|
/* The minimum block size which can be written is 16B. However, the erase
|
||||||
|
* block is always FLASHPAGE_SIZE (SAM0 row).
|
||||||
|
*/
|
||||||
|
#define FLASHPAGE_RAW_BLOCKSIZE (16)
|
||||||
|
/* Writing should be always 4 byte aligned */
|
||||||
|
#define FLASHPAGE_RAW_ALIGNMENT (4)
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@ -58,19 +58,18 @@ static void _lock(void)
|
|||||||
|
|
||||||
void flashpage_write_raw(void *target_addr, void *data, size_t len)
|
void flashpage_write_raw(void *target_addr, void *data, size_t len)
|
||||||
{
|
{
|
||||||
/* sam[dlr]21 can only write whole flash pages.
|
/* The actual minimal block size for writing is 16B, thus we
|
||||||
* Mind the use of the ATMEL FLASH_PAGE_SIZE (64B) define vs.
|
* assert we write on multiples and no less of that length.
|
||||||
* FLASHPAGE_SIZE (256B) as defined by RIOT.
|
|
||||||
* The actual minimal block size for writing is 16B, thus we
|
|
||||||
* assert we don't write less than that.
|
|
||||||
*/
|
*/
|
||||||
assert(!(len % (FLASH_PAGE_SIZE / 4)));
|
assert(!(len % FLASHPAGE_RAW_BLOCKSIZE));
|
||||||
|
|
||||||
/* ensure 4 byte aligned writes */
|
/* ensure 4 byte aligned writes */
|
||||||
assert(!(((unsigned)target_addr & 0x3) || ((unsigned)data & 0x3)));
|
assert(!(((unsigned)target_addr % FLASHPAGE_RAW_ALIGNMENT) ||
|
||||||
|
((unsigned)data % FLASHPAGE_RAW_ALIGNMENT)));
|
||||||
|
|
||||||
/* ensure the length doesn't exceed the actual flash size */
|
/* ensure the length doesn't exceed the actual flash size */
|
||||||
assert((target_addr + len) < (CPU_FLASH_BASE + (FLASHPAGE_SIZE * FLASHPAGE_NUMOF)));
|
assert(((uint8_t*)target_addr + len) <
|
||||||
|
(CPU_FLASH_BASE + (FLASHPAGE_SIZE * FLASHPAGE_NUMOF)));
|
||||||
|
|
||||||
uint32_t *dst = (uint32_t *)target_addr;
|
uint32_t *dst = (uint32_t *)target_addr;
|
||||||
uint32_t *data_addr = (uint32_t *)data;
|
uint32_t *data_addr = (uint32_t *)data;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user