# # Copyright (c) 2017 Linaro # Copyright (c) 2017 Bobby Noelte # # SPDX-License-Identifier: Apache-2.0 # from collections import defaultdict # globals phandles = {} aliases = defaultdict(list) chosen = {} reduced = {} regs_config = { 'zephyr,flash' : 'CONFIG_FLASH', 'zephyr,sram' : 'CONFIG_SRAM', 'zephyr,ccm' : 'CONFIG_CCM' } name_config = { 'zephyr,console' : 'CONFIG_UART_CONSOLE_ON_DEV_NAME', 'zephyr,bt-uart' : 'CONFIG_BT_UART_ON_DEV_NAME', 'zephyr,uart-pipe' : 'CONFIG_UART_PIPE_ON_DEV_NAME', 'zephyr,bt-mon-uart' : 'CONFIG_BT_MONITOR_ON_DEV_NAME', 'zephyr,uart-mcumgr' : 'CONFIG_UART_MCUMGR_ON_DEV_NAME' } def convert_string_to_label(s): # Transmute ,-@ to _ s = s.replace("-", "_") s = s.replace(",", "_") s = s.replace("@", "_") # Uppercase the string s = s.upper() return s def get_all_compatibles(d, name, comp_dict): if 'props' in d: compat = d['props'].get('compatible') enabled = d['props'].get('status') if enabled == "disabled": return comp_dict if compat is not None: comp_dict[name] = compat if name != '/': name += '/' if isinstance(d, dict): if d['children']: for k, v in d['children'].items(): get_all_compatibles(v, name + k, comp_dict) return comp_dict def get_aliases(root): if 'children' in root: if 'aliases' in root['children']: for k, v in root['children']['aliases']['props'].items(): aliases[v].append(k) def get_compat(node_address): compat = None try: if 'props' in reduced[node_address].keys(): compat = reduced[node_address]['props'].get('compatible') if isinstance(compat, list): compat = compat[0] if compat == None: compat = find_parent_prop(node_address, 'compatible') except: pass return compat def get_chosen(root): if 'children' in root: if 'chosen' in root['children']: for k, v in root['children']['chosen']['props'].items(): chosen[k] = v def get_phandles(root, name, handles): if 'props' in root: handle = root['props'].get('phandle') enabled = root['props'].get('status') if enabled == "disabled": return if handle is not None: phandles[handle] = name if name != '/': name += '/' if isinstance(root, dict): if root['children']: for k, v in root['children'].items(): get_phandles(v, name + k, handles) def insert_defs(node_address, defs, new_defs, new_aliases): if node_address in defs: if 'aliases' in defs[node_address]: defs[node_address]['aliases'].update(new_aliases) else: defs[node_address]['aliases'] = new_aliases defs[node_address].update(new_defs) else: new_defs['aliases'] = new_aliases defs[node_address] = new_defs def find_node_by_path(nodes, path): d = nodes for k in path[1:].split('/'): d = d['children'][k] return d def get_reduced(nodes, path): # compress nodes list to nodes w/ paths, add interrupt parent if 'props' in nodes: status = nodes['props'].get('status') if status == "disabled": return if isinstance(nodes, dict): reduced[path] = dict(nodes) reduced[path].pop('children', None) if path != '/': path += '/' if nodes['children']: for k, v in nodes['children'].items(): get_reduced(v, path + k) def get_node_label(node_compat, node_address): def_label = convert_string_to_label(node_compat) if '@' in node_address: def_label += '_' + node_address.split('@')[-1].upper() else: def_label += convert_string_to_label(node_address) return def_label def find_parent_prop(node_address, prop): parent_address = '' for comp in node_address.split('/')[1:-1]: parent_address += '/' + comp if prop in reduced[parent_address]['props']: parent_prop = reduced[parent_address]['props'].get(prop) else: raise Exception("Parent of node " + node_address + " has no " + prop + " property") return parent_prop