Issue #24: Fix bug in update code
This commit is contained in:
parent
6322c3728b
commit
9bd0dd194b
@ -54,17 +54,43 @@ int flash_writer_write_to_memory(void *dest, const void *src, uint32_t size)
|
|||||||
uint32_t *word_dest_ptr;
|
uint32_t *word_dest_ptr;
|
||||||
const char *char_src_ptr;
|
const char *char_src_ptr;
|
||||||
char *char_dest_ptr;
|
char *char_dest_ptr;
|
||||||
|
uint32_t pre_byte_count;
|
||||||
|
|
||||||
flash_writer_enable_access();
|
flash_writer_enable_access();
|
||||||
while (flash_op_busy());
|
while (flash_op_busy());
|
||||||
|
|
||||||
/* Do the full words */
|
/* Number of full words to program */
|
||||||
full_word_cnt = size / 4u;
|
full_word_cnt = size / 4u;
|
||||||
byte_cnt = size % 4;
|
byte_cnt = size % 4;
|
||||||
|
|
||||||
word_dest_ptr = dest;
|
word_dest_ptr = dest;
|
||||||
word_src_ptr = src;
|
word_src_ptr = src;
|
||||||
|
|
||||||
|
/* Do the first bytes, in case the destination is not word aligned */
|
||||||
|
pre_byte_count = (4 - ((uint32_t)dest % 4u)) % 4;
|
||||||
|
if (pre_byte_count) {
|
||||||
|
FLASH->CR = 0u;
|
||||||
|
FLASH->CR |= FLASH_CR_PG;
|
||||||
|
|
||||||
|
char_src_ptr = src;
|
||||||
|
char_dest_ptr = dest;
|
||||||
|
|
||||||
|
/* Write bytes to memory until we hit the next word aligned address */
|
||||||
|
for (idx = 0; idx < pre_byte_count; idx++) {
|
||||||
|
*(char_dest_ptr++) = *(char_src_ptr++);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Correct the word addresses set above */
|
||||||
|
full_word_cnt = (size - pre_byte_count) / 4u;
|
||||||
|
byte_cnt = (size - pre_byte_count) % 4;
|
||||||
|
word_dest_ptr = (uint32_t *)char_dest_ptr;
|
||||||
|
word_src_ptr = (uint32_t *)char_src_ptr;
|
||||||
|
|
||||||
|
while(flash_op_busy());
|
||||||
|
FLASH->CR = 0u;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Do the full word flash write */
|
||||||
if (full_word_cnt) {
|
if (full_word_cnt) {
|
||||||
FLASH->CR = FLASH_CR_PSIZE_1;
|
FLASH->CR = FLASH_CR_PSIZE_1;
|
||||||
FLASH->CR |= FLASH_CR_PG;
|
FLASH->CR |= FLASH_CR_PG;
|
||||||
@ -76,7 +102,7 @@ int flash_writer_write_to_memory(void *dest, const void *src, uint32_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (flash_op_busy());
|
while (flash_op_busy());
|
||||||
FLASH->CR = 0;
|
FLASH->CR = 0u;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write remaining bytes */
|
/* write remaining bytes */
|
||||||
@ -84,7 +110,7 @@ int flash_writer_write_to_memory(void *dest, const void *src, uint32_t size)
|
|||||||
char_src_ptr = (char *)word_src_ptr;
|
char_src_ptr = (char *)word_src_ptr;
|
||||||
char_dest_ptr = (char *)word_dest_ptr;
|
char_dest_ptr = (char *)word_dest_ptr;
|
||||||
|
|
||||||
FLASH->CR = 0;
|
FLASH->CR = 0u;
|
||||||
FLASH->CR |= FLASH_CR_PG;
|
FLASH->CR |= FLASH_CR_PG;
|
||||||
|
|
||||||
for (idx = 0; idx < byte_cnt; idx++) {
|
for (idx = 0; idx < byte_cnt; idx++) {
|
||||||
@ -94,7 +120,7 @@ int flash_writer_write_to_memory(void *dest, const void *src, uint32_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (flash_op_busy());
|
while (flash_op_busy());
|
||||||
FLASH->CR = 0;
|
FLASH->CR = 0u;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_flash_cr();
|
lock_flash_cr();
|
||||||
|
Loading…
Reference in New Issue
Block a user