diff --git a/radio/src/bootloader/boot_uf2.cpp b/radio/src/bootloader/boot_uf2.cpp index 0d56b675f..9b4eab203 100644 --- a/radio/src/bootloader/boot_uf2.cpp +++ b/radio/src/bootloader/boot_uf2.cpp @@ -34,8 +34,6 @@ #define FRAME_INTERVAL_MS 20 -extern uf2_fat_write_state_t _uf2_write_state; - void bootloaderUF2() { BootloaderState state = ST_START; @@ -89,7 +87,7 @@ void bootloaderUF2() state = (state == ST_FLASH_DONE) ? ST_REBOOT : ST_START; } else { auto wr_st = uf2_fat_get_state(); - if (wr_st->num_blocks != 0 && wr_st->num_blocks <= UF2_MAX_BLOCKS) { + if (wr_st->num_blocks != 0 && wr_st->num_blocks != UF2_INVALID_NUM_BLOCKS) { state = ST_FLASHING; } } @@ -100,7 +98,7 @@ void bootloaderUF2() bootloaderDrawScreen(state, 0); } else if (state == ST_FLASHING) { auto wr_st = uf2_fat_get_state(); - if (wr_st->num_blocks == 0 || wr_st->num_blocks > UF2_MAX_BLOCKS) { + if (wr_st->num_blocks == 0 || wr_st->num_blocks == UF2_INVALID_NUM_BLOCKS) { state = ST_USB; } else { uint32_t progress = (wr_st->num_written * 100) / wr_st->num_blocks; diff --git a/radio/src/drivers/uf2_ghostfat.cpp b/radio/src/drivers/uf2_ghostfat.cpp index f0fcbf864..79d1c55e2 100644 --- a/radio/src/drivers/uf2_ghostfat.cpp +++ b/radio/src/drivers/uf2_ghostfat.cpp @@ -35,6 +35,17 @@ #include +#if defined(FLASHSIZE) + #define UF2_MAX_FW_SIZE FLASHSIZE +#else + #define UF2_MAX_FW_SIZE (2 * 1024 * 1024) +#endif + +#define UF2_MAX_BLOCKS (UF2_MAX_FW_SIZE / 256) + +#define UF2_ERASE_BLOCK_SIZE (4 * 1024) +#define UF2_ERASE_BLOCKS (UF2_MAX_FW_SIZE / UF2_ERASE_BLOCK_SIZE) + typedef struct { uint8_t JumpInstruction[3]; uint8_t OEMInfo[8]; @@ -219,10 +230,15 @@ static FAT_BootBlock const BootBlock = { static uf2_fat_write_state_t _uf2_write_state; static uint32_t _flash_sz; +static uint32_t _written_mask[UF2_MAX_BLOCKS / sizeof(uint32_t)]; +static uint32_t _erased_mask[UF2_ERASE_BLOCKS / sizeof(uint32_t)]; + void uf2_fat_reset_state() { _flash_sz = 0; memset(&_uf2_write_state, 0, sizeof(_uf2_write_state)); + memset(_written_mask, 0, sizeof(_written_mask)); + memset(_erased_mask, 0, sizeof(_erased_mask)); } const uf2_fat_write_state_t* uf2_fat_get_state() @@ -430,7 +446,7 @@ int uf2_fat_write_block(uint32_t block_no, uint8_t *data) uint32_t pos = erase_sector >> 5; uint32_t addr = bl->targetAddr; - if (wr_st && !(wr_st->erased_mask[pos] & mask)) { + if (wr_st && !(_erased_mask[pos] & mask)) { TRACE_DEBUG("[UF2] erase 0x%08x\n", bl->targetAddr); auto drv = flashFindDriver(addr); @@ -447,7 +463,7 @@ int uf2_fat_write_block(uint32_t block_no, uint8_t *data) while (erased_sectors-- != 0) { pos = erase_sector >> 5; mask = 1 << (erase_sector & 0x1F); - wr_st->erased_mask[pos] |= mask; + _erased_mask[pos] |= mask; erase_sector++; } } @@ -474,8 +490,8 @@ int uf2_fat_write_block(uint32_t block_no, uint8_t *data) if (bl->blockNo < UF2_MAX_BLOCKS) { uint32_t mask = 1 << (bl->blockNo & 0x1F); uint32_t pos = bl->blockNo >> 5; - if (!(wr_st->written_mask[pos] & mask)) { - wr_st->written_mask[pos] |= mask; + if (!(_written_mask[pos] & mask)) { + _written_mask[pos] |= mask; wr_st->num_written++; TRACE_DEBUG("[UF2] wr #%d (%d / %d)\n", bl->blockNo, wr_st->num_written, bl->numBlocks); diff --git a/radio/src/drivers/uf2_ghostfat.h b/radio/src/drivers/uf2_ghostfat.h index 986457fba..39987be61 100644 --- a/radio/src/drivers/uf2_ghostfat.h +++ b/radio/src/drivers/uf2_ghostfat.h @@ -26,20 +26,9 @@ #define UF2_NUM_BLOCKS 32768 // at least 16MB #define UF2_INVALID_NUM_BLOCKS 0xFFFFFFFF -#if !defined(UF2_MAX_FW_SIZE) -#define UF2_MAX_FW_SIZE (2 * 1024 * 1024) -#endif - -#define UF2_MAX_BLOCKS (UF2_MAX_FW_SIZE / 256) - -#define UF2_ERASE_BLOCK_SIZE (4 * 1024) -#define UF2_ERASE_BLOCKS (UF2_MAX_FW_SIZE / UF2_ERASE_BLOCK_SIZE) - typedef struct { uint32_t num_blocks; uint32_t num_written; - uint32_t written_mask[UF2_MAX_BLOCKS / 32]; - uint32_t erased_mask[UF2_ERASE_BLOCKS / 32]; } uf2_fat_write_state_t; void uf2_fat_reset_state();