diff --git a/__init__.py b/__init__.py index 6582073..abed052 100644 --- a/__init__.py +++ b/__init__.py @@ -24,11 +24,18 @@ def import_svd(bv: BinaryView): for peripheral in peripherals: per_name: str = peripheral['name'] - per_desc: str = peripheral['description'] + per_desc = None + if 'description' in peripheral: + per_desc: str = peripheral['description'] per_base_addr: int = peripheral['baseAddress'] per_struct = StructureBuilder.create() - per_registers = peripheral['registers']['register'] + # the registers block is an optional 0..1 field in the SVD spec. Even + # if we don't get individual register definitions, we can create a + # memory region for a peripheral + per_registers = [] + if 'registers' in peripheral: + per_registers = peripheral['registers']['register'] for register in per_registers: reg_name: str = register['name'] reg_desc: str = register['description'] @@ -41,8 +48,22 @@ def import_svd(bv: BinaryView): reg_fields = register['fields']['field'] for field in reg_fields: field_name: str = field['name'] - field_lsb: int = field['lsb'] - field_msb: int = field['msb'] + # one of the three following field bit specifications must be + # provided + if 'lsb' in field and 'msb' in field: + field_lsb: int = field['lsb'] + field_msb: int = field['msb'] + elif 'bitOffset' in field: + field_lsb: int = field['bitOffset'] + # The bitWidth field is optional + if 'bitWidth' in field: + field_msb: int = field['bitOffset'] + field['bitWidth'] - 1 + else: + field_msb: int = field['bitOffset'] + elif 'bitRange' in field: + msb_str, lsb_str = field['bitRange'].split(':', 1) + field_lsb: int = int(lsb_str[:-1]) + field_msb: int = int(msb_str[1:]) field_lsb_b: float = field_lsb / BYTE_SIZE field_msb_b: float = field_msb / BYTE_SIZE @@ -102,7 +123,7 @@ def import_svd(bv: BinaryView): bv.memory_map.add_memory_region(per_name, per_base_addr, bytearray(per_size)) # Add the peripheral description as a comment - if show_comments: + if show_comments and per_desc is not None: bv.set_comment_at(per_base_addr, per_desc) # Define the peripheral type and data var in the binary view. per_struct_ty = Type.structure_type(per_struct)