Skip to content

Commit 528d33d

Browse files
committed
fix peripheral access to cmsis_svd
1 parent 94bd022 commit 528d33d

1 file changed

Lines changed: 37 additions & 24 deletions

File tree

cmdebug/svd_gdb.py

Lines changed: 37 additions & 24 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,33 +38,42 @@
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

42-
def _field_accessible(field: svd_model.SVDField, mode: str) -> bool:
43+
def _field_accessible(field: svd_model.SVDField, mode: SVDAccessType) -> 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:
50-
return _field_accessible(field, "read")
51+
return _field_accessible(field, SVDAccessType.READ_ONLY) or \
52+
_field_accessible(field, SVDAccessType.READ_WRITE) or \
53+
_field_accessible(field, SVDAccessType.READ_WRITE_ONCE)
5154

5255
def _field_writeable(field: svd_model.SVDField) -> bool:
53-
return _field_accessible(field, "write")
54-
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+
return _field_accessible(field, SVDAccessType.READ_WRITE) or \
57+
_field_accessible(field, SVDAccessType.WRITE_ONCE) or \
58+
_field_accessible(field, SVDAccessType.WRITE_ONLY)
59+
60+
def _reg_accessible(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray], mode: SVDAccessType) -> bool:
61+
if reg.access is not None:
62+
return reg.access == mode
63+
elif reg.parent.access is not None:
64+
return reg.parent.access == mode
6065
return False
6166

6267
def _reg_readable(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray]) -> bool:
63-
return _reg_accessible(reg, "read")
68+
return _reg_accessible(reg, SVDAccessType.READ_ONLY) or \
69+
_reg_accessible(reg, SVDAccessType.READ_WRITE) or \
70+
_reg_accessible(reg, SVDAccessType.READ_WRITE_ONCE)
6471

6572
def _reg_writeable(reg: Union[svd_model.SVDRegister, svd_model.SVDRegisterArray]) -> bool:
66-
return _reg_accessible(reg, "write")
73+
return _reg_accessible(reg, SVDAccessType.WRITE_ONCE) or \
74+
_reg_accessible(reg, SVDAccessType.WRITE_ONLY) or \
75+
_reg_accessible(reg, SVDAccessType.READ_WRITE) or \
76+
_reg_accessible(reg, SVDAccessType.READ_WRITE_ONCE)
6777

6878
def _get_regs_by_addresss(peripheral: svd_model.SVDPeripheral) -> List[Tuple[str, svd_model.SVDRegister, int]]:
6979
reg_list: List[Tuple[str, svd_model.SVDRegister, int]] = []
@@ -152,15 +162,14 @@ def __init__(self, svd_device: svd_model.SVDDevice):
152162

153163
def _print_registers(self, container_name, form: str, peripheral: svd_model.SVDPeripheral):
154164
gdb.write(f"Registers in {container_name}:\n")
155-
156165
reg_list = _get_regs_by_addresss(peripheral)
157166
reg_list_str: List[Tuple[str, str, str]] = []
158167

159168
for name, r, addr in reg_list:
160169
if _reg_readable(r):
161170
try:
162-
data = self.read(addr, r._size)
163-
data_str = self.format(data, form, r._size)
171+
data = self.read(addr, r.size)
172+
data_str = self.format(data, form, r.size)
164173
if form == 'a':
165174
data_str += " <" + re.sub(r'\s+', ' ',
166175
gdb.execute("info symbol {}".format(data), True,
@@ -183,13 +192,14 @@ def _print_registers(self, container_name, form: str, peripheral: svd_model.SVDP
183192

184193
def _print_register_fields(self, container_name: str, form: str, register: svd_model.SVDRegister):
185194
gdb.write(f"Fields in {container_name}:\n")
186-
fields = register._fields
187-
if "read" not in register._access:
195+
fields = register.fields
196+
if not _reg_readable(register):
197+
gdb.write("{} is not readable\n".format(register.name))
188198
data = 0
189199
else:
190-
data = self.read(_reg_address(register), register._size)
200+
data = self.read(_reg_address(register), register.size)
191201
field_list: List[Tuple[str, str, str]] = []
192-
for f in register._fields:
202+
for f in register.fields:
193203

194204
desc = re.sub(r'\s+', ' ', f.description)
195205
if _field_readable(f):
@@ -253,8 +263,11 @@ def invoke(self, args, from_tty):
253263
peripherals = self.svd_device.peripherals
254264
column_width = max(len(p.name) for p in peripherals) + 2 # padding
255265
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))
266+
if p.description is not None:
267+
desc = re.sub(r'\s+', ' ', p.description)
268+
gdb.write("\t{}:{}{}\n".format(p.name, "".ljust(column_width - len(p.name)), desc))
269+
else:
270+
gdb.write("\t{}\n".format(p.name))
258271
return
259272

260273
if len(s) >= 1:

0 commit comments

Comments
 (0)