mkimage.py 7.8 KB

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