2121import sys
2222import struct
2323import pkg_resources
24+ from cmsis_svd .model import SVDAccessType
2425
2526from typing import Tuple , List , Optional , Union
2627
3738
3839def _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
4243def _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
4950def _field_readable (field : svd_model .SVDField ) -> bool :
@@ -52,18 +53,23 @@ def _field_readable(field: svd_model.SVDField) -> bool:
5253def _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
6263def _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
6568def _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
6874def _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