def load_vnd2vendor(vendor_prefixes): # Load the vendor-prefixes.txt file. Return a dict mapping 'vnd' # vendor prefixes as they are found in compatible properties to # each vendor's full name. # # For example, this line: # # vnd A stand-in for a real vendor # # Gets split into a key 'vnd' and a value 'A stand-in for a real # vendor' in the return value. # # The 'None' key maps to GENERIC_OR_VENDOR_INDEPENDENT. vnd2vendor = { None: GENERIC_OR_VENDOR_INDEPENDENT, } vnd2vendor.update(edtlib.load_vendor_prefixes_txt(vendor_prefixes)) logger.info('found %d vendor prefixes in %s', len(vnd2vendor) - 1, vendor_prefixes) if logger.isEnabledFor(logging.DEBUG): logger.debug('vnd2vendor=%s', pprint.pformat(vnd2vendor)) return vnd2vendor
def main(): global header_file global flash_area_num args = parse_args() 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, # Suppress this warning if it's suppressed in dtc warn_reg_unit_address_mismatch="-Wno-simple_bus_reg" not in args.dtc_flags, default_prop_types=True, infer_binding_for_paths=["/zephyr,user"], werror=args.edtlib_Werror, vendor_prefixes=vendor_prefixes) except edtlib.EDTError as e: sys.exit(f"devicetree error: {e}") flash_area_num = 0 # Save merged DTS source, as a debugging aid with open(args.dts_out, "w", encoding="utf-8") as f: print(edt.dts_source, file=f) # The raw index into edt.compat2nodes[compat] is used for node # instance numbering within a compatible. # # As a way to satisfy people's intuitions about instance numbers, # though, we sort this list so enabled instances come first. # # This might look like a hack, but it keeps drivers and # applications which don't use instance numbers carefully working # as expected, since e.g. instance number 0 is always the # singleton instance if there's just one enabled node of a # particular compatible. # # This doesn't violate any devicetree.h API guarantees about # instance ordering, since we make no promises that instance # numbers are stable across builds. for compat, nodes in edt.compat2nodes.items(): edt.compat2nodes[compat] = sorted(nodes, key=lambda node: 0 if node.status == "okay" else 1) # Create the generated header. with open(args.header_out, "w", encoding="utf-8") as header_file: write_top_comment(edt) # populate all z_path_id first so any children references will # work correctly. for node in sorted(edt.nodes, key=lambda node: node.dep_ordinal): node.z_path_id = node_z_path_id(node) # Check to see if we have duplicate "zephyr,memory-region" property values. regions = dict() for node in sorted(edt.nodes, key=lambda node: node.dep_ordinal): if 'zephyr,memory-region' in node.props: region = node.props['zephyr,memory-region'].val if region in regions: sys.exit( f"ERROR: Duplicate 'zephyr,memory-region' ({region}) properties " f"between {regions[region].path} and {node.path}") regions[region] = node for node in sorted(edt.nodes, key=lambda node: node.dep_ordinal): write_node_comment(node) out_comment("Node's full path:") out_dt_define(f"{node.z_path_id}_PATH", f'"{escape(node.path)}"') out_comment("Node's name with unit-address:") out_dt_define(f"{node.z_path_id}_FULL_NAME", f'"{escape(node.name)}"') if node.parent is not None: out_comment(f"Node parent ({node.parent.path}) identifier:") out_dt_define(f"{node.z_path_id}_PARENT", f"DT_{node.parent.z_path_id}") out_comment(f"Node's index in its parent's list of children:") out_dt_define(f"{node.z_path_id}_CHILD_IDX", node.parent.child_index(node)) write_children(node) write_dep_info(node) write_idents_and_existence(node) write_bus(node) write_special_props(node) write_vanilla_props(node) write_chosen(edt) write_global_compat_info(edt) write_device_extern_header(args.device_header_out, edt) if args.edt_pickle_out: write_pickled_edt(edt, args.edt_pickle_out)