mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-27 01:48:17 +00:00
boardloader, bootloader: reorder erasing of sectors, check whether sector was really erased
This commit is contained in:
parent
b1d9a59a79
commit
6ea9b105e5
@ -75,7 +75,6 @@ static bool copy_sdcard(void)
|
|||||||
uint8_t sectors[] = {
|
uint8_t sectors[] = {
|
||||||
FLASH_SECTOR_STORAGE_1,
|
FLASH_SECTOR_STORAGE_1,
|
||||||
FLASH_SECTOR_STORAGE_2,
|
FLASH_SECTOR_STORAGE_2,
|
||||||
FLASH_SECTOR_PIN_AREA,
|
|
||||||
FLASH_SECTOR_BOOTLOADER,
|
FLASH_SECTOR_BOOTLOADER,
|
||||||
FLASH_SECTOR_FIRMWARE_START,
|
FLASH_SECTOR_FIRMWARE_START,
|
||||||
7,
|
7,
|
||||||
@ -94,8 +93,9 @@ static bool copy_sdcard(void)
|
|||||||
21,
|
21,
|
||||||
22,
|
22,
|
||||||
FLASH_SECTOR_FIRMWARE_EXTRA_END,
|
FLASH_SECTOR_FIRMWARE_EXTRA_END,
|
||||||
|
FLASH_SECTOR_PIN_AREA,
|
||||||
};
|
};
|
||||||
if (!flash_erase_sectors(sectors, 2 + 1 + 1 + 6 + 4 + 7, progress_callback)) {
|
if (!flash_erase_sectors(sectors, 2 + 1 + 6 + 4 + 7 + 1, progress_callback)) {
|
||||||
display_printf(" failed\n");
|
display_printf(" failed\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -153,7 +153,10 @@ int main(void)
|
|||||||
#if PRODUCTION
|
#if PRODUCTION
|
||||||
flash_set_option_bytes();
|
flash_set_option_bytes();
|
||||||
if (!flash_check_option_bytes()) {
|
if (!flash_check_option_bytes()) {
|
||||||
uint8_t sectors[] = {FLASH_SECTOR_STORAGE_1, FLASH_SECTOR_STORAGE_2};
|
uint8_t sectors[] = {
|
||||||
|
FLASH_SECTOR_STORAGE_1,
|
||||||
|
FLASH_SECTOR_STORAGE_2,
|
||||||
|
};
|
||||||
flash_erase_sectors(sectors, 2, NULL);
|
flash_erase_sectors(sectors, 2, NULL);
|
||||||
ensure(0, "wrong option bytes");
|
ensure(0, "wrong option bytes");
|
||||||
}
|
}
|
||||||
|
@ -356,7 +356,6 @@ int process_msg_WipeDevice(uint8_t iface_num, uint32_t msg_size, uint8_t *buf)
|
|||||||
uint8_t sectors[] = {
|
uint8_t sectors[] = {
|
||||||
FLASH_SECTOR_STORAGE_1,
|
FLASH_SECTOR_STORAGE_1,
|
||||||
FLASH_SECTOR_STORAGE_2,
|
FLASH_SECTOR_STORAGE_2,
|
||||||
FLASH_SECTOR_PIN_AREA,
|
|
||||||
FLASH_SECTOR_FIRMWARE_START,
|
FLASH_SECTOR_FIRMWARE_START,
|
||||||
7,
|
7,
|
||||||
8,
|
8,
|
||||||
@ -374,8 +373,9 @@ int process_msg_WipeDevice(uint8_t iface_num, uint32_t msg_size, uint8_t *buf)
|
|||||||
21,
|
21,
|
||||||
22,
|
22,
|
||||||
FLASH_SECTOR_FIRMWARE_EXTRA_END,
|
FLASH_SECTOR_FIRMWARE_EXTRA_END,
|
||||||
|
FLASH_SECTOR_PIN_AREA,
|
||||||
};
|
};
|
||||||
if (!flash_erase_sectors(sectors, 2 + 1 + 6 + 4 + 7, progress_wipe)) {
|
if (!flash_erase_sectors(sectors, 2 + 6 + 4 + 7 + 1, progress_wipe)) {
|
||||||
MSG_SEND_INIT(Failure);
|
MSG_SEND_INIT(Failure);
|
||||||
MSG_SEND_ASSIGN_VALUE(code, FailureType_Failure_ProcessError);
|
MSG_SEND_ASSIGN_VALUE(code, FailureType_Failure_ProcessError);
|
||||||
MSG_SEND_ASSIGN_STRING(message, "Could not erase flash");
|
MSG_SEND_ASSIGN_STRING(message, "Could not erase flash");
|
||||||
|
@ -3,6 +3,38 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "flash.h"
|
#include "flash.h"
|
||||||
|
|
||||||
|
// see docs/memory.md for more information
|
||||||
|
|
||||||
|
#define SECTOR_COUNT 24
|
||||||
|
|
||||||
|
static const uint32_t SECTOR_TABLE[SECTOR_COUNT + 1] = {
|
||||||
|
[ 0] = 0x08000000, // - 0x08003FFF | 16 KiB
|
||||||
|
[ 1] = 0x08004000, // - 0x08007FFF | 16 KiB
|
||||||
|
[ 2] = 0x08008000, // - 0x0800BFFF | 16 KiB
|
||||||
|
[ 3] = 0x0800C000, // - 0x0800FFFF | 16 KiB
|
||||||
|
[ 4] = 0x08010000, // - 0x0801FFFF | 64 KiB
|
||||||
|
[ 5] = 0x08020000, // - 0x0803FFFF | 128 KiB
|
||||||
|
[ 6] = 0x08040000, // - 0x0805FFFF | 128 KiB
|
||||||
|
[ 7] = 0x08060000, // - 0x0807FFFF | 128 KiB
|
||||||
|
[ 8] = 0x08080000, // - 0x0809FFFF | 128 KiB
|
||||||
|
[ 9] = 0x080A0000, // - 0x080BFFFF | 128 KiB
|
||||||
|
[10] = 0x080C0000, // - 0x080DFFFF | 128 KiB
|
||||||
|
[11] = 0x080E0000, // - 0x080FFFFF | 128 KiB
|
||||||
|
[12] = 0x08100000, // - 0x08103FFF | 16 KiB
|
||||||
|
[13] = 0x08104000, // - 0x08107FFF | 16 KiB
|
||||||
|
[14] = 0x08108000, // - 0x0810BFFF | 16 KiB
|
||||||
|
[15] = 0x0810C000, // - 0x0810FFFF | 16 KiB
|
||||||
|
[16] = 0x08110000, // - 0x0811FFFF | 64 KiB
|
||||||
|
[17] = 0x08120000, // - 0x0813FFFF | 128 KiB
|
||||||
|
[18] = 0x08140000, // - 0x0815FFFF | 128 KiB
|
||||||
|
[19] = 0x08160000, // - 0x0817FFFF | 128 KiB
|
||||||
|
[20] = 0x08180000, // - 0x0819FFFF | 128 KiB
|
||||||
|
[21] = 0x081A0000, // - 0x081BFFFF | 128 KiB
|
||||||
|
[22] = 0x081C0000, // - 0x081DFFFF | 128 KiB
|
||||||
|
[23] = 0x081E0000, // - 0x081FFFFF | 128 KiB
|
||||||
|
[24] = 0x08200000, // last element - not a valid sector
|
||||||
|
};
|
||||||
|
|
||||||
int flash_init(void)
|
int flash_init(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -40,6 +72,13 @@ bool flash_erase_sectors(const uint8_t *sectors, int len, void (*progress)(int p
|
|||||||
flash_lock();
|
flash_lock();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// check whether the sector was really deleted (contains only 0xFF)
|
||||||
|
uint32_t addr_start = SECTOR_TABLE[sectors[i]], addr_end = SECTOR_TABLE[sectors[i] + 1];
|
||||||
|
for (uint32_t addr = addr_start; addr < addr_end; addr += 4) {
|
||||||
|
if (*((const uint32_t *)addr) != 0xFFFFFFFF) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (progress) {
|
if (progress) {
|
||||||
progress(i + 1, len);
|
progress(i + 1, len);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,6 @@
|
|||||||
// 22
|
// 22
|
||||||
// 23
|
// 23
|
||||||
#define FLASH_SECTOR_FIRMWARE_EXTRA_END 23
|
#define FLASH_SECTOR_FIRMWARE_EXTRA_END 23
|
||||||
#define FLASH_SECTOR_LAST 23
|
|
||||||
|
|
||||||
int flash_init(void);
|
int flash_init(void);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user