1*abb07886SMatthias Ringwald#!/usr/bin/env python 2*abb07886SMatthias Ringwald# BlueKitchen GmbH (c) 2019 3*abb07886SMatthias Ringwald 4*abb07886SMatthias Ringwaldimport sys 5*abb07886SMatthias Ringwald 6*abb07886SMatthias Ringwaldusage = ''' 7*abb07886SMatthias RingwaldCSR/Qualcomm PSR conversion tool for use with BTstack 8*abb07886SMatthias RingwaldCopyright 2019 BlueKitchen GmbH 9*abb07886SMatthias Ringwald 10*abb07886SMatthias RingwaldUsage: 11*abb07886SMatthias Ringwald$ ./convert_prs.py file.prs 12*abb07886SMatthias Ringwald 13*abb07886SMatthias Ringwald''' 14*abb07886SMatthias Ringwald 15*abb07886SMatthias Ringwaldmsg_seqno = 0 16*abb07886SMatthias Ringwaldindent = ' ' 17*abb07886SMatthias Ringwald 18*abb07886SMatthias Ringwalddef write_verbatim(fout, text): 19*abb07886SMatthias Ringwald fout.write(text + '\n') 20*abb07886SMatthias Ringwald 21*abb07886SMatthias Ringwalddef write_set_varid_cmd(fout, varid, msg_payload): 22*abb07886SMatthias Ringwald global msg_seqno 23*abb07886SMatthias Ringwald 24*abb07886SMatthias Ringwald # msg_payload must be at least 4 uint16 25*abb07886SMatthias Ringwald while len(msg_payload) < 4: 26*abb07886SMatthias Ringwald msg_payload.append(0) 27*abb07886SMatthias Ringwald 28*abb07886SMatthias Ringwald # setup msg 29*abb07886SMatthias Ringwald msg_type = 0x0002 30*abb07886SMatthias Ringwald msg_len = 5 + len(msg_payload) 31*abb07886SMatthias Ringwald msg_seqno += 1 32*abb07886SMatthias Ringwald msg_status = 0 33*abb07886SMatthias Ringwald msg = [msg_type, msg_len, msg_seqno, varid, msg_status] + msg_payload 34*abb07886SMatthias Ringwald 35*abb07886SMatthias Ringwald # setup hci command 36*abb07886SMatthias Ringwald hci_payload_descriptor = 0xc2 37*abb07886SMatthias Ringwald hci_param_len = len(msg) * 2 + 1 38*abb07886SMatthias Ringwald hci_cmd = [ 0x00, 0xfc, hci_param_len, hci_payload_descriptor] 39*abb07886SMatthias Ringwald 40*abb07886SMatthias Ringwald # convert list of uint16_t to sequence of uint8_t in little endian 41*abb07886SMatthias Ringwald for value in msg: 42*abb07886SMatthias Ringwald hci_cmd.append(value & 0xff) 43*abb07886SMatthias Ringwald hci_cmd.append(value >> 8) 44*abb07886SMatthias Ringwald 45*abb07886SMatthias Ringwald fout.write(indent + ', '.join(["0x%02x" % val for val in hci_cmd]) + ',\n') 46*abb07886SMatthias Ringwald 47*abb07886SMatthias Ringwalddef write_key(fout, key, value): 48*abb07886SMatthias Ringwald # setup ps command 49*abb07886SMatthias Ringwald payload_len = len(value) 50*abb07886SMatthias Ringwald stores = 0x0008 # psram 51*abb07886SMatthias Ringwald ps_cmd = [key, payload_len, stores] + value 52*abb07886SMatthias Ringwald 53*abb07886SMatthias Ringwald # write ps command 54*abb07886SMatthias Ringwald write_set_varid_cmd(fout, 0x7003, ps_cmd) 55*abb07886SMatthias Ringwald 56*abb07886SMatthias Ringwalddef write_warm_reset(fout): 57*abb07886SMatthias Ringwald write_verbatim(fout, indent + "// WarmReset") 58*abb07886SMatthias Ringwald write_set_varid_cmd(fout, 0x4002, []) 59*abb07886SMatthias Ringwald 60*abb07886SMatthias Ringwald 61*abb07886SMatthias Ringwald# check args 62*abb07886SMatthias Ringwaldif len(sys.argv) != 2: 63*abb07886SMatthias Ringwald print(usage) 64*abb07886SMatthias Ringwald sys.exit(1) 65*abb07886SMatthias Ringwald 66*abb07886SMatthias Ringwaldprs_file = sys.argv[1] 67*abb07886SMatthias Ringwaldfout = sys.stdout 68*abb07886SMatthias Ringwald 69*abb07886SMatthias Ringwaldwith open (prs_file, 'rb') as fin: 70*abb07886SMatthias Ringwald for line_with_nl in fin: 71*abb07886SMatthias Ringwald line = line_with_nl.strip() 72*abb07886SMatthias Ringwald if line.startswith('&'): 73*abb07886SMatthias Ringwald # pskey 74*abb07886SMatthias Ringwald parts = line.split('=') 75*abb07886SMatthias Ringwald key = int(parts[0].strip().replace('&','0x'), 16) 76*abb07886SMatthias Ringwald value = [int('0x'+i, 16) for i in parts[1].strip().split(' ')] 77*abb07886SMatthias Ringwald write_key(fout, key, value) 78*abb07886SMatthias Ringwald elif line.startswith('#'): 79*abb07886SMatthias Ringwald #ifdef, .. 80*abb07886SMatthias Ringwald write_verbatim(fout, line) 81*abb07886SMatthias Ringwald else: 82*abb07886SMatthias Ringwald # comments 83*abb07886SMatthias Ringwald write_verbatim(fout, indent + line) 84*abb07886SMatthias Ringwald 85*abb07886SMatthias Ringwaldwrite_warm_reset(fout) 86