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]')