Contiki-NG
Loading...
Searching...
No Matches

Files

file  udma.c
 Implementation of the cc2538 micro-DMA driver.
 
file  udma.h
 Header file with register, macro and function declarations for the cc2538 micro-DMA controller module.
 

Macros

#define udma_xfer_size(len)   ((len - 1) << 4)
 Calculate the value of the xfersize field in the control structure.
 

Functions

bool udma_is_valid_source_address (uintptr_t address)
 Checks if data can be DMAed from the given address.
 
void udma_init (void)
 Initialise the uDMA driver.
 
void udma_set_channel_src (uint8_t channel, uint32_t src_end)
 Sets the channels source address.
 
void udma_set_channel_dst (uint8_t channel, uint32_t dst_end)
 Sets the channel's destination address.
 
void udma_set_channel_control_word (uint8_t channel, uint32_t ctrl)
 Configure the channel's control word.
 
void udma_set_channel_assignment (uint8_t channel, uint8_t enc)
 Choose an encoding for a uDMA channel.
 
void udma_channel_enable (uint8_t channel)
 Enables a uDMA channel.
 
void udma_channel_disable (uint8_t channel)
 Disables a uDMA channel.
 
void udma_channel_use_alternate (uint8_t channel)
 Use the alternate control data structure for a channel.
 
void udma_channel_use_primary (uint8_t channel)
 Use the primary control data structure for a channel.
 
void udma_channel_prio_set_high (uint8_t channel)
 Set a uDMA channel to high priority.
 
void udma_channel_prio_set_default (uint8_t channel)
 Set a uDMA channel to default priority.
 
void udma_channel_use_burst (uint8_t channel)
 Configure a channel to only use burst transfers.
 
void udma_channel_use_single (uint8_t channel)
 Configure a channel to use single as well as burst requests.
 
void udma_channel_mask_set (uint8_t channel)
 Disable peripheral triggers for a uDMA channel.
 
void udma_channel_mask_clr (uint8_t channel)
 Enable peripheral triggers for a uDMA channel.
 
void udma_channel_sw_request (uint8_t channel)
 Generate a software trigger to start a transfer.
 
uint8_t udma_channel_get_mode (uint8_t channel)
 Retrieve the current mode for a channel.
 

uDMA Register offset declarations

#define UDMA_STAT   0x400FF000
 DMA status.
 
#define UDMA_CFG   0x400FF004
 DMA configuration.
 
#define UDMA_CTLBASE   0x400FF008
 DMA channel control base pointer.
 
#define UDMA_ALTBASE   0x400FF00C
 DMA alternate channel control base pointer.
 
#define UDMA_WAITSTAT   0x400FF010
 DMA channel wait-on-request status.
 
#define UDMA_SWREQ   0x400FF014
 DMA channel software request.
 
#define UDMA_USEBURSTSET   0x400FF018
 DMA channel useburst set.
 
#define UDMA_USEBURSTCLR   0x400FF01C
 DMA channel useburst clear.
 
#define UDMA_REQMASKSET   0x400FF020
 DMA channel request mask set.
 
#define UDMA_REQMASKCLR   0x400FF024
 DMA channel request mask clear.
 
#define UDMA_ENASET   0x400FF028
 DMA channel enable set.
 
#define UDMA_ENACLR   0x400FF02C
 DMA channel enable clear.
 
#define UDMA_ALTSET   0x400FF030
 DMA channel primary alternate set.
 
#define UDMA_ALTCLR   0x400FF034
 DMA channel primary alternate clear.
 
#define UDMA_PRIOSET   0x400FF038
 DMA channel priority set.
 
#define UDMA_PRIOCLR   0x400FF03C
 DMA channel priority clear.
 
#define UDMA_ERRCLR   0x400FF04C
 DMA bus error clear.
 
#define UDMA_CHASGN   0x400FF500
 DMA channel assignment.
 
#define UDMA_CHIS   0x400FF504
 DMA channel interrupt status.
 
