mbed official / mbed-dev

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /*
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
AnnaBridge 189:f392fc9709a3 3 * All rights reserved.
AnnaBridge 189:f392fc9709a3 4 *
AnnaBridge 189:f392fc9709a3 5 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 189:f392fc9709a3 6 * are permitted provided that the following conditions are met:
AnnaBridge 189:f392fc9709a3 7 *
AnnaBridge 189:f392fc9709a3 8 * o Redistributions of source code must retain the above copyright notice, this list
AnnaBridge 189:f392fc9709a3 9 * of conditions and the following disclaimer.
AnnaBridge 189:f392fc9709a3 10 *
AnnaBridge 189:f392fc9709a3 11 * o Redistributions in binary form must reproduce the above copyright notice, this
AnnaBridge 189:f392fc9709a3 12 * list of conditions and the following disclaimer in the documentation and/or
AnnaBridge 189:f392fc9709a3 13 * other materials provided with the distribution.
AnnaBridge 189:f392fc9709a3 14 *
AnnaBridge 189:f392fc9709a3 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
AnnaBridge 189:f392fc9709a3 16 * contributors may be used to endorse or promote products derived from this
AnnaBridge 189:f392fc9709a3 17 * software without specific prior written permission.
AnnaBridge 189:f392fc9709a3 18 *
AnnaBridge 189:f392fc9709a3 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
AnnaBridge 189:f392fc9709a3 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
AnnaBridge 189:f392fc9709a3 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 189:f392fc9709a3 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
AnnaBridge 189:f392fc9709a3 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
AnnaBridge 189:f392fc9709a3 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
AnnaBridge 189:f392fc9709a3 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
AnnaBridge 189:f392fc9709a3 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
AnnaBridge 189:f392fc9709a3 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
AnnaBridge 189:f392fc9709a3 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 189:f392fc9709a3 29 */
AnnaBridge 189:f392fc9709a3 30
AnnaBridge 189:f392fc9709a3 31 #ifndef _FSL_EDMA_H_
AnnaBridge 189:f392fc9709a3 32 #define _FSL_EDMA_H_
AnnaBridge 189:f392fc9709a3 33
AnnaBridge 189:f392fc9709a3 34 #include "fsl_common.h"
AnnaBridge 189:f392fc9709a3 35
AnnaBridge 189:f392fc9709a3 36 /*!
AnnaBridge 189:f392fc9709a3 37 * @addtogroup edma
AnnaBridge 189:f392fc9709a3 38 * @{
AnnaBridge 189:f392fc9709a3 39 */
AnnaBridge 189:f392fc9709a3 40
AnnaBridge 189:f392fc9709a3 41 /*******************************************************************************
AnnaBridge 189:f392fc9709a3 42 * Definitions
AnnaBridge 189:f392fc9709a3 43 ******************************************************************************/
AnnaBridge 189:f392fc9709a3 44
AnnaBridge 189:f392fc9709a3 45 /*! @name Driver version */
AnnaBridge 189:f392fc9709a3 46 /*@{*/
AnnaBridge 189:f392fc9709a3 47 /*! @brief eDMA driver version */
AnnaBridge 189:f392fc9709a3 48 #define FSL_EDMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 1)) /*!< Version 2.0.1. */
AnnaBridge 189:f392fc9709a3 49 /*@}*/
AnnaBridge 189:f392fc9709a3 50
AnnaBridge 189:f392fc9709a3 51 /*! @brief Compute the offset unit from DCHPRI3 */
AnnaBridge 189:f392fc9709a3 52 #define DMA_DCHPRI_INDEX(channel) (((channel) & ~0x03U) | (3 - ((channel)&0x03U)))
AnnaBridge 189:f392fc9709a3 53
AnnaBridge 189:f392fc9709a3 54 /*! @brief Get the pointer of DCHPRIn */
AnnaBridge 189:f392fc9709a3 55 #define DMA_DCHPRIn(base, channel) ((volatile uint8_t *)&(base->DCHPRI3))[DMA_DCHPRI_INDEX(channel)]
AnnaBridge 189:f392fc9709a3 56
AnnaBridge 189:f392fc9709a3 57 /*! @brief eDMA transfer configuration */
AnnaBridge 189:f392fc9709a3 58 typedef enum _edma_transfer_size
AnnaBridge 189:f392fc9709a3 59 {
AnnaBridge 189:f392fc9709a3 60 kEDMA_TransferSize1Bytes = 0x0U, /*!< Source/Destination data transfer size is 1 byte every time */
AnnaBridge 189:f392fc9709a3 61 kEDMA_TransferSize2Bytes = 0x1U, /*!< Source/Destination data transfer size is 2 bytes every time */
AnnaBridge 189:f392fc9709a3 62 kEDMA_TransferSize4Bytes = 0x2U, /*!< Source/Destination data transfer size is 4 bytes every time */
AnnaBridge 189:f392fc9709a3 63 kEDMA_TransferSize16Bytes = 0x4U, /*!< Source/Destination data transfer size is 16 bytes every time */
AnnaBridge 189:f392fc9709a3 64 kEDMA_TransferSize32Bytes = 0x5U, /*!< Source/Destination data transfer size is 32 bytes every time */
AnnaBridge 189:f392fc9709a3 65 } edma_transfer_size_t;
AnnaBridge 189:f392fc9709a3 66
AnnaBridge 189:f392fc9709a3 67 /*! @brief eDMA modulo configuration */
AnnaBridge 189:f392fc9709a3 68 typedef enum _edma_modulo
AnnaBridge 189:f392fc9709a3 69 {
AnnaBridge 189:f392fc9709a3 70 kEDMA_ModuloDisable = 0x0U, /*!< Disable modulo */
AnnaBridge 189:f392fc9709a3 71 kEDMA_Modulo2bytes, /*!< Circular buffer size is 2 bytes. */
AnnaBridge 189:f392fc9709a3 72 kEDMA_Modulo4bytes, /*!< Circular buffer size is 4 bytes. */
AnnaBridge 189:f392fc9709a3 73 kEDMA_Modulo8bytes, /*!< Circular buffer size is 8 bytes. */
AnnaBridge 189:f392fc9709a3 74 kEDMA_Modulo16bytes, /*!< Circular buffer size is 16 bytes. */
AnnaBridge 189:f392fc9709a3 75 kEDMA_Modulo32bytes, /*!< Circular buffer size is 32 bytes. */
AnnaBridge 189:f392fc9709a3 76 kEDMA_Modulo64bytes, /*!< Circular buffer size is 64 bytes. */
AnnaBridge 189:f392fc9709a3 77 kEDMA_Modulo128bytes, /*!< Circular buffer size is 128 bytes. */
AnnaBridge 189:f392fc9709a3 78 kEDMA_Modulo256bytes, /*!< Circular buffer size is 256 bytes. */
AnnaBridge 189:f392fc9709a3 79 kEDMA_Modulo512bytes, /*!< Circular buffer size is 512 bytes. */
AnnaBridge 189:f392fc9709a3 80 kEDMA_Modulo1Kbytes, /*!< Circular buffer size is 1K bytes. */
AnnaBridge 189:f392fc9709a3 81 kEDMA_Modulo2Kbytes, /*!< Circular buffer size is 2K bytes. */
AnnaBridge 189:f392fc9709a3 82 kEDMA_Modulo4Kbytes, /*!< Circular buffer size is 4K bytes. */
AnnaBridge 189:f392fc9709a3 83 kEDMA_Modulo8Kbytes, /*!< Circular buffer size is 8K bytes. */
AnnaBridge 189:f392fc9709a3 84 kEDMA_Modulo16Kbytes, /*!< Circular buffer size is 16K bytes. */
AnnaBridge 189:f392fc9709a3 85 kEDMA_Modulo32Kbytes, /*!< Circular buffer size is 32K bytes. */
AnnaBridge 189:f392fc9709a3 86 kEDMA_Modulo64Kbytes, /*!< Circular buffer size is 64K bytes. */
AnnaBridge 189:f392fc9709a3 87 kEDMA_Modulo128Kbytes, /*!< Circular buffer size is 128K bytes. */
AnnaBridge 189:f392fc9709a3 88 kEDMA_Modulo256Kbytes, /*!< Circular buffer size is 256K bytes. */
AnnaBridge 189:f392fc9709a3 89 kEDMA_Modulo512Kbytes, /*!< Circular buffer size is 512K bytes. */
AnnaBridge 189:f392fc9709a3 90 kEDMA_Modulo1Mbytes, /*!< Circular buffer size is 1M bytes. */
AnnaBridge 189:f392fc9709a3 91 kEDMA_Modulo2Mbytes, /*!< Circular buffer size is 2M bytes. */
AnnaBridge 189:f392fc9709a3 92 kEDMA_Modulo4Mbytes, /*!< Circular buffer size is 4M bytes. */
AnnaBridge 189:f392fc9709a3 93 kEDMA_Modulo8Mbytes, /*!< Circular buffer size is 8M bytes. */
AnnaBridge 189:f392fc9709a3 94 kEDMA_Modulo16Mbytes, /*!< Circular buffer size is 16M bytes. */
AnnaBridge 189:f392fc9709a3 95 kEDMA_Modulo32Mbytes, /*!< Circular buffer size is 32M bytes. */
AnnaBridge 189:f392fc9709a3 96 kEDMA_Modulo64Mbytes, /*!< Circular buffer size is 64M bytes. */
AnnaBridge 189:f392fc9709a3 97 kEDMA_Modulo128Mbytes, /*!< Circular buffer size is 128M bytes. */
AnnaBridge 189:f392fc9709a3 98 kEDMA_Modulo256Mbytes, /*!< Circular buffer size is 256M bytes. */
AnnaBridge 189:f392fc9709a3 99 kEDMA_Modulo512Mbytes, /*!< Circular buffer size is 512M bytes. */
AnnaBridge 189:f392fc9709a3 100 kEDMA_Modulo1Gbytes, /*!< Circular buffer size is 1G bytes. */
AnnaBridge 189:f392fc9709a3 101 kEDMA_Modulo2Gbytes, /*!< Circular buffer size is 2G bytes. */
AnnaBridge 189:f392fc9709a3 102 } edma_modulo_t;
AnnaBridge 189:f392fc9709a3 103
AnnaBridge 189:f392fc9709a3 104 /*! @brief Bandwidth control */
AnnaBridge 189:f392fc9709a3 105 typedef enum _edma_bandwidth
AnnaBridge 189:f392fc9709a3 106 {
AnnaBridge 189:f392fc9709a3 107 kEDMA_BandwidthStallNone = 0x0U, /*!< No eDMA engine stalls. */
AnnaBridge 189:f392fc9709a3 108 kEDMA_BandwidthStall4Cycle = 0x2U, /*!< eDMA engine stalls for 4 cycles after each read/write. */
AnnaBridge 189:f392fc9709a3 109 kEDMA_BandwidthStall8Cycle = 0x3U, /*!< eDMA engine stalls for 8 cycles after each read/write. */
AnnaBridge 189:f392fc9709a3 110 } edma_bandwidth_t;
AnnaBridge 189:f392fc9709a3 111
AnnaBridge 189:f392fc9709a3 112 /*! @brief Channel link type */
AnnaBridge 189:f392fc9709a3 113 typedef enum _edma_channel_link_type
AnnaBridge 189:f392fc9709a3 114 {
AnnaBridge 189:f392fc9709a3 115 kEDMA_LinkNone = 0x0U, /*!< No channel link */
AnnaBridge 189:f392fc9709a3 116 kEDMA_MinorLink, /*!< Channel link after each minor loop */
AnnaBridge 189:f392fc9709a3 117 kEDMA_MajorLink, /*!< Channel link while major loop count exhausted */
AnnaBridge 189:f392fc9709a3 118 } edma_channel_link_type_t;
AnnaBridge 189:f392fc9709a3 119
AnnaBridge 189:f392fc9709a3 120 /*!@brief eDMA channel status flags. */
AnnaBridge 189:f392fc9709a3 121 enum _edma_channel_status_flags
AnnaBridge 189:f392fc9709a3 122 {
AnnaBridge 189:f392fc9709a3 123 kEDMA_DoneFlag = 0x1U, /*!< DONE flag, set while transfer finished, CITER value exhausted*/
AnnaBridge 189:f392fc9709a3 124 kEDMA_ErrorFlag = 0x2U, /*!< eDMA error flag, an error occurred in a transfer */
AnnaBridge 189:f392fc9709a3 125 kEDMA_InterruptFlag = 0x4U, /*!< eDMA interrupt flag, set while an interrupt occurred of this channel */
AnnaBridge 189:f392fc9709a3 126 };
AnnaBridge 189:f392fc9709a3 127
AnnaBridge 189:f392fc9709a3 128 /*! @brief eDMA channel error status flags. */
AnnaBridge 189:f392fc9709a3 129 enum _edma_error_status_flags
AnnaBridge 189:f392fc9709a3 130 {
AnnaBridge 189:f392fc9709a3 131 kEDMA_DestinationBusErrorFlag = DMA_ES_DBE_MASK, /*!< Bus error on destination address */
AnnaBridge 189:f392fc9709a3 132 kEDMA_SourceBusErrorFlag = DMA_ES_SBE_MASK, /*!< Bus error on the source address */
AnnaBridge 189:f392fc9709a3 133 kEDMA_ScatterGatherErrorFlag = DMA_ES_SGE_MASK, /*!< Error on the Scatter/Gather address, not 32byte aligned. */
AnnaBridge 189:f392fc9709a3 134 kEDMA_NbytesErrorFlag = DMA_ES_NCE_MASK, /*!< NBYTES/CITER configuration error */
AnnaBridge 189:f392fc9709a3 135 kEDMA_DestinationOffsetErrorFlag = DMA_ES_DOE_MASK, /*!< Destination offset not aligned with destination size */
AnnaBridge 189:f392fc9709a3 136 kEDMA_DestinationAddressErrorFlag = DMA_ES_DAE_MASK, /*!< Destination address not aligned with destination size */
AnnaBridge 189:f392fc9709a3 137 kEDMA_SourceOffsetErrorFlag = DMA_ES_SOE_MASK, /*!< Source offset not aligned with source size */
AnnaBridge 189:f392fc9709a3 138 kEDMA_SourceAddressErrorFlag = DMA_ES_SAE_MASK, /*!< Source address not aligned with source size*/
AnnaBridge 189:f392fc9709a3 139 kEDMA_ErrorChannelFlag = DMA_ES_ERRCHN_MASK, /*!< Error channel number of the cancelled channel number */
AnnaBridge 189:f392fc9709a3 140 kEDMA_ChannelPriorityErrorFlag = DMA_ES_CPE_MASK, /*!< Channel priority is not unique. */
AnnaBridge 189:f392fc9709a3 141 kEDMA_TransferCanceledFlag = DMA_ES_ECX_MASK, /*!< Transfer cancelled */
AnnaBridge 189:f392fc9709a3 142 #if defined(FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT) && FSL_FEATURE_EDMA_CHANNEL_GROUP_COUNT > 1
AnnaBridge 189:f392fc9709a3 143 kEDMA_GroupPriorityErrorFlag = DMA_ES_GPE_MASK, /*!< Group priority is not unique. */
AnnaBridge 189:f392fc9709a3 144 #endif
AnnaBridge 189:f392fc9709a3 145 kEDMA_ValidFlag = DMA_ES_VLD_MASK, /*!< No error occurred, this bit is 0. Otherwise, it is 1. */
AnnaBridge 189:f392fc9709a3 146 };
AnnaBridge 189:f392fc9709a3 147
AnnaBridge 189:f392fc9709a3 148 /*! @brief eDMA interrupt source */
AnnaBridge 189:f392fc9709a3 149 typedef enum _edma_interrupt_enable
AnnaBridge 189:f392fc9709a3 150 {
AnnaBridge 189:f392fc9709a3 151 kEDMA_ErrorInterruptEnable = 0x1U, /*!< Enable interrupt while channel error occurs. */
AnnaBridge 189:f392fc9709a3 152 kEDMA_MajorInterruptEnable = DMA_CSR_INTMAJOR_MASK, /*!< Enable interrupt while major count exhausted. */
AnnaBridge 189:f392fc9709a3 153 kEDMA_HalfInterruptEnable = DMA_CSR_INTHALF_MASK, /*!< Enable interrupt while major count to half value. */
AnnaBridge 189:f392fc9709a3 154 } edma_interrupt_enable_t;
AnnaBridge 189:f392fc9709a3 155
AnnaBridge 189:f392fc9709a3 156 /*! @brief eDMA transfer type */
AnnaBridge 189:f392fc9709a3 157 typedef enum _edma_transfer_type
AnnaBridge 189:f392fc9709a3 158 {
AnnaBridge 189:f392fc9709a3 159 kEDMA_MemoryToMemory = 0x0U, /*!< Transfer from memory to memory */
AnnaBridge 189:f392fc9709a3 160 kEDMA_PeripheralToMemory, /*!< Transfer from peripheral to memory */
AnnaBridge 189:f392fc9709a3 161 kEDMA_MemoryToPeripheral, /*!< Transfer from memory to peripheral */
AnnaBridge 189:f392fc9709a3 162 } edma_transfer_type_t;
AnnaBridge 189:f392fc9709a3 163
AnnaBridge 189:f392fc9709a3 164 /*! @brief eDMA transfer status */
AnnaBridge 189:f392fc9709a3 165 enum _edma_transfer_status
AnnaBridge 189:f392fc9709a3 166 {
AnnaBridge 189:f392fc9709a3 167 kStatus_EDMA_QueueFull = MAKE_STATUS(kStatusGroup_EDMA, 0), /*!< TCD queue is full. */
AnnaBridge 189:f392fc9709a3 168 kStatus_EDMA_Busy = MAKE_STATUS(kStatusGroup_EDMA, 1), /*!< Channel is busy and can't handle the
AnnaBridge 189:f392fc9709a3 169 transfer request. */
AnnaBridge 189:f392fc9709a3 170 };
AnnaBridge 189:f392fc9709a3 171
AnnaBridge 189:f392fc9709a3 172 /*! @brief eDMA global configuration structure.*/
AnnaBridge 189:f392fc9709a3 173 typedef struct _edma_config
AnnaBridge 189:f392fc9709a3 174 {
AnnaBridge 189:f392fc9709a3 175 bool enableContinuousLinkMode; /*!< Enable (true) continuous link mode. Upon minor loop completion, the channel
AnnaBridge 189:f392fc9709a3 176 activates again if that channel has a minor loop channel link enabled and
AnnaBridge 189:f392fc9709a3 177 the link channel is itself. */
AnnaBridge 189:f392fc9709a3 178 bool enableHaltOnError; /*!< Enable (true) transfer halt on error. Any error causes the HALT bit to set.
AnnaBridge 189:f392fc9709a3 179 Subsequently, all service requests are ignored until the HALT bit is cleared.*/
AnnaBridge 189:f392fc9709a3 180 bool enableRoundRobinArbitration; /*!< Enable (true) round robin channel arbitration method, or fixed priority
AnnaBridge 189:f392fc9709a3 181 arbitration is used for channel selection */
AnnaBridge 189:f392fc9709a3 182 bool enableDebugMode; /*!< Enable(true) eDMA debug mode. When in debug mode, the eDMA stalls the start of
AnnaBridge 189:f392fc9709a3 183 a new channel. Executing channels are allowed to complete. */
AnnaBridge 189:f392fc9709a3 184 } edma_config_t;
AnnaBridge 189:f392fc9709a3 185
AnnaBridge 189:f392fc9709a3 186 /*!
AnnaBridge 189:f392fc9709a3 187 * @brief eDMA transfer configuration
AnnaBridge 189:f392fc9709a3 188 *
AnnaBridge 189:f392fc9709a3 189 * This structure configures the source/destination transfer attribute.
AnnaBridge 189:f392fc9709a3 190 * This figure shows the eDMA's transfer model:
AnnaBridge 189:f392fc9709a3 191 * _________________________________________________
AnnaBridge 189:f392fc9709a3 192 * | Transfer Size | |
AnnaBridge 189:f392fc9709a3 193 * Minor Loop |_______________| Major loop Count 1 |
AnnaBridge 189:f392fc9709a3 194 * Bytes | Transfer Size | |
AnnaBridge 189:f392fc9709a3 195 * ____________|_______________|____________________|--> Minor loop complete
AnnaBridge 189:f392fc9709a3 196 * ____________________________________
AnnaBridge 189:f392fc9709a3 197 * | | |
AnnaBridge 189:f392fc9709a3 198 * |_______________| Major Loop Count 2 |
AnnaBridge 189:f392fc9709a3 199 * | | |
AnnaBridge 189:f392fc9709a3 200 * |_______________|____________________|--> Minor loop Complete
AnnaBridge 189:f392fc9709a3 201 *
AnnaBridge 189:f392fc9709a3 202 * ---------------------------------------------------------> Transfer complete
AnnaBridge 189:f392fc9709a3 203 */
AnnaBridge 189:f392fc9709a3 204 typedef struct _edma_transfer_config
AnnaBridge 189:f392fc9709a3 205 {
AnnaBridge 189:f392fc9709a3 206 uint32_t srcAddr; /*!< Source data address. */
AnnaBridge 189:f392fc9709a3 207 uint32_t destAddr; /*!< Destination data address. */
AnnaBridge 189:f392fc9709a3 208 edma_transfer_size_t srcTransferSize; /*!< Source data transfer size. */
AnnaBridge 189:f392fc9709a3 209 edma_transfer_size_t destTransferSize; /*!< Destination data transfer size. */
AnnaBridge 189:f392fc9709a3 210 int16_t srcOffset; /*!< Sign-extended offset applied to the current source address to
AnnaBridge 189:f392fc9709a3 211 form the next-state value as each source read is completed. */
AnnaBridge 189:f392fc9709a3 212 int16_t destOffset; /*!< Sign-extended offset applied to the current destination address to
AnnaBridge 189:f392fc9709a3 213 form the next-state value as each destination write is completed. */
AnnaBridge 189:f392fc9709a3 214 uint16_t minorLoopBytes; /*!< Bytes to transfer in a minor loop*/
AnnaBridge 189:f392fc9709a3 215 uint32_t majorLoopCounts; /*!< Major loop iteration count. */
AnnaBridge 189:f392fc9709a3 216 } edma_transfer_config_t;
AnnaBridge 189:f392fc9709a3 217
AnnaBridge 189:f392fc9709a3 218 /*! @brief eDMA channel priority configuration */
AnnaBridge 189:f392fc9709a3 219 typedef struct _edma_channel_Preemption_config
AnnaBridge 189:f392fc9709a3 220 {
AnnaBridge 189:f392fc9709a3 221 bool enableChannelPreemption; /*!< If true: channel can be suspended by other channel with higher priority */
AnnaBridge 189:f392fc9709a3 222 bool enablePreemptAbility; /*!< If true: channel can suspend other channel with low priority */
AnnaBridge 189:f392fc9709a3 223 uint8_t channelPriority; /*!< Channel priority */
AnnaBridge 189:f392fc9709a3 224 } edma_channel_Preemption_config_t;
AnnaBridge 189:f392fc9709a3 225
AnnaBridge 189:f392fc9709a3 226 /*! @brief eDMA minor offset configuration */
AnnaBridge 189:f392fc9709a3 227 typedef struct _edma_minor_offset_config
AnnaBridge 189:f392fc9709a3 228 {
AnnaBridge 189:f392fc9709a3 229 bool enableSrcMinorOffset; /*!< Enable(true) or Disable(false) source minor loop offset. */
AnnaBridge 189:f392fc9709a3 230 bool enableDestMinorOffset; /*!< Enable(true) or Disable(false) destination minor loop offset. */
AnnaBridge 189:f392fc9709a3 231 uint32_t minorOffset; /*!< Offset for minor loop mapping. */
AnnaBridge 189:f392fc9709a3 232 } edma_minor_offset_config_t;
AnnaBridge 189:f392fc9709a3 233
AnnaBridge 189:f392fc9709a3 234 /*!
AnnaBridge 189:f392fc9709a3 235 * @brief eDMA TCD.
AnnaBridge 189:f392fc9709a3 236 *
AnnaBridge 189:f392fc9709a3 237 * This structure is same as TCD register which is described in reference manual,
AnnaBridge 189:f392fc9709a3 238 * and is used to configure the scatter/gather feature as a next hardware TCD.
AnnaBridge 189:f392fc9709a3 239 */
AnnaBridge 189:f392fc9709a3 240 typedef struct _edma_tcd
AnnaBridge 189:f392fc9709a3 241 {
AnnaBridge 189:f392fc9709a3 242 __IO uint32_t SADDR; /*!< SADDR register, used to save source address */
AnnaBridge 189:f392fc9709a3 243 __IO uint16_t SOFF; /*!< SOFF register, save offset bytes every transfer */
AnnaBridge 189:f392fc9709a3 244 __IO uint16_t ATTR; /*!< ATTR register, source/destination transfer size and modulo */
AnnaBridge 189:f392fc9709a3 245 __IO uint32_t NBYTES; /*!< Nbytes register, minor loop length in bytes */
AnnaBridge 189:f392fc9709a3 246 __IO uint32_t SLAST; /*!< SLAST register */
AnnaBridge 189:f392fc9709a3 247 __IO uint32_t DADDR; /*!< DADDR register, used for destination address */
AnnaBridge 189:f392fc9709a3 248 __IO uint16_t DOFF; /*!< DOFF register, used for destination offset */
AnnaBridge 189:f392fc9709a3 249 __IO uint16_t CITER; /*!< CITER register, current minor loop numbers, for unfinished minor loop.*/
AnnaBridge 189:f392fc9709a3 250 __IO uint32_t DLAST_SGA; /*!< DLASTSGA register, next stcd address used in scatter-gather mode */
AnnaBridge 189:f392fc9709a3 251 __IO uint16_t CSR; /*!< CSR register, for TCD control status */
AnnaBridge 189:f392fc9709a3 252 __IO uint16_t BITER; /*!< BITER register, begin minor loop count. */
AnnaBridge 189:f392fc9709a3 253 } edma_tcd_t;
AnnaBridge 189:f392fc9709a3 254
AnnaBridge 189:f392fc9709a3 255 /*! @brief Callback for eDMA */
AnnaBridge 189:f392fc9709a3 256 struct _edma_handle;
AnnaBridge 189:f392fc9709a3 257
AnnaBridge 189:f392fc9709a3 258 /*! @brief Define Callback function for eDMA. */
AnnaBridge 189:f392fc9709a3 259 typedef void (*edma_callback)(struct _edma_handle *handle, void *userData, bool transferDone, uint32_t tcds);
AnnaBridge 189:f392fc9709a3 260
AnnaBridge 189:f392fc9709a3 261 /*! @brief eDMA transfer handle structure */
AnnaBridge 189:f392fc9709a3 262 typedef struct _edma_handle
AnnaBridge 189:f392fc9709a3 263 {
AnnaBridge 189:f392fc9709a3 264 edma_callback callback; /*!< Callback function for major count exhausted. */
AnnaBridge 189:f392fc9709a3 265 void *userData; /*!< Callback function parameter. */
AnnaBridge 189:f392fc9709a3 266 DMA_Type *base; /*!< eDMA peripheral base address. */
AnnaBridge 189:f392fc9709a3 267 edma_tcd_t *tcdPool; /*!< Pointer to memory stored TCDs. */
AnnaBridge 189:f392fc9709a3 268 uint8_t channel; /*!< eDMA channel number. */
AnnaBridge 189:f392fc9709a3 269 volatile int8_t header; /*!< The first TCD index. */
AnnaBridge 189:f392fc9709a3 270 volatile int8_t tail; /*!< The last TCD index. */
AnnaBridge 189:f392fc9709a3 271 volatile int8_t tcdUsed; /*!< The number of used TCD slots. */
AnnaBridge 189:f392fc9709a3 272 volatile int8_t tcdSize; /*!< The total number of TCD slots in the queue. */
AnnaBridge 189:f392fc9709a3 273 uint8_t flags; /*!< The status of the current channel. */
AnnaBridge 189:f392fc9709a3 274 } edma_handle_t;
AnnaBridge 189:f392fc9709a3 275
AnnaBridge 189:f392fc9709a3 276 /*******************************************************************************
AnnaBridge 189:f392fc9709a3 277 * APIs
AnnaBridge 189:f392fc9709a3 278 ******************************************************************************/
AnnaBridge 189:f392fc9709a3 279 #if defined(__cplusplus)
AnnaBridge 189:f392fc9709a3 280 extern "C" {
AnnaBridge 189:f392fc9709a3 281 #endif /* __cplusplus */
AnnaBridge 189:f392fc9709a3 282
AnnaBridge 189:f392fc9709a3 283 /*!
AnnaBridge 189:f392fc9709a3 284 * @name eDMA initialization and De-initialization
AnnaBridge 189:f392fc9709a3 285 * @{
AnnaBridge 189:f392fc9709a3 286 */
AnnaBridge 189:f392fc9709a3 287
AnnaBridge 189:f392fc9709a3 288 /*!
AnnaBridge 189:f392fc9709a3 289 * @brief Initializes eDMA peripheral.
AnnaBridge 189:f392fc9709a3 290 *
AnnaBridge 189:f392fc9709a3 291 * This function ungates the eDMA clock and configures the eDMA peripheral according
AnnaBridge 189:f392fc9709a3 292 * to the configuration structure.
AnnaBridge 189:f392fc9709a3 293 *
AnnaBridge 189:f392fc9709a3 294 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 295 * @param config Pointer to configuration structure, see "edma_config_t".
AnnaBridge 189:f392fc9709a3 296 * @note This function enable the minor loop map feature.
AnnaBridge 189:f392fc9709a3 297 */
AnnaBridge 189:f392fc9709a3 298 void EDMA_Init(DMA_Type *base, const edma_config_t *config);
AnnaBridge 189:f392fc9709a3 299
AnnaBridge 189:f392fc9709a3 300 /*!
AnnaBridge 189:f392fc9709a3 301 * @brief Deinitializes eDMA peripheral.
AnnaBridge 189:f392fc9709a3 302 *
AnnaBridge 189:f392fc9709a3 303 * This function gates the eDMA clock.
AnnaBridge 189:f392fc9709a3 304 *
AnnaBridge 189:f392fc9709a3 305 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 306 */
AnnaBridge 189:f392fc9709a3 307 void EDMA_Deinit(DMA_Type *base);
AnnaBridge 189:f392fc9709a3 308
AnnaBridge 189:f392fc9709a3 309 /*!
AnnaBridge 189:f392fc9709a3 310 * @brief Gets the eDMA default configuration structure.
AnnaBridge 189:f392fc9709a3 311 *
AnnaBridge 189:f392fc9709a3 312 * This function sets the configuration structure to a default value.
AnnaBridge 189:f392fc9709a3 313 * The default configuration is set to the following value:
AnnaBridge 189:f392fc9709a3 314 * @code
AnnaBridge 189:f392fc9709a3 315 * config.enableContinuousLinkMode = false;
AnnaBridge 189:f392fc9709a3 316 * config.enableHaltOnError = true;
AnnaBridge 189:f392fc9709a3 317 * config.enableRoundRobinArbitration = false;
AnnaBridge 189:f392fc9709a3 318 * config.enableDebugMode = false;
AnnaBridge 189:f392fc9709a3 319 * @endcode
AnnaBridge 189:f392fc9709a3 320 *
AnnaBridge 189:f392fc9709a3 321 * @param config Pointer to eDMA configuration structure.
AnnaBridge 189:f392fc9709a3 322 */
AnnaBridge 189:f392fc9709a3 323 void EDMA_GetDefaultConfig(edma_config_t *config);
AnnaBridge 189:f392fc9709a3 324
AnnaBridge 189:f392fc9709a3 325 /* @} */
AnnaBridge 189:f392fc9709a3 326 /*!
AnnaBridge 189:f392fc9709a3 327 * @name eDMA Channel Operation
AnnaBridge 189:f392fc9709a3 328 * @{
AnnaBridge 189:f392fc9709a3 329 */
AnnaBridge 189:f392fc9709a3 330
AnnaBridge 189:f392fc9709a3 331 /*!
AnnaBridge 189:f392fc9709a3 332 * @brief Sets all TCD registers to a default value.
AnnaBridge 189:f392fc9709a3 333 *
AnnaBridge 189:f392fc9709a3 334 * This function sets TCD registers for this channel to default value.
AnnaBridge 189:f392fc9709a3 335 *
AnnaBridge 189:f392fc9709a3 336 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 337 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 338 * @note This function must not be called while the channel transfer is on-going,
AnnaBridge 189:f392fc9709a3 339 * or it causes unpredictable results.
AnnaBridge 189:f392fc9709a3 340 * @note This function enables the auto stop request feature.
AnnaBridge 189:f392fc9709a3 341 */
AnnaBridge 189:f392fc9709a3 342 void EDMA_ResetChannel(DMA_Type *base, uint32_t channel);
AnnaBridge 189:f392fc9709a3 343
AnnaBridge 189:f392fc9709a3 344 /*!
AnnaBridge 189:f392fc9709a3 345 * @brief Configures the eDMA transfer attribute.
AnnaBridge 189:f392fc9709a3 346 *
AnnaBridge 189:f392fc9709a3 347 * This function configures the transfer attribute, including source address, destination address,
AnnaBridge 189:f392fc9709a3 348 * transfer size, address offset, and so on. It also configures the scatter gather feature if the
AnnaBridge 189:f392fc9709a3 349 * user supplies the TCD address.
AnnaBridge 189:f392fc9709a3 350 * Example:
AnnaBridge 189:f392fc9709a3 351 * @code
AnnaBridge 189:f392fc9709a3 352 * edma_transfer_t config;
AnnaBridge 189:f392fc9709a3 353 * edma_tcd_t tcd;
AnnaBridge 189:f392fc9709a3 354 * config.srcAddr = ..;
AnnaBridge 189:f392fc9709a3 355 * config.destAddr = ..;
AnnaBridge 189:f392fc9709a3 356 * ...
AnnaBridge 189:f392fc9709a3 357 * EDMA_SetTransferConfig(DMA0, channel, &config, &stcd);
AnnaBridge 189:f392fc9709a3 358 * @endcode
AnnaBridge 189:f392fc9709a3 359 *
AnnaBridge 189:f392fc9709a3 360 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 361 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 362 * @param config Pointer to eDMA transfer configuration structure.
AnnaBridge 189:f392fc9709a3 363 * @param nextTcd Point to TCD structure. It can be NULL if users
AnnaBridge 189:f392fc9709a3 364 * do not want to enable scatter/gather feature.
AnnaBridge 189:f392fc9709a3 365 * @note If nextTcd is not NULL, it means scatter gather feature is enabled
AnnaBridge 189:f392fc9709a3 366 * and DREQ bit is cleared in the previous transfer configuration, which
AnnaBridge 189:f392fc9709a3 367 * is set in eDMA_ResetChannel.
AnnaBridge 189:f392fc9709a3 368 */
AnnaBridge 189:f392fc9709a3 369 void EDMA_SetTransferConfig(DMA_Type *base,
AnnaBridge 189:f392fc9709a3 370 uint32_t channel,
AnnaBridge 189:f392fc9709a3 371 const edma_transfer_config_t *config,
AnnaBridge 189:f392fc9709a3 372 edma_tcd_t *nextTcd);
AnnaBridge 189:f392fc9709a3 373
AnnaBridge 189:f392fc9709a3 374 /*!
AnnaBridge 189:f392fc9709a3 375 * @brief Configures the eDMA minor offset feature.
AnnaBridge 189:f392fc9709a3 376 *
AnnaBridge 189:f392fc9709a3 377 * Minor offset means signed-extended value added to source address or destination
AnnaBridge 189:f392fc9709a3 378 * address after each minor loop.
AnnaBridge 189:f392fc9709a3 379 *
AnnaBridge 189:f392fc9709a3 380 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 381 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 382 * @param config Pointer to Minor offset configuration structure.
AnnaBridge 189:f392fc9709a3 383 */
AnnaBridge 189:f392fc9709a3 384 void EDMA_SetMinorOffsetConfig(DMA_Type *base, uint32_t channel, const edma_minor_offset_config_t *config);
AnnaBridge 189:f392fc9709a3 385
AnnaBridge 189:f392fc9709a3 386 /*!
AnnaBridge 189:f392fc9709a3 387 * @brief Configures the eDMA channel preemption feature.
AnnaBridge 189:f392fc9709a3 388 *
AnnaBridge 189:f392fc9709a3 389 * This function configures the channel preemption attribute and the priority of the channel.
AnnaBridge 189:f392fc9709a3 390 *
AnnaBridge 189:f392fc9709a3 391 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 392 * @param channel eDMA channel number
AnnaBridge 189:f392fc9709a3 393 * @param config Pointer to channel preemption configuration structure.
AnnaBridge 189:f392fc9709a3 394 */
AnnaBridge 189:f392fc9709a3 395 static inline void EDMA_SetChannelPreemptionConfig(DMA_Type *base,
AnnaBridge 189:f392fc9709a3 396 uint32_t channel,
AnnaBridge 189:f392fc9709a3 397 const edma_channel_Preemption_config_t *config)
AnnaBridge 189:f392fc9709a3 398 {
AnnaBridge 189:f392fc9709a3 399 assert(channel < FSL_FEATURE_EDMA_MODULE_CHANNEL);
AnnaBridge 189:f392fc9709a3 400 assert(config != NULL);
AnnaBridge 189:f392fc9709a3 401
AnnaBridge 189:f392fc9709a3 402 DMA_DCHPRIn(base, channel) =
AnnaBridge 189:f392fc9709a3 403 (DMA_DCHPRI0_DPA(!config->enablePreemptAbility) | DMA_DCHPRI0_ECP(config->enableChannelPreemption) |
AnnaBridge 189:f392fc9709a3 404 DMA_DCHPRI0_CHPRI(config->channelPriority));
AnnaBridge 189:f392fc9709a3 405 }
AnnaBridge 189:f392fc9709a3 406
AnnaBridge 189:f392fc9709a3 407 /*!
AnnaBridge 189:f392fc9709a3 408 * @brief Sets the channel link for the eDMA transfer.
AnnaBridge 189:f392fc9709a3 409 *
AnnaBridge 189:f392fc9709a3 410 * This function configures minor link or major link mode. The minor link means that the channel link is
AnnaBridge 189:f392fc9709a3 411 * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is
AnnaBridge 189:f392fc9709a3 412 * exhausted.
AnnaBridge 189:f392fc9709a3 413 *
AnnaBridge 189:f392fc9709a3 414 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 415 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 416 * @param type Channel link type, it can be one of:
AnnaBridge 189:f392fc9709a3 417 * @arg kEDMA_LinkNone
AnnaBridge 189:f392fc9709a3 418 * @arg kEDMA_MinorLink
AnnaBridge 189:f392fc9709a3 419 * @arg kEDMA_MajorLink
AnnaBridge 189:f392fc9709a3 420 * @param linkedChannel The linked channel number.
AnnaBridge 189:f392fc9709a3 421 * @note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid.
AnnaBridge 189:f392fc9709a3 422 */
AnnaBridge 189:f392fc9709a3 423 void EDMA_SetChannelLink(DMA_Type *base, uint32_t channel, edma_channel_link_type_t type, uint32_t linkedChannel);
AnnaBridge 189:f392fc9709a3 424
AnnaBridge 189:f392fc9709a3 425 /*!
AnnaBridge 189:f392fc9709a3 426 * @brief Sets the bandwidth for the eDMA transfer.
AnnaBridge 189:f392fc9709a3 427 *
AnnaBridge 189:f392fc9709a3 428 * In general, because the eDMA processes the minor loop, it continuously generates read/write sequences
AnnaBridge 189:f392fc9709a3 429 * until the minor count is exhausted. The bandwidth forces the eDMA to stall after the completion of
AnnaBridge 189:f392fc9709a3 430 * each read/write access to control the bus request bandwidth seen by the crossbar switch.
AnnaBridge 189:f392fc9709a3 431 *
AnnaBridge 189:f392fc9709a3 432 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 433 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 434 * @param bandWidth Bandwidth setting, it can be one of:
AnnaBridge 189:f392fc9709a3 435 * @arg kEDMABandwidthStallNone
AnnaBridge 189:f392fc9709a3 436 * @arg kEDMABandwidthStall4Cycle
AnnaBridge 189:f392fc9709a3 437 * @arg kEDMABandwidthStall8Cycle
AnnaBridge 189:f392fc9709a3 438 */
AnnaBridge 189:f392fc9709a3 439 void EDMA_SetBandWidth(DMA_Type *base, uint32_t channel, edma_bandwidth_t bandWidth);
AnnaBridge 189:f392fc9709a3 440
AnnaBridge 189:f392fc9709a3 441 /*!
AnnaBridge 189:f392fc9709a3 442 * @brief Sets the source modulo and destination modulo for eDMA transfer.
AnnaBridge 189:f392fc9709a3 443 *
AnnaBridge 189:f392fc9709a3 444 * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF)
AnnaBridge 189:f392fc9709a3 445 * calculation is performed or the original register value. It provides the ability to implement a circular data
AnnaBridge 189:f392fc9709a3 446 * queue easily.
AnnaBridge 189:f392fc9709a3 447 *
AnnaBridge 189:f392fc9709a3 448 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 449 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 450 * @param srcModulo Source modulo value.
AnnaBridge 189:f392fc9709a3 451 * @param destModulo Destination modulo value.
AnnaBridge 189:f392fc9709a3 452 */
AnnaBridge 189:f392fc9709a3 453 void EDMA_SetModulo(DMA_Type *base, uint32_t channel, edma_modulo_t srcModulo, edma_modulo_t destModulo);
AnnaBridge 189:f392fc9709a3 454
AnnaBridge 189:f392fc9709a3 455 #if defined(FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT) && FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT
AnnaBridge 189:f392fc9709a3 456 /*!
AnnaBridge 189:f392fc9709a3 457 * @brief Enables an async request for the eDMA transfer.
AnnaBridge 189:f392fc9709a3 458 *
AnnaBridge 189:f392fc9709a3 459 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 460 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 461 * @param enable The command for enable(ture) or disable(false).
AnnaBridge 189:f392fc9709a3 462 */
AnnaBridge 189:f392fc9709a3 463 static inline void EDMA_EnableAsyncRequest(DMA_Type *base, uint32_t channel, bool enable)
AnnaBridge 189:f392fc9709a3 464 {
AnnaBridge 189:f392fc9709a3 465 assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
AnnaBridge 189:f392fc9709a3 466
AnnaBridge 189:f392fc9709a3 467 base->EARS = (base->EARS & (~(1U << channel))) | ((uint32_t)enable << channel);
AnnaBridge 189:f392fc9709a3 468 }
AnnaBridge 189:f392fc9709a3 469 #endif /* FSL_FEATURE_EDMA_ASYNCHRO_REQUEST_CHANNEL_COUNT */
AnnaBridge 189:f392fc9709a3 470
AnnaBridge 189:f392fc9709a3 471 /*!
AnnaBridge 189:f392fc9709a3 472 * @brief Enables an auto stop request for the eDMA transfer.
AnnaBridge 189:f392fc9709a3 473 *
AnnaBridge 189:f392fc9709a3 474 * If enabling the auto stop request, the eDMA hardware automatically disables the hardware channel request.
AnnaBridge 189:f392fc9709a3 475 *
AnnaBridge 189:f392fc9709a3 476 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 477 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 478 * @param enable The command for enable (true) or disable (false).
AnnaBridge 189:f392fc9709a3 479 */
AnnaBridge 189:f392fc9709a3 480 static inline void EDMA_EnableAutoStopRequest(DMA_Type *base, uint32_t channel, bool enable)
AnnaBridge 189:f392fc9709a3 481 {
AnnaBridge 189:f392fc9709a3 482 assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
AnnaBridge 189:f392fc9709a3 483
AnnaBridge 189:f392fc9709a3 484 base->TCD[channel].CSR = (base->TCD[channel].CSR & (~DMA_CSR_DREQ_MASK)) | DMA_CSR_DREQ(enable);
AnnaBridge 189:f392fc9709a3 485 }
AnnaBridge 189:f392fc9709a3 486
AnnaBridge 189:f392fc9709a3 487 /*!
AnnaBridge 189:f392fc9709a3 488 * @brief Enables the interrupt source for the eDMA transfer.
AnnaBridge 189:f392fc9709a3 489 *
AnnaBridge 189:f392fc9709a3 490 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 491 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 492 * @param mask The mask of interrupt source to be set. Users need to use
AnnaBridge 189:f392fc9709a3 493 * the defined edma_interrupt_enable_t type.
AnnaBridge 189:f392fc9709a3 494 */
AnnaBridge 189:f392fc9709a3 495 void EDMA_EnableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask);
AnnaBridge 189:f392fc9709a3 496
AnnaBridge 189:f392fc9709a3 497 /*!
AnnaBridge 189:f392fc9709a3 498 * @brief Disables the interrupt source for the eDMA transfer.
AnnaBridge 189:f392fc9709a3 499 *
AnnaBridge 189:f392fc9709a3 500 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 501 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 502 * @param mask The mask of interrupt source to be set. Use
AnnaBridge 189:f392fc9709a3 503 * the defined edma_interrupt_enable_t type.
AnnaBridge 189:f392fc9709a3 504 */
AnnaBridge 189:f392fc9709a3 505 void EDMA_DisableChannelInterrupts(DMA_Type *base, uint32_t channel, uint32_t mask);
AnnaBridge 189:f392fc9709a3 506
AnnaBridge 189:f392fc9709a3 507 /* @} */
AnnaBridge 189:f392fc9709a3 508 /*!
AnnaBridge 189:f392fc9709a3 509 * @name eDMA TCD Operation
AnnaBridge 189:f392fc9709a3 510 * @{
AnnaBridge 189:f392fc9709a3 511 */
AnnaBridge 189:f392fc9709a3 512
AnnaBridge 189:f392fc9709a3 513 /*!
AnnaBridge 189:f392fc9709a3 514 * @brief Sets all fields to default values for the TCD structure.
AnnaBridge 189:f392fc9709a3 515 *
AnnaBridge 189:f392fc9709a3 516 * This function sets all fields for this TCD structure to default value.
AnnaBridge 189:f392fc9709a3 517 *
AnnaBridge 189:f392fc9709a3 518 * @param tcd Pointer to the TCD structure.
AnnaBridge 189:f392fc9709a3 519 * @note This function enables the auto stop request feature.
AnnaBridge 189:f392fc9709a3 520 */
AnnaBridge 189:f392fc9709a3 521 void EDMA_TcdReset(edma_tcd_t *tcd);
AnnaBridge 189:f392fc9709a3 522
AnnaBridge 189:f392fc9709a3 523 /*!
AnnaBridge 189:f392fc9709a3 524 * @brief Configures the eDMA TCD transfer attribute.
AnnaBridge 189:f392fc9709a3 525 *
AnnaBridge 189:f392fc9709a3 526 * TCD is a transfer control descriptor. The content of the TCD is the same as hardware TCD registers.
AnnaBridge 189:f392fc9709a3 527 * STCD is used in scatter-gather mode.
AnnaBridge 189:f392fc9709a3 528 * This function configures the TCD transfer attribute, including source address, destination address,
AnnaBridge 189:f392fc9709a3 529 * transfer size, address offset, and so on. It also configures the scatter gather feature if the
AnnaBridge 189:f392fc9709a3 530 * user supplies the next TCD address.
AnnaBridge 189:f392fc9709a3 531 * Example:
AnnaBridge 189:f392fc9709a3 532 * @code
AnnaBridge 189:f392fc9709a3 533 * edma_transfer_t config = {
AnnaBridge 189:f392fc9709a3 534 * ...
AnnaBridge 189:f392fc9709a3 535 * }
AnnaBridge 189:f392fc9709a3 536 * edma_tcd_t tcd __aligned(32);
AnnaBridge 189:f392fc9709a3 537 * edma_tcd_t nextTcd __aligned(32);
AnnaBridge 189:f392fc9709a3 538 * EDMA_TcdSetTransferConfig(&tcd, &config, &nextTcd);
AnnaBridge 189:f392fc9709a3 539 * @endcode
AnnaBridge 189:f392fc9709a3 540 *
AnnaBridge 189:f392fc9709a3 541 * @param tcd Pointer to the TCD structure.
AnnaBridge 189:f392fc9709a3 542 * @param config Pointer to eDMA transfer configuration structure.
AnnaBridge 189:f392fc9709a3 543 * @param nextTcd Pointer to the next TCD structure. It can be NULL if users
AnnaBridge 189:f392fc9709a3 544 * do not want to enable scatter/gather feature.
AnnaBridge 189:f392fc9709a3 545 * @note TCD address should be 32 bytes aligned, or it causes an eDMA error.
AnnaBridge 189:f392fc9709a3 546 * @note If the nextTcd is not NULL, the scatter gather feature is enabled
AnnaBridge 189:f392fc9709a3 547 * and DREQ bit is cleared in the previous transfer configuration, which
AnnaBridge 189:f392fc9709a3 548 * is set in the EDMA_TcdReset.
AnnaBridge 189:f392fc9709a3 549 */
AnnaBridge 189:f392fc9709a3 550 void EDMA_TcdSetTransferConfig(edma_tcd_t *tcd, const edma_transfer_config_t *config, edma_tcd_t *nextTcd);
AnnaBridge 189:f392fc9709a3 551
AnnaBridge 189:f392fc9709a3 552 /*!
AnnaBridge 189:f392fc9709a3 553 * @brief Configures the eDMA TCD minor offset feature.
AnnaBridge 189:f392fc9709a3 554 *
AnnaBridge 189:f392fc9709a3 555 * Minor offset is a signed-extended value added to the source address or destination
AnnaBridge 189:f392fc9709a3 556 * address after each minor loop.
AnnaBridge 189:f392fc9709a3 557 *
AnnaBridge 189:f392fc9709a3 558 * @param tcd Point to the TCD structure.
AnnaBridge 189:f392fc9709a3 559 * @param config Pointer to Minor offset configuration structure.
AnnaBridge 189:f392fc9709a3 560 */
AnnaBridge 189:f392fc9709a3 561 void EDMA_TcdSetMinorOffsetConfig(edma_tcd_t *tcd, const edma_minor_offset_config_t *config);
AnnaBridge 189:f392fc9709a3 562
AnnaBridge 189:f392fc9709a3 563 /*!
AnnaBridge 189:f392fc9709a3 564 * @brief Sets the channel link for eDMA TCD.
AnnaBridge 189:f392fc9709a3 565 *
AnnaBridge 189:f392fc9709a3 566 * This function configures either a minor link or a major link. The minor link means the channel link is
AnnaBridge 189:f392fc9709a3 567 * triggered every time CITER decreases by 1. The major link means that the channel link is triggered when the CITER is
AnnaBridge 189:f392fc9709a3 568 * exhausted.
AnnaBridge 189:f392fc9709a3 569 *
AnnaBridge 189:f392fc9709a3 570 * @note Users should ensure that DONE flag is cleared before calling this interface, or the configuration is invalid.
AnnaBridge 189:f392fc9709a3 571 * @param tcd Point to the TCD structure.
AnnaBridge 189:f392fc9709a3 572 * @param type Channel link type, it can be one of:
AnnaBridge 189:f392fc9709a3 573 * @arg kEDMA_LinkNone
AnnaBridge 189:f392fc9709a3 574 * @arg kEDMA_MinorLink
AnnaBridge 189:f392fc9709a3 575 * @arg kEDMA_MajorLink
AnnaBridge 189:f392fc9709a3 576 * @param linkedChannel The linked channel number.
AnnaBridge 189:f392fc9709a3 577 */
AnnaBridge 189:f392fc9709a3 578 void EDMA_TcdSetChannelLink(edma_tcd_t *tcd, edma_channel_link_type_t type, uint32_t linkedChannel);
AnnaBridge 189:f392fc9709a3 579
AnnaBridge 189:f392fc9709a3 580 /*!
AnnaBridge 189:f392fc9709a3 581 * @brief Sets the bandwidth for the eDMA TCD.
AnnaBridge 189:f392fc9709a3 582 *
AnnaBridge 189:f392fc9709a3 583 * In general, because the eDMA processes the minor loop, it continuously generates read/write sequences
AnnaBridge 189:f392fc9709a3 584 * until the minor count is exhausted. Bandwidth forces the eDMA to stall after the completion of
AnnaBridge 189:f392fc9709a3 585 * each read/write access to control the bus request bandwidth seen by the crossbar switch.
AnnaBridge 189:f392fc9709a3 586 * @param tcd Point to the TCD structure.
AnnaBridge 189:f392fc9709a3 587 * @param bandWidth Bandwidth setting, it can be one of:
AnnaBridge 189:f392fc9709a3 588 * @arg kEDMABandwidthStallNone
AnnaBridge 189:f392fc9709a3 589 * @arg kEDMABandwidthStall4Cycle
AnnaBridge 189:f392fc9709a3 590 * @arg kEDMABandwidthStall8Cycle
AnnaBridge 189:f392fc9709a3 591 */
AnnaBridge 189:f392fc9709a3 592 static inline void EDMA_TcdSetBandWidth(edma_tcd_t *tcd, edma_bandwidth_t bandWidth)
AnnaBridge 189:f392fc9709a3 593 {
AnnaBridge 189:f392fc9709a3 594 assert(tcd != NULL);
AnnaBridge 189:f392fc9709a3 595 assert(((uint32_t)tcd & 0x1FU) == 0);
AnnaBridge 189:f392fc9709a3 596
AnnaBridge 189:f392fc9709a3 597 tcd->CSR = (tcd->CSR & (~DMA_CSR_BWC_MASK)) | DMA_CSR_BWC(bandWidth);
AnnaBridge 189:f392fc9709a3 598 }
AnnaBridge 189:f392fc9709a3 599
AnnaBridge 189:f392fc9709a3 600 /*!
AnnaBridge 189:f392fc9709a3 601 * @brief Sets the source modulo and destination modulo for eDMA TCD.
AnnaBridge 189:f392fc9709a3 602 *
AnnaBridge 189:f392fc9709a3 603 * This function defines a specific address range specified to be the value after (SADDR + SOFF)/(DADDR + DOFF)
AnnaBridge 189:f392fc9709a3 604 * calculation is performed or the original register value. It provides the ability to implement a circular data
AnnaBridge 189:f392fc9709a3 605 * queue easily.
AnnaBridge 189:f392fc9709a3 606 *
AnnaBridge 189:f392fc9709a3 607 * @param tcd Point to the TCD structure.
AnnaBridge 189:f392fc9709a3 608 * @param srcModulo Source modulo value.
AnnaBridge 189:f392fc9709a3 609 * @param destModulo Destination modulo value.
AnnaBridge 189:f392fc9709a3 610 */
AnnaBridge 189:f392fc9709a3 611 void EDMA_TcdSetModulo(edma_tcd_t *tcd, edma_modulo_t srcModulo, edma_modulo_t destModulo);
AnnaBridge 189:f392fc9709a3 612
AnnaBridge 189:f392fc9709a3 613 /*!
AnnaBridge 189:f392fc9709a3 614 * @brief Sets the auto stop request for the eDMA TCD.
AnnaBridge 189:f392fc9709a3 615 *
AnnaBridge 189:f392fc9709a3 616 * If enabling the auto stop request, the eDMA hardware automatically disables the hardware channel request.
AnnaBridge 189:f392fc9709a3 617 *
AnnaBridge 189:f392fc9709a3 618 * @param tcd Point to the TCD structure.
AnnaBridge 189:f392fc9709a3 619 * @param enable The command for enable(ture) or disable(false).
AnnaBridge 189:f392fc9709a3 620 */
AnnaBridge 189:f392fc9709a3 621 static inline void EDMA_TcdEnableAutoStopRequest(edma_tcd_t *tcd, bool enable)
AnnaBridge 189:f392fc9709a3 622 {
AnnaBridge 189:f392fc9709a3 623 assert(tcd != NULL);
AnnaBridge 189:f392fc9709a3 624 assert(((uint32_t)tcd & 0x1FU) == 0);
AnnaBridge 189:f392fc9709a3 625
AnnaBridge 189:f392fc9709a3 626 tcd->CSR = (tcd->CSR & (~DMA_CSR_DREQ_MASK)) | DMA_CSR_DREQ(enable);
AnnaBridge 189:f392fc9709a3 627 }
AnnaBridge 189:f392fc9709a3 628
AnnaBridge 189:f392fc9709a3 629 /*!
AnnaBridge 189:f392fc9709a3 630 * @brief Enables the interrupt source for the eDMA TCD.
AnnaBridge 189:f392fc9709a3 631 *
AnnaBridge 189:f392fc9709a3 632 * @param tcd Point to the TCD structure.
AnnaBridge 189:f392fc9709a3 633 * @param mask The mask of interrupt source to be set. Users need to use
AnnaBridge 189:f392fc9709a3 634 * the defined edma_interrupt_enable_t type.
AnnaBridge 189:f392fc9709a3 635 */
AnnaBridge 189:f392fc9709a3 636 void EDMA_TcdEnableInterrupts(edma_tcd_t *tcd, uint32_t mask);
AnnaBridge 189:f392fc9709a3 637
AnnaBridge 189:f392fc9709a3 638 /*!
AnnaBridge 189:f392fc9709a3 639 * @brief Disables the interrupt source for the eDMA TCD.
AnnaBridge 189:f392fc9709a3 640 *
AnnaBridge 189:f392fc9709a3 641 * @param tcd Point to the TCD structure.
AnnaBridge 189:f392fc9709a3 642 * @param mask The mask of interrupt source to be set. Users need to use
AnnaBridge 189:f392fc9709a3 643 * the defined edma_interrupt_enable_t type.
AnnaBridge 189:f392fc9709a3 644 */
AnnaBridge 189:f392fc9709a3 645 void EDMA_TcdDisableInterrupts(edma_tcd_t *tcd, uint32_t mask);
AnnaBridge 189:f392fc9709a3 646
AnnaBridge 189:f392fc9709a3 647 /*! @} */
AnnaBridge 189:f392fc9709a3 648 /*!
AnnaBridge 189:f392fc9709a3 649 * @name eDMA Channel Transfer Operation
AnnaBridge 189:f392fc9709a3 650 * @{
AnnaBridge 189:f392fc9709a3 651 */
AnnaBridge 189:f392fc9709a3 652
AnnaBridge 189:f392fc9709a3 653 /*!
AnnaBridge 189:f392fc9709a3 654 * @brief Enables the eDMA hardware channel request.
AnnaBridge 189:f392fc9709a3 655 *
AnnaBridge 189:f392fc9709a3 656 * This function enables the hardware channel request.
AnnaBridge 189:f392fc9709a3 657 *
AnnaBridge 189:f392fc9709a3 658 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 659 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 660 */
AnnaBridge 189:f392fc9709a3 661 static inline void EDMA_EnableChannelRequest(DMA_Type *base, uint32_t channel)
AnnaBridge 189:f392fc9709a3 662 {
AnnaBridge 189:f392fc9709a3 663 assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
AnnaBridge 189:f392fc9709a3 664
AnnaBridge 189:f392fc9709a3 665 base->SERQ = DMA_SERQ_SERQ(channel);
AnnaBridge 189:f392fc9709a3 666 }
AnnaBridge 189:f392fc9709a3 667
AnnaBridge 189:f392fc9709a3 668 /*!
AnnaBridge 189:f392fc9709a3 669 * @brief Disables the eDMA hardware channel request.
AnnaBridge 189:f392fc9709a3 670 *
AnnaBridge 189:f392fc9709a3 671 * This function disables the hardware channel request.
AnnaBridge 189:f392fc9709a3 672 *
AnnaBridge 189:f392fc9709a3 673 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 674 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 675 */
AnnaBridge 189:f392fc9709a3 676 static inline void EDMA_DisableChannelRequest(DMA_Type *base, uint32_t channel)
AnnaBridge 189:f392fc9709a3 677 {
AnnaBridge 189:f392fc9709a3 678 assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
AnnaBridge 189:f392fc9709a3 679
AnnaBridge 189:f392fc9709a3 680 base->CERQ = DMA_CERQ_CERQ(channel);
AnnaBridge 189:f392fc9709a3 681 }
AnnaBridge 189:f392fc9709a3 682
AnnaBridge 189:f392fc9709a3 683 /*!
AnnaBridge 189:f392fc9709a3 684 * @brief Starts the eDMA transfer by software trigger.
AnnaBridge 189:f392fc9709a3 685 *
AnnaBridge 189:f392fc9709a3 686 * This function starts a minor loop transfer.
AnnaBridge 189:f392fc9709a3 687 *
AnnaBridge 189:f392fc9709a3 688 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 689 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 690 */
AnnaBridge 189:f392fc9709a3 691 static inline void EDMA_TriggerChannelStart(DMA_Type *base, uint32_t channel)
AnnaBridge 189:f392fc9709a3 692 {
AnnaBridge 189:f392fc9709a3 693 assert(channel < FSL_FEATURE_DMAMUX_MODULE_CHANNEL);
AnnaBridge 189:f392fc9709a3 694
AnnaBridge 189:f392fc9709a3 695 base->SSRT = DMA_SSRT_SSRT(channel);
AnnaBridge 189:f392fc9709a3 696 }
AnnaBridge 189:f392fc9709a3 697
AnnaBridge 189:f392fc9709a3 698 /*! @} */
AnnaBridge 189:f392fc9709a3 699 /*!
AnnaBridge 189:f392fc9709a3 700 * @name eDMA Channel Status Operation
AnnaBridge 189:f392fc9709a3 701 * @{
AnnaBridge 189:f392fc9709a3 702 */
AnnaBridge 189:f392fc9709a3 703
AnnaBridge 189:f392fc9709a3 704 /*!
AnnaBridge 189:f392fc9709a3 705 * @brief Gets the Remaining bytes from the eDMA current channel TCD.
AnnaBridge 189:f392fc9709a3 706 *
AnnaBridge 189:f392fc9709a3 707 * This function checks the TCD (Task Control Descriptor) status for a specified
AnnaBridge 189:f392fc9709a3 708 * eDMA channel and returns the the number of bytes that have not finished.
AnnaBridge 189:f392fc9709a3 709 *
AnnaBridge 189:f392fc9709a3 710 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 711 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 712 * @return Bytes have not been transferred yet for the current TCD.
AnnaBridge 189:f392fc9709a3 713 * @note This function can only be used to get unfinished bytes of transfer without
AnnaBridge 189:f392fc9709a3 714 * the next TCD, or it might be inaccuracy.
AnnaBridge 189:f392fc9709a3 715 */
AnnaBridge 189:f392fc9709a3 716 uint32_t EDMA_GetRemainingBytes(DMA_Type *base, uint32_t channel);
AnnaBridge 189:f392fc9709a3 717
AnnaBridge 189:f392fc9709a3 718 /*!
AnnaBridge 189:f392fc9709a3 719 * @brief Gets the eDMA channel error status flags.
AnnaBridge 189:f392fc9709a3 720 *
AnnaBridge 189:f392fc9709a3 721 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 722 * @return The mask of error status flags. Users need to use the
AnnaBridge 189:f392fc9709a3 723 * _edma_error_status_flags type to decode the return variables.
AnnaBridge 189:f392fc9709a3 724 */
AnnaBridge 189:f392fc9709a3 725 static inline uint32_t EDMA_GetErrorStatusFlags(DMA_Type *base)
AnnaBridge 189:f392fc9709a3 726 {
AnnaBridge 189:f392fc9709a3 727 return base->ES;
AnnaBridge 189:f392fc9709a3 728 }
AnnaBridge 189:f392fc9709a3 729
AnnaBridge 189:f392fc9709a3 730 /*!
AnnaBridge 189:f392fc9709a3 731 * @brief Gets the eDMA channel status flags.
AnnaBridge 189:f392fc9709a3 732 *
AnnaBridge 189:f392fc9709a3 733 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 734 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 735 * @return The mask of channel status flags. Users need to use the
AnnaBridge 189:f392fc9709a3 736 * _edma_channel_status_flags type to decode the return variables.
AnnaBridge 189:f392fc9709a3 737 */
AnnaBridge 189:f392fc9709a3 738 uint32_t EDMA_GetChannelStatusFlags(DMA_Type *base, uint32_t channel);
AnnaBridge 189:f392fc9709a3 739
AnnaBridge 189:f392fc9709a3 740 /*!
AnnaBridge 189:f392fc9709a3 741 * @brief Clears the eDMA channel status flags.
AnnaBridge 189:f392fc9709a3 742 *
AnnaBridge 189:f392fc9709a3 743 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 744 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 745 * @param mask The mask of channel status to be cleared. Users need to use
AnnaBridge 189:f392fc9709a3 746 * the defined _edma_channel_status_flags type.
AnnaBridge 189:f392fc9709a3 747 */
AnnaBridge 189:f392fc9709a3 748 void EDMA_ClearChannelStatusFlags(DMA_Type *base, uint32_t channel, uint32_t mask);
AnnaBridge 189:f392fc9709a3 749
AnnaBridge 189:f392fc9709a3 750 /*! @} */
AnnaBridge 189:f392fc9709a3 751 /*!
AnnaBridge 189:f392fc9709a3 752 * @name eDMA Transactional Operation
AnnaBridge 189:f392fc9709a3 753 */
AnnaBridge 189:f392fc9709a3 754
AnnaBridge 189:f392fc9709a3 755 /*!
AnnaBridge 189:f392fc9709a3 756 * @brief Creates the eDMA handle.
AnnaBridge 189:f392fc9709a3 757 *
AnnaBridge 189:f392fc9709a3 758 * This function is called if using transaction API for eDMA. This function
AnnaBridge 189:f392fc9709a3 759 * initializes the internal state of eDMA handle.
AnnaBridge 189:f392fc9709a3 760 *
AnnaBridge 189:f392fc9709a3 761 * @param handle eDMA handle pointer. The eDMA handle stores callback function and
AnnaBridge 189:f392fc9709a3 762 * parameters.
AnnaBridge 189:f392fc9709a3 763 * @param base eDMA peripheral base address.
AnnaBridge 189:f392fc9709a3 764 * @param channel eDMA channel number.
AnnaBridge 189:f392fc9709a3 765 */
AnnaBridge 189:f392fc9709a3 766 void EDMA_CreateHandle(edma_handle_t *handle, DMA_Type *base, uint32_t channel);
AnnaBridge 189:f392fc9709a3 767
AnnaBridge 189:f392fc9709a3 768 /*!
AnnaBridge 189:f392fc9709a3 769 * @brief Installs the TCDs memory pool into eDMA handle.
AnnaBridge 189:f392fc9709a3 770 *
AnnaBridge 189:f392fc9709a3 771 * This function is called after the EDMA_CreateHandle to use scatter/gather feature.
AnnaBridge 189:f392fc9709a3 772 *
AnnaBridge 189:f392fc9709a3 773 * @param handle eDMA handle pointer.
AnnaBridge 189:f392fc9709a3 774 * @param tcdPool Memory pool to store TCDs. It must be 32 bytes aligned.
AnnaBridge 189:f392fc9709a3 775 * @param tcdSize The number of TCD slots.
AnnaBridge 189:f392fc9709a3 776 */
AnnaBridge 189:f392fc9709a3 777 void EDMA_InstallTCDMemory(edma_handle_t *handle, edma_tcd_t *tcdPool, uint32_t tcdSize);
AnnaBridge 189:f392fc9709a3 778
AnnaBridge 189:f392fc9709a3 779 /*!
AnnaBridge 189:f392fc9709a3 780 * @brief Installs a callback function for the eDMA transfer.
AnnaBridge 189:f392fc9709a3 781 *
AnnaBridge 189:f392fc9709a3 782 * This callback is called in eDMA IRQ handler. Use the callback to do something after
AnnaBridge 189:f392fc9709a3 783 * the current major loop transfer completes.
AnnaBridge 189:f392fc9709a3 784 *
AnnaBridge 189:f392fc9709a3 785 * @param handle eDMA handle pointer.
AnnaBridge 189:f392fc9709a3 786 * @param callback eDMA callback function pointer.
AnnaBridge 189:f392fc9709a3 787 * @param userData Parameter for callback function.
AnnaBridge 189:f392fc9709a3 788 */
AnnaBridge 189:f392fc9709a3 789 void EDMA_SetCallback(edma_handle_t *handle, edma_callback callback, void *userData);
AnnaBridge 189:f392fc9709a3 790
AnnaBridge 189:f392fc9709a3 791 /*!
AnnaBridge 189:f392fc9709a3 792 * @brief Prepares the eDMA transfer structure.
AnnaBridge 189:f392fc9709a3 793 *
AnnaBridge 189:f392fc9709a3 794 * This function prepares the transfer configuration structure according to the user input.
AnnaBridge 189:f392fc9709a3 795 *
AnnaBridge 189:f392fc9709a3 796 * @param config The user configuration structure of type edma_transfer_t.
AnnaBridge 189:f392fc9709a3 797 * @param srcAddr eDMA transfer source address.
AnnaBridge 189:f392fc9709a3 798 * @param srcWidth eDMA transfer source address width(bytes).
AnnaBridge 189:f392fc9709a3 799 * @param destAddr eDMA transfer destination address.
AnnaBridge 189:f392fc9709a3 800 * @param destWidth eDMA transfer destination address width(bytes).
AnnaBridge 189:f392fc9709a3 801 * @param bytesEachRequest eDMA transfer bytes per channel request.
AnnaBridge 189:f392fc9709a3 802 * @param transferBytes eDMA transfer bytes to be transferred.
AnnaBridge 189:f392fc9709a3 803 * @param type eDMA transfer type.
AnnaBridge 189:f392fc9709a3 804 * @note The data address and the data width must be consistent. For example, if the SRC
AnnaBridge 189:f392fc9709a3 805 * is 4 bytes, so the source address must be 4 bytes aligned, or it shall result in
AnnaBridge 189:f392fc9709a3 806 * source address error(SAE).
AnnaBridge 189:f392fc9709a3 807 */
AnnaBridge 189:f392fc9709a3 808 void EDMA_PrepareTransfer(edma_transfer_config_t *config,
AnnaBridge 189:f392fc9709a3 809 void *srcAddr,
AnnaBridge 189:f392fc9709a3 810 uint32_t srcWidth,
AnnaBridge 189:f392fc9709a3 811 void *destAddr,
AnnaBridge 189:f392fc9709a3 812 uint32_t destWidth,
AnnaBridge 189:f392fc9709a3 813 uint32_t bytesEachRequest,
AnnaBridge 189:f392fc9709a3 814 uint32_t transferBytes,
AnnaBridge 189:f392fc9709a3 815 edma_transfer_type_t type);
AnnaBridge 189:f392fc9709a3 816
AnnaBridge 189:f392fc9709a3 817 /*!
AnnaBridge 189:f392fc9709a3 818 * @brief Submits the eDMA transfer request.
AnnaBridge 189:f392fc9709a3 819 *
AnnaBridge 189:f392fc9709a3 820 * This function submits the eDMA transfer request according to the transfer configuration structure.
AnnaBridge 189:f392fc9709a3 821 * If the user submits the transfer request repeatedly, this function packs an unprocessed request as
AnnaBridge 189:f392fc9709a3 822 * a TCD and enables scatter/gather feature to process it in the next time.
AnnaBridge 189:f392fc9709a3 823 *
AnnaBridge 189:f392fc9709a3 824 * @param handle eDMA handle pointer.
AnnaBridge 189:f392fc9709a3 825 * @param config Pointer to eDMA transfer configuration structure.
AnnaBridge 189:f392fc9709a3 826 * @retval kStatus_EDMA_Success It means submit transfer request succeed.
AnnaBridge 189:f392fc9709a3 827 * @retval kStatus_EDMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed.
AnnaBridge 189:f392fc9709a3 828 * @retval kStatus_EDMA_Busy It means the given channel is busy, need to submit request later.
AnnaBridge 189:f392fc9709a3 829 */
AnnaBridge 189:f392fc9709a3 830 status_t EDMA_SubmitTransfer(edma_handle_t *handle, const edma_transfer_config_t *config);
AnnaBridge 189:f392fc9709a3 831
AnnaBridge 189:f392fc9709a3 832 /*!
AnnaBridge 189:f392fc9709a3 833 * @brief eDMA start transfer.
AnnaBridge 189:f392fc9709a3 834 *
AnnaBridge 189:f392fc9709a3 835 * This function enables the channel request. Users can call this function after submitting the transfer request
AnnaBridge 189:f392fc9709a3 836 * or before submitting the transfer request.
AnnaBridge 189:f392fc9709a3 837 *
AnnaBridge 189:f392fc9709a3 838 * @param handle eDMA handle pointer.
AnnaBridge 189:f392fc9709a3 839 */
AnnaBridge 189:f392fc9709a3 840 void EDMA_StartTransfer(edma_handle_t *handle);
AnnaBridge 189:f392fc9709a3 841
AnnaBridge 189:f392fc9709a3 842 /*!
AnnaBridge 189:f392fc9709a3 843 * @brief eDMA stop transfer.
AnnaBridge 189:f392fc9709a3 844 *
AnnaBridge 189:f392fc9709a3 845 * This function disables the channel request to pause the transfer. Users can call EDMA_StartTransfer()
AnnaBridge 189:f392fc9709a3 846 * again to resume the transfer.
AnnaBridge 189:f392fc9709a3 847 *
AnnaBridge 189:f392fc9709a3 848 * @param handle eDMA handle pointer.
AnnaBridge 189:f392fc9709a3 849 */
AnnaBridge 189:f392fc9709a3 850 void EDMA_StopTransfer(edma_handle_t *handle);
AnnaBridge 189:f392fc9709a3 851
AnnaBridge 189:f392fc9709a3 852 /*!
AnnaBridge 189:f392fc9709a3 853 * @brief eDMA abort transfer.
AnnaBridge 189:f392fc9709a3 854 *
AnnaBridge 189:f392fc9709a3 855 * This function disables the channel request and clear transfer status bits.
AnnaBridge 189:f392fc9709a3 856 * Users can submit another transfer after calling this API.
AnnaBridge 189:f392fc9709a3 857 *
AnnaBridge 189:f392fc9709a3 858 * @param handle DMA handle pointer.
AnnaBridge 189:f392fc9709a3 859 */
AnnaBridge 189:f392fc9709a3 860 void EDMA_AbortTransfer(edma_handle_t *handle);
AnnaBridge 189:f392fc9709a3 861
AnnaBridge 189:f392fc9709a3 862 /*!
AnnaBridge 189:f392fc9709a3 863 * @brief eDMA IRQ handler for current major loop transfer complete.
AnnaBridge 189:f392fc9709a3 864 *
AnnaBridge 189:f392fc9709a3 865 * This function clears the channel major interrupt flag and call
AnnaBridge 189:f392fc9709a3 866 * the callback function if it is not NULL.
AnnaBridge 189:f392fc9709a3 867 *
AnnaBridge 189:f392fc9709a3 868 * @param handle eDMA handle pointer.
AnnaBridge 189:f392fc9709a3 869 */
AnnaBridge 189:f392fc9709a3 870 void EDMA_HandleIRQ(edma_handle_t *handle);
AnnaBridge 189:f392fc9709a3 871
AnnaBridge 189:f392fc9709a3 872 /* @} */
AnnaBridge 189:f392fc9709a3 873
AnnaBridge 189:f392fc9709a3 874 #if defined(__cplusplus)
AnnaBridge 189:f392fc9709a3 875 }
AnnaBridge 189:f392fc9709a3 876 #endif /* __cplusplus */
AnnaBridge 189:f392fc9709a3 877
AnnaBridge 189:f392fc9709a3 878 /* @} */
AnnaBridge 189:f392fc9709a3 879
AnnaBridge 189:f392fc9709a3 880 #endif /*_FSL_EDMA_H_*/