blob: 3084eef37c21f436f53ee41f3e1634aee50bcf3d [file] [log] [blame]
xjb04a4022021-11-25 15:01:52 +08001#!/usr/bin/env python3
2
3import argparse
4import os
5import struct
6import sys
7
8def read(path):
9 with open(path, "rb") as f:
10 return f.read()
11
12def write(path, data):
13 with open(path, "wb") as f:
14 f.write(data)
15
16def padding(data, size, pattern = b'\0'):
17 return data + pattern * (size - len(data))
18
19def align(data, size, pattern = b'\0'):
20 return padding(data, (len(data) + (size - 1)) & ~(size - 1), pattern)
21
22def 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
30def 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
38def 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
46def 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
54def 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
67def 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
92if __name__ == "__main__":
93 sys.exit(main(sys.argv))