forked from NVIDIA/tegra-pinmux-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tegra_pmx_board_parser.py
102 lines (83 loc) · 3.99 KB
/
tegra_pmx_board_parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
import os.path
import sys
import tegra_pmx_soc_parser
from tegra_pmx_parser_utils import *
script_dir = os.path.dirname(os.path.abspath(__file__))
configs_dir = os.path.join(script_dir, 'configs')
class PinConfig(ReprDictObj):
def __init__(self, soc, data):
fields = ('fullname', 'mux', 'gpio_init', 'pull', 'tri', 'e_inp', 'od')
if soc.soc_pins_have_rcv_sel:
fields += ('rcv_sel', )
if soc.soc_pins_have_e_io_hv:
fields += ('e_io_hv', )
for i, field in enumerate(fields):
self.__setattr__(field, data[i])
self.gpio_pin = soc.gpio_or_pin_by_fullname(self.fullname)
class MipiPadCtrlConfig(ReprDictObj):
def __init__(self, soc, data):
fields = ('name', 'mux')
for i, field in enumerate(fields):
self.__setattr__(field, data[i])
self.mipi_pad_ctrl_group = soc.mipi_pad_ctrl_group_by_name(self.name)
class Board(TopLevelParsedObj):
def __init__(self, name, data):
TopLevelParsedObj.__init__(self, name, (), data)
self.varname = name.lower().replace('-', '_')
self.definename = name.upper().replace('-', '_')
self.soc = tegra_pmx_soc_parser.load_soc(data['soc'])
self._pincfgs = []
for num, pindata in enumerate(data['pins']):
pincfg = PinConfig(self.soc, pindata)
self._pincfgs.append(pincfg)
# FIXME: fill this in...
self.drvcfg = []
self._mipipadctrlcfgs = []
if 'mipi_pad_ctrl_groups' in data:
for num, pindata in enumerate(data['mipi_pad_ctrl_groups']):
mipipadctrlcfg = MipiPadCtrlConfig(self.soc, pindata)
self._mipipadctrlcfgs.append(mipipadctrlcfg)
self._generate_derived_data()
def _generate_derived_data(self):
self._pincfgs_by_num = sorted(self._pincfgs, key=lambda pincfg: pincfg.gpio_pin.sort_by_num_key())
self._mipipadctrlcfgs_by_num = sorted(self._mipipadctrlcfgs, key=lambda cfg: cfg.mipi_pad_ctrl_group.reg)
def pincfgs_by_conf_order(self):
return self._pincfgs
def pincfgs_by_num(self):
return self._pincfgs_by_num
def mipipadctrlcfgs_by_conf_order(self):
return self._mipipadctrlcfgs
def mipipadctrlcfgs_by_num(self):
return self._mipipadctrlcfgs_by_num
def warn_about_unconfigured_pins(self):
unconfigured_gpio_pins = [gpio_pin.fullname for gpio_pin in self.soc.gpios_pins_by_num() if gpio_pin.reg]
for gpio_pin in self.pincfgs_by_num():
unconfigured_gpio_pins.remove(gpio_pin.gpio_pin.fullname)
for gpio_pin in unconfigured_gpio_pins:
print('WARNING: Unconfigured pin ' + gpio_pin, file=sys.stderr)
def load_board(boardname):
fn = os.path.join(configs_dir, boardname + '.board')
d = {}
with open(fn) as f:
code = compile(f.read(), fn, 'exec')
exec(code, globals(), d)
return Board(boardname, d)