mksunxi.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #!/usr/bin/env python3
  2. import sys
  3. import struct
  4. def align(num, alignment):
  5. if num % alignment != 0:
  6. num += (alignment - num % alignment)
  7. return num
  8. def process_file(input, output):
  9. with open(input, 'rb') as fin:
  10. content = bytearray(fin.read())
  11. align_value = 512
  12. padded_length = align(len(content), align_value)
  13. # pad file to actual length
  14. content += b'\x00' * (padded_length - len(content))
  15. struct_format = '<L8sLL'
  16. (instruction, magic, checksum, length) = struct.unpack_from(struct_format, content)
  17. if magic != b'eGON.BT0':
  18. print("Magic is invalid:", magic)
  19. return 2
  20. checksum = 0x5F0A6C39
  21. length = align(length, align_value)
  22. struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
  23. checksum = 0
  24. for i in range(0, length, 4):
  25. (n, ) = struct.unpack_from('<L', content, i)
  26. checksum += n
  27. checksum %= 4294967296
  28. struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
  29. with open(output, 'wb') as fout:
  30. fout.write(content)
  31. return 0
  32. if __name__ == "__main__":
  33. if len(sys.argv) != 3:
  34. print("Usage: mksunxi.py input.bin output.bin")
  35. exit(1)
  36. exit(process_file(sys.argv[1], sys.argv[2]))