| #!/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() |