Skip to content

Commit 946bf0c

Browse files
committed
fix(flash): Fix system hung caused by flash write
1) flash write source buffer should not be in the same flash 2) remove wdt enable code as it's for debug purpose
1 parent dd4735e commit 946bf0c

2 files changed

Lines changed: 36 additions & 7 deletions

File tree

src/fw/drivers/flash/sf32lb52_int_flash.c

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,28 @@ static int prv_write_nor(uint32_t addr, uint8_t *buf, uint32_t size) {
108108
uint32_t taddr, start, remain, fill;
109109
uint8_t *tbuf;
110110
int res;
111-
112-
__disable_irq();
111+
uint8_t *local_buf = NULL;
113112

114113
hflash = &spi_flash_handle.handle;
115114

116-
HAL_FLASH_SET_WDT(hflash, UINT16_MAX);
117115
if ((addr < hflash->base) || (addr > (hflash->base + hflash->size))) return 0;
118116

117+
if (IS_SAME_FLASH_ADDR(buf, addr) || IS_SPI_NONDMA_RAM_ADDR(buf)
118+
|| (IS_DMA_ACCROSS_1M_BOUNDARY((uint32_t)buf, size)))
119+
{
120+
local_buf = (uint8_t *)malloc(size);
121+
PBL_ASSERT(local_buf != NULL, "malloc failed");
122+
memcpy(local_buf, buf, size);
123+
tbuf = local_buf;
124+
}
125+
else
126+
{
127+
tbuf = buf;
128+
}
129+
130+
__disable_irq();
131+
119132
taddr = addr - hflash->base;
120-
tbuf = (uint8_t *)buf;
121133
remain = size;
122134

123135
start = taddr & (QSPI_NOR_PAGE_SIZE - 1);
@@ -129,22 +141,39 @@ static int prv_write_nor(uint32_t addr, uint8_t *buf, uint32_t size) {
129141
fill = size;
130142
}
131143
res = HAL_QSPIEX_WRITE_PAGE(hflash, taddr, tbuf, fill);
132-
if ((uint32_t)res != fill) return 0;
144+
145+
if ((uint32_t)res != fill)
146+
{
147+
size = 0;
148+
goto __EXIT;
149+
}
133150
taddr += fill;
134151
tbuf += fill;
135152
remain -= fill;
136153
}
137154
while (remain > 0) {
138155
fill = remain > QSPI_NOR_PAGE_SIZE ? QSPI_NOR_PAGE_SIZE : remain;
139156
res = HAL_QSPIEX_WRITE_PAGE(hflash, taddr, tbuf, fill);
140-
if ((uint32_t)res != fill) return 0;
157+
if ((uint32_t)res != fill)
158+
{
159+
size = 0;
160+
goto __EXIT;
161+
}
162+
141163
taddr += fill;
142164
tbuf += fill;
143165
remain -= fill;
144166
}
145167

168+
169+
__EXIT:
146170
__enable_irq();
147-
171+
172+
if (local_buf)
173+
{
174+
free(local_buf);
175+
}
176+
148177
return size;
149178
}
150179

tools/sf32tool/sftool

100644100755
File mode changed.

0 commit comments

Comments
 (0)