remove redundant registers
[sitara-dss-files/am57xx-dss-files.git] / padconf / am57xx-padconf-decoder.py
1 #!/usr/bin/python
2 #
3 # Copyright (c) 2019, Texas Instruments Incorporated
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 #
10 # *  Redistributions of source code must retain the above copyright
11 #    notice, this list of conditions and the following disclaimer.
12 #
13 # *  Redistributions in binary form must reproduce the above copyright
14 #    notice, this list of conditions and the following disclaimer in the
15 #    documentation and/or other materials provided with the distribution.
16 #
17 # *  Neither the name of Texas Instruments Incorporated nor the names of
18 #    its contributors may be used to endorse or promote products derived
19 #    from this software without specific prior written permission.
20 #
21 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28 # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30 # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31 # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #
34 from __future__ import print_function
35 import xml.etree.ElementTree as ET
36 import re
37 import sys
39 if len(sys.argv) != 2:
40     print()  # Empty line
41     print(sys.argv[0], "help:\n")
42     print("Please pass the rd1 file to this script, e.g.:")
43     print("", sys.argv[0], "am57xx-padconf_yyyy-mm-dd_hhmmss.rd1\n")
44     print("Output file will have same base name as input, "
45           "but csv file type.\n")
46     sys.exit(1)
48 try:
49     rd1 = open(sys.argv[1], "rt")
50 except IOError:
51     print("Error: input file", sys.argv[1], "not accessible.")
52     sys.exit(1)
54 try:
55     csv_filename = sys.argv[1]
56     csv_filename = csv_filename.replace(".rd1", ".csv")
57     csv = open(csv_filename, "w+")
58 except IOError:
59     print("Error creating file", csv_filename)
61 # CSV files must use \r\n for all line endings
62 # Create header row
63 csv.write("Reg Name,Reg Address,Reg Value,Slew,InputEnable,Pull Config,"
64           "Mode Select,Delay Mode,Muxmode,Mux Description,Comments\r\n")
65 csv_string = "%s,0x%08X,0x%08X,%s,%s,%s,%s,%s,%d,%s,%s\r\n"
67 # Determine device family based on header
68 header = rd1.readline()
69 m = re.match(r'.*AM(57[0-4])x.*', header, 0);
70 if m:
71     family = int(m.group(1))
72 else:
73     print("Unrecognized device family in header:")
74     print(header)
75     sys.exit(1)
77 if family == 570:
78     tree = ET.parse('CTRL_MODULE_CORE_am571x.xml')
79 elif family == 571:
80     tree = ET.parse('CTRL_MODULE_CORE_am571x.xml')
81 elif family == 572:
82     tree = ET.parse('CTRL_MODULE_CORE_am572x.xml')
83 elif family == 574:
84     tree = ET.parse('CTRL_MODULE_CORE_am574x.xml')
85 else:
86     print("Didn't recognize device family AM%d" % family)
87     print(header)
88     sys.exit(1)
90 root = tree.getroot()
92 mySearchExpression = "./register[@offset=\'0x%X\']"
93 mySearchExpression2 = "./bitenum[@value=\'%d\']"
95 for lines in rd1:
96     # Use regular expression to extract address and data from rd1
97     m = re.match(r'(0x[0-9a-fA-F]{8})\s+(0x[0-9a-fA-F]{8})', lines, 0)
98     if m:
99         alphanum1 = m.group(1)  # address (string)
100         alphanum2 = m.group(2)  # data (string)
101         address = int(alphanum1, 16)  # convert from string to number
102         offset = address - 0x4A002000
103         register_value = int(alphanum2, 16)  # convert from string
104         comments = ""  # Start new for each line
106         # Extract slewcontrol field
107         if (register_value & 0x00080000) == 0x00080000:
108             slewstring = "slow"
109             slew = 1
110         else:
111             slewstring = "fast"
112             slew = 0
114         # Extract inputenable and pullup/pulldown info
115         if (register_value & 0x00040000) == 0x00040000:
116             inputenable_string = "input enabled"
117         else:
118             inputenable_string = "output-only"
119         if (register_value & 0x00010000) == 0x00010000:
120             pullstring = "no pull"
121         else:
122             if (register_value & 0x00020000) == 0x00020000:
123                 pullstring = "pullup"
124             else:
125                 pullstring = "pulldown"
126         myregister = root.find(mySearchExpression % offset)
127         myregister_name = myregister.get("id")
129         # Extract muxmode and associated description
130         muxmode = register_value & 0xf
131         mymux = myregister.find("./bitfield[@begin='3']")
132         if mymux is not None:
133             myselection = mymux.find(mySearchExpression2 % muxmode)
134             if myselection is not None:
135                 muxmode_description = myselection.get('description')
136             else:
137                 muxmode_description = "Undefined!"
138                 comments += "Illegal muxmode selected; "
139         else:
140             muxmode_description = "-"
142         # Parse modeselect and delaymode fields
143         mymodeselect = myregister.find("./bitfield[@begin='8']")
144         if mymodeselect is not None:
145             if (register_value & 0x100) == 0x100:
146                 modeselect_description = "Virtual/Manual"
147                 delaymode = (register_value & 0xF0) >> 4
148                 delaymode_format_string = "%d"
149                 delaymode_string = delaymode_format_string % delaymode
150             else:
151                 modeselect_description = "Default"
152                 delaymode_string = "-"
153         else:
154             modeselect_description = "-"
155             delaymode_string = "-"
157         # For vout pins, recommend slow slew
158         # For all other pins, use the default value
159         if "vout" in muxmode_description:
160             if slew == 0:
161                 comments += "Slow slew recommended for vout pins. "
162         else:
163             myslew = myregister.find("./bitfield[@begin='19']")
164             if myslew is not None:
165                 default_slew = int(myslew.get('resetval'), 16)
166                 if default_slew != slew:
167                     comments += "Slew rate should be left at default value. "
169         # Write a line of the CSV file
170         csv.write(csv_string % (myregister_name, address,
171                   register_value, slewstring, inputenable_string,
172                   pullstring, modeselect_description,
173                   delaymode_string, muxmode, muxmode_description,
174                   comments))
176 rd1.close()
177 csv.close()