48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| import sys
 | |
| import struct
 | |
| 
 | |
| def align(num, alignment):
 | |
|     if num % alignment != 0:
 | |
|         num += (alignment - num % alignment)
 | |
|     return num
 | |
| 
 | |
| 
 | |
| def process_file(input, output):
 | |
|     with open(input, 'rb') as fin:
 | |
|         content = bytearray(fin.read())
 | |
| 
 | |
|     align_value = 512
 | |
|     padded_length = align(len(content), align_value)
 | |
|     # pad file to actual length
 | |
|     content += b'\x00' * (padded_length - len(content))
 | |
| 
 | |
|     struct_format = '<L8sLL'
 | |
|     (instruction, magic, checksum, length) = struct.unpack_from(struct_format, content)
 | |
| 
 | |
|     if magic != b'eGON.BT0':
 | |
|         print("Magic is invalid:", magic)
 | |
|         return 2
 | |
| 
 | |
|     checksum = 0x5F0A6C39
 | |
|     length = align(length, align_value)
 | |
| 
 | |
|     struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
 | |
| 
 | |
|     checksum = 0
 | |
|     for i in range(0, length, 4):
 | |
|         (n, ) = struct.unpack_from('<L', content, i)
 | |
|         checksum += n
 | |
|         checksum %= 4294967296
 | |
| 
 | |
|     struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)
 | |
| 
 | |
|     with open(output, 'wb') as fout:
 | |
|         fout.write(content)
 | |
|     return 0
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     if len(sys.argv) != 3:
 | |
|         print("Usage: mksunxi.py input.bin output.bin")
 | |
|         exit(1)
 | |
|     exit(process_file(sys.argv[1], sys.argv[2])) | 