#define UDMA_CHMAP0   0x400FF510
 DMA channel map select 0.
 
#define UDMA_CHMAP1   0x400FF514
 DMA channel map select 1.
 
#define UDMA_CHMAP2   0x400FF518
 DMA channel map select 2.
 
#define UDMA_CHMAP3   0x400FF51C
 DMA channel map select 3.
 

UDMA_STAT register bit masks

#define UDMA_STAT_DMACHANS   0x001F0000
 Available uDMA channels minus 1.
 
#define UDMA_STAT_STATE   0x000000F0
 Control state machine status.
 
#define UDMA_STAT_MASTEN   0x00000001
 Master enable status.
 

UDMA_CFG register bit masks

#define UDMA_CFG_MASTEN   0x00000001
 Controller master enable.
 

UDMA_CTLBASE register bit masks

#define UDMA_CTLBASE_ADDR   0xFFFFFC00
 Channel control base address.
 

UDMA_ALTBASE register bit masks

#define UDMA_ALTBASE_ADDR   0xFFFFFFFF
 Alternate channel address pointer.
 

UDMA_WAITSTAT register bit masks

#define UDMA_WAITSTAT_WAITREQ   0xFFFFFFFF
 Channel [n] wait status.
 

UDMA_SWREQ register bit masks

#define UDMA_SWREQ_SWREQ   0xFFFFFFFF
 Channel [n] software request.
 

UDMA_USEBURSTSET register bit masks

#define UDMA_USEBURSTSET_SET   0xFFFFFFFF
 Channel [n] useburst set.
 

UDMA_USEBURSTCLR register bit masks

#define UDMA_USEBURSTCLR_CLR   0xFFFFFFFF
 Channel [n] useburst clear.
 

UDMA_REQMASKSET register bit masks

#define UDMA_REQMASKSET_SET   0xFFFFFFFF
 Channel [n] request mask set.
 

UDMA_REQMASKCLR register bit masks

#define UDMA_REQMASKCLR_CLR   0xFFFFFFFF
 Channel [n] request mask clear.
 

UDMA_ENASET register bit masks

#define UDMA_ENASET_SET   0xFFFFFFFF
 Channel [n] enable set.
 

UDMA_ENACLR register bit masks

#define UDMA_ENACLR_CLR   0xFFFFFFFF
 Channel [n] enable clear.
 

UDMA_ALTSET register bit masks

#define UDMA_ALTSET_SET   0xFFFFFFFF
 Channel [n] alternate set.
 

UDMA_ALTCLR register bit masks

#define UDMA_ALTCLR_CLR   0xFFFFFFFF
 Channel [n] alternate clear.
 

UDMA_PRIOSET register bit masks

#define UDMA_PRIOSET_SET   0xFFFFFFFF
 Channel [n] priority set.
 

UDMA_PRIOCLR register bit masks

#define UDMA_PRIOCLR_CLR   0xFFFFFFFF
 Channel [n] priority clear.
 

UDMA_ERRCLR register bit masks

#define UDMA_ERRCLR_ERRCLR   0x00000001
 uDMA bus error status
 

UDMA_CHASGN register bit masks

#define UDMA_CHASGN_CHASGN   0xFFFFFFFF
 Channel [n] assignment select.
 

UDMA_CHIS register bit masks

#define UDMA_CHIS_CHIS   0xFFFFFFFF
 Channel [n] interrupt status.
 

UDMA_CHMAP0 register bit masks

#define UDMA_CHMAP0_CH7SEL   0xF0000000
 uDMA channel 7 source select
 
#define UDMA_CHMAP0_CH6SEL   0x0F000000
 uDMA channel 6 source select
 
#define UDMA_CHMAP0_CH5SEL   0x00F00000
 uDMA channel 5 source select
 
#define UDMA_CHMAP0_CH4SEL   0x000F0000
 uDMA channel 4 source select
 
#define UDMA_CHMAP0_CH3SEL   0x0000F000
 uDMA channel 3 source select
 
