xref: /btstack/chipset/em9301/convert_emp.py (revision c9921182ab4b1f83e3e5c671446dca5ffdf45b90)
1*c9921182SMatthias Ringwald#!/usr/bin/env python3
2f2122e1bSMatthias Ringwald# BlueKitchen GmbH (c) 2018
3f2122e1bSMatthias Ringwaldimport sys
4f2122e1bSMatthias Ringwald
5f2122e1bSMatthias Ringwaldusage = '''This script converts a set of configurations and patches in .emp format for EM9304
6881a49d5SMatthias Ringwaldinto a single C files to be used with BTstack. It also configures the controller for 8 connections
7881a49d5SMatthias Ringwaldand enables support for LE Data Length Extension.
8f2122e1bSMatthias Ringwald
9f2122e1bSMatthias RingwaldUsage:
10f2122e1bSMatthias Ringwald$ ./convert_emp.py container.emp
11f2122e1bSMatthias Ringwald'''
12f2122e1bSMatthias Ringwald
13f2122e1bSMatthias Ringwaldheader = '''/**
14f2122e1bSMatthias Ringwald * BASENAME.h converted from BASENAME.emp
15f2122e1bSMatthias Ringwald */
16f2122e1bSMatthias Ringwald
1780e33422SMatthias Ringwald#ifndef BASENAME_H
1880e33422SMatthias Ringwald#define BASENAME_H
19f2122e1bSMatthias Ringwald
20f2122e1bSMatthias Ringwald#include <stdint.h>
21f2122e1bSMatthias Ringwaldextern const uint8_t  container_blob_data[];
22f2122e1bSMatthias Ringwaldextern const uint32_t container_blob_size;
23f2122e1bSMatthias Ringwaldextern const char *   container_blob_name;
24f2122e1bSMatthias Ringwald
25f2122e1bSMatthias Ringwald#endif
26f2122e1bSMatthias Ringwald'''
27f2122e1bSMatthias Ringwald
28f2122e1bSMatthias Ringwaldcode_start = '''/**
29f2122e1bSMatthias Ringwald * BASENAME.c converted from BASENAME.bin
30f2122e1bSMatthias Ringwald * Size: SIZE bytes
31881a49d5SMatthias Ringwald *
32881a49d5SMatthias Ringwald * BTstack: added config for 8 connections + 251 packet len
33f2122e1bSMatthias Ringwald */
34f2122e1bSMatthias Ringwald
35f2122e1bSMatthias Ringwald#include <stdint.h>
36f2122e1bSMatthias Ringwald
37f2122e1bSMatthias Ringwaldconst char *   container_blob_name = "BASENAME";
38f2122e1bSMatthias Ringwald
39f2122e1bSMatthias Ringwaldconst uint8_t  container_blob_data[] = {
40f2122e1bSMatthias Ringwald'''
41f2122e1bSMatthias Ringwald
42f2122e1bSMatthias Ringwaldcode_end = '''
43881a49d5SMatthias Ringwald    // configure EM9304 for 8 connections, data length 251
44881a49d5SMatthias Ringwald    0x33, 0x39, 0x6d, 0x65, 0x24, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x14,
45881a49d5SMatthias Ringwald    0x11, 0x0c, 0x00, 0x00, 0x56, 0x62, 0xc3, 0xd4, 0x30, 0x02, 0x00, 0x00,
46881a49d5SMatthias Ringwald    0xfb, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x5a, 0x00, 0x0c, 0xf3
47881a49d5SMatthias Ringwald
48f2122e1bSMatthias Ringwald};
49f2122e1bSMatthias Ringwaldconst uint32_t container_blob_size = sizeof(container_blob_data);
50f2122e1bSMatthias Ringwald'''
51f2122e1bSMatthias Ringwald
52f2122e1bSMatthias Ringwalddef convert_emp(basename):
53f2122e1bSMatthias Ringwald	emp_name = basename + '.emp'
54f2122e1bSMatthias Ringwald	print ('Reading %s' % emp_name)
55f2122e1bSMatthias Ringwald
56f2122e1bSMatthias Ringwald	with open (emp_name, 'rb') as fin:
57f2122e1bSMatthias Ringwald		firm = fin.read()
58f2122e1bSMatthias Ringwald		size = len(firm)
59f2122e1bSMatthias Ringwald
60f2122e1bSMatthias Ringwald		# reduce size by 4 as it ends with four zero bytes that indicate the end of the file
61f2122e1bSMatthias Ringwald		size -= 4
62f2122e1bSMatthias Ringwald
63f2122e1bSMatthias Ringwald		# don't write .h file as we would need to store its name in btstack_chipset_em9301.c, too
64f2122e1bSMatthias Ringwald		# with open(basename + '.h', 'w') as fout:
65f2122e1bSMatthias Ringwald		# 	fout.write(header.replace('BASENAME',basename));
66f2122e1bSMatthias Ringwald
67f2122e1bSMatthias Ringwald		with open(basename + '.c', 'w') as fout:
68f2122e1bSMatthias Ringwald			fout.write(code_start.replace('BASENAME',basename).replace('SIZE',str(size)));
69f2122e1bSMatthias Ringwald			fout.write('    ')
70f2122e1bSMatthias Ringwald			for i in range(0,size):
71f2122e1bSMatthias Ringwald				if i % 1000 == 0:
72f2122e1bSMatthias Ringwald					print ('- Write %05u/%05u' % (i, size))
73*c9921182SMatthias Ringwald				byte = firm[i]
74f2122e1bSMatthias Ringwald				fout.write("0x{0:02x}, ".format(byte))
75f2122e1bSMatthias Ringwald				if (i & 0x0f) == 0x0f:
76f2122e1bSMatthias Ringwald					fout.write('\n    ')
77f2122e1bSMatthias Ringwald			fout.write(code_end);
78f2122e1bSMatthias Ringwald			print ('Done\n')
79f2122e1bSMatthias Ringwald
80f2122e1bSMatthias Ringwald# check usage: 1 param
81f2122e1bSMatthias Ringwaldif not len(sys.argv) == 2:
82f2122e1bSMatthias Ringwald    print(usage)
83f2122e1bSMatthias Ringwald    sys.exit(1)
84f2122e1bSMatthias Ringwald
85f2122e1bSMatthias Ringwaldname = sys.argv[1]
86f2122e1bSMatthias Ringwaldbasename = name.replace('.emp','')
87f2122e1bSMatthias Ringwaldconvert_emp(basename)
88