//########################################################################### // // FILE: dma.h // // TITLE: C28x DMA driver. // //########################################################################### // $Copyright: // Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the // distribution. // // Neither the name of Texas Instruments Incorporated nor the names of // its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // $ //########################################################################### #ifndef DMA_H #define DMA_H //***************************************************************************** // // If building with a C++ compiler, make all of the definitions in this header // have a C binding. // //***************************************************************************** #ifdef __cplusplus extern "C" { #endif //***************************************************************************** // //! \addtogroup dma_api DMA //! \brief This module is used for DMA configurations. //! @{ // //***************************************************************************** #include #include #include "inc/hw_dma.h" #include "inc/hw_memmap.h" #include "inc/hw_sysctl.h" #include "inc/hw_types.h" #include "cpu.h" #include "debug.h" //***************************************************************************** // // Values that can be passed to DMA_configMode() as the config parameter. // //***************************************************************************** //! Only one burst transfer performed per trigger. #define DMA_CFG_ONESHOT_DISABLE 0U //! Burst transfers occur without additional event triggers after the first. #define DMA_CFG_ONESHOT_ENABLE DMA_MODE_ONESHOT //! DMA channel will be disabled at the end of a transfer. #define DMA_CFG_CONTINUOUS_DISABLE 0U //! DMA reinitializes when the transfer count is zero and waits for a trigger. #define DMA_CFG_CONTINUOUS_ENABLE DMA_MODE_CONTINUOUS //! DMA transfers 16 bits at a time. #define DMA_CFG_SIZE_16BIT 0U //! DMA transfers 32 bits at a time. #define DMA_CFG_SIZE_32BIT DMA_MODE_DATASIZE //***************************************************************************** // //! Values that can be passed to DMA_configMode() as the \e trigger parameter. // //***************************************************************************** typedef enum { DMA_TRIGGER_SOFTWARE = 0, DMA_TRIGGER_ADCA1 = 1, DMA_TRIGGER_ADCA2 = 2, DMA_TRIGGER_ADCA3 = 3, DMA_TRIGGER_ADCA4 = 4, DMA_TRIGGER_ADCAEVT = 5, DMA_TRIGGER_ADCB1 = 6, DMA_TRIGGER_ADCB2 = 7, DMA_TRIGGER_ADCB3 = 8, DMA_TRIGGER_ADCB4 = 9, DMA_TRIGGER_ADCBEVT = 10, DMA_TRIGGER_ADCC1 = 11, DMA_TRIGGER_ADCC2 = 12, DMA_TRIGGER_ADCC3 = 13, DMA_TRIGGER_ADCC4 = 14, DMA_TRIGGER_ADCCEVT = 15, DMA_TRIGGER_ADCD1 = 16, DMA_TRIGGER_ADCD2 = 17, DMA_TRIGGER_ADCD3 = 18, DMA_TRIGGER_ADCD4 = 19, DMA_TRIGGER_ADCDEVT = 20, DMA_TRIGGER_XINT1 = 29, DMA_TRIGGER_XINT2 = 30, DMA_TRIGGER_XINT3 = 31, DMA_TRIGGER_XINT4 = 32, DMA_TRIGGER_XINT5 = 33, DMA_TRIGGER_EPWM1SOCA = 36, DMA_TRIGGER_EPWM1SOCB = 37, DMA_TRIGGER_EPWM2SOCA = 38, DMA_TRIGGER_EPWM2SOCB = 39, DMA_TRIGGER_EPWM3SOCA = 40, DMA_TRIGGER_EPWM3SOCB = 41, DMA_TRIGGER_EPWM4SOCA = 42, DMA_TRIGGER_EPWM4SOCB = 43, DMA_TRIGGER_EPWM5SOCA = 44, DMA_TRIGGER_EPWM5SOCB = 45, DMA_TRIGGER_EPWM6SOCA = 46, DMA_TRIGGER_EPWM6SOCB = 47, DMA_TRIGGER_EPWM7SOCA = 48, DMA_TRIGGER_EPWM7SOCB = 49, DMA_TRIGGER_EPWM8SOCA = 50, DMA_TRIGGER_EPWM8SOCB = 51, DMA_TRIGGER_EPWM9SOCA = 52, DMA_TRIGGER_EPWM9SOCB = 53, DMA_TRIGGER_EPWM10SOCA = 54, DMA_TRIGGER_EPWM10SOCB = 55, DMA_TRIGGER_EPWM11SOCA = 56, DMA_TRIGGER_EPWM11SOCB = 57, DMA_TRIGGER_EPWM12SOCA = 58, DMA_TRIGGER_EPWM12SOCB = 59, DMA_TRIGGER_TINT0 = 68, DMA_TRIGGER_TINT1 = 69, DMA_TRIGGER_TINT2 = 70, DMA_TRIGGER_MCBSPAMXEVT = 71, DMA_TRIGGER_MCBSPAMREVT = 72, DMA_TRIGGER_MCBSPBMXEVT = 73, DMA_TRIGGER_MCBSPBMREVT = 74, DMA_TRIGGER_SDFM1FLT1 = 95, DMA_TRIGGER_SDFM1FLT2 = 96, DMA_TRIGGER_SDFM1FLT3 = 97, DMA_TRIGGER_SDFM1FLT4 = 98, DMA_TRIGGER_SDFM2FLT1 = 99, DMA_TRIGGER_SDFM2FLT2 = 100, DMA_TRIGGER_SDFM2FLT3 = 101, DMA_TRIGGER_SDFM2FLT4 = 102, DMA_TRIGGER_SPIATX = 109, DMA_TRIGGER_SPIARX = 110, DMA_TRIGGER_SPIBTX = 111, DMA_TRIGGER_SPIBRX = 112, DMA_TRIGGER_SPICTX = 113, DMA_TRIGGER_SPICRX = 114, DMA_TRIGGER_CLB1INT = 127, DMA_TRIGGER_CLB2INT = 128, DMA_TRIGGER_CLB3INT = 129, DMA_TRIGGER_CLB4INT = 130, } DMA_Trigger; //***************************************************************************** // //! Values that can be passed to DMA_setInterruptMode() as the \e mode //! parameter. // //***************************************************************************** typedef enum { //! DMA interrupt is generated at the beginning of a transfer DMA_INT_AT_BEGINNING, //! DMA interrupt is generated at the end of a transfer DMA_INT_AT_END } DMA_InterruptMode; //***************************************************************************** // //! Values that can be passed to DMA_setEmulationMode() as the \e mode //! parameter. // //***************************************************************************** typedef enum { //! Transmission stops after current read-write access is completed DMA_EMULATION_STOP, //! Continue DMA operation regardless of emulation suspend DMA_EMULATION_FREE_RUN } DMA_EmulationMode; //***************************************************************************** // //! Values that can be passed to DMA_configChannel() as the //! configure parameter. // //***************************************************************************** typedef struct { DMA_Trigger transferTrigger; //DMA transfer triggers DMA_InterruptMode interruptMode; //Channel interrupt mode bool enableInterrupt; //Enable/Disable interrupt mode uint32_t configSize; //Data bus width (16 or 32 bits) uint32_t transferMode; //Burst transfer mode uint32_t reinitMode; //DMA reinitialization mode uint32_t burstSize; //Number of words transferred per burst uint32_t transferSize; //Number of bursts per transfer //! Number of bursts to be transferred before a wrap of the source address //! occurs. uint32_t srcWrapSize; //! Number of bursts to be transferred before a wrap of the destination //! address occurs. uint32_t destWrapSize; uint32_t destAddr; //destination address uint32_t srcAddr; //source address //! Amount to inc or dec the source address after each word of a burst int16_t srcBurstStep; //! Amount to inc or dec the destination address after each word of a burst int16_t destBurstStep; //! Amount to inc or dec the source address after each burst of a transfer int16_t srcTransferStep; //! Amount to inc or dec the destination address after each burst of a //! transfer int16_t destTransferStep; //! Amount to inc or dec the source address when the wrap occurs int16_t srcWrapStep; //! Amount to inc or dec the destination address when the wrap occurs int16_t destWrapStep; } DMA_ConfigParams; //***************************************************************************** // // Prototypes for the APIs. // //***************************************************************************** //***************************************************************************** // //! \internal //! Checks an DMA channel base address. //! //! \param base specifies the DMA channel base address. //! //! This function determines if a DMA channel base address is valid. //! //! \return Returns \b true if the base address is valid and \b false //! otherwise. // //***************************************************************************** #ifdef DEBUG static inline bool DMA_isBaseValid(uint32_t base) { return((base == DMA_CH1_BASE) || (base == DMA_CH2_BASE) || (base == DMA_CH3_BASE) || (base == DMA_CH4_BASE) || (base == DMA_CH5_BASE) || (base == DMA_CH6_BASE)); } #endif //***************************************************************************** // //! Initializes the DMA controller to a known state. //! //! This function configures does a hard reset of the DMA controller in order //! to put it into a known state. The function also sets the DMA to run free //! during an emulation suspend (see the field DEBUGCTRL.FREE for more info). //! //! \return None. // //***************************************************************************** static inline void DMA_initController(void) { EALLOW; // // Set the hard reset bit. One NOP is required after HARDRESET. // HWREGH(DMA_BASE + DMA_O_CTRL) |= DMA_CTRL_HARDRESET; NOP; EDIS; } //***************************************************************************** // //! Channel Soft Reset //! //! \param base is the base address of the DMA channel control registers. //! //! This function does a soft reset to place the channel into its default state //! //! \return None. // //***************************************************************************** static inline void DMA_triggerSoftReset(uint32_t base) { EALLOW; // // Set the soft reset bit. One NOP is required after SOFTRESET. // HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_SOFTRESET; NOP; EDIS; } //***************************************************************************** // //! Sets DMA emulation mode. //! //! \param mode is the emulation mode to be selected. //! //! This function sets the behavior of the DMA operation when an emulation //! suspend occurs. The \e mode parameter can be one of the following: //! //! - \b DMA_EMULATION_STOP - DMA runs until the current read-write access is //! completed. //! - \b DMA_EMULATION_FREE_RUN - DMA operation continues regardless of a //! the suspend. //! //! \return None. // //***************************************************************************** static inline void DMA_setEmulationMode(DMA_EmulationMode mode) { EALLOW; // // Set emulation mode // if(mode == DMA_EMULATION_STOP) { HWREGH(DMA_BASE + DMA_O_DEBUGCTRL) &= ~DMA_DEBUGCTRL_FREE; } else { HWREGH(DMA_BASE + DMA_O_DEBUGCTRL) |= DMA_DEBUGCTRL_FREE; } EDIS; } //***************************************************************************** // //! Enables peripherals to trigger a DMA transfer. //! //! \param base is the base address of the DMA channel control registers. //! //! This function enables the selected peripheral trigger to start a DMA //! transfer on the specified channel. //! //! \return None. // //***************************************************************************** static inline void DMA_enableTrigger(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Set the peripheral interrupt trigger enable bit. // EALLOW; HWREGH(base + DMA_O_MODE) |= DMA_MODE_PERINTE; EDIS; } //***************************************************************************** // //! Disables peripherals from triggering a DMA transfer. //! //! \param base is the base address of the DMA channel control registers. //! //! This function disables the selected peripheral trigger from starting a DMA //! transfer on the specified channel. This also disables the use of the //! software force using the DMA_forceTrigger() API. //! //! \return None. // //***************************************************************************** static inline void DMA_disableTrigger(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Clear the peripheral interrupt trigger enable bit. // EALLOW; HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_PERINTE; EDIS; } //***************************************************************************** // //! Force a peripheral trigger to a DMA channel. //! //! \param base is the base address of the DMA channel control registers. //! //! This function sets the peripheral trigger flag and if triggering a DMA //! burst is enabled (see DMA_enableTrigger()), a DMA burst transfer will be //! forced. //! //! \return None. // //***************************************************************************** static inline void DMA_forceTrigger(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Set the peripheral interrupt trigger force bit. // EALLOW; HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_PERINTFRC; EDIS; } //***************************************************************************** // //! Clears a DMA channel's peripheral trigger flag. //! //! \param base is the base address of the DMA channel control registers. //! //! This function clears the peripheral trigger flag. Normally, you would use //! this function when initializing the DMA for the first time. The flag is //! cleared automatically when the DMA starts the first burst of a transfer. //! //! \return None. // //***************************************************************************** static inline void DMA_clearTriggerFlag(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Write a one to the clear bit to clear the peripheral trigger flag. // EALLOW; HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_PERINTCLR; EDIS; } //***************************************************************************** // //! Gets the status of a DMA channel's Transfer Status Flag. //! //! \param base is the base address of the DMA channel control registers. //! //! This function returns \b true if the Transfer Status Flag is set, which //! means a DMA transfer has begun. //! This flag is cleared when TRANSFER_COUNT reaches zero, or when the //! HARDRESET or SOFTRESET bit is set. //! //! \return Returns \b true if the Transfer Status Flag is set. Returns \b false //! otherwise. // //***************************************************************************** static inline bool DMA_getTransferStatusFlag(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Read the Transfer Status Flag and return appropriately. // return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_TRANSFERSTS) != 0U); } //***************************************************************************** // //! Gets the status of a DMA channel's Burst Status Flag. //! //! \param base is the base address of the DMA channel control registers. //! //! This function returns \b true if the Burst Status Flag is set, which //! means a DMA burst has begun. //! This flag is cleared when BURST_COUNT reaches zero, or when the //! HARDRESET or SOFTRESET bit is set. //! //! \return Returns \b true if the Burst Status Flag is set. Returns \b false //! otherwise. // //***************************************************************************** static inline bool DMA_getBurstStatusFlag(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Read the Burst Status Flag and return appropriately. // return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_BURSTSTS) != 0U); } //***************************************************************************** // //! Gets the status of a DMA channel's Run Status Flag. //! //! \param base is the base address of the DMA channel control registers. //! //! This function returns \b true if the Run Status Flag is set, which //! means the DMA channel is enabled. //! This flag is cleared when a transfer completes (TRANSFER_COUNT = 0) and //! continuous mode is disabled, or when the HARDRESET, SOFTRESET, or HALT bit //! is set. //! //! \return Returns \b true if the channel is enabled. Returns \b false //! otherwise. // //***************************************************************************** static inline bool DMA_getRunStatusFlag(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Read the Run Status Flag and return appropriately. // return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_RUNSTS) != 0U); } //***************************************************************************** // //! Gets the status of a DMA channel's Overflow Flag. //! //! \param base is the base address of the DMA channel control registers. //! //! This function returns \b true if the Overflow Flag is set, which //! means peripheral event trigger was received while Peripheral Event Trigger //! Flag was already set. //! This flag can be cleared by writing to ERRCLR bit, using the function //! DMA_clearErrorFlag(). //! //! \return Returns \b true if the channel is enabled. Returns \b false //! otherwise. // //***************************************************************************** static inline bool DMA_getOverflowFlag(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Read the Overflow Flag and return appropriately. // return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_OVRFLG) != 0U); } //***************************************************************************** // //! Gets the status of a DMA channel's peripheral trigger flag. //! //! \param base is the base address of the DMA channel control registers. //! //! This function returns \b true if a peripheral trigger event has occurred //! The flag is automatically cleared when the first burst transfer begins, but //! if needed, it can be cleared using DMA_clearTriggerFlag(). //! //! \return Returns \b true if a peripheral trigger event has occurred and its //! flag is set. Returns \b false otherwise. // //***************************************************************************** static inline bool DMA_getTriggerFlagStatus(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Read the peripheral trigger flag and return appropriately. // return((HWREGH(base + DMA_O_CONTROL) & DMA_CONTROL_PERINTFLG) != 0U); } //***************************************************************************** // //! Starts a DMA channel. //! //! \param base is the base address of the DMA channel control registers. //! //! This function starts the DMA running, typically after you have configured //! it. It will wait for the first trigger event to start operation. To halt //! the channel use DMA_stopChannel(). //! //! \return None. // //***************************************************************************** static inline void DMA_startChannel(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Set the run bit. // EALLOW; HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_RUN; EDIS; } //***************************************************************************** // //! Halts a DMA channel. //! //! \param base is the base address of the DMA channel control registers. //! //! This function halts the DMA at its current state and any current read-write //! access is completed. To start the channel again use DMA_startChannel(). //! //! \return None. // //***************************************************************************** static inline void DMA_stopChannel(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Set the halt bit. // EALLOW; HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_HALT; EDIS; } //***************************************************************************** // //! Enables a DMA channel interrupt source. //! //! \param base is the base address of the DMA channel control registers. //! //! This function enables the indicated DMA channel interrupt source. //! //! \return None. // //***************************************************************************** static inline void DMA_enableInterrupt(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Enable the specified DMA channel interrupt. // EALLOW; HWREGH(base + DMA_O_MODE) |= DMA_MODE_CHINTE; EDIS; } //***************************************************************************** // //! Disables a DMA channel interrupt source. //! //! \param base is the base address of the DMA channel control registers. //! //! This function disables the indicated DMA channel interrupt source. //! //! \return None. // //***************************************************************************** static inline void DMA_disableInterrupt(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Disable the specified DMA channel interrupt. // EALLOW; HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_CHINTE; EDIS; } //***************************************************************************** // //! Enables the DMA channel overrun interrupt. //! //! \param base is the base address of the DMA channel control registers. //! //! This function enables the indicated DMA channel's ability to generate an //! interrupt upon the detection of an overrun. An overrun is when a peripheral //! event trigger is received by the DMA before a previous trigger on that //! channel had been serviced and its flag had been cleared. //! //! Note that this is the same interrupt signal as the interrupt that gets //! generated at the beginning/end of a transfer. That interrupt must first be //! enabled using DMA_enableInterrupt() in order for the overrun interrupt to //! be generated. //! //! \return None. // //***************************************************************************** static inline void DMA_enableOverrunInterrupt(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Enable the specified DMA channel interrupt. // EALLOW; HWREGH(base + DMA_O_MODE) |= DMA_MODE_OVRINTE; EDIS; } //***************************************************************************** // //! Disables the DMA channel overrun interrupt. //! //! \param base is the base address of the DMA channel control registers. //! //! This function disables the indicated DMA channel's ability to generate an //! interrupt upon the detection of an overrun. //! //! \return None. // //***************************************************************************** static inline void DMA_disableOverrunInterrupt(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Disable the specified DMA channel interrupt. // EALLOW; HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_OVRINTE; EDIS; } //***************************************************************************** // //! Clears the DMA channel error flags. //! //! \param base is the base address of the DMA channel control registers. //! //! This function clears both the DMA channel's sync error flag and its //! overrun error flag. //! //! \return None. // //***************************************************************************** static inline void DMA_clearErrorFlag(uint32_t base) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); // // Write to the error clear bit. // EALLOW; HWREGH(base + DMA_O_CONTROL) |= DMA_CONTROL_ERRCLR; EDIS; } //***************************************************************************** // //! Sets the interrupt generation mode of a DMA channel interrupt. //! //! \param base is the base address of the DMA channel control registers. //! \param mode is a flag to indicate the channel interrupt mode. //! //! This function sets the channel interrupt mode. When the \e mode parameter //! is \b DMA_INT_AT_END, the DMA channel interrupt will be generated at the //! end of the transfer. If \b DMA_INT_AT_BEGINNING, the interrupt will be //! generated at the beginning of a new transfer. Generating at the beginning //! of a new transfer is the default behavior. //! //! \return None. // //***************************************************************************** static inline void DMA_setInterruptMode(uint32_t base, DMA_InterruptMode mode) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); EALLOW; // // Write the selected interrupt generation mode to the register. // if(mode == DMA_INT_AT_END) { HWREGH(base + DMA_O_MODE) |= DMA_MODE_CHINTMODE; } else { HWREGH(base + DMA_O_MODE) &= ~DMA_MODE_CHINTMODE; } EDIS; } //***************************************************************************** // //! Sets the DMA channel priority mode. //! //! \param ch1IsHighPri is a flag to indicate the channel interrupt mode. //! //! This function sets the channel interrupt mode. When the \e ch1IsHighPri //! parameter is \b false, the DMA channels are serviced in round-robin mode. //! This is the default behavior. //! //! If \b true, channel 1 will be given higher priority than the other //! channels. This means that if a channel 1 trigger occurs, the current word //! transfer on any other channel is completed and channel 1 is serviced for //! the complete burst count. The lower-priority channel's interrupted transfer //! will then resume. //! //! \return None. // //***************************************************************************** static inline void DMA_setPriorityMode(bool ch1IsHighPri) { EALLOW; // // Write the selected priority mode to the register. // if(ch1IsHighPri) { HWREGH(DMA_BASE + DMA_O_PRIORITYCTRL1) |= DMA_PRIORITYCTRL1_CH1PRIORITY; } else { HWREGH(DMA_BASE + DMA_O_PRIORITYCTRL1) &= ~DMA_PRIORITYCTRL1_CH1PRIORITY; } EDIS; } //***************************************************************************** // //! Configures the source address for the DMA channel //! //! \param base is the base address of the DMA channel control registers. //! \param *srcAddr is a source address. //! //! This function configures the source address of a DMA //! channel. //! //! \return None. // //***************************************************************************** static inline void DMA_configSourceAddress(uint32_t base, const void *srcAddr) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); EALLOW; // // Set up SOURCE address. // HWREG(base + DMA_O_SRC_BEG_ADDR_SHADOW) = (uint32_t)srcAddr; HWREG(base + DMA_O_SRC_ADDR_SHADOW) = (uint32_t)srcAddr; EDIS; } //***************************************************************************** // //! Configures the destination address for the DMA channel //! //! \param base is the base address of the DMA channel control registers. //! \param *destAddr is the destination address. //! //! This function configures the destinaton address of a DMA //! channel. //! //! \return None. // //***************************************************************************** static inline void DMA_configDestAddress(uint32_t base, const void *destAddr) { // // Check the arguments. // ASSERT(DMA_isBaseValid(base)); EALLOW; // // Set up DESTINATION address. // HWREG(base + DMA_O_DST_BEG_ADDR_SHADOW) = (uint32_t)destAddr; HWREG(base + DMA_O_DST_ADDR_SHADOW) = (uint32_t)destAddr; EDIS; } //***************************************************************************** // //! Setup DMA to transfer data on the specified channel. //! //! \param base is Base address of the DMA channel control register //! \param *transfParams configuration parameter //! Refer struct #DMA_ConfigParams //! //! This function configures the DMA transfer on the specified channel. //! //! \return None. // //***************************************************************************** extern void DMA_configChannel(uint32_t base, const DMA_ConfigParams *transfParams); //***************************************************************************** // //! Configures the DMA channel //! //! \param base is the base address of the DMA channel control registers. //! \param *destAddr is the destination address. //! \param *srcAddr is a source address. //! //! This function configures the source and destination addresses of a DMA //! channel. The parameters are pointers to the data to be transferred. //! //! \return None. // //***************************************************************************** extern void DMA_configAddresses(uint32_t base, const void *destAddr, const void *srcAddr); //***************************************************************************** // //! Configures the DMA channel's burst settings. //! //! \param base is the base address of the DMA channel control registers. //! \param size is the number of words transferred per burst. //! \param srcStep is the amount to increment or decrement the source address //! after each word of a burst. //! \param destStep is the amount to increment or decrement the destination //! address after each word of a burst. //! //! This function configures the size of each burst and the address step size. //! //! The \e size parameter is the number of words that will be transferred //! during a single burst. Possible amounts range from 1 word to 32 words. //! //! The \e srcStep and \e destStep parameters specify the address step that //! should be added to the source and destination addresses after each //! transferred word of a burst. Only signed values from -4096 to 4095 are //! valid. //! //! \note Note that regardless of what data size (configured by //! DMA_configMode()) is used, parameters are in terms of 16-bits words. //! //! \return None. // //***************************************************************************** extern void DMA_configBurst(uint32_t base, uint16_t size, int16_t srcStep, int16_t destStep); //***************************************************************************** // //! Configures the DMA channel's transfer settings. //! //! \param base is the base address of the DMA channel control registers. //! \param transferSize is the number of bursts per transfer. //! \param srcStep is the amount to increment or decrement the source address //! after each burst of a transfer unless a wrap occurs. //! \param destStep is the amount to increment or decrement the destination //! address after each burst of a transfer unless a wrap occurs. //! //! This function configures the transfer size and the address step that is //! made after each burst. //! //! The \e transferSize parameter is the number of bursts per transfer. If DMA //! channel interrupts are enabled, they will occur after this number of bursts //! have completed. The maximum number of bursts is 65536. //! //! The \e srcStep and \e destStep parameters specify the address step that //! should be added to the source and destination addresses after each //! transferred burst of a transfer. Only signed values from -4096 to 4095 are //! valid. If a wrap occurs, these step values will be ignored. Wrapping is //! configured with DMA_configWrap(). //! //! \note Note that regardless of what data size (configured by //! DMA_configMode()) is used, parameters are in terms of 16-bits words. //! //! \return None. // //***************************************************************************** extern void DMA_configTransfer(uint32_t base, uint32_t transferSize, int16_t srcStep, int16_t destStep); //***************************************************************************** // //! Configures the DMA channel's wrap settings. //! //! \param base is the base address of the DMA channel control registers. //! \param srcWrapSize is the number of bursts to be transferred before a wrap //! of the source address occurs. //! \param srcStep is the amount to increment or decrement the source address //! after each burst of a transfer unless a wrap occurs. //! \param destWrapSize is the number of bursts to be transferred before a wrap //! of the destination address occurs. //! \param destStep is the amount to increment or decrement the destination //! address after each burst of a transfer unless a wrap occurs. //! //! This function configures the DMA channel's wrap settings. //! //! The \e srcWrapSize and \e destWrapSize parameters are the number of bursts //! that are to be transferred before their respective addresses are wrapped. //! The maximum wrap size is 65536 bursts. //! //! The \e srcStep and \e destStep parameters specify the address step that //! should be added to the source and destination addresses when the wrap //! occurs. Only signed values from -4096 to 4095 are valid. //! //! \note Note that regardless of what data size (configured by //! DMA_configMode()) is used, parameters are in terms of 16-bits words. //! //! \return None. // //***************************************************************************** extern void DMA_configWrap(uint32_t base, uint32_t srcWrapSize, int16_t srcStep, uint32_t destWrapSize, int16_t destStep); //***************************************************************************** // //! Configures the DMA channel trigger and mode. //! //! \param base is the base address of the DMA channel control registers. //! \param trigger is the interrupt source that triggers a DMA transfer. //! \param config is a bit field of several configuration selections. //! //! This function configures the DMA channel's trigger and mode. //! //! The \e trigger parameter is the interrupt source that will trigger the //! start of a DMA transfer. //! //! The \e config parameter is the logical OR of the following values: //! - \b DMA_CFG_ONESHOT_DISABLE or \b DMA_CFG_ONESHOT_ENABLE. If enabled, //! the subsequent burst transfers occur without additional event triggers //! after the first event trigger. If disabled, only one burst transfer is //! performed per event trigger. //! - \b DMA_CFG_CONTINUOUS_DISABLE or \b DMA_CFG_CONTINUOUS_ENABLE. If enabled //! the DMA reinitializes when the transfer count is zero and waits for the //! next interrupt event trigger. If disabled, the DMA stops and clears the //! run status bit. //! - \b DMA_CFG_SIZE_16BIT or \b DMA_CFG_SIZE_32BIT. This setting selects //! whether the databus width is 16 or 32 bits. //! //! \return None. // //***************************************************************************** extern void DMA_configMode(uint32_t base, DMA_Trigger trigger, uint32_t config); //***************************************************************************** // // Close the Doxygen group. //! @} // //***************************************************************************** //***************************************************************************** // // Mark the end of the C bindings section for C++ compilers. // //***************************************************************************** #ifdef __cplusplus } #endif #endif // DMA_H