#define UDMA_CHMAP0_CH2SEL   0x00000F00
 uDMA channel 2 source select
 
#define UDMA_CHMAP0_CH1SEL   0x000000F0
 uDMA channel 1 source select
 
#define UDMA_CHMAP0_CH0SEL   0x0000000F
 uDMA channel 0 source select
 

UDMA_CHMAP1 register bit masks

#define UDMA_CHMAP1_CH15SEL   0xF0000000
 uDMA channel 15 source select
 
#define UDMA_CHMAP1_CH14SEL   0x0F000000
 uDMA channel 14 source select
 
#define UDMA_CHMAP1_CH13SEL   0x00F00000
 uDMA channel 13 source select
 
#define UDMA_CHMAP1_CH12SEL   0x000F0000
 uDMA channel 12 source select
 
#define UDMA_CHMAP1_CH11SEL   0x0000F000
 uDMA channel 11 source select
 
#define UDMA_CHMAP1_CH10SEL   0x00000F00
 uDMA channel 10 source select
 
#define UDMA_CHMAP1_CH9SEL   0x000000F0
 uDMA channel 9 source select
 
#define UDMA_CHMAP1_CH8SEL   0x0000000F
 uDMA channel 8 source select
 

UDMA_CHMAP2 register bit masks

#define UDMA_CHMAP2_CH23SEL   0xF0000000
 uDMA channel 23 source select
 
#define UDMA_CHMAP2_CH22SEL   0x0F000000
 uDMA channel 22 source select
 
#define UDMA_CHMAP2_CH21SEL   0x00F00000
 uDMA channel 21 source select
 
#define UDMA_CHMAP2_CH20SEL   0x000F0000
 uDMA channel 20 source select
 
#define UDMA_CHMAP2_CH19SEL   0x0000F000
 uDMA channel 19 source select
 
#define UDMA_CHMAP2_CH18SEL   0x00000F00
 uDMA channel 18 source select
 
#define UDMA_CHMAP2_CH17SEL   0x000000F0
 uDMA channel 17 source select
 
#define UDMA_CHMAP2_CH16SEL   0x0000000F
 uDMA channel 16 source select
 

UDMA_CHMAP3 register bit masks

#define UDMA_CHMAP3_CH31SEL   0xF0000000
 uDMA channel 31 source select
 
#define UDMA_CHMAP3_CH30SEL   0x0F000000
 uDMA channel 30 source select
 
#define UDMA_CHMAP3_CH29SEL   0x00F00000
 uDMA channel 29 source select
 
#define UDMA_CHMAP3_CH28SEL   0x000F0000
 uDMA channel 28 source select
 
#define UDMA_CHMAP3_CH27SEL   0x0000F000
 uDMA channel 27 source select
 
#define UDMA_CHMAP3_CH26SEL   0x00000F00
 uDMA channel 26 source select
 
#define UDMA_CHMAP3_CH25SEL   0x000000F0
 uDMA channel 25 source select
 
#define UDMA_CHMAP3_CH24SEL   0x0000000F
 uDMA channel 24 source select
 

Values to ORd together as the ctrl argument of

udma_set_channel_control_word()

#define UDMA_CHCTL_DSTINC_NONE   0xC0000000
 Dst address no increment.
 
#define UDMA_CHCTL_DSTINC_32   0x80000000
 Dst address increment 32 bit.
 
#define UDMA_CHCTL_DSTINC_16   0x40000000
 Dst address increment 16 bit.
 
#define UDMA_CHCTL_DSTINC_8   0x00000000
 Dst address increment 8 bit.
 
#define UDMA_CHCTL_DSTSIZE_32   0x20000000
 Destination size 32 bit.
 
#define UDMA_CHCTL_DSTSIZE_16   0x10000000
 Destination size 16 bit.
 
#define UDMA_CHCTL_DSTSIZE_8   0x00000000
 Destination size 8 bit.
 
