1import argparse 2import os 3import sys 4 5def bin2c_convert(binfile_name, array_name, padding_len=0): 6 7 with open(binfile_name, 'rb') as in_file: 8 bindata = in_file.read() 9 10 out = 'const char %s[%d] = {\n' % (array_name, len(bindata)+padding_len) 11 line = '' 12 first_char=True 13 nb_char_in_line = 0 14 for byte in bindata: 15 if first_char: 16 line += ' 0x%02x' % byte 17 first_char = False 18 else: 19 line += ',0x%02x' % byte 20 nb_char_in_line = nb_char_in_line + 1 21 if nb_char_in_line == 16: 22 out += ' ' + line + '\n' 23 nb_char_in_line = 0 24 line = ' ' 25 while padding_len > 0: 26 line += ',0xff' 27 padding_len = padding_len-1 28 # add the last line 29 if nb_char_in_line < 16: 30 out += ' ' + line + '\n' 31 out += '};\n' 32 return out 33 34 35def bin2c_file(bin_file_name, out_src_file_name, dest_path): 36 37 bin_file_name=dest_path+'/../'+bin_file_name 38 if not os.path.isfile(bin_file_name): 39 print('File "%s" is not found!' % bin_file_name) 40 return '' 41 42 array_name = out_src_file_name 43 out_src_file_name = dest_path + '/' + out_src_file_name + '.c' 44 with open(out_src_file_name, 'w') as out_file: 45 c_file = bin2c_convert(bin_file_name, array_name, 4) 46 out_file.write(c_file) 47 48def generate_sb_src(conn_fwloader_dir, chip_revision): 49 50 a1_sb_list = [ 51 {'file': 'rw61x_sb_wifi_a1.bin', 'array_name': 'fw_cpu1'}, 52 {'file': 'rw61x_sb_ble_a1.bin', 'array_name': 'fw_cpu2_ble'}, 53 {'file': 'rw61x_sb_ble_15d4_combo_a1.bin', 'array_name': 'fw_cpu2_combo'} 54 ] 55 a2_sb_list = [ 56 {'file': 'rw61x_sb_wifi_a2.bin', 'array_name': 'fw_cpu1'}, 57 {'file': 'rw61x_sb_ble_a2.bin', 'array_name': 'fw_cpu2_ble'}, 58 {'file': 'rw61x_sb_ble_15d4_combo_a2.bin', 'array_name': 'fw_cpu2_combo'} 59 ] 60 61 if (chip_revision == 'A2'): 62 binlist = a2_sb_list 63 elif (chip_revision == 'A1'): 64 binlist = a1_sb_list 65 else: 66 return 67 print ("Directory=" + conn_fwloader_dir) 68 dest_dir=conn_fwloader_dir+'/'+chip_revision 69 if not os.path.exists(dest_dir): 70 os.makedirs(dest_dir) 71 # SB3 format built for A0 72 for i in range(0,3): 73 input_file = binlist[i]['file'] 74 print(input_file, binlist[i]['array_name']) 75 bin2c_file(input_file, binlist[i]['array_name'], dest_dir) 76 77 78def generate_raw_src(conn_fwloader_dir, chip_revision): 79 80 a1_raw_list = [ 81 {'file': 'rw61xw_raw_cpu1_a1.bin', 'array_name': 'fw_cpu1'}, 82 {'file': 'rw61xn_raw_cpu2_ble_a1.bin', 'array_name': 'fw_cpu2_ble'}, 83 {'file': 'rw61xn_combo_raw_cpu2_ble_15_4_combo_a1.bin', 'array_name': 'fw_cpu2_combo'} 84 ] 85 a2_raw_list = [ 86 {'file': 'rw61xw_raw_cpu1_a2.bin', 'array_name': 'fw_cpu1'}, 87 {'file': 'rw61xn_raw_cpu2_ble_a2.bin', 'array_name': 'fw_cpu2_ble'}, 88 {'file': 'rw61xn_combo_raw_cpu2_ble_15_4_combo_a2.bin', 'array_name': 'fw_cpu2_combo'} 89 ] 90 91 if (chip_revision == 'A2'): 92 binlist = a2_raw_list 93 elif (chip_revision == 'A1'): 94 binlist = a1_raw_list 95 else: 96 return 97 dest_dir=conn_fwloader_dir+'/'+chip_revision 98 if not os.path.exists(dest_dir): 99 os.makedirs(dest_dir) 100 # SB3 format built for A0 101 for i in range(0,3): 102 #print(binlist[i]['file'], binlist[i]['array_name']) 103 bin2c_file(binlist[i]['file'], binlist[i]['array_name'], dest_dir) 104 105 106 107def main(): 108 parser = argparse.ArgumentParser(description='Bin2C Generator') 109 parser.add_argument('in_path', help="Directory to fw_bin containing binaries.") 110 parser.add_argument('out_dir', nargs='?') 111 parser.add_argument('-v', '--verbose', action='store_true', default=False, help="Sets verbose mode") 112 parser.add_argument('-t', '--type', nargs='?', default='sb', help='generate SB3 version or raw version') 113 parser.add_argument('-r', '--rev', default='all', help='generate for chip revisions A0, A1, A2 or all' ) 114 args = parser.parse_args() 115 116 if args.type == 'sb': 117 if args.rev == 'all': 118 generate_sb_src(args.in_path, 'A1') 119 generate_sb_src(args.in_path, 'A2') 120 else: 121 if args.rev == 'A1' or args.rev == 'A2': 122 generate_sb_src(args.in_path, args.rev, args.verbose) 123 elif args.type == 'raw': 124 if args.rev == 'all': 125 generate_raw_src(args.in_path, 'A1') 126 generate_raw_src(args.in_path, 'A2') 127 else: 128 if args.rev == 'A1' or args.rev == 'A2': 129 generate_raw_src(args.in_path, args.rev, args.verbose) 130 else: 131 print("error wrong chip revision argument must be in A0, A1, A2, or all") 132 else: 133 print("error wrong type argument") 134 135 136if __name__ == '__main__': 137 main() 138 139 140 141