Steward
分享是一種喜悅、更是一種幸福
掌機 - Miyoo Mini Flip - 如何更新U-Boot Environment CRC32
CRC32結果位於:0x5f000
CRC32計算長度:0x5f004~0x60000
Environment Variables:0x5f004~0x60000
計算方式如下:
import os
import sys
import struct
FILE = sys.argv[1]
CRC_START = 0x5f004
CRC_END = 0x60000
CRC_POS = 0x5f000
def crc32b(data):
crc = 0xffffffff
for byte in data:
crc ^= byte
for _ in range(8):
mask = -(crc & 1)
crc = (crc >> 1) ^ (0xedb88320 & mask)
return (~crc) & 0xffffffff
with open(FILE, "r+b") as f:
f.seek(CRC_START)
data = f.read(CRC_END - CRC_START)
if len(data) != CRC_END - CRC_START:
raise RuntimeError(
f"read {len(data):#x} bytes, "
f"expected {CRC_END - CRC_START:#x} bytes"
)
crc = crc32b(data)
print(f"CRC32 = 0x{crc:08x}")
f.seek(CRC_POS)
f.write(struct.pack("<I", crc))
print(f"Written to 0x{CRC_POS:05x}")
執行
$ python3 ./patch.py spi.bin
CRC32 = 0x60847167
Written to 0x5f000