| #!/usr/bin/env python3 |
| |
| import argparse |
| import os |
| import struct |
| import sys |
| |
| def read(path): |
| with open(path, "rb") as f: |
| return f.read() |
| |
| def write(path, data): |
| with open(path, "wb") as f: |
| f.write(data) |
| |
| def padding(data, size, pattern = b'\0'): |
| return data + pattern * (size - len(data)) |
| |
| def align(data, size, pattern = b'\0'): |
| return padding(data, (len(data) + (size - 1)) & ~(size - 1), pattern) |
| |
| def gen_nor_bl_img(data): |
| data = align(data, 512, '\xff') |
| header = (padding(struct.pack("<12sII", "SF_BOOT", 1, 512), 512, '\xff') + |
| padding(struct.pack("<8sIIIIIIII", "BRLYT", 1, 2048, 2048 + len(data), |
| 0x42424242, 0x00010007, 2048, 2048 + len(data), 1) + '\0' * 140, 512, '\xff') + |
| '\0' * 1024) |
| return header + data |
| |
| def gen_emmc_bl_img(data): |
| data = align(data, 512, b'\xff') |
| header = (padding(struct.pack("<12sII", b"EMMC_BOOT", 1, 512), 512, b'\xff') + |
| padding(struct.pack("<8sIIIIIIII", b"BRLYT", 1, 2048, 2048 + len(data), |
| 0x42424242, 0x00010005, 2048, 2048 + len(data), 1) + b'\0' * 140, 512, b'\xff') + |
| b'\0' * 1024) |
| return header + data |
| |
| def gen_sdcard_bl_img(data): |
| data = align(data, 512, '\xff') |
| header = (padding(struct.pack("<12sII", "SDMMC_BOOT", 1, 512), 512, '\xff') + |
| padding(struct.pack("<8sIIIIIIII", "BRLYT", 1, 2048, 2048 + len(data), |
| 0x42424242, 0x00010008, 2048, 2048 + len(data), 1) + '\0' * 140, 512, '\xff') + |
| '\0' * 1024) |
| return header + data |
| |
| def get_page_size(nand_name): |
| with open("scripts/nand-setting.txt", "r") as f: |
| for l in f: |
| s = l.split("\t") |
| if s[0] == nand_name: |
| return int(s[1]) |
| raise KeyError("not support " + nand_name) |
| |
| def gen_nand_bl_img(data, nand_name, page_number_bl1, page_number_bl2): |
| hdr1 = "temp1.hdr" |
| hdr2 = "temp2.hdr" |
| page_size = get_page_size(nand_name) |
| data = align(data, 128*page_size, '\xff') |
| os.system("./tools/bch h {0} null {1} 1 {2} 0 0".format(nand_name, hdr1, page_number_bl1)) |
| os.system("./tools/bch h {0} null {1} 1 {2} 0 0".format(nand_name, hdr2, page_number_bl2)) |
| header1 = padding(read(hdr1), 256*page_size, '\xff') |
| header2 = padding(read(hdr2), 256*page_size, '\xff') |
| os.remove(hdr1) |
| os.remove(hdr2) |
| return header1 + header2 + data + data |
| |
| def main(argv): |
| parser = argparse.ArgumentParser() |
| parser.add_argument('type', default='emmc', help='emmc | nand | nor | sdcard') |
| parser.add_argument('in_image', help='input file path') |
| parser.add_argument('out_image', help='output image path') |
| parser.add_argument('nand_name', nargs='?', help='nand chip name') |
| parser.add_argument('bl1', type=int, nargs='?', default=0, help='page number of bl1. default=0') |
| parser.add_argument('bl2', type=int, nargs='?', default=0, help='page number of bl2. default=0') |
| args = parser.parse_args() |
| |
| if args.type == 'emmc': |
| r = gen_emmc_bl_img(read(args.in_image)) |
| elif args.type == 'nor': |
| r = gen_nor_bl_img(read(args.in_image)) |
| elif args.type == 'sdcard': |
| r = gen_sdcard_bl_img(read(args.in_image)) |
| elif args.type == 'nand': |
| r = gen_nand_bl_img(read(args.in_image), args.nand_name, args.bl1, args.bl2) |
| else: |
| print("unknown type: " + args.type) |
| return 1 |
| |
| write(args.out_image, r) |
| return 0 |
| |
| if __name__ == "__main__": |
| sys.exit(main(sys.argv)) |