#define UDMA_CHCTL_SRCINC_NONE   0x0C000000
 Source address no increment.
 
#define UDMA_CHCTL_SRCINC_32   0x08000000
 Source address increment 32 bit.
 
#define UDMA_CHCTL_SRCINC_16   0x04000000
 Source address increment 16 bit.
 
#define UDMA_CHCTL_SRCINC_8   0x00000000
 Source address increment 8 bit.
 
#define UDMA_CHCTL_SRCSIZE_32   0x02000000
 Source size 32 bit.
 
#define UDMA_CHCTL_SRCSIZE_16   0x01000000
 Source size 16 bit.
 
#define UDMA_CHCTL_SRCSIZE_8   0x00000000
 Source size 8 bit.
 
#define UDMA_CHCTL_ARBSIZE_1   0x00000000
 Arbitration size 1 Transfer.
 
#define UDMA_CHCTL_ARBSIZE_2   0x00004000
 Arbitration size 2 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_4   0x00008000
 Arbitration size 4 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_8   0x0000C000
 Arbitration size 8 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_16   0x00010000
 Arbitration size 16 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_32   0x00014000
 Arbitration size 32 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_64   0x00018000
 Arbitration size 64 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_128   0x0001C000
 Arbitration size 128 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_256   0x00020000
 Arbitration size 256 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_512   0x00024000
 Arbitration size 512 Transfers.
 
#define UDMA_CHCTL_ARBSIZE_1024   0x00028000
 Arbitration size 1024 Transfers.
 
#define UDMA_CHCTL_XFERMODE_STOP   0x00000000
 Stop.
 
#define UDMA_CHCTL_XFERMODE_BASIC   0x00000001
 Basic.
 
#define UDMA_CHCTL_XFERMODE_AUTO   0x00000002
 Auto-Request.
 
#define UDMA_CHCTL_XFERMODE_PINGPONG   0x00000003
 Ping-Pong.
 
#define UDMA_CHCTL_XFERMODE_MEM_SG   0x00000004
 Memory Scatter-Gather.
 
#define UDMA_CHCTL_XFERMODE_MEM_SGA   0x00000005
 Memory Scatter-Gather Alt.
 
#define UDMA_CHCTL_XFERMODE_PER_SG   0x00000006
 Peripheral Scatter-Gather.
 
#define UDMA_CHCTL_XFERMODE_PER_SGA   0x00000007
 Peripheral Scatter-Gather Alt.
 

Detailed Description

Driver for the cc2538 uDMA controller

Macro Definition Documentation

◆ udma_xfer_size

#define udma_xfer_size ( len)    ((len - 1) << 4)

Calculate the value of the xfersize field in the control structure.

Parameters
lenThe number of items to be transferred
Returns
The value to be written to the control structure to achieve the desired transfer size

If we want to transfer len items, we will normally do something like udma_set_channel_control_word(OTHER_FLAGS | udma_xfer_size(len))

Definition at line 703 of file udma.h.

Function Documentation

◆ udma_channel_disable()

void udma_channel_disable ( uint8_t channel)

Disables a uDMA channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 138 of file udma.c.

References UDMA_ENACLR.

◆ udma_channel_enable()

void udma_channel_enable ( uint8_t channel)

Enables a uDMA channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 128 of file udma.c.

References UDMA_ENASET.

◆ udma_channel_get_mode()

uint8_t udma_channel_get_mode ( uint8_t channel)

Retrieve the current mode for a channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]
Returns
The channel's current mode

The return value will be one of the UDMA_CHCTL_XFERMODE_xyz defines. This function is useful to determine whether a uDMA transfer has completed, in which case the return value will be UDMA_CHCTL_XFERMODE_STOP

Definition at line 243 of file udma.c.

◆ udma_channel_mask_clr()

void udma_channel_mask_clr ( uint8_t channel)

Enable peripheral triggers for a uDMA channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 222 of file udma.c.

References UDMA_REQMASKCLR.

