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