mk_update.py 1.0 KB

123456789101112131415161718192021222324252627282930313233343536
  1. # mk_update.py
  2. #
  3. # Convert a raw firmware binary into an update file for our bootloader:
  4. # N bytes: <raw binary data>
  5. # 2 bytes: 'GW'
  6. # 2 bytes: major, minor
  7. # 2 bytes: 0, 0
  8. # 2 bytes: CRC16-CCITT, seed 0xFFFF, stored big endian
  9. #
  10. # Written & released by Keir Fraser <keir.xen@gmail.com>
  11. #
  12. # This is free and unencumbered software released into the public domain.
  13. # See the file COPYING for more details, or visit <http://unlicense.org>.
  14. import crcmod.predefined
  15. import struct, sys
  16. from greaseweazle import version
  17. def main(argv):
  18. in_f = open(argv[1], "rb")
  19. out_f = open(argv[2], "wb")
  20. in_dat = in_f.read()
  21. in_len = len(in_dat)
  22. assert (in_len & 3) == 0, "input is not longword padded"
  23. crc16 = crcmod.predefined.Crc('crc-ccitt-false')
  24. out_f.write(in_dat)
  25. crc16.update(in_dat)
  26. in_dat = struct.pack("2s4B", b'GW', version.major, version.minor, 0, 0)
  27. out_f.write(in_dat)
  28. crc16.update(in_dat)
  29. in_dat = struct.pack(">H", crc16.crcValue)
  30. out_f.write(in_dat)
  31. if __name__ == "__main__":
  32. main(sys.argv)