xref: /btstack/chipset/atwilc3000/convert_firmware_bin.py (revision 44149d3a0fec35241d23d10635df08d4a0746064)
1*44149d3aSMatthias Ringwald#!/usr/bin/env python
2*44149d3aSMatthias Ringwald# BlueKitchen GmbH (c) 2012-2014
3*44149d3aSMatthias Ringwald
4*44149d3aSMatthias Ringwald# avr-objcopy -I ihex -O binary hci_581_active_uart.hex hci_581_active_uart.bin
5*44149d3aSMatthias Ringwald
6*44149d3aSMatthias Ringwald# requires IntelHex package https://pypi.python.org/pypi/IntelHex
7*44149d3aSMatthias Ringwald# docs: http://python-intelhex.readthedocs.io/en/latest/
8*44149d3aSMatthias Ringwald
9*44149d3aSMatthias Ringwaldfrom intelhex import IntelHex
10*44149d3aSMatthias Ringwaldimport glob
11*44149d3aSMatthias Ringwald
12*44149d3aSMatthias Ringwaldusage = '''This script converts the HCI Firmware in .bin format for Atmel WILC3000
13*44149d3aSMatthias Ringwaldinto C files to be used with BTstack.
14*44149d3aSMatthias Ringwald'''
15*44149d3aSMatthias Ringwald
16*44149d3aSMatthias Ringwaldheader = '''
17*44149d3aSMatthias Ringwald/**
18*44149d3aSMatthias Ringwald * BASENAME.h converted from BASENAME.bin
19*44149d3aSMatthias Ringwald */
20*44149d3aSMatthias Ringwald
21*44149d3aSMatthias Ringwald#ifndef __BASENAME_H
22*44149d3aSMatthias Ringwald#define __BASENAME_H
23*44149d3aSMatthias Ringwald
24*44149d3aSMatthias Ringwald#include <stdint.h>
25*44149d3aSMatthias Ringwald
26*44149d3aSMatthias Ringwaldextern const uint8_t  atwilc3000_fw_data[];
27*44149d3aSMatthias Ringwaldextern const uint32_t atwilc3000_fw_size;
28*44149d3aSMatthias Ringwaldextern const char *   atwilc3000_fw_name;
29*44149d3aSMatthias Ringwald
30*44149d3aSMatthias Ringwald#endif
31*44149d3aSMatthias Ringwald'''
32*44149d3aSMatthias Ringwald
33*44149d3aSMatthias Ringwaldcode_start = '''
34*44149d3aSMatthias Ringwald/**
35*44149d3aSMatthias Ringwald * BASENAME.c converted from BASENAME.bin
36*44149d3aSMatthias Ringwald */
37*44149d3aSMatthias Ringwald
38*44149d3aSMatthias Ringwald#include "BASENAME.h"
39*44149d3aSMatthias Ringwald
40*44149d3aSMatthias Ringwaldconst char *   atwilc3000_fw_name = "BASENAME";
41*44149d3aSMatthias Ringwald
42*44149d3aSMatthias Ringwaldconst uint8_t  atwilc3000_fw_data[] = {
43*44149d3aSMatthias Ringwald'''
44*44149d3aSMatthias Ringwald
45*44149d3aSMatthias Ringwaldcode_end = '''
46*44149d3aSMatthias Ringwald};
47*44149d3aSMatthias Ringwaldconst uint32_t atwilc3000_fw_size = sizeof(atwilc3000_fw_data);
48*44149d3aSMatthias Ringwald'''
49*44149d3aSMatthias Ringwald
50*44149d3aSMatthias Ringwalddef convert_bin(basename):
51*44149d3aSMatthias Ringwald	bin_name = basename + '.bin'
52*44149d3aSMatthias Ringwald	print ('Reading %s' % bin_name)
53*44149d3aSMatthias Ringwald
54*44149d3aSMatthias Ringwald	with open (bin_name, 'rb') as fin:
55*44149d3aSMatthias Ringwald		firm = fin.read()
56*44149d3aSMatthias Ringwald		size = len(firm)
57*44149d3aSMatthias Ringwald		print ('Size %u', size)
58*44149d3aSMatthias Ringwald
59*44149d3aSMatthias Ringwald		with open(basename + '.h', 'w') as fout:
60*44149d3aSMatthias Ringwald			fout.write(header.replace('BASENAME',basename));
61*44149d3aSMatthias Ringwald
62*44149d3aSMatthias Ringwald		with open(basename + '.c', 'w') as fout:
63*44149d3aSMatthias Ringwald			fout.write(code_start.replace('BASENAME',basename));
64*44149d3aSMatthias Ringwald			fout.write('    ')
65*44149d3aSMatthias Ringwald			for i in range(0,size):
66*44149d3aSMatthias Ringwald				if i % 10000 == 0:
67*44149d3aSMatthias Ringwald					print ('- Write %05u/%05u' % (i, size))
68*44149d3aSMatthias Ringwald				byte = ord(firm[i])
69*44149d3aSMatthias Ringwald				fout.write("0x{0:02x}, ".format(byte))
70*44149d3aSMatthias Ringwald				if (i & 0x0f) == 0x0f:
71*44149d3aSMatthias Ringwald					fout.write('\n    ')
72*44149d3aSMatthias Ringwald			fout.write(code_end);
73*44149d3aSMatthias Ringwald			print ('Done\n')
74*44149d3aSMatthias Ringwald
75*44149d3aSMatthias Ringwaldfiles =  glob.glob('*.bin')
76*44149d3aSMatthias Ringwaldif not files:
77*44149d3aSMatthias Ringwald    print(usage)
78*44149d3aSMatthias Ringwald    sys.exit(1)
79*44149d3aSMatthias Ringwald
80*44149d3aSMatthias Ringwald# convert each of them
81*44149d3aSMatthias Ringwaldfor name in files:
82*44149d3aSMatthias Ringwald	basename = name.replace('.bin','')
83*44149d3aSMatthias Ringwald	convert_bin(basename)
84