| 
									
										
										
										
											2021-12-07 22:53:52 +08:00
										 |  |  | #!/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) | 
					
						
							| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  |     exit(process_file(sys.argv[1], sys.argv[2])) |