xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame^] | 1 | #!/usr/bin/env python3 |
| 2 | |
| 3 | import argparse |
| 4 | import os |
| 5 | import struct |
| 6 | import sys |
| 7 | |
| 8 | def read(path): |
| 9 | with open(path, "rb") as f: |
| 10 | return f.read() |
| 11 | |
| 12 | def write(path, data): |
| 13 | with open(path, "wb") as f: |
| 14 | f.write(data) |
| 15 | |
| 16 | def padding(data, size, pattern = b'\0'): |
| 17 | return data + pattern * (size - len(data)) |
| 18 | |
| 19 | def align(data, size, pattern = b'\0'): |
| 20 | return padding(data, (len(data) + (size - 1)) & ~(size - 1), pattern) |
| 21 | |
| 22 | def gen_nor_bl_img(data): |
| 23 | data = align(data, 512, '\xff') |
| 24 | header = (padding(struct.pack("<12sII", "SF_BOOT", 1, 512), 512, '\xff') + |
| 25 | padding(struct.pack("<8sIIIIIIII", "BRLYT", 1, 2048, 2048 + len(data), |
| 26 | 0x42424242, 0x00010007, 2048, 2048 + len(data), 1) + '\0' * 140, 512, '\xff') + |
| 27 | '\0' * 1024) |
| 28 | return header + data |
| 29 | |
| 30 | def gen_emmc_bl_img(data): |
| 31 | data = align(data, 512, b'\xff') |
| 32 | header = (padding(struct.pack("<12sII", b"EMMC_BOOT", 1, 512), 512, b'\xff') + |
| 33 | padding(struct.pack("<8sIIIIIIII", b"BRLYT", 1, 2048, 2048 + len(data), |
| 34 | 0x42424242, 0x00010005, 2048, 2048 + len(data), 1) + b'\0' * 140, 512, b'\xff') + |
| 35 | b'\0' * 1024) |
| 36 | return header + data |
| 37 | |
| 38 | def gen_sdcard_bl_img(data): |
| 39 | data = align(data, 512, '\xff') |
| 40 | header = (padding(struct.pack("<12sII", "SDMMC_BOOT", 1, 512), 512, '\xff') + |
| 41 | padding(struct.pack("<8sIIIIIIII", "BRLYT", 1, 2048, 2048 + len(data), |
| 42 | 0x42424242, 0x00010008, 2048, 2048 + len(data), 1) + '\0' * 140, 512, '\xff') + |
| 43 | '\0' * 1024) |
| 44 | return header + data |
| 45 | |
| 46 | def get_page_size(nand_name): |
| 47 | with open("scripts/nand-setting.txt", "r") as f: |
| 48 | for l in f: |
| 49 | s = l.split("\t") |
| 50 | if s[0] == nand_name: |
| 51 | return int(s[1]) |
| 52 | raise KeyError("not support " + nand_name) |
| 53 | |
| 54 | def gen_nand_bl_img(data, nand_name, page_number_bl1, page_number_bl2): |
| 55 | hdr1 = "temp1.hdr" |
| 56 | hdr2 = "temp2.hdr" |
| 57 | page_size = get_page_size(nand_name) |
| 58 | data = align(data, 128*page_size, '\xff') |
| 59 | os.system("./tools/bch h {0} null {1} 1 {2} 0 0".format(nand_name, hdr1, page_number_bl1)) |
| 60 | os.system("./tools/bch h {0} null {1} 1 {2} 0 0".format(nand_name, hdr2, page_number_bl2)) |
| 61 | header1 = padding(read(hdr1), 256*page_size, '\xff') |
| 62 | header2 = padding(read(hdr2), 256*page_size, '\xff') |
| 63 | os.remove(hdr1) |
| 64 | os.remove(hdr2) |
| 65 | return header1 + header2 + data + data |
| 66 | |
| 67 | def main(argv): |
| 68 | parser = argparse.ArgumentParser() |
| 69 | parser.add_argument('type', default='emmc', help='emmc | nand | nor | sdcard') |
| 70 | parser.add_argument('in_image', help='input file path') |
| 71 | parser.add_argument('out_image', help='output image path') |
| 72 | parser.add_argument('nand_name', nargs='?', help='nand chip name') |
| 73 | parser.add_argument('bl1', type=int, nargs='?', default=0, help='page number of bl1. default=0') |
| 74 | parser.add_argument('bl2', type=int, nargs='?', default=0, help='page number of bl2. default=0') |
| 75 | args = parser.parse_args() |
| 76 | |
| 77 | if args.type == 'emmc': |
| 78 | r = gen_emmc_bl_img(read(args.in_image)) |
| 79 | elif args.type == 'nor': |
| 80 | r = gen_nor_bl_img(read(args.in_image)) |
| 81 | elif args.type == 'sdcard': |
| 82 | r = gen_sdcard_bl_img(read(args.in_image)) |
| 83 | elif args.type == 'nand': |
| 84 | r = gen_nand_bl_img(read(args.in_image), args.nand_name, args.bl1, args.bl2) |
| 85 | else: |
| 86 | print("unknown type: " + args.type) |
| 87 | return 1 |
| 88 | |
| 89 | write(args.out_image, r) |
| 90 | return 0 |
| 91 | |
| 92 | if __name__ == "__main__": |
| 93 | sys.exit(main(sys.argv)) |