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