Add DMAMUX

This commit is contained in:
Dario Nieuwenhuis 2021-06-23 02:30:55 +02:00
parent 983fa80ef3
commit 29f70ac45f
2 changed files with 169 additions and 13 deletions

View File

@ -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

View File

@ -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-')