解析bin文件信息
This commit is contained in:
		
							
								
								
									
										166
									
								
								bin_to_hex.py
									
									
									
									
									
								
							
							
						
						
									
										166
									
								
								bin_to_hex.py
									
									
									
									
									
								
							| @@ -1,9 +1,11 @@ | ||||
| import re | ||||
| import sys | ||||
|  | ||||
| import struct | ||||
| import json | ||||
|  | ||||
|  | ||||
| # kunlun1,kunlun2,kunlun3的img类型 | ||||
| # FRW是指未压缩的fw CFRW是指压缩之后的fw | ||||
| _ImgType={ | ||||
|   0x0000:"imgROM", # Maybe,ROM doesn't need a imgType */ | ||||
|   0xFC00:"imgSP", # sp */ | ||||
| @@ -45,6 +47,9 @@ _DevType={ | ||||
| } | ||||
|  | ||||
|  | ||||
| _PKT_HEADER_MAGIC_NO = 0x00005566 | ||||
| _IMG_HEADER_MAGIC_NO = 0xa4e49a17 | ||||
|  | ||||
| def load_flash_info(file_name:str): | ||||
|   flash_info_list:list[dict]=[] | ||||
|   with open(file_name,mode='r',encoding='utf-8') as f: | ||||
| @@ -64,9 +69,133 @@ def load_flash_info(file_name:str): | ||||
|   return flash_info_list | ||||
|  | ||||
|  | ||||
| # 查看是不是数据头,不是返回 "",是返回解析值 | ||||
| def tran_pkg_header(data:bytearray): | ||||
|   size=len(data) | ||||
|   ret={} | ||||
|   if(size>=96): | ||||
|     # 大写为无符号 B 单字节 H 双字节 I 4字节 L 4字节 Q 8字节 | ||||
|     # f 单精度浮点 d 双精度浮点 s 字符串 | ||||
|     a=struct.unpack('>BBHIIIIIIIIIIIIIIIIIIIIIIHBB',data) | ||||
|     if(a[5]==_PKT_HEADER_MAGIC_NO): | ||||
|       ret["enctype"]=str(a[0]) | ||||
|       ret["pattern"]=hex(a[1]) | ||||
|       ret["dev_type"]=hex(a[2]) | ||||
|       ret["file_crc"]=hex(a[3]) | ||||
|       ret["file_len"]=str(a[4]) | ||||
|       ret["magic_no"]=hex(a[5]) | ||||
|       ret["version"]=hex(a[6]) | ||||
|       ret["sp_start"]=hex(a[7]) | ||||
|       ret["sp_len"]=str(a[8]) | ||||
|       ret["sbl_start"]=hex(a[9]) # 32bytes | ||||
|       ret["sbl_len"]=str(a[10]) | ||||
|       ret["oem_start"]=hex(a[11]) | ||||
|       ret["oem_len"]=str(a[12]) | ||||
|       ret["pib_start"]=hex(a[13]) | ||||
|       ret["pib_len"]=str(a[14]) | ||||
|       ret["fw_start"]=hex(a[15]) | ||||
|       ret["fw_len"]=str(a[16]) | ||||
|       ret["efuse_start"]=hex(a[17]) # 64bytes | ||||
|       ret["efuse_len"]=str(a[18]) | ||||
|       ret["fw2_start"]=hex(a[19]) | ||||
|       ret["fw2_len"]=str(a[20]) | ||||
|       ret["ref_start"]=hex(a[21]) | ||||
|       ret["ref_len"]=str(a[22]) | ||||
|       ret["cus_start"]=hex(a[23]) | ||||
|       ret["cus_len"]=str(a[24]) | ||||
|       ret["vendor_id"]=hex(a[25]) | ||||
|       ret["img_type"]=hex(a[26]) | ||||
|       ret["img_flag"]=hex(a[27]) | ||||
|       t=str(ret) | ||||
|       t=t.replace(',','\n') | ||||
|       # t=json.dumps(ret, sort_keys=True, indent=2, separators=(',', ': ')) | ||||
|       return t | ||||
|   return "" | ||||
|  | ||||
|  | ||||
| def tran_img_headerv0(data:bytearray): | ||||
|   size=len(data) | ||||
|   ret={} | ||||
|   if(size>=64): | ||||
|     # 大写为无符号 B 单字节 H 双字节 I 4字节 L 4字节 Q 8字节 | ||||
|     # f 单精度浮点 d 双精度浮点 s 字符串 | ||||
|     a=struct.unpack('>HHIHBBIIIBBBBI',data[0:32]) | ||||
|     if(a[8]==_IMG_HEADER_MAGIC_NO): | ||||
|       ret["devType"]=hex(a[0])+f"({_DevType[a[0]]})" | ||||
|       ret["imgType"]=hex(a[1])+f"({_ImgType[a[1]]})" | ||||
|       ret["imgSize"]=str(a[2]) | ||||
|       ret["imgVer"]=hex(a[3]) | ||||
|       ret["psramSize"]=str(a[4]) | ||||
|       ret["hdrVer"]=hex(a[5]) | ||||
|       ret["fwSize"]=str(a[6]) | ||||
|       ret["imgCRC"]=hex(a[7]) | ||||
|       ret["guard"]=hex(a[8]) | ||||
|       ret["layoutIdx"]=hex(a[9]) | ||||
|       # reserved 3bytes | ||||
|       ret["fwCRC"]=hex(a[13]) | ||||
|       ret["sha256"]=data[32:].hex() | ||||
|       t=str(ret) | ||||
|       t=t.replace(',','\n') | ||||
|       return t | ||||
|   return "" | ||||
|  | ||||
| def tran_img_headerv1(data:bytearray): | ||||
|   size=len(data) | ||||
|   ret={} | ||||
|   if(size>=64): | ||||
|     # 大写为无符号 B 单字节 H 双字节 I 4字节 L 4字节 Q 8字节 | ||||
|     # f 单精度浮点 d 双精度浮点 s 字符串 | ||||
|     a=struct.unpack('>BBBBIBBBBIIIBBBBI',data[0:32]) | ||||
|     if(a[11]==_IMG_HEADER_MAGIC_NO): | ||||
|       ret["devType"]=hex(a[0])+f"({_DevType[a[0]]})" | ||||
|       ret["imgType"]=hex(a[1])+f"({_ImgType[a[1]]})" | ||||
|       ret["encType"]=hex(a[2]) | ||||
|       ret["cfg"]=hex(a[3]) | ||||
|       ret["imgSize"]=str(a[4]) | ||||
|       ret["zipType"]=hex(a[5]) | ||||
|       ret["flashSize"]=str(a[6]) | ||||
|       ret["psramSize"]=hex(a[7]) | ||||
|       ret["hdrVer"]=hex(a[8]) | ||||
|       ret["imgVer"]=hex(a[9]) | ||||
|       ret["imgCRC"]=hex(a[10]) | ||||
|       ret["guard"]=hex(a[11]) | ||||
|       ret["layoutIdx"]=hex(a[12]) | ||||
|       # reserved 3bytes | ||||
|       ret["runAddr"]=hex(a[16]) | ||||
|       ret["sha256"]=data[32:].hex() | ||||
|       t=str(ret) | ||||
|       t=t.replace(',','\n') | ||||
|       return t | ||||
|   return "" | ||||
|  | ||||
|  | ||||
| # 判断是不是pkt_header | ||||
| def pkt_header_check(data:bytearray): | ||||
|   magic=(data[12]<<24)|(data[13]<<16)|(data[14]<<8)|(data[15]) | ||||
|   if (magic==_PKT_HEADER_MAGIC_NO): | ||||
|     return True | ||||
|   print(f"magic={hex(magic)}") | ||||
|   return False | ||||
|  | ||||
| # 判断是不是img_header | ||||
| def img_header_check(data:bytearray): | ||||
|   if(len(data)<32): | ||||
|     return '' | ||||
|   magic=(data[20]<<24)|(data[21]<<16)|(data[22]<<8)|(data[23]) | ||||
|   if (magic==_IMG_HEADER_MAGIC_NO): | ||||
|     imghdr_v=data[11] | ||||
|     print(f"magic={hex(magic)}, imghdr_v={imghdr_v}") | ||||
|     # 返回使用的结构体类型 | ||||
|     if(imghdr_v==0x10): | ||||
|       return 'V1' | ||||
|     else: | ||||
|       return "V0" | ||||
|   return "" | ||||
|  | ||||
|  | ||||
| def bin_to_hex(bin:bytearray,flash_info:list[dict]=[]): | ||||
|   all_size=len(bin) | ||||
|   pack_size=64 | ||||
|   pack_size=32 | ||||
|   turned=0 | ||||
|   turned_old=0 | ||||
|   out_text='' | ||||
| @@ -86,6 +215,34 @@ def bin_to_hex(bin:bytearray,flash_info:list[dict]=[]): | ||||
|     out_text+=f"[{hex(turned_old)}] {data.hex(' ')}\n" | ||||
|   return out_text | ||||
|  | ||||
| # 这个是从固件里直接读出数据头 | ||||
| def bin_to_hex2(bin:bytearray): | ||||
|   all_size=len(bin) | ||||
|   pack_size=32 | ||||
|   turned=0 | ||||
|   turned_old=0 | ||||
|   out_text='' | ||||
|   if(pkt_header_check(bin)): | ||||
|     out_text+=tran_pkg_header(bin[0:96])+'\n' | ||||
|   while turned < all_size: | ||||
|     if(turned+pack_size<=all_size): | ||||
|       data=bin[turned:turned+pack_size] | ||||
|       turned_old=turned | ||||
|       turned+=pack_size | ||||
|     else: | ||||
|       data=bin[turned:] | ||||
|       turned=all_size | ||||
|     if(all_size-turned_old>=64): | ||||
|       hdr_data=bin[turned_old:turned_old+64] | ||||
|     else: | ||||
|       hdr_data=bytearray() | ||||
|     hdr_v=img_header_check(hdr_data) | ||||
|     if(hdr_v=='V0'): | ||||
|       out_text+=tran_img_headerv0(hdr_data)+'\n' | ||||
|     elif(hdr_v=='V1'): | ||||
|       out_text+=tran_img_headerv1(hdr_data)+'\n' | ||||
|     out_text+=f"[{hex(turned_old)}] {data.hex(' ')}\n" | ||||
|   return out_text | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -96,11 +253,12 @@ def bin_to_hex_file(bin_file_name:str,hex_file_name:str,info_file_name:str=None) | ||||
|     info=[] | ||||
|   else: | ||||
|     info=load_flash_info(info_file_name) | ||||
|   text=bin_to_hex(bin,info) | ||||
|   text=bin_to_hex2(bin) | ||||
|   with open(hex_file_name,mode='w+',encoding="utf-8") as f: | ||||
|     f.write(text) | ||||
|  | ||||
| # bin_to_hex.py input_file output_file | ||||
| if __name__ == "__main__": | ||||
|   bin_to_hex_file(sys.argv[1],sys.argv[2],sys.argv[3]) | ||||
|   # bin_to_hex_file(sys.argv[1],sys.argv[2],sys.argv[3]) | ||||
|   # load_flash_info("work/upload-test.info") | ||||
|   bin_to_hex_file(sys.argv[1],sys.argv[2]) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user