#!/usr/bin/env python3 """ Whole Flash Image Tag { u32 crc32; u32 version; u32 chipID; u32 flashType; u32 flags; } CRC32: Ethernet (Poly 0x04C11DB7) Version: 0x00005700: Any version 0x00005731: NAND 1MB data partition 0x00005732: Normal version Chip ID: Broadcom Chip ID 0x00006328: BCM6328 0x00006362: BCM6362 0x00006368: BCM6368 0x00063268: BCM63268 Flash Type: 1: NOR 2: NAND 16k blocks 3: NAND 128k blocks 4: NAND 256k blocks 5: NAND 512k blocks 6: NAND 1MB blocks 7: NAND 2MB blocks Flags: 0x00000001: PMC 0x00000002: Secure BootROM """ import argparse import os import struct import binascii def auto_int(x): return int(x, 0) def create_tag(args, in_bytes): # JAM CRC32 is bitwise not and unsigned crc = ~binascii.crc32(in_bytes) & 0xFFFFFFFF tag = struct.pack( ">IIIII", crc, args.tag_version, args.chip_id, args.flash_type, args.flags, ) return tag def create_output(args): in_st = os.stat(args.input_file) in_size = in_st.st_size in_f = open(args.input_file, "r+b") in_bytes = in_f.read(in_size) in_f.close() tag = create_tag(args, in_bytes) out_f = open(args.output_file, "w+b") out_f.write(in_bytes) out_f.write(tag) out_f.close() def main(): global args parser = argparse.ArgumentParser(description="") parser.add_argument( "--input-file", dest="input_file", action="store", type=str, help="Input file", ) parser.add_argument( "--output-file", dest="output_file", action="store", type=str, help="Output file", ) parser.add_argument( "--version", dest="tag_version", action="store", type=auto_int, help="WFI Tag Version", ) parser.add_argument( "--chip-id", dest="chip_id", action="store", type=auto_int, help="WFI Chip ID", ) parser.add_argument( "--flash-type", dest="flash_type", action="store", type=auto_int, help="WFI Flash Type", ) parser.add_argument( "--flags", dest="flags", action="store", type=auto_int, help="WFI Flags" ) args = parser.parse_args() if not args.flags: args.flags = 0 if ( (not args.input_file) or (not args.output_file) or (not args.tag_version) or (not args.chip_id) or (not args.flash_type) ): parser.print_help() else: create_output(args) main()