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