diff --git a/stm32data/__main__.py b/stm32data/__main__.py index d883047..76f8fa9 100755 --- a/stm32data/__main__.py +++ b/stm32data/__main__.py @@ -853,6 +853,7 @@ def parse_chips(): 'kind': 'flash', 'address': h['defines']['all'][each + '_BASE'], 'size': size, + 'settings': memory.determine_flash_settings(chip_name), }) found = set() diff --git a/stm32data/memory.py b/stm32data/memory.py index 7815abe..4ef8cf3 100644 --- a/stm32data/memory.py +++ b/stm32data/memory.py @@ -45,13 +45,16 @@ memories = [] def parse(): for f in sorted(glob('sources/cubeprogdb/db/*.xml')): - #print("parsing ", f); + # print("parsing ", f); device = xmltodict.parse(open(f, 'rb'))['Root']['Device'] device_id = device['DeviceID'] name = device['Name'] names = split_names(name) flash_size = None flash_addr = None + write_size = None + erase_size = None + erase_value = None ram_size = None ram_addr = None @@ -69,7 +72,20 @@ def parse(): configs = [configs] flash_addr = int(configs[0]['Parameters']['@address'], 16) flash_size = int(configs[0]['Parameters']['@size'], 16) - #print( f'flash {addr} {size}') + erase_value = int(peripheral['ErasedValue'], 16) + write_size = int(configs[0]['Allignement'], 16) + bank = configs[0]['Bank'] + if type(bank) != list: + bank = [bank] + fields = bank[0]['Field'] + if type(fields) != list: + fields = [fields] + + erase_size = int(fields[0]['Parameters']['@size'], 16) + for field in fields: + # print("Field", field) + erase_size = max(erase_size, int(field['Parameters']['@size'], 16)) + #print( f'flash {addr} {size}') chunk = { 'device-id': int(device_id, 16), @@ -86,6 +102,9 @@ def parse(): chunk['flash'] = { 'address': flash_addr, 'bytes': flash_size, + 'erase_value': erase_value, + 'write_size': write_size, + 'erase_size': erase_size, } memories.append(chunk) @@ -108,6 +127,18 @@ def determine_flash_size(chip_name): return None +def determine_flash_settings(chip_name): + for each in memories: + for name in each['names']: + if is_chip_name_match(name, chip_name): + return { + 'erase_size': each['flash']['erase_size'], + 'write_size': each['flash']['write_size'], + 'erase_value': each['flash']['erase_value'], + } + + return None + def determine_device_id(chip_name): for each in memories: