From 7a7b14ed4b05021d121464a2895de7dcb4db5568 Mon Sep 17 00:00:00 2001 From: Bob McWhirter Date: Fri, 9 Jul 2021 09:32:55 -0400 Subject: [PATCH 1/6] Adjust parse to remove L or H from clock name. --- parse.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parse.py b/parse.py index 8bad457..caf7229 100755 --- a/parse.py +++ b/parse.py @@ -976,6 +976,8 @@ def parse_rcc_regs(): if key.startswith("fieldset/A") and key.endswith("ENR"): clock = removesuffix(key, "ENR") clock = removeprefix(clock, "fieldset/") + clock = removesuffix(clock, "L") + clock = removesuffix(clock, "H") for field in body['fields']: if field['name'].endswith('EN'): peri = removesuffix(field['name'], 'EN') From 4823bfee649c78c3c671bcf53782fd7a5a5cd3f8 Mon Sep 17 00:00:00 2001 From: Bob McWhirter Date: Fri, 9 Jul 2021 11:04:46 -0400 Subject: [PATCH 2/6] Slightly improve DMA parsing wrt H7 weirdness. --- parse.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/parse.py b/parse.py index caf7229..e0f521d 100755 --- a/parse.py +++ b/parse.py @@ -827,9 +827,12 @@ dma_channels = {} def parse_dma(): - - for f in glob('sources/cubedb/mcu/IP/DMA-*Modes.xml'): - ff = removeprefix(f, 'sources/cubedb/mcu/IP/DMA-') + for f in glob('sources/cubedb/mcu/IP/*DMA-*Modes.xml'): + ff = removeprefix(f, 'sources/cubedb/mcu/IP/') + if not ( ff.startswith('B') or ff.startswith( 'D' ) ): + continue + ff = removeprefix(ff, 'DMA-') + ff = removeprefix(ff, 'BDMA-') ff = removesuffix(ff, '_Modes.xml') r = xmltodict.parse(open(f, 'rb'), force_list={'Mode', 'RefMode'}) @@ -871,14 +874,15 @@ def parse_dma(): request_num += 1 for n in dma_peri_name.split(","): n = n.strip() - if result := re.match('.*' + n + '_Channel\[(\d+)-(\d+)\]', channels[0]['@Name']): - low = int(result.group(1)) - high = int(result.group(2)) + if result := re.match('.*' + n + '_(Channel|Stream)\[(\d+)-(\d+)\]', channels[0]['@Name']): + low = int(result.group(2)) + high = int(result.group(3)) for i in range(low, high+1): chip_dma['channels'][n+'_'+str(i)] = OrderedDict({ 'dma': n, 'channel': i, }) + else: # see if we can scrape out requests requests = {} From b187661675f2b4fed3b008f43f44325bb9ebd7f8 Mon Sep 17 00:00:00 2001 From: Bob McWhirter Date: Mon, 12 Jul 2021 10:45:32 -0400 Subject: [PATCH 3/6] Change DMA-vs-BDMA parsing to ensure we capture everything without trampling. --- parse.py | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/parse.py b/parse.py index e0f521d..6bd8f1c 100755 --- a/parse.py +++ b/parse.py @@ -491,7 +491,15 @@ def parse_chips(): gpio_af = next(filter(lambda x: x['@Name'] == 'GPIO', r['IP']))['@Version'] gpio_af = removesuffix(gpio_af, '_gpio_v1_0') - dma = next(filter(lambda x: x['@Name'] == 'DMA', r['IP']))['@Version'] + dma = next(filter(lambda x: x['@Name'] == 'DMA', r['IP']), None) + bdma = next(filter(lambda x: x['@Name'] == 'BDMA', r['IP']), None) + + if dma is not None: + dma = dma['@Version'] + if bdma is not None: + bdma = bdma['@Version'] + #dma = next(filter(lambda x: x['@Name'] == 'DMA', r['IP']), None)['@Version'] + #bdma = next(filter(lambda x: x['@Name'] == 'BDMA', r['IP']), None)['@Version'] rcc = next(filter(lambda x: x['@Name'] == 'RCC', r['IP']))['@Version'] @@ -532,6 +540,7 @@ def parse_chips(): 'application-notes': [], 'rcc': rcc, # temporarily stashing it here 'dma': dma, # temporarily stashing it here + 'bdma': bdma, # temporarily stashing it here }) chips[chip_name]['packages'].append(OrderedDict({ @@ -606,6 +615,9 @@ def parse_chips(): chip_dma = chip['dma'] del chip['dma'] + chip_bdma = chip['bdma'] + del chip['bdma'] + h = find_header(chip_name) if h is None: raise Exception("missing header for {}".format(chip_name)) @@ -624,8 +636,11 @@ def parse_chips(): defines = h['defines'][core_name] core['interrupts'] = interrupts + core['dma_channels'] = {} if chip_dma in dma_channels: - core['dma_channels'] = dma_channels[chip_dma]['channels'] + core['dma_channels'].update(dma_channels[chip_dma]['channels']) + if chip_bdma in dma_channels: + core['dma_channels'].update(dma_channels[chip_bdma]['channels']) # print("INterrupts for", core, ":", interrupts) #print("Defines for", core, ":", defines) @@ -634,8 +649,6 @@ def parse_chips(): addr = defines.get(pname) if addr is None: if pname == 'ADC_COMMON': - addr = defines.get('ADC_COMMON') - if addr is None: addr = defines.get('ADC1_COMMON') if addr is None: addr = defines.get('ADC12_COMMON') @@ -828,6 +841,7 @@ dma_channels = {} def parse_dma(): for f in glob('sources/cubedb/mcu/IP/*DMA-*Modes.xml'): + print("---> ", f) ff = removeprefix(f, 'sources/cubedb/mcu/IP/') if not ( ff.startswith('B') or ff.startswith( 'D' ) ): continue @@ -873,15 +887,20 @@ def parse_dma(): # } )) request_num += 1 for n in dma_peri_name.split(","): + print("search channels for :: ", dma_peri_name) n = n.strip() + print("n = ", n) if result := re.match('.*' + n + '_(Channel|Stream)\[(\d+)-(\d+)\]', channels[0]['@Name']): low = int(result.group(2)) high = int(result.group(3)) + print(low, " - ", high) for i in range(low, high+1): chip_dma['channels'][n+'_'+str(i)] = OrderedDict({ 'dma': n, 'channel': i, }) + else: + print("none found") else: # see if we can scrape out requests From 9040fafc334fe29d429dc0aa9cba6f0f5655d001 Mon Sep 17 00:00:00 2001 From: Bob McWhirter Date: Mon, 12 Jul 2021 14:02:05 -0400 Subject: [PATCH 4/6] Ensure the RCC reg is named `DMA1EN` and not just `DMAEN` --- data/registers/rcc_l0.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/registers/rcc_l0.yaml b/data/registers/rcc_l0.yaml index eb962d2..11c0e42 100644 --- a/data/registers/rcc_l0.yaml +++ b/data/registers/rcc_l0.yaml @@ -593,7 +593,7 @@ fieldset/AHBENR: - bit_offset: 0 bit_size: 1 description: DMA clock enable bit - name: DMAEN + name: DMA1EN - bit_offset: 8 bit_size: 1 description: NVM interface clock enable bit @@ -621,7 +621,7 @@ fieldset/AHBRSTR: bit_size: 1 description: DMA reset enum_write: CRYPRSTW - name: DMARST + name: DMA1RST - bit_offset: 8 bit_size: 1 description: Memory interface reset @@ -653,7 +653,7 @@ fieldset/AHBSMENR: - bit_offset: 0 bit_size: 1 description: DMA clock enable during sleep mode bit - name: DMASMEN + name: DMA1SMEN - bit_offset: 8 bit_size: 1 description: NVM interface clock enable during sleep mode bit From 892c520abde3aa93ff03f7a754c5b1377ac0bb80 Mon Sep 17 00:00:00 2001 From: Bob McWhirter Date: Mon, 12 Jul 2021 14:11:02 -0400 Subject: [PATCH 5/6] Clean up parse.py. --- parse.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/parse.py b/parse.py index 6bd8f1c..c487a0b 100755 --- a/parse.py +++ b/parse.py @@ -841,7 +841,6 @@ dma_channels = {} def parse_dma(): for f in glob('sources/cubedb/mcu/IP/*DMA-*Modes.xml'): - print("---> ", f) ff = removeprefix(f, 'sources/cubedb/mcu/IP/') if not ( ff.startswith('B') or ff.startswith( 'D' ) ): continue @@ -887,20 +886,15 @@ def parse_dma(): # } )) request_num += 1 for n in dma_peri_name.split(","): - print("search channels for :: ", dma_peri_name) n = n.strip() - print("n = ", n) if result := re.match('.*' + n + '_(Channel|Stream)\[(\d+)-(\d+)\]', channels[0]['@Name']): low = int(result.group(2)) high = int(result.group(3)) - print(low, " - ", high) for i in range(low, high+1): chip_dma['channels'][n+'_'+str(i)] = OrderedDict({ 'dma': n, 'channel': i, }) - else: - print("none found") else: # see if we can scrape out requests From 197ef2a3d1455173ae038419240a11c25deedb1c Mon Sep 17 00:00:00 2001 From: Bob McWhirter Date: Mon, 12 Jul 2021 15:57:43 -0400 Subject: [PATCH 6/6] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8244817..8ff4245 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ families, including: - :heavy_check_mark: Interrupts - :heavy_check_mark: GPIO AlternateFunction mappings (except F1) - :construction: Register blocks for all peripherals -- :x: DMA stream mappings +- :construction: DMA stream mappings - :x: Per-package pinouts - :heavy_check_mark: Links to applicable reference manuals, datasheets, appnotes PDFs.