掌機 - Miyoo Mini Flip - Update U-Boot Env



update.py

import sys
import struct

FILE = sys.argv[1]
ENV_FILE = sys.argv[2]

CRC_POS   = 0x5f000
CRC_START = 0x5f004
CRC_END   = 0x60000

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(ENV_FILE, "r", encoding="utf-8") as f:
    lines = []

    for line in f:
        line = line.rstrip("\r\n")

        if not line:
            continue

        lines.append(line.encode("utf-8"))

env_data = b"\0".join(lines) + b"\0\0"
env_size = CRC_END - CRC_START

if len(env_data) > env_size:
    print(
        f"ERROR: environment too large: "
        f"0x{len(env_data):x} bytes, "
        f"maximum 0x{env_size:x} bytes"
    )
    sys.exit(1)

with open(FILE, "r+b") as f:
    f.seek(CRC_START)
    f.write(b"\xff" * env_size)
    f.seek(CRC_START)
    f.write(env_data)
    f.seek(CRC_START)
    data = f.read(env_size)

    if len(data) != env_size:
        raise RuntimeError("Failed to read CRC area")

    crc = crc32b(data)
    f.seek(CRC_POS)
    f.write(struct.pack("<I", crc))

print(f"Environment variables : {len(lines)}")
print(f"Environment size      : 0x{len(env_data):x}")
print(f"Environment area      : 0x{CRC_START:05x} ~ 0x{CRC_END:05x}")
print(f"CRC position          : 0x{CRC_POS:05x}")
print(f"CRC32                 : 0x{crc:08x}")

env.txt

SdUpgradeImage=miyoo285_fw.img
baudrate=115200
bootargs=console=ttyS0,115200 root=/dev/mtdblock4 rootfstype=squashfs ro init=/linuxrc LX_MEM=0x7f00000 mma_heap=mma_heap_name0,miu=0,sz=0x1500000 mma_memblock_remove=1 highres=off mmap_reserved=fb,miu=0,sz=0x300000,max_start_off=0x7C00000,max_end_off=0x7F00000
bootcmd=gpio output 73 1;sleepms 50;gpio output 73 0;sleepms 150;gpio output 73 1;sleepms 200;gpio output 85 1; bootlogo 0 0 0 0 0; mw 1f001cc0 11; gpio out 8 0; sf probe 0;sf read 0x22000000 ${sf_kernel_start} ${sf_kernel_size}; gpio out 8 1; sleepms 1000; gpio output 4 1; bootm 0x22000000
bootdelay=0
cpu_part_start=14270000
dispout=LCD752560
ethact=sstar_emac
ethaddr=00:30:1b:ba:02:db
filesize=1e4f0
miyoo_version=202510011046
sf_kernel_size=200000
sf_kernel_start=60000
sf_part_size=20000
sf_part_start=270000
stderr=serial
stdin=serial
stdout=serial
usb_folder=images

更新U-Boot Env

$ python3 ./update.py spi.bin env.txt 
    Environment variables : 19
    Environment size      : 0x375
    Environment area      : 0x5f004 ~ 0x60000
    CRC position          : 0x5f000
    CRC32                 : 0xc98bf04e