mk_update.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # mk_update.py <bootloader> <main_firmware> <output> <stm_model>
  2. #
  3. # Convert a raw firmware binary into an update file for our bootloader.
  4. #
  5. # Update Format (Little endian, unless otherwise stated):
  6. # Catalogue Header:
  7. # 2 bytes: <length> (excludes Catalogue Header)
  8. # 2 bytes: <hw_model>
  9. # Payload:
  10. # N bytes: <raw binary data>
  11. # Footer:
  12. # 2 bytes: 'GW' or 'BL'
  13. # 2 bytes: major, minor
  14. # 2 bytes: <hw_model>
  15. # 2 bytes: CRC16-CCITT, seed 0xFFFF (big endian, excludes Catalogue Header)
  16. #
  17. # Written & released by Keir Fraser <keir.xen@gmail.com>
  18. #
  19. # This is free and unencumbered software released into the public domain.
  20. # See the file COPYING for more details, or visit <http://unlicense.org>.
  21. import crcmod.predefined
  22. import re, struct, sys
  23. from greaseweazle import version
  24. def mk_cat_entry(dat, hw_model, sig):
  25. max_kb = { 1: { b'BL': 8, b'GW': 56 },
  26. 7: { b'BL': 16, b'GW': 48 } }
  27. dlen = len(dat)
  28. assert (dlen & 3) == 0, "input is not longword padded"
  29. assert dlen <= max_kb[hw_model][sig]*1024, "input is too long"
  30. header = struct.pack("<2H", dlen + 8, hw_model)
  31. footer = struct.pack("<2s2BH", sig, version.major, version.minor, hw_model)
  32. crc16 = crcmod.predefined.Crc('crc-ccitt-false')
  33. crc16.update(dat)
  34. crc16.update(footer)
  35. footer += struct.pack(">H", crc16.crcValue)
  36. return header + dat + footer
  37. def main(argv):
  38. out_f = open(argv[3], "wb")
  39. hw_model = int(re.match("f(\d)", argv[4]).group(1))
  40. with open(argv[2], "rb") as gw_f:
  41. out_f.write(mk_cat_entry(gw_f.read(), hw_model, b'GW'))
  42. with open(argv[1], "rb") as bl_f:
  43. out_f.write(mk_cat_entry(bl_f.read(), hw_model, b'BL'))
  44. if __name__ == "__main__":
  45. main(sys.argv)
  46. # Local variables:
  47. # python-indent: 4
  48. # End: