import argparse
import pickle
import sys
from typing import NoReturn
import edtlib_logger
from devicetree import edtlib
def main():
args = parse_args()
edtlib_logger.setup_edtlib_logging()
vendor_prefixes = {}
for prefixes_file in args.vendor_prefixes:
vendor_prefixes.update(edtlib.load_vendor_prefixes_txt(prefixes_file))
try:
edt = edtlib.EDT(
args.dts,
args.bindings_dirs,
warn_reg_unit_address_mismatch="-Wno-simple_bus_reg" not in args.dtc_flags,
default_prop_types=True,
infer_binding_for_paths=["/nuttx,user"],
werror=args.edtlib_Werror,
vendor_prefixes=vendor_prefixes,
)
except edtlib.EDTError as e:
sys.exit(f"devicetree error: {e}")
with open(args.dts_out, "w", encoding="utf-8") as f:
print(edt.dts_source, file=f)
write_pickled_edt(edt, args.edt_pickle_out)
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(allow_abbrev=False)
parser.add_argument("--dts", required=True, help="DTS file")
parser.add_argument(
"--dtc-flags",
help="'dtc' devicetree compiler flags, some of which "
"might be respected here",
)
parser.add_argument(
"--bindings-dirs",
nargs="+",
required=True,
help="directory with bindings in YAML format, " "we allow multiple",
)
parser.add_argument(
"--dts-out",
required=True,
help="path to write merged DTS source code to (e.g. " "as a debugging aid)",
)
parser.add_argument(
"--edt-pickle-out",
help="path to write pickled edtlib.EDT object to",
required=True,
)
parser.add_argument(
"--vendor-prefixes",
action="append",
default=[],
help="vendor-prefixes.txt path; used for validation; "
"may be given multiple times",
)
parser.add_argument(
"--edtlib-Werror",
action="store_true",
help="if set, edtlib-specific warnings become errors. "
"(this does not apply to warnings shared "
"with dtc.)",
)
return parser.parse_args()
def write_pickled_edt(edt: edtlib.EDT, out_file: str) -> None:
with open(out_file, "wb") as f:
pickle.dump(edt, f, protocol=4)
def err(s: str) -> NoReturn:
raise Exception(s)
if __name__ == "__main__":
main()