Skip to content

Commit 9d82bb4

Browse files
committed
fix peripheral access to cmsis_svd
1 parent 94bd022 commit 9d82bb4

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed

cmdebug/svd_gdb.py

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import sys
2222
import struct
2323
import pkg_resources
24+
from cmsis_svd.model import SVDAccessType
2425

2526
from typing import Tuple, List, Optional, Union
2627

@@ -37,13 +38,13 @@
3738

3839
def _reg_address(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray]) -> int:
3940
assert reg.parent is not None, f"Cannot get address for parentless register {reg.name}"
40-
return reg.parent._base_address + reg.address_offset
41+
return reg.parent.base_address + reg.address_offset
4142

4243
def _field_accessible(field: svd_model.SVDField, mode: str) -> bool:
4344
if field.access is not None:
44-
return mode in field.access
45-
elif field.parent._access is not None:
46-
return mode in field.parent._access
45+
return mode == field.access
46+
elif field.parent.access is not None:
47+
return mode == field.parent.access
4748
return False
4849

4950
def _field_readable(field: svd_model.SVDField) -> bool:
@@ -52,18 +53,23 @@ def _field_readable(field: svd_model.SVDField) -> bool:
5253
def _field_writeable(field: svd_model.SVDField) -> bool:
5354
return _field_accessible(field, "write")
5455

55-
def _reg_accessible(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray], mode: str) -> bool:
56-
if reg._access is not None:
57-
return mode in reg._access
58-
elif reg.parent._access is not None:
59-
return mode in reg.parent._access
56+
def _reg_accessible(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray], mode: SVDAccessType) -> bool:
57+
if reg.access is not None:
58+
return reg.access == mode
59+
elif reg.parent.access is not None:
60+
return reg.parent.access == mode
6061
return False
6162

6263
def _reg_readable(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray]) -> bool:
63-
return _reg_accessible(reg, "read")
64+
return _reg_accessible(reg, SVDAccessType.READ_ONLY) or \
65+
_reg_accessible(reg, SVDAccessType.READ_WRITE) or \
66+
_reg_accessible(reg, SVDAccessType.READ_WRITE_ONCE)
6467

6568
def _reg_writeable(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray]) -> bool:
66-
return _reg_accessible(reg, "write")
69+
return _reg_accessible(reg, SVDAccessType.WRITE_ONCE) or \
70+
_reg_accessible(reg, SVDAccessType.WRITE_ONLY) or \
71+
_reg_accessible(reg, SVDAccessType.READ_WRITE) or \
72+
_reg_accessible(reg, SVDAccessType.READ_WRITE_ONCE)
6773

6874
def _get_regs_by_addresss(peripheral: svd_model.SVDPeripheral) -> List[Tuple[str, svd_model.SVDRegister, int]]:
6975
reg_list: List[Tuple[str, svd_model.SVDRegister, int]] = []
@@ -152,15 +158,14 @@ def __init__(self, svd_device: svd_model.SVDDevice):
152158

153159
def _print_registers(self, container_name, form: str, peripheral: svd_model.SVDPeripheral):
154160
gdb.write(f"Registers in {container_name}:\n")
155-
156161
reg_list = _get_regs_by_addresss(peripheral)
157162
reg_list_str: List[Tuple[str, str, str]] = []
158163

159164
for name, r, addr in reg_list:
160165
if _reg_readable(r):
161166
try:
162-
data = self.read(addr, r._size)
163-
data_str = self.format(data, form, r._size)
167+
data = self.read(addr, r.size)
168+
data_str = self.format(data, form, r.size)
164169
if form == 'a':
165170
data_str += " <" + re.sub(r'\s+', ' ',
166171
gdb.execute("info symbol {}".format(data), True,
@@ -184,7 +189,7 @@ def _print_registers(self, container_name, form: str, peripheral: svd_model.SVDP
184189
def _print_register_fields(self, container_name: str, form: str, register: svd_model.SVDRegister):
185190
gdb.write(f"Fields in {container_name}:\n")
186191
fields = register._fields
187-
if "read" not in register._access:
192+
if "read" not in register.access:
188193
data = 0
189194
else:
190195
data = self.read(_reg_address(register), register._size)
@@ -253,8 +258,11 @@ def invoke(self, args, from_tty):
253258
peripherals = self.svd_device.peripherals
254259
column_width = max(len(p.name) for p in peripherals) + 2 # padding
255260
for p in peripherals:
256-
desc = re.sub(r'\s+', ' ', p._description)
257-
gdb.write("\t{}:{}{}\n".format(p.name, "".ljust(column_width - len(p.name)), desc))
261+
if p.description is not None:
262+
desc = re.sub(r'\s+', ' ', p.description)
263+
gdb.write("\t{}:{}{}\n".format(p.name, "".ljust(column_width - len(p.name)), desc))
264+
else:
265+
gdb.write("\t{}\n".format(p.name))
258266
return
259267

260268
if len(s) >= 1:

0 commit comments

Comments
 (0)