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
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
4950def _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
5255def _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
6267def _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
6572def _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
6878def _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