From 29f70ac45f488a12b4ab5bf5d22b2f781d3eef05 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Wed, 23 Jun 2021 02:30:55 +0200 Subject: [PATCH] Add DMAMUX --- data/registers/dmamux_v1.yaml | 139 ++++++++++++++++++++++++++++++++++ parse.py | 43 +++++++---- 2 files changed, 169 insertions(+), 13 deletions(-) create mode 100644 data/registers/dmamux_v1.yaml diff --git a/data/registers/dmamux_v1.yaml b/data/registers/dmamux_v1.yaml new file mode 100644 index 0000000..fa4b6fd --- /dev/null +++ b/data/registers/dmamux_v1.yaml @@ -0,0 +1,139 @@ +--- +block/DMAMUX: + description: DMAMUX + items: + - name: CCR + description: DMAMux - DMA request line multiplexer channel x control register + array: + len: 16 + stride: 4 + byte_offset: 0 + fieldset: CCR + - name: CSR + description: DMAMUX request line multiplexer interrupt channel status register + byte_offset: 128 + access: Read + fieldset: CSR + - name: CFR + description: DMAMUX request line multiplexer interrupt clear flag register + byte_offset: 132 + access: Write + fieldset: CFR + - name: RGCR + description: DMAMux - DMA request generator channel x control register + array: + len: 8 + stride: 4 + byte_offset: 256 + fieldset: RGCR + - name: RGSR + description: DMAMux - DMA request generator status register + byte_offset: 320 + access: Read + fieldset: RGSR + - name: RGCFR + description: DMAMux - DMA request generator clear flag register + byte_offset: 324 + access: Write + fieldset: RGSR +fieldset/CCR: + description: DMAMux - DMA request line multiplexer channel x control register + fields: + - name: DMAREQ_ID + description: Input DMA request line selected + bit_offset: 0 + bit_size: 8 + - name: SOIE + description: Interrupt enable at synchronization event overrun + bit_offset: 8 + bit_size: 1 + - name: EGE + description: Event generation enable/disable + bit_offset: 9 + bit_size: 1 + - name: SE + description: Synchronous operating mode enable/disable + bit_offset: 16 + bit_size: 1 + - name: SPOL + description: "Synchronization event type selector Defines the synchronization event on the selected synchronization input:" + bit_offset: 17 + bit_size: 2 + enum: POL + - name: NBREQ + description: "Number of DMA requests to forward Defines the number of DMA requests forwarded before output event is generated. In synchronous mode, it also defines the number of DMA requests to forward after a synchronization event, then stop forwarding. The actual number of DMA requests forwarded is NBREQ+1. Note: This field can only be written when both SE and EGE bits are reset." + bit_offset: 19 + bit_size: 5 + - name: SYNC_ID + description: Synchronization input selected + bit_offset: 24 + bit_size: 5 +fieldset/CFR: + description: DMAMUX request line multiplexer interrupt clear flag register + fields: + - name: CSOF + description: Clear synchronization overrun event flag + bit_offset: 0 + bit_size: 1 + array: + len: 16 + stride: 1 +fieldset/CSR: + description: DMAMUX request line multiplexer interrupt channel status register + fields: + - name: SOF + description: Synchronization overrun event flag + bit_offset: 0 + bit_size: 1 + array: + len: 16 + stride: 1 +fieldset/RGCR: + description: DMAMux - DMA request generator channel x control register + fields: + - name: SIG_ID + description: DMA request trigger input selected + bit_offset: 0 + bit_size: 5 + - name: OIE + description: Interrupt enable at trigger event overrun + bit_offset: 8 + bit_size: 1 + - name: GE + description: DMA request generator channel enable/disable + bit_offset: 16 + bit_size: 1 + - name: GPOL + description: DMA request generator trigger event type selection Defines the trigger event on the selected DMA request trigger input + bit_offset: 17 + bit_size: 2 + enum: POL + - name: GNBREQ + description: "Number of DMA requests to generate Defines the number of DMA requests generated after a trigger event, then stop generating. The actual number of generated DMA requests is GNBREQ+1. Note: This field can only be written when GE bit is reset." + bit_offset: 19 + bit_size: 5 +fieldset/RGSR: + description: DMAMux - DMA request generator status register + fields: + - name: OF + description: "Trigger event overrun flag The flag is set when a trigger event occurs on DMA request generator channel x, while the DMA request generator counter value is lower than GNBREQ. The flag is cleared by writing 1 to the corresponding COFx bit in DMAMUX_RGCFR register." + bit_offset: 0 + bit_size: 1 + array: + len: 8 + stride: 1 +enum/POL: + bit_size: 2 + variants: + - name: NoEdge + description: "No event, i.e. no synchronization nor detection" + value: 0 + - name: RisingEdge + description: Rising edge + value: 1 + - name: FallingEdge + description: Falling edge + value: 2 + - name: BothEdges + description: Rising and falling edges + value: 3 diff --git a/parse.py b/parse.py index 9aa72d2..46276fa 100644 --- a/parse.py +++ b/parse.py @@ -350,6 +350,7 @@ perimap = [ ('.*:STM32WL_dbgmcu_v1_0', 'dbgmcu_wl/DBGMCU'), ('.*:IPCC:v1_0', 'ipcc_v1/IPCC'), + ('.*:DMAMUX:v1', 'dmamux_v1/DMAMUX'), ] rng_clock_map = [ @@ -658,6 +659,18 @@ def parse_chips(): }) peris[dma] = p + # DMAMUX is not in the cubedb XMLs + for dma in ('DMAMUX', 'DMAMUX1', "DMAMUX2"): + if addr := defines.get(dma+'_BASE'): + kind = 'DMAMUX:v1' + dbg_peri = OrderedDict({ + 'address': addr, + 'kind': kind, + }) + if block := match_peri(kind): + dbg_peri['block'] = block + peris[dma] = dbg_peri + # EXTI is not in the cubedb XMLs if addr := defines.get('EXTI_BASE'): if chip_name.startswith("STM32WB55"): @@ -755,13 +768,15 @@ def parse_gpio_af(): pins[pin_name] = afs - #with open('data/gpio_af/'+ff+'.yaml', 'w') as f: - #f.write(yaml.dump(pins)) + # with open('data/gpio_af/'+ff+'.yaml', 'w') as f: + # f.write(yaml.dump(pins)) af[ff] = pins + dma_channels = {} + def parse_dma(): for f in glob('sources/cubedb/mcu/IP/DMA-*Modes.xml'): @@ -800,18 +815,18 @@ def parse_dma(): if event not in peri_dma['requests']: peri_dma['requests'][event] = request_num #event_dma = peri_dma['requests'][event] - #event_dma.append( OrderedDict( { - #'channel': 'DMAMUX', - #'request': request_num - #} )) + # event_dma.append( OrderedDict( { + # 'channel': 'DMAMUX', + # 'request': request_num + # } )) request_num += 1 for n in dma_peri_name.split(","): - n = n.strip(); - if result := re.match( '.*' + n + '_Channel\[(\d+)-(\d+)\]', channels[0]['@Name'] ): + n = n.strip() + if result := re.match('.*' + n + '_Channel\[(\d+)-(\d+)\]', channels[0]['@Name']): low = int(result.group(1)) high = int(result.group(2)) - for i in range(low,high+1): - chip_dma['channels'][n+'_'+str(i)] = OrderedDict( { + for i in range(low, high+1): + chip_dma['channels'][n+'_'+str(i)] = OrderedDict({ 'dma': n, 'channel': i, }) @@ -821,7 +836,7 @@ def parse_dma(): channel_name = removeprefix(channel_name, dma_peri_name + '_') channel_name = removeprefix(channel_name, "Channel") channel_name = removeprefix(channel_name, "Stream") - chip_dma['channels'][dma_peri_name + '_' + channel_name] = OrderedDict( { + chip_dma['channels'][dma_peri_name + '_' + channel_name] = OrderedDict({ 'dma': dma_peri_name, 'channel': int(channel_name), }) @@ -832,7 +847,7 @@ def parse_dma(): parts = target_name.split('_') target_peri_name = parts[0] if len(parts) < 2: - target_events = [ target_peri_name ] + target_events = [target_peri_name] else: target_events = target_name.split('_')[1].split('/') if target_name != 'MEMTOMEM': @@ -847,11 +862,13 @@ def parse_dma(): if event not in peri_dma: peri_dma['channels'][event] = [] event_dma = peri_dma['channels'][event] - event_dma.append( dma_peri_name + '_' + channel_name ) + event_dma.append(dma_peri_name + '_' + channel_name) dma_channels[ff] = chip_dma + clocks = {} + def parse_clocks(): for f in glob('sources/cubedb/mcu/IP/RCC-*rcc_v1_0_Modes.xml'): ff = removeprefix(f, 'sources/cubedb/mcu/IP/RCC-')