◆ udma_channel_mask_set()

void udma_channel_mask_set ( uint8_t channel)

Disable peripheral triggers for a uDMA channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Calling this function will result in the uDMA controller not acknowledging peripheral-generated transfer triggers. Afterwards, the channel may be used with software triggers

Definition at line 212 of file udma.c.

References UDMA_REQMASKSET.

Referenced by init().

◆ udma_channel_prio_set_default()

void udma_channel_prio_set_default ( uint8_t channel)

Set a uDMA channel to default priority.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 180 of file udma.c.

References UDMA_PRIOCLR.

◆ udma_channel_prio_set_high()

void udma_channel_prio_set_high ( uint8_t channel)

Set a uDMA channel to high priority.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 170 of file udma.c.

References UDMA_PRIOSET.

◆ udma_channel_sw_request()

void udma_channel_sw_request ( uint8_t channel)

Generate a software trigger to start a transfer.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 233 of file udma.c.

References UDMA_SWREQ.

◆ udma_channel_use_alternate()

void udma_channel_use_alternate ( uint8_t channel)

Use the alternate control data structure for a channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]
Note
Currently, the driver only reserves memory space for primary contrl data structures

Definition at line 149 of file udma.c.

References UDMA_ALTSET.

◆ udma_channel_use_burst()

void udma_channel_use_burst ( uint8_t channel)

Configure a channel to only use burst transfers.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]
Note
The uDMA controller may under certain conditions automatically disable burst mode, in which case this function will need to be called again to re-enable them

Definition at line 191 of file udma.c.

References UDMA_USEBURSTSET.

◆ udma_channel_use_primary()

void udma_channel_use_primary ( uint8_t channel)

Use the primary control data structure for a channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 159 of file udma.c.

References UDMA_ALTCLR.

◆ udma_channel_use_single()

void udma_channel_use_single ( uint8_t channel)

Configure a channel to use single as well as burst requests.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 201 of file udma.c.

References UDMA_USEBURSTCLR.

◆ udma_init()

void udma_init ( void )

Initialise the uDMA driver.

Prepares the channel control structure and enables the controller

Definition at line 65 of file udma.c.

References UDMA_CFG, UDMA_CFG_MASTEN, UDMA_CTLBASE, UDMA_ERR_IRQn, and UDMA_SW_IRQn.

Referenced by platform_init_stage_two().

◆ udma_set_channel_assignment()

void udma_set_channel_assignment ( uint8_t channel,
uint8_t enc )

Choose an encoding for a uDMA channel.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]
encA value in [0 , 4]

Possible values for the encoding param are defined as UDMA_CHnn_xyz

Definition at line 108 of file udma.c.

References UDMA_CHMAP0.

◆ udma_set_channel_control_word()

void udma_set_channel_control_word ( uint8_t channel,
uint32_t ctrl )

Configure the channel's control word.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]
ctrlThe value of the control word

The value of the control word is generated by ORing the values defined as UDMA_CHCTL_xyz

For example, to configure a channel with 8 bit source and destination size, 0 source increment and 8 bit destination increment, one would need to pass UDMA_CHCTL_DSTINC_8 | UDMA_CHCTL_SRCINC_NONE | UDMA_CHCTL_SRCSIZE_8 | UDMA_CHCTL_DSTSIZE_8

Macros defined as 0 can be omitted.

Definition at line 98 of file udma.c.

◆ udma_set_channel_dst()

void udma_set_channel_dst ( uint8_t channel,
uint32_t dst_end )

Sets the channel's destination address.

Parameters
dst_endThe destination's end address
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]

Definition at line 88 of file udma.c.

Referenced by init().

◆ udma_set_channel_src()

void udma_set_channel_src ( uint8_t channel,
uint32_t src_end )

Sets the channels source address.

Parameters
channelThe channel as a value in [0 , UDMA_CONF_MAX_CHANNEL]
src_endThe source's end address

Definition at line 78 of file udma.c.

Referenced by init().