掌機 - 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