|
31 | 31 | from micropython import const
|
32 | 32 | from time import sleep
|
33 | 33 | import binascii
|
| 34 | +import gc |
34 | 35 |
|
35 | 36 | _CMD_SYNC = const(0x08)
|
36 | 37 | _CMD_CHANGE_BAUDRATE = const(0x0F)
|
@@ -113,8 +114,11 @@ def _poll_reg(self, addr, flag, retry=10, delay=0.050):
|
113 | 114 | raise Exception(f"Register poll timeout. Addr: 0x{addr:02X} Flag: 0x{flag:02X}.")
|
114 | 115 |
|
115 | 116 | def _write_slip(self, pkt):
|
| 117 | + gc.collect() |
116 | 118 | pkt = pkt.replace(b"\xDB", b"\xdb\xdd").replace(b"\xc0", b"\xdb\xdc")
|
117 |
| - self.uart.write(b"\xC0" + pkt + b"\xC0") |
| 119 | + self.uart.write(b"\xC0") |
| 120 | + self.uart.write(pkt) |
| 121 | + self.uart.write(b"\xC0") |
118 | 122 | self._log(pkt)
|
119 | 123 |
|
120 | 124 | def _read_slip(self):
|
@@ -256,32 +260,31 @@ def flash_write_file(self, path, blksize=0x1000):
|
256 | 260 | total_blocks = (size + blksize - 1) // blksize
|
257 | 261 | erase_blocks = 1
|
258 | 262 | print(f"Flash write size: {size} total_blocks: {total_blocks} block size: {blksize}")
|
| 263 | + gc.collect() |
| 264 | + buf = bytearray(blksize + 16) |
| 265 | + erase_cmd = bytearray(16) |
| 266 | + mv = memoryview(buf) |
259 | 267 | with open(path, "rb") as f:
|
260 | 268 | seq = 0
|
261 | 269 | subseq = 0
|
262 | 270 | for i in range(total_blocks):
|
263 |
| - buf = f.read(blksize) |
| 271 | + nread = f.readinto(mv[16: 16 + blksize]) |
264 | 272 | # Update digest
|
265 | 273 | if self.md5sum is not None:
|
266 |
| - self.md5sum.update(buf) |
| 274 | + self.md5sum.update(mv[16:16 + blksize]) |
267 | 275 | # The last data block should be padded to the block size with 0xFF bytes.
|
268 |
| - if len(buf) < blksize: |
269 |
| - buf += b"\xFF" * (blksize - len(buf)) |
270 |
| - checksum = self._checksum(buf) |
| 276 | + if nread < blksize: |
| 277 | + mv[nread + 16, blksize + 16] = b"\xFF" * (blksize - nread) |
| 278 | + checksum = self._checksum(mv[16: 16 + blksize]) |
271 | 279 | if seq % erase_blocks == 0:
|
272 | 280 | # print(f"Erasing {seq} -> {seq+erase_blocks}...")
|
273 |
| - self._command( |
274 |
| - _CMD_SPI_FLASH_BEGIN, |
275 |
| - struct.pack( |
276 |
| - "<IIII", erase_blocks * blksize, erase_blocks, blksize, seq * blksize |
277 |
| - ), |
278 |
| - ) |
| 281 | + struct.pack_into( |
| 282 | + "<IIII", erase_cmd, 0, erase_blocks * blksize, erase_blocks, blksize, seq * blksize |
| 283 | + ), |
| 284 | + self._command(_CMD_SPI_FLASH_BEGIN, erase_cmd) |
279 | 285 | print(f"Writing sequence number {seq}/{total_blocks}...")
|
280 |
| - self._command( |
281 |
| - _CMD_SPI_FLASH_DATA, |
282 |
| - struct.pack("<IIII", len(buf), seq % erase_blocks, 0, 0) + buf, |
283 |
| - checksum, |
284 |
| - ) |
| 286 | + struct.pack_into("<IIII", mv[0: 16], 0, nread, seq % erase_blocks, 0, 0) |
| 287 | + self._command(_CMD_SPI_FLASH_DATA, buf, checksum) |
285 | 288 | seq += 1
|
286 | 289 |
|
287 | 290 | print("Flash write finished")
|
|
0 commit comments