Skip to content

Commit aa2abc8

Browse files
committed
Fixed Sam-R21 hal_flash_write()
1 parent d6b38d2 commit aa2abc8

1 file changed

Lines changed: 11 additions & 6 deletions

File tree

hal/samr21.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,19 +166,24 @@ int hal_flash_write(uint32_t address, const uint8_t *data, int len)
166166
NVMCTRLA_REG = (NVMCMD_PBC | NVMCMD_KEY);
167167
while (i < len) {
168168
if ((len - i > 3) && ((((address + i) & 0x03) == 0) && ((((uint32_t)data) + i) & 0x03) == 0)) {
169-
src = (uint32_t *)data;
170169
dst = (uint32_t *)address;
170+
src = (uint32_t *)data;
171171
dst[i >> 2] = src[i >> 2];
172172
i+=4;
173173
} else {
174174
uint32_t val;
175175
uint8_t *vbytes = (uint8_t *)(&val);
176-
int off = (address + i) - (((address + i) >> 2) << 2);
176+
uint32_t off = (address % 4);
177177
dst = (uint32_t *)(address - off);
178-
val = dst[i >> 2];
179-
vbytes[off] = data[i];
180-
dst[i >> 2] = val;
181-
i++;
178+
uint32_t dst_idx = (i + off) >> 2;
179+
val = dst[dst_idx];
180+
while (off < 4) {
181+
if (i < len)
182+
vbytes[off++] = data[i++];
183+
else
184+
off++;
185+
}
186+
dst[dst_idx] = val;
182187
}
183188
}
184189
/* Enable write protection */

0 commit comments

Comments
 (0)