Contiki 3.x
|
Driver for the cc2538 uDMA controller. More...
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. More... | |
Functions | |
void | udma_init (void) |
Initialise the uDMA driver. More... | |
void | udma_set_channel_src (uint8_t channel, uint32_t src_end) |
Sets the channels source address. More... | |
void | udma_set_channel_dst (uint8_t channel, uint32_t dst_end) |
void | udma_set_channel_control_word (uint8_t channel, uint32_t ctrl) |
Configure the channel's control word. More... | |
void | udma_set_channel_assignment (uint8_t channel, uint8_t enc) |
Choose an encoding for a uDMA channel. More... | |
void | udma_channel_enable (uint8_t channel) |
Enables a uDMA channel. More... | |
void | udma_channel_disable (uint8_t channel) |
Disables a uDMA channel. More... | |
void | udma_channel_use_alternate (uint8_t channel) |
Use the alternate control data structure for a channel. More... | |
void | udma_channel_use_primary (uint8_t channel) |
Use the primary control data structure for a channel. More... | |
void | udma_channel_prio_set_high (uint8_t channel) |
Set a uDMA channel to high priority. More... | |
void | udma_channel_prio_set_default (uint8_t channel) |
Set a uDMA channel to default priority. More... | |
void | udma_channel_use_burst (uint8_t channel) |
Configure a channel to only use burst transfers. More... | |
void | udma_channel_use_single (uint8_t channel) |
Configure a channel to use single as well as burst requests. More... | |
void | udma_channel_mask_set (uint8_t channel) |
Disable peripheral triggers for a uDMA channel. More... | |
void | udma_channel_mask_clr (uint8_t channel) |
Enable peripheral triggers for a uDMA channel. More... | |
void | udma_channel_sw_request (uint8_t channel) |
Generate a software trigger to start a transfer. More... | |
uint8_t | udma_channel_get_mode (uint8_t channel) |
Retrieve the current mode for a channel. More... | |
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 | |
#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. | |
Driver for the cc2538 uDMA controller.
#define udma_xfer_size | ( | len | ) | ((len - 1) << 4) |
Calculate the value of the xfersize field in the control structure.
len | The number of items to be transferred |
If we want to transfer len items, we will normally do something like udma_set_channel_control_word(OTHER_FLAGS | udma_xfer_size(len))
void udma_channel_disable | ( | uint8_t | channel | ) |
Disables a uDMA channel.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 130 of file udma.c.
References UDMA_ENACLR.
void udma_channel_enable | ( | uint8_t | channel | ) |
Enables a uDMA channel.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 120 of file udma.c.
References UDMA_ENASET.
uint8_t udma_channel_get_mode | ( | uint8_t | channel | ) |
Retrieve the current mode for a channel.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
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
void udma_channel_mask_clr | ( | uint8_t | channel | ) |
Enable peripheral triggers for a uDMA channel.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 214 of file udma.c.
References UDMA_REQMASKCLR.
void udma_channel_mask_set | ( | uint8_t | channel | ) |
Disable peripheral triggers for a uDMA channel.
channel | The 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 204 of file udma.c.
References UDMA_REQMASKSET.
void udma_channel_prio_set_default | ( | uint8_t | channel | ) |
Set a uDMA channel to default priority.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 172 of file udma.c.
References UDMA_PRIOCLR.
void udma_channel_prio_set_high | ( | uint8_t | channel | ) |
Set a uDMA channel to high priority.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 162 of file udma.c.
References UDMA_PRIOSET.
void udma_channel_sw_request | ( | uint8_t | channel | ) |
Generate a software trigger to start a transfer.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 225 of file udma.c.
References UDMA_SWREQ.
void udma_channel_use_alternate | ( | uint8_t | channel | ) |
Use the alternate control data structure for a channel.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 141 of file udma.c.
References UDMA_ALTSET.
void udma_channel_use_burst | ( | uint8_t | channel | ) |
Configure a channel to only use burst transfers.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 183 of file udma.c.
References UDMA_USEBURSTSET.
void udma_channel_use_primary | ( | uint8_t | channel | ) |
Use the primary control data structure for a channel.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 151 of file udma.c.
References UDMA_ALTCLR.
void udma_channel_use_single | ( | uint8_t | channel | ) |
Configure a channel to use single as well as burst requests.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
Definition at line 193 of file udma.c.
References UDMA_USEBURSTCLR.
void udma_init | ( | void | ) |
Initialise the uDMA driver.
Prepares the channel control structure and enables the controller
Definition at line 57 of file udma.c.
References NVIC_INT_UDMA, NVIC_INT_UDMA_ERR, nvic_interrupt_enable(), UDMA_CFG, UDMA_CFG_MASTEN, and UDMA_CTLBASE.
Referenced by main().
void udma_set_channel_assignment | ( | uint8_t | channel, |
uint8_t | enc | ||
) |
Choose an encoding for a uDMA channel.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
enc | A value in [0 , 4] |
Possible values for the encoding param are defined as UDMA_CHnn_xyz
Definition at line 100 of file udma.c.
References UDMA_CHMAP0.
void udma_set_channel_control_word | ( | uint8_t | channel, |
uint32_t | ctrl | ||
) |
Configure the channel's control word.
channel | The channel as a value in [0 , UDMA_CONF_MAX_CHANNEL] |
ctrl | The 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.
void udma_set_channel_dst | ( | uint8_t | channel, |
uint32_t | dst_end | ||
) |