1# @Time : 2020/12/31
2# @Author : David Dai
3# @File : mkimage.py
4#!/usr/bin/python2
5
6import os
7import argparse
8import struct
9
10parser = argparse.ArgumentParser()
11
12parser.add_argument('-t', '--type')
13parser.add_argument('-b', '--bin')
14parser.add_argument('-o', '--out', default = "load.bin")
15parser.add_argument('-g', '--img', default = "load.img")
16parser.add_argument('-a', '--addr', default = "0x00000000")
17parser.add_argument('-e', '--ep', default = "0x00000000")
18
19args = parser.parse_args()
20
21args.addr = int(args.addr, 16)
22args.ep = int(args.ep, 16)
23
24def stm32image():
25    checksum = 0
26
27    with open(args.out, 'wb') as f:
28        #write head 'STM32'
29        f.write(struct.pack('<B', 0x53))
30        f.write(struct.pack('<B', 0x54))
31        f.write(struct.pack('<B', 0x4D))
32        f.write(struct.pack('<B', 0x32))
33        for i in range(16):
34            f.write(struct.pack('<I', 0x00000000))
35
36        #write checksum
37        with open(args.bin, 'rb') as b:
38            while(True):
39                raw = b.read(1)
40                if len(raw) == 0:
41                    b.close()
42                    break
43                else:
44                    checksum = checksum + ord(raw)
45        checksum = checksum & 0xffffffff
46        f.write(struct.pack('<I', checksum))
47        f.write(struct.pack('<I', 0x00010000))
48
49        #write size
50        f.write(struct.pack('<I', os.path.getsize(args.bin)))
51        #write entry point
52        f.write(struct.pack('<I', args.ep))
53        f.write(struct.pack('<I', 0x00000000))
54        #write image load
55        f.write(struct.pack('<I', args.addr))
56        f.write(struct.pack('<I', 0x00000000))
57
58        f.write(struct.pack('<I', 0x00000000))
59        f.write(struct.pack('<I', 0x00000001))
60        f.write(struct.pack('<I', 0x00000001))
61        for i in range(37):
62            f.write(struct.pack('<I', 0x00000000))
63
64        #write bin data
65        with open(args.bin, 'rb') as b:
66            while(True):
67                raw = b.read(1024)
68                if len(raw) == 0:
69                    b.close()
70                    break
71                else:
72                    f.write(raw)
73        f.close()
74
75    print('Image Type   : STMicroelectronics STM32 Image')
76    print('Bin File     : %s' % args.bin)
77    print('Out File     : %s' % args.out)
78    print('Image Size   : %d bytes' % os.path.getsize(args.bin))
79    print('Image Load   : 0x%x' % args.addr)
80    print('Entry Point  : 0x%x' % args.ep)
81    print('Checksum     : 0x%x' % checksum)
82
83def imx6ullimage():
84    dcdConfig = [
85        ['0x020c4068', '0xffffffff'],
86        ['0x020c406c', '0xffffffff'],
87        ['0x020c4070', '0xffffffff'],
88        ['0x020c4074', '0xffffffff'],
89        ['0x020c4078', '0xffffffff'],
90        ['0x020c407c', '0xffffffff'],
91        ['0x020c4080', '0xffffffff'],
92        ['0x020E04B4', '0x000C0000'],
93        ['0x020E04AC', '0x00000000'],
94        ['0x020E027C', '0x00000030'],
95        ['0x020E0250', '0x00000030'],
96        ['0x020E024C', '0x00000030'],
97        ['0x020E0490', '0x00000030'],
98        ['0x020E0288', '0x000C0030'],
99        ['0x020E0270', '0x00000000'],
100        ['0x020E0260', '0x00000030'],
101        ['0x020E0264', '0x00000030'],
102        ['0x020E04A0', '0x00000030'],
103        ['0x020E0494', '0x00020000'],
104        ['0x020E0280', '0x00000030'],
105        ['0x020E0284', '0x00000030'],
106        ['0x020E04B0', '0x00020000'],
107        ['0x020E0498', '0x00000030'],
108        ['0x020E04A4', '0x00000030'],
109        ['0x020E0244', '0x00000030'],
110        ['0x020E0248', '0x00000030'],
111        ['0x021B001C', '0x00008000'],
112        ['0x021B0800', '0xA1390003'],
113        ['0x021B080C', '0x00000004'],
114        ['0x021B083C', '0x41640158'],
115        ['0x021B0848', '0x40403237'],
116        ['0x021B0850', '0x40403C33'],
117        ['0x021B081C', '0x33333333'],
118        ['0x021B0820', '0x33333333'],
119        ['0x021B082C', '0xf3333333'],
120        ['0x021B0830', '0xf3333333'],
121        ['0x021B08C0', '0x00944009'],
122        ['0x021B08b8', '0x00000800'],
123        ['0x021B0004', '0x0002002D'],
124        ['0x021B0008', '0x1B333030'],
125        ['0x021B000C', '0x676B52F3'],
126        ['0x021B0010', '0xB66D0B63'],
127        ['0x021B0014', '0x01FF00DB'],
128        ['0x021B0018', '0x00201740'],
129        ['0x021B001C', '0x00008000'],
130        ['0x021B002C', '0x000026D2'],
131        ['0x021B0030', '0x006B1023'],
132        ['0x021B0040', '0x0000004F'],
133        ['0x021B0000', '0x84180000'],
134        ['0x021B0890', '0x00400000'],
135        ['0x021B001C', '0x02008032'],
136        ['0x021B001C', '0x00008033'],
137        ['0x021B001C', '0x00048031'],
138        ['0x021B001C', '0x15208030'],
139        ['0x021B001C', '0x04008040'],
140        ['0x021B0020', '0x00000800'],
141        ['0x021B0818', '0x00000227'],
142        ['0x021B0004', '0x0002552D'],
143        ['0x021B0404', '0x00011006'],
144        ['0x021B001C', '0x00000000']
145        ]
146
147    with open(args.out, 'wb') as f:
148        #write ivt
149        f.write(struct.pack('<B', 0xD1))
150        f.write(struct.pack('>H', 32))
151        f.write(struct.pack('<B', 0x40))
152        f.write(struct.pack('<I', args.addr))
153        f.write(struct.pack('<I', 0x00000000))
154        f.write(struct.pack('<I', args.addr - ((len(dcdConfig) + 318) << 3) - 4))
155        f.write(struct.pack('<I', args.addr - ((len(dcdConfig) + 318) << 3) - 16))
156        f.write(struct.pack('<I', args.addr - ((len(dcdConfig) + 318) << 3) - 48))
157        f.write(struct.pack('<I', 0x00000000))
158        f.write(struct.pack('<I', 0x00000000))
159
160        #write boot data
161        f.write(struct.pack('<I', args.addr - ((len(dcdConfig) + 318) << 3) - 1072))
162        f.write(struct.pack('<I', ((os.path.getsize(args.bin) + 0x1000 - 1) & ~(0x1000 - 1)) + 4096))
163        f.write(struct.pack('<I', 0x00000000))
164
165        #write DCD
166            #dcd header
167        f.write(struct.pack('<B', 0xD2))
168        f.write(struct.pack('>H', (len(dcdConfig) << 3) + 8))
169        f.write(struct.pack('<B', 0x40))
170            #dcd wrute header
171        f.write(struct.pack('<B', 0xCC))
172        f.write(struct.pack('>H', (len(dcdConfig) << 3) + 4))
173        f.write(struct.pack('<B', 0x04))
174            #dcd wrute data
175        for d in dcdConfig:
176            f.write(struct.pack('>I', int(d[0], 16)))
177            f.write(struct.pack('>I', int(d[1], 16)))
178
179        #padding data
180        for i in range(0x27B):
181            f.write(struct.pack('<I', 0x00000000))
182
183        #write bin data
184        with open(args.bin, 'rb') as b:
185            while(True):
186                raw = b.read(1024)
187                if len(raw) == 0:
188                    b.close()
189                    break
190                else:
191                    f.write(raw)
192
193        #padding data
194        for i in range(((os.path.getsize(args.bin) + 0x1000 - 1) & ~(0x1000 - 1)) - os.path.getsize(args.bin)):
195            f.write(struct.pack('<B', 0x00))
196        f.close()
197
198    #build img file
199    with open(args.img, 'wb') as g:
200        #Header write 1K data
201        for i in range(0x100):
202            g.write(struct.pack('<I', 0x00000000))
203
204        #write imx data
205        with open(args.out, 'rb') as f:
206            while(True):
207                raw = f.read(1024)
208                if len(raw) == 0:
209                    f.close()
210                    break
211                else:
212                    g.write(raw)
213        g.close()
214
215    print('Image Type   : Freescale i.MX Boot Image')
216    print('Bin File     : %s' % args.bin)
217    print('IMX File     : %s' % args.out)
218    print('IMG File     : %s' % args.img)
219    print('Image Size   : %d bytes' % os.path.getsize(args.bin))
220    print('Image Load   : 0x%x' % args.addr)
221
222if __name__ == '__main__':
223    if args.bin is not None and args.type is not None:
224        if not os.path.exists(args.bin):
225            print('Bin File : %s is not exist' % args.bin)
226            exit()
227
228        if args.type == 'stm32image':
229            stm32image()
230        elif args.type == "imximage":
231            imx6ullimage()
232        else:
233            print('%s type image no found!' % args.type)
234    else:
235        print('Help : mkimage.py -b [name.bin] -t [stm32image|imx6ullimage]')