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