xref: /btstack/chipset/csr/convert_psr.py (revision c9921182ab4b1f83e3e5c671446dca5ffdf45b90)
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