[loader] initial fix of flash checking

main-solar-only
Richard Meadows 2016-08-05 19:07:23 +01:00
rodzic 91bfcb9d58
commit 7e7dbc10ae
3 zmienionych plików z 15 dodań i 13 usunięć

Wyświetl plik

@ -32,7 +32,7 @@
void mem_read_memory(unsigned int* address, uint8_t* buffer, uint32_t length);
void mem_write_word(unsigned int* address, uint32_t word);
void mem_write_sector(unsigned int* address, uint8_t* buffer);
void mem_write_sector(unsigned int* address, unsigned int* buffer);
void mem_erase_sector(unsigned int* address);

Wyświetl plik

@ -155,9 +155,9 @@ void update_checksums(const uint32_t* nvm, uint32_t* ram, int sectors)
int i;
for (i = 0; i < sectors; i++,
nvm += SECTOR_SIZE, ram += SECTOR_SIZE) {
nvm += 64, ram += 64) {
mem_erase_sector((unsigned int*)nvm);
mem_write_sector((unsigned int*)nvm, (uint8_t*)ram);
mem_write_sector((unsigned int*)nvm, (unsigned int*)ram);
kick_the_watchdog();
}
@ -182,7 +182,7 @@ uint32_t check_and_repair_memory(void)
/* foreach sector */
for (i = 0; i < D1_SECTORS; i++,
address1 += SECTOR_SIZE, address2 += SECTOR_SIZE) {
address1 += 64, address2 += 64) {
/* calculate checksums */
check1 = checksum_sector(address1);
check2 = checksum_sector(address2);
@ -196,7 +196,7 @@ uint32_t check_and_repair_memory(void)
(check2 == d2_checksums_ram[i])) {
/* restore d1 */
mem_erase_sector(address1);
mem_write_sector(address1, (uint8_t*)address2);
mem_write_sector(address1, address2);
/* update d1 checksum */
d1_checksums_ram[i] = check2;
@ -209,7 +209,7 @@ uint32_t check_and_repair_memory(void)
(check2 != d2_checksums_ram[i])) {
/* restore d2 */
mem_erase_sector(address2);
mem_write_sector(address2, (uint8_t*)address1);
mem_write_sector(address2, address1);
/* update d2 checksum */
d2_checksums_ram[i] = check1;
@ -222,7 +222,7 @@ uint32_t check_and_repair_memory(void)
/* both bad, restore d2 and calculate both checksums */
/* restore d2 */
mem_erase_sector(address2);
mem_write_sector(address2, (uint8_t*)address1);
mem_write_sector(address2, address1);
/* update both checksums */
d1_checksums_ram[i] = check1;

Wyświetl plik

@ -86,10 +86,9 @@ void mem_write_word(unsigned int* address, uint32_t word)
/**
* Write 256-byte sector. Address must be sector aligned
*/
void mem_write_sector(unsigned int* address, uint8_t* buffer)
void mem_write_sector(unsigned int* address, unsigned int* buffer)
{
int i;
uint8_t tempbuf[0x40];
#ifdef FIX_ERRATA_REV_C_FLASH_10804
/* save CTRLB and disable cache */
@ -103,9 +102,12 @@ void mem_write_sector(unsigned int* address, uint8_t* buffer)
for (i = 0; i < 4; i++) { /* write by page */
/* write address */
NVMCTRL->ADDR.reg = (uint32_t)(address) >> 1;
/* write page. length must be multiple of two */
memcpy((void*)tempbuf, buffer, 0x40);
memcpy((void*)address, tempbuf, 0x40);
for (int j = 0; j < 0x10; j++) {
address[j] = buffer[j];
}
/* unlock */
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_UR;
/* write page */
@ -115,8 +117,8 @@ void mem_write_sector(unsigned int* address, uint8_t* buffer)
NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_LR;
/* next page */
address += 0x40;
buffer += 0x40;
address += 0x10;
buffer += 0x10;
}