22
33import argparse
44import binascii
5+ import os
56import struct
67
78OTA_MAGIC = b'\x5d \x02 '
1011def main (args ):
1112 assert args .input_file != args .output
1213
13- with open (args .input_file , 'rb' ) as bin_file :
14+ with ( open (args .input_file , 'rb' ) as bin_file ) :
1415 bin_file .seek (0 , 0 )
1516 firmware = bytearray (bin_file .read (- 1 ))
1617 if firmware [6 :8 ] != OTA_MAGIC :
@@ -30,30 +31,49 @@ def main(args):
3031 header_size = 56
3132 firmware_len = len (firmware )
3233 total_image_size = firmware_len + header_size + 6
34+ manufacturer_code = int .from_bytes (firmware [18 :20 ], byteorder = 'little' )
35+ image_type = int .from_bytes (firmware [20 :22 ], byteorder = 'little' )
36+ file_version = args .set_version or int .from_bytes (firmware [2 :6 ], byteorder = 'little' )
3337 ota_hdr = ota_hdr_s .pack (
3438 0xbeef11e ,
3539 0x100 , # header version is 0x0100
3640 header_size ,
3741 0 , # ota_ext_hdr_value if ota_ext_hdr else 0,
38- int . from_bytes ( firmware [ 18 : 20 ], byteorder = 'little' ) , # args.manufacturer,
39- int . from_bytes ( firmware [ 20 : 22 ], byteorder = 'little' ) , # args.image_type,
40- args . set_version or int . from_bytes ( firmware [ 2 : 6 ], byteorder = 'little' ), # 0x10023001 # options.File_Version
42+ manufacturer_code , # args.manufacturer,
43+ image_type , # args.image_type,
44+ file_version , # options.File_Version
4145 args .ota_version , # options.stack_version,
4246 b'\x00 ' * 32 , # OTA_Header_String.encode(),
4347 total_image_size ,
4448 )
49+ # add chunk header: 0 - firmware type
4550 ota_hdr += struct .pack ('<HI' , 0 , firmware_len )
46- with open (args .output , 'wb' ) as output :
51+
52+ out_filename = args .output
53+ if not out_filename :
54+ head , tail = os .path .split (args .input_file )
55+ if args .output_title :
56+ name = args .output_title
57+ else :
58+ name , _ = os .path .splitext (tail )
59+ out_filename = os .path .join (head , '{:04x}-{:04x}-{:08x}-{}.zigbee' .format (
60+ manufacturer_code ,
61+ image_type ,
62+ file_version ,
63+ name ,
64+ ))
65+ with open (out_filename , 'wb' ) as output :
4766 bin_file .seek (0 , 0 )
4867 output .write (ota_hdr )
4968 output .write (firmware )
50- print ("%s was created with ZCL OTA Header." % args . output )
69+ print ("%s was created with ZCL OTA Header." % out_filename )
5170
5271
5372if __name__ == '__main__' :
5473 parser = argparse .ArgumentParser ()
5574 parser .add_argument ("input_file" , help = "path to input file" )
56- parser .add_argument ("-o" , '--output' , help = "path to output file" , required = True )
75+ parser .add_argument ("-ot" , '--output-title' , help = "replace original file name with the string" )
76+ parser .add_argument ("-o" , '--output' , help = "path to output file" )
5777 # sync with g_zcl_basicAttrs.stackVersion
5878 parser .add_argument ("-s" , '--ota-version' , type = int , help = "OTA stack version" , default = 2 )
5979 parser .add_argument ("-v" , '--set-version' , type = lambda x : int (x , 0 ), help = "Override version from BIN" )
0 commit comments