Merge pull request #15897 from bergzand/pr/riotboot/flashwrite_remove_flashpage_size
riotboot/flashwrite: Remove last dependencies on flashpage size
This commit is contained in:
commit
a5e5ec5215
@ -84,6 +84,27 @@ extern "C" {
|
|||||||
#ifdef DOXYGEN
|
#ifdef DOXYGEN
|
||||||
#define FLASHPAGE_WRITE_BLOCK_ALIGNMENT
|
#define FLASHPAGE_WRITE_BLOCK_ALIGNMENT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @def PERIPH_FLASHPAGE_CUSTOM_PAGESIZES
|
||||||
|
*
|
||||||
|
* @brief Defined to signal that the peripheral has non-uniform flash page
|
||||||
|
* sizes. These devices do not define FLASHPAGE_SIZE and do not
|
||||||
|
* implement the pagewise api.
|
||||||
|
*/
|
||||||
|
#ifdef DOXYGEN
|
||||||
|
#define PERIPH_FLASHPAGE_CUSTOM_PAGESIZES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Return values used in this interface
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
FLASHPAGE_OK = 0, /**< everything succeeded */
|
||||||
|
FLASHPAGE_NOMATCH = -1 /**< page differs from target data */
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !defined(PERIPH_FLASHPAGE_CUSTOM_PAGESIZES) || defined(DOXYGEN)
|
||||||
/**
|
/**
|
||||||
* @def FLASHPAGE_SIZE
|
* @def FLASHPAGE_SIZE
|
||||||
*
|
*
|
||||||
@ -97,12 +118,17 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Return values used in this interface
|
* @brief Get the page size of the given page number
|
||||||
|
*
|
||||||
|
* @param[in] page page number to get the size for
|
||||||
|
*
|
||||||
|
* @return Page size of the given page
|
||||||
*/
|
*/
|
||||||
enum {
|
static inline size_t flashpage_size(unsigned page)
|
||||||
FLASHPAGE_OK = 0, /**< everything succeeded */
|
{
|
||||||
FLASHPAGE_NOMATCH = -1 /**< page differs from target data */
|
(void)page;
|
||||||
};
|
return FLASHPAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Translate the given page number into the page's starting address
|
* @brief Translate the given page number into the page's starting address
|
||||||
@ -135,6 +161,15 @@ static inline unsigned flashpage_page(void *addr)
|
|||||||
return (((intptr_t)addr - CPU_FLASH_BASE) / FLASHPAGE_SIZE);
|
return (((intptr_t)addr - CPU_FLASH_BASE) / FLASHPAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Bare prototypes for the above functions. See above for the documentation */
|
||||||
|
size_t flashpage_size(unsigned page);
|
||||||
|
void *flashpage_addr(unsigned page);
|
||||||
|
unsigned flashpage_page(void *addr);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Erase the given page
|
* @brief Erase the given page
|
||||||
*
|
*
|
||||||
|
|||||||
@ -37,7 +37,7 @@ void flashpage_read(unsigned page, void *data)
|
|||||||
assert(page < (FLASH->SFR & FLASH_SFR_SFSA));
|
assert(page < (FLASH->SFR & FLASH_SFR_SFSA));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
memcpy(data, flashpage_addr(page), FLASHPAGE_SIZE);
|
memcpy(data, flashpage_addr(page), flashpage_size(page));
|
||||||
}
|
}
|
||||||
|
|
||||||
int flashpage_verify(unsigned page, const void *data)
|
int flashpage_verify(unsigned page, const void *data)
|
||||||
@ -48,7 +48,7 @@ int flashpage_verify(unsigned page, const void *data)
|
|||||||
assert(page < (int)(FLASH->SFR & FLASH_SFR_SFSA));
|
assert(page < (int)(FLASH->SFR & FLASH_SFR_SFSA));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (memcmp(flashpage_addr(page), data, FLASHPAGE_SIZE) == 0) {
|
if (memcmp(flashpage_addr(page), data, flashpage_size(page)) == 0) {
|
||||||
return FLASHPAGE_OK;
|
return FLASHPAGE_OK;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@ -49,9 +49,15 @@ size_t riotboot_flashwrite_slotsize(
|
|||||||
int riotboot_flashwrite_init_raw(riotboot_flashwrite_t *state, int target_slot,
|
int riotboot_flashwrite_init_raw(riotboot_flashwrite_t *state, int target_slot,
|
||||||
size_t offset)
|
size_t offset)
|
||||||
{
|
{
|
||||||
|
#ifdef FLASHPAGE_SIZE
|
||||||
assert(offset <= FLASHPAGE_SIZE);
|
assert(offset <= FLASHPAGE_SIZE);
|
||||||
/* the flashpage size must be a multiple of the riotboot flashpage buffer */
|
/* the flashpage size must be a multiple of the riotboot flashpage buffer */
|
||||||
static_assert(!(FLASHPAGE_SIZE % RIOTBOOT_FLASHPAGE_BUFFER_SIZE));
|
static_assert(!(FLASHPAGE_SIZE % RIOTBOOT_FLASHPAGE_BUFFER_SIZE));
|
||||||
|
#else
|
||||||
|
/* The flashpage buffer must be a multiple of the write block size */
|
||||||
|
static_assert(!(RIOTBOOT_FLASHPAGE_BUFFER_SIZE % FLASHPAGE_WRITE_BLOCK_SIZE));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
LOG_INFO(LOG_PREFIX "initializing update to target slot %i\n",
|
LOG_INFO(LOG_PREFIX "initializing update to target slot %i\n",
|
||||||
target_slot);
|
target_slot);
|
||||||
@ -103,15 +109,20 @@ int riotboot_flashwrite_putbytes(riotboot_flashwrite_t *state,
|
|||||||
LOG_DEBUG(LOG_PREFIX "processing bytes %u-%u\n", state->offset, state->offset + len - 1);
|
LOG_DEBUG(LOG_PREFIX "processing bytes %u-%u\n", state->offset, state->offset + len - 1);
|
||||||
|
|
||||||
while (len) {
|
while (len) {
|
||||||
size_t flashpage_pos = state->offset % FLASHPAGE_SIZE;
|
/* Position within the page, calculated from state->offset by
|
||||||
|
* subtracting the start offset of the current page */
|
||||||
|
size_t flashpage_pos = state->offset -
|
||||||
|
(flashpage_addr(state->flashpage) - (void*)riotboot_slot_get_hdr(state->target_slot));
|
||||||
size_t flashwrite_buffer_pos = state->offset % RIOTBOOT_FLASHPAGE_BUFFER_SIZE;
|
size_t flashwrite_buffer_pos = state->offset % RIOTBOOT_FLASHPAGE_BUFFER_SIZE;
|
||||||
size_t flashpage_avail = RIOTBOOT_FLASHPAGE_BUFFER_SIZE - flashwrite_buffer_pos;
|
size_t flashpage_avail = RIOTBOOT_FLASHPAGE_BUFFER_SIZE - flashwrite_buffer_pos;
|
||||||
|
|
||||||
size_t to_copy = min(flashpage_avail, len);
|
size_t to_copy = min(flashpage_avail, len);
|
||||||
|
|
||||||
if (CONFIG_RIOTBOOT_FLASHWRITE_RAW && flashpage_pos == 0) {
|
if (CONFIG_RIOTBOOT_FLASHWRITE_RAW &&
|
||||||
|
flashpage_pos == flashpage_size(state->flashpage)) {
|
||||||
/* Erase the next page */
|
/* Erase the next page */
|
||||||
state->flashpage++;
|
state->flashpage++;
|
||||||
|
flashpage_pos = 0;
|
||||||
flashpage_erase(state->flashpage);
|
flashpage_erase(state->flashpage);
|
||||||
}
|
}
|
||||||
if (CONFIG_RIOTBOOT_FLASHWRITE_RAW &&
|
if (CONFIG_RIOTBOOT_FLASHWRITE_RAW &&
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user