fix(radio): use correct flash size instead of 2MB (#6562)

This commit is contained in:
Raphael Coeffic
2025-09-01 10:22:42 +10:00
committed by GitHub
parent cc154493b5
commit f141229222
3 changed files with 22 additions and 19 deletions
+2 -4
View File
@@ -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;
+20 -4
View File
@@ -35,6 +35,17 @@
#include <string.h>
#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);
-11
View File
@@ -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();