-
Notifications
You must be signed in to change notification settings - Fork 148
/
Copy pathgen_board_pinctrl.py
executable file
·178 lines (154 loc) · 6.02 KB
/
gen_board_pinctrl.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/usr/bin/env python3
#
# Copyright 2023, NXP
#
# SPDX-License-Identifier: Apache-2.0
"""
Wrapper around support libraries for i.MX RT, LPC, and Kinetis SOCs.
Allows user to generate pin control board files from MCUXpresso config
tools (MEX) files
"""
# Standard python libraries
import argparse
import tempfile
import zipfile
import pathlib
import sys
import re
import datetime
# SOC configuration data support libraries
from imx import imx_cfg_utils
from kinetis import kinetis_cfg_utils
from lpc import lpc_cfg_utils
# Shared MEX utilities
from shared import mex_utils
HELPSTR = """
Processes NXP MEX configuration files
Given a mex file, generates the board level pinctrl groups required for
Zephyr. This tool is intended to be used with the configuration data packs
downloaded from NXP's MCUXpresso SDK builder, as well as MEX files created
by the user using MCUXpresso configuration tools
"""
def parse_args():
"""
Parses arguments, and returns object with parsed arguments
as properties
"""
parser = argparse.ArgumentParser(description=HELPSTR,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('mex_file', metavar = 'MEX',
type=str, help='path to source MEX file')
parser.add_argument('data_pack', metavar = 'DATA_PACK', type=str,
help='Path to downloaded data package zip')
parser.add_argument('--copyright', action='store_true',
help='Enable default NXP copyright')
parser.add_argument('--board-output', metavar = 'BOARD_OUT', type=str,
help='Output path for board level DTS file')
parser.add_argument('--controller', metavar = 'CTRL', type=str,
help=("SOC pin controller type."
"Currently supports: [IOMUX, IOCON, PORT]"))
return parser.parse_args()
def processor_to_controller(processor_name):
"""
Returns pin controller type for processor, or None if
processor is unknown
"""
# Select family of pin controller based on SOC type
if "IMXRT1" in processor_name:
# Use IMX config tools
return 'IOMUX'
if "IMXRT6" in processor_name:
# LPC config tools
return 'IOCON'
if "IMXRT5" in processor_name:
# LPC config tools
return 'IOCON'
if "LPC55" in processor_name:
# LPC config tools
return 'IOCON'
if "MK" in processor_name:
# Kinetis config tools
return 'PORT'
if "MCX" in processor_name:
# Kinetis config tools
return 'PORT'
# Unknown processor family
return "UNKNOWN"
def get_pack_version(pack_dir):
"""
Gets datapack version
@param pack_dir: root directory data pack is in
"""
# Check version of the config tools archive
npi_data = pathlib.Path(pack_dir) / 'npidata.mf'
data_version = 0.0
with open(npi_data, 'r', encoding='UTF8') as stream:
line = stream.readline()
while line != '':
match = re.search(r'data_version=([\d\.]+)', line)
if match:
data_version = float(match.group(1))
break
line = stream.readline()
return data_version
def main():
"""
Main entry point. Will process arguments, and generate board pin control
files.
"""
args = parse_args()
utils = mex_utils.NxpMexUtil(args.mex_file)
pins_version = utils.get_pins_version()
if round(pins_version) != 14:
print("Warning: This tool is only verified for MEX files version 14, "
"other versions may not work")
board_name = utils.get_board_name()
processor_name = utils.get_processor_name()
package_name = utils.get_package_name()
# Extract the Data pack to a temporary directory
temp_dir = tempfile.TemporaryDirectory()
zipfile.ZipFile(args.data_pack).extractall(temp_dir.name)
proc_root = (pathlib.Path(temp_dir.name) / 'processors'/
processor_name / 'ksdk2_0' / package_name)
if not proc_root.exists():
print(f"Error: Data pack does not contain processor data for {processor_name}")
sys.exit(255)
data_version = get_pack_version(temp_dir.name)
print(f"Found data pack version {data_version}, pins version {pins_version} "
f"for processor {processor_name}")
if round(data_version) != 14:
print("Warning: This tool is only verified for data pack version 14, "
"other versions may not work")
if not args.board_output:
args.board_output = f"{board_name.lower().replace('-', '_')}-pinctrl.dtsi"
# Initialize SOC specific utility, and generate board pin control
if args.copyright:
# Add default copyright
nxp_copyright = (f"Copyright {datetime.datetime.today().year}, NXP\n"
f" * SPDX-License-Identifier: Apache-2.0")
else:
nxp_copyright = ''
if args.controller is None:
args.controller = processor_to_controller(processor_name)
# If controller is unknown, this is an unknown SOC and user did not
# manually select a controller
if args.controller == "UNKNOWN":
print(f"Error: processor {processor_name} is not currently supported by this tool")
print("You can try specifying your pin controller family manually, "
"but this is unsupported!")
sys.exit(255)
# Select correct config tool script for the MEX file
if args.controller == 'IOMUX':
cfg_util = imx_cfg_utils.NXPSdkUtil(str(proc_root), copyright_header=nxp_copyright)
elif args.controller == 'IOCON':
cfg_util = lpc_cfg_utils.NXPSdkUtil(str(proc_root), copyright_header=nxp_copyright)
elif args.controller == 'PORT':
cfg_util = kinetis_cfg_utils.NXPSdkUtil(str(proc_root), copyright_header=nxp_copyright)
else:
print("Error: unknown controller type")
sys.exit(255)
print(f"Generating configuration for {board_name}")
cfg_util.write_pinctrl_groups(args.mex_file, args.board_output)
print(f"Wrote board pinctrl dts file to {args.board_output}")
if __name__ == "__main__":
main()