xref: /btstack/chipset/atwilc3000/convert_firmware_bin.py (revision 6f6f8b16b187b6f853cd67c766447d952356c78d)
1*6f6f8b16SMatthias Ringwald#!/usr/bin/env python3
269e3d973SMatthias Ringwald# BlueKitchen GmbH (c) 2017
369e3d973SMatthias Ringwaldimport sys
444149d3aSMatthias Ringwald
544149d3aSMatthias Ringwaldusage = '''This script converts the HCI Firmware in .bin format for Atmel WILC3000
644149d3aSMatthias Ringwaldinto C files to be used with BTstack.
769e3d973SMatthias Ringwald
869e3d973SMatthias RingwaldUsage:
969e3d973SMatthias Ringwald$ ./convert_firmware_bin.py firmware.bin
1044149d3aSMatthias Ringwald'''
1144149d3aSMatthias Ringwald
1244149d3aSMatthias Ringwaldheader = '''
1344149d3aSMatthias Ringwald/**
1444149d3aSMatthias Ringwald * BASENAME.h converted from BASENAME.bin
1544149d3aSMatthias Ringwald */
1644149d3aSMatthias Ringwald
1780e33422SMatthias Ringwald#ifndef BASENAME_H
1880e33422SMatthias Ringwald#define BASENAME_H
1944149d3aSMatthias Ringwald
2044149d3aSMatthias Ringwald#include <stdint.h>
2144149d3aSMatthias Ringwald
2244149d3aSMatthias Ringwaldextern const uint8_t  atwilc3000_fw_data[];
2344149d3aSMatthias Ringwaldextern const uint32_t atwilc3000_fw_size;
2444149d3aSMatthias Ringwaldextern const char *   atwilc3000_fw_name;
2544149d3aSMatthias Ringwald
2644149d3aSMatthias Ringwald#endif
2744149d3aSMatthias Ringwald'''
2844149d3aSMatthias Ringwald
2944149d3aSMatthias Ringwaldcode_start = '''
3044149d3aSMatthias Ringwald/**
3144149d3aSMatthias Ringwald * BASENAME.c converted from BASENAME.bin
3244149d3aSMatthias Ringwald */
3344149d3aSMatthias Ringwald
3444149d3aSMatthias Ringwald#include "BASENAME.h"
3544149d3aSMatthias Ringwald
3644149d3aSMatthias Ringwaldconst char *   atwilc3000_fw_name = "BASENAME";
3744149d3aSMatthias Ringwald
3844149d3aSMatthias Ringwaldconst uint8_t  atwilc3000_fw_data[] = {
3944149d3aSMatthias Ringwald'''
4044149d3aSMatthias Ringwald
4144149d3aSMatthias Ringwaldcode_end = '''
4244149d3aSMatthias Ringwald};
4344149d3aSMatthias Ringwaldconst uint32_t atwilc3000_fw_size = sizeof(atwilc3000_fw_data);
4444149d3aSMatthias Ringwald'''
4544149d3aSMatthias Ringwald
4644149d3aSMatthias Ringwalddef convert_bin(basename):
4744149d3aSMatthias Ringwald	bin_name = basename + '.bin'
4844149d3aSMatthias Ringwald	print ('Reading %s' % bin_name)
4944149d3aSMatthias Ringwald
5044149d3aSMatthias Ringwald	with open (bin_name, 'rb') as fin:
5144149d3aSMatthias Ringwald		firm = fin.read()
5244149d3aSMatthias Ringwald		size = len(firm)
5344149d3aSMatthias Ringwald		print ('Size %u', size)
5444149d3aSMatthias Ringwald
5544149d3aSMatthias Ringwald		with open(basename + '.h', 'w') as fout:
5644149d3aSMatthias Ringwald			fout.write(header.replace('BASENAME',basename));
5744149d3aSMatthias Ringwald
5844149d3aSMatthias Ringwald		with open(basename + '.c', 'w') as fout:
5944149d3aSMatthias Ringwald			fout.write(code_start.replace('BASENAME',basename));
6044149d3aSMatthias Ringwald			fout.write('    ')
6144149d3aSMatthias Ringwald			for i in range(0,size):
6244149d3aSMatthias Ringwald				if i % 10000 == 0:
6344149d3aSMatthias Ringwald					print ('- Write %05u/%05u' % (i, size))
6444149d3aSMatthias Ringwald				byte = ord(firm[i])
6544149d3aSMatthias Ringwald				fout.write("0x{0:02x}, ".format(byte))
6644149d3aSMatthias Ringwald				if (i & 0x0f) == 0x0f:
6744149d3aSMatthias Ringwald					fout.write('\n    ')
6844149d3aSMatthias Ringwald			fout.write(code_end);
6944149d3aSMatthias Ringwald			print ('Done\n')
7044149d3aSMatthias Ringwald
7169e3d973SMatthias Ringwald# check usage: 1 param
7269e3d973SMatthias Ringwaldif not len(sys.argv) == 2:
7344149d3aSMatthias Ringwald    print(usage)
7444149d3aSMatthias Ringwald    sys.exit(1)
7544149d3aSMatthias Ringwald
7669e3d973SMatthias Ringwaldname = sys.argv[1]
7744149d3aSMatthias Ringwaldbasename = name.replace('.bin','')
7844149d3aSMatthias Ringwaldconvert_bin(basename)
79