(self, offset, length, progress_fn=None)
| 1034 | raise NotImplementedInROMError(self, self.read_flash_slow) |
| 1035 | |
| 1036 | def read_flash(self, offset, length, progress_fn=None): |
| 1037 | if not self.IS_STUB: |
| 1038 | return self.read_flash_slow(offset, length, progress_fn) # ROM-only routine |
| 1039 | |
| 1040 | # issue a standard bootloader command to trigger the read |
| 1041 | self.check_command( |
| 1042 | "read flash", |
| 1043 | self.ESP_READ_FLASH, |
| 1044 | struct.pack("<IIII", offset, length, self.FLASH_SECTOR_SIZE, 64), |
| 1045 | ) |
| 1046 | # now we expect (length // block_size) SLIP frames with the data |
| 1047 | data = b"" |
| 1048 | while len(data) < length: |
| 1049 | p = self.read() |
| 1050 | data += p |
| 1051 | if len(data) < length and len(p) < self.FLASH_SECTOR_SIZE: |
| 1052 | raise FatalError( |
| 1053 | "Corrupt data, expected 0x%x bytes but received 0x%x bytes" |
| 1054 | % (self.FLASH_SECTOR_SIZE, len(p)) |
| 1055 | ) |
| 1056 | self.write(struct.pack("<I", len(data))) |
| 1057 | if progress_fn and (len(data) % 1024 == 0 or len(data) == length): |
| 1058 | progress_fn(len(data), length) |
| 1059 | if progress_fn: |
| 1060 | progress_fn(len(data), length) |
| 1061 | if len(data) > length: |
| 1062 | raise FatalError("Read more than expected") |
| 1063 | |
| 1064 | digest_frame = self.read() |
| 1065 | if len(digest_frame) != 16: |
| 1066 | raise FatalError("Expected digest, got: %s" % hexify(digest_frame)) |
| 1067 | expected_digest = hexify(digest_frame).upper() |
| 1068 | digest = hashlib.md5(data).hexdigest().upper() |
| 1069 | if digest != expected_digest: |
| 1070 | raise FatalError( |
| 1071 | "Digest mismatch: expected %s, got %s" % (expected_digest, digest) |
| 1072 | ) |
| 1073 | return data |
| 1074 | |
| 1075 | def flash_spi_attach(self, hspi_arg): |
| 1076 | """Send SPI attach command to enable the SPI flash pins |
no test coverage detected