#!/usr/bin/env python3 """ Extract SPL and U-Boot images from an Allwinner boot image """ import argparse import mmap from pathlib import Path import struct import sys SPL_SIGNATURE = b"eGON.BT0" # The SPL can be located at different locations depending on the SoC type SPL_OFFSETS = [8 * 1024, 128 * 1024, 256 * 1024] SPL_FILENAME = "spl.img" UBOOT_SIGNATURE = b"sunxi-package" UBOOT_OFFSET = 16400 * 1024 UBOOT_FILENAME = "u-boot.img" class InvalidImageError(Exception): pass def extract_blobs(image: Path, output_dir: Path = Path(), verbose: bool = True): with image.open("rb") as f: # The first partition starts at 36MB: map all space before that into memory mm = mmap.mmap(f.fileno(), 36 * 1024**2, prot=mmap.PROT_READ) spl_offset = spl_size = None for offset in SPL_OFFSETS: sig_offset = offset + 4 if mm[sig_offset : sig_offset + len(SPL_SIGNATURE)] == SPL_SIGNATURE: spl_offset = offset (spl_size,) = struct.unpack("