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.

Committer:
AnnaBridge
Date:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 148:fd96258d940d 1 /*
Kojto 148:fd96258d940d 2 * Copyright (c) 2016, Freescale Semiconductor, Inc.
Kojto 148:fd96258d940d 3 * All rights reserved.
Kojto 148:fd96258d940d 4 *
Kojto 148:fd96258d940d 5 * Redistribution and use in source and binary forms, with or without modification,
Kojto 148:fd96258d940d 6 * are permitted provided that the following conditions are met:
Kojto 148:fd96258d940d 7 *
Kojto 148:fd96258d940d 8 * o Redistributions of source code must retain the above copyright notice, this list
Kojto 148:fd96258d940d 9 * of conditions and the following disclaimer.
Kojto 148:fd96258d940d 10 *
Kojto 148:fd96258d940d 11 * o Redistributions in binary form must reproduce the above copyright notice, this
Kojto 148:fd96258d940d 12 * list of conditions and the following disclaimer in the documentation and/or
Kojto 148:fd96258d940d 13 * other materials provided with the distribution.
Kojto 148:fd96258d940d 14 *
Kojto 148:fd96258d940d 15 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
Kojto 148:fd96258d940d 16 * contributors may be used to endorse or promote products derived from this
Kojto 148:fd96258d940d 17 * software without specific prior written permission.
Kojto 148:fd96258d940d 18 *
Kojto 148:fd96258d940d 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
Kojto 148:fd96258d940d 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Kojto 148:fd96258d940d 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Kojto 148:fd96258d940d 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
Kojto 148:fd96258d940d 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Kojto 148:fd96258d940d 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Kojto 148:fd96258d940d 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
Kojto 148:fd96258d940d 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Kojto 148:fd96258d940d 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Kojto 148:fd96258d940d 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Kojto 148:fd96258d940d 29 */
Kojto 148:fd96258d940d 30
Kojto 148:fd96258d940d 31 #ifndef _FSL_DMA_H_
Kojto 148:fd96258d940d 32 #define _FSL_DMA_H_
Kojto 148:fd96258d940d 33
Kojto 148:fd96258d940d 34 #include "fsl_common.h"
Kojto 148:fd96258d940d 35
Kojto 148:fd96258d940d 36 /*!
Kojto 148:fd96258d940d 37 * @addtogroup dma
Kojto 148:fd96258d940d 38 * @{
Kojto 148:fd96258d940d 39 */
Kojto 148:fd96258d940d 40
Kojto 148:fd96258d940d 41 /*! @file */
Kojto 148:fd96258d940d 42 /*******************************************************************************
Kojto 148:fd96258d940d 43 * Definitions
Kojto 148:fd96258d940d 44 ******************************************************************************/
Kojto 148:fd96258d940d 45
Kojto 148:fd96258d940d 46 /*! @name Driver version */
Kojto 148:fd96258d940d 47 /*@{*/
Kojto 148:fd96258d940d 48 /*! @brief DMA driver version */
Kojto 148:fd96258d940d 49 #define FSL_DMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) /*!< Version 2.0.0. */
Kojto 148:fd96258d940d 50 /*@}*/
Kojto 148:fd96258d940d 51
Kojto 148:fd96258d940d 52 #define DMA_MAX_TRANSFER_COUNT 0x400
Kojto 148:fd96258d940d 53
Kojto 148:fd96258d940d 54 /* Channel group consists of 32 channels. channel_group = (channel / 32) */
Kojto 148:fd96258d940d 55 #define DMA_CHANNEL_GROUP(channel) (((uint8_t)channel) >> 5U)
Kojto 148:fd96258d940d 56 /* Channel index in channel group. channel_index = (channel % 32) */
Kojto 148:fd96258d940d 57 #define DMA_CHANNEL_INDEX(channel) (((uint8_t)channel) & 0x1F)
Kojto 148:fd96258d940d 58
Kojto 148:fd96258d940d 59
Kojto 148:fd96258d940d 60 /*! @brief DMA descriptor structure */
Kojto 148:fd96258d940d 61 typedef struct _dma_descriptor {
Kojto 148:fd96258d940d 62 uint32_t xfercfg; /*!< Transfer configuration */
Kojto 148:fd96258d940d 63 void *srcEndAddr; /*!< Last source address of DMA transfer */
Kojto 148:fd96258d940d 64 void *dstEndAddr; /*!< Last destination address of DMA transfer */
Kojto 148:fd96258d940d 65 void *linkToNextDesc; /*!< Address of next DMA descriptor in chain */
Kojto 148:fd96258d940d 66 } dma_descriptor_t;
Kojto 148:fd96258d940d 67
Kojto 148:fd96258d940d 68 /*! @brief DMA transfer configuration */
Kojto 148:fd96258d940d 69 typedef struct _dma_xfercfg {
Kojto 148:fd96258d940d 70 bool valid; /*!< Descriptor is ready to transfer */
Kojto 148:fd96258d940d 71 bool reload; /*!< Reload channel configuration register after
Kojto 148:fd96258d940d 72 current descriptor is exhausted */
Kojto 148:fd96258d940d 73 bool swtrig; /*!< Perform software trigger. Transfer if fired
Kojto 148:fd96258d940d 74 when 'valid' is set */
Kojto 148:fd96258d940d 75 bool clrtrig; /*!< Clear trigger */
Kojto 148:fd96258d940d 76 bool intA; /*!< Raises IRQ when transfer is done and set IRQA status register flag */
Kojto 148:fd96258d940d 77 bool intB; /*!< Raises IRQ when transfer is done and set IRQB status register flag */
Kojto 148:fd96258d940d 78 uint8_t byteWidth; /*!< Byte width of data to transfer */
Kojto 148:fd96258d940d 79 uint8_t srcInc; /*!< Increment source address by 'srcInc' x 'byteWidth' */
Kojto 148:fd96258d940d 80 uint8_t dstInc; /*!< Increment destination address by 'dstInc' x 'byteWidth' */
Kojto 148:fd96258d940d 81 uint16_t transferCount; /*!< Number of transfers */
Kojto 148:fd96258d940d 82 } dma_xfercfg_t;
Kojto 148:fd96258d940d 83
Kojto 148:fd96258d940d 84 /*! @brief DMA channel priority */
Kojto 148:fd96258d940d 85 typedef enum _dma_priority {
Kojto 148:fd96258d940d 86 kDMA_ChannelPriority0 = 0, /*!< Highest channel priority - priority 0 */
Kojto 148:fd96258d940d 87 kDMA_ChannelPriority1, /*!< Channel priority 1 */
Kojto 148:fd96258d940d 88 kDMA_ChannelPriority2, /*!< Channel priority 2 */
Kojto 148:fd96258d940d 89 kDMA_ChannelPriority3, /*!< Channel priority 3 */
Kojto 148:fd96258d940d 90 kDMA_ChannelPriority4, /*!< Channel priority 4 */
Kojto 148:fd96258d940d 91 kDMA_ChannelPriority5, /*!< Channel priority 5 */
Kojto 148:fd96258d940d 92 kDMA_ChannelPriority6, /*!< Channel priority 6 */
Kojto 148:fd96258d940d 93 kDMA_ChannelPriority7, /*!< Lowest channel priority - priority 7 */
Kojto 148:fd96258d940d 94 } dma_priority_t;
Kojto 148:fd96258d940d 95
Kojto 148:fd96258d940d 96 /*! @brief DMA interrupt flags */
Kojto 148:fd96258d940d 97 typedef enum _dma_int {
Kojto 148:fd96258d940d 98 kDMA_IntA, /*!< DMA interrupt flag A */
Kojto 148:fd96258d940d 99 kDMA_IntB, /*!< DMA interrupt flag B */
Kojto 148:fd96258d940d 100 } dma_irq_t;
Kojto 148:fd96258d940d 101
Kojto 148:fd96258d940d 102 /*! @brief DMA trigger type*/
Kojto 148:fd96258d940d 103 typedef enum _dma_trigger_type {
Kojto 148:fd96258d940d 104 kDMA_NoTrigger = 0, /*!< Trigger is disabled */
Kojto 148:fd96258d940d 105 kDMA_LowLevelTrigger = DMA_CHANNEL_CFG_HWTRIGEN(1) | DMA_CHANNEL_CFG_TRIGTYPE(1), /*!< Low level active trigger */
Kojto 148:fd96258d940d 106 kDMA_HighLevelTrigger = DMA_CHANNEL_CFG_HWTRIGEN(1) | DMA_CHANNEL_CFG_TRIGTYPE(1) | DMA_CHANNEL_CFG_TRIGPOL(1), /*!< High level active trigger */
Kojto 148:fd96258d940d 107 kDMA_FallingEdgeTrigger = DMA_CHANNEL_CFG_HWTRIGEN(1), /*!< Falling edge active trigger */
Kojto 148:fd96258d940d 108 kDMA_RisingEdgeTrigger = DMA_CHANNEL_CFG_HWTRIGEN(1) | DMA_CHANNEL_CFG_TRIGPOL(1), /*!< Rising edge active trigger */
Kojto 148:fd96258d940d 109 } dma_trigger_type_t;
Kojto 148:fd96258d940d 110
Kojto 148:fd96258d940d 111 /*! @brief DMA trigger burst */
Kojto 148:fd96258d940d 112 typedef enum _dma_trigger_burst {
Kojto 148:fd96258d940d 113 kDMA_SingleTransfer = 0, /*!< Single transfer */
Kojto 148:fd96258d940d 114 kDMA_LevelBurstTransfer = DMA_CHANNEL_CFG_TRIGBURST(1), /*!< Burst transfer driven by level trigger */
Kojto 148:fd96258d940d 115 kDMA_EdgeBurstTransfer1 = DMA_CHANNEL_CFG_TRIGBURST(1), /*!< Perform 1 transfer by edge trigger */
Kojto 148:fd96258d940d 116 kDMA_EdgeBurstTransfer2 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(1), /*!< Perform 2 transfers by edge trigger */
Kojto 148:fd96258d940d 117 kDMA_EdgeBurstTransfer4 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(2), /*!< Perform 4 transfers by edge trigger */
Kojto 148:fd96258d940d 118 kDMA_EdgeBurstTransfer8 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(3), /*!< Perform 8 transfers by edge trigger */
Kojto 148:fd96258d940d 119 kDMA_EdgeBurstTransfer16 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(4), /*!< Perform 16 transfers by edge trigger */
Kojto 148:fd96258d940d 120 kDMA_EdgeBurstTransfer32 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(5), /*!< Perform 32 transfers by edge trigger */
Kojto 148:fd96258d940d 121 kDMA_EdgeBurstTransfer64 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(6), /*!< Perform 64 transfers by edge trigger */
Kojto 148:fd96258d940d 122 kDMA_EdgeBurstTransfer128 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(7), /*!< Perform 128 transfers by edge trigger */
Kojto 148:fd96258d940d 123 kDMA_EdgeBurstTransfer256 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(8), /*!< Perform 256 transfers by edge trigger */
Kojto 148:fd96258d940d 124 kDMA_EdgeBurstTransfer512 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(9), /*!< Perform 512 transfers by edge trigger */
Kojto 148:fd96258d940d 125 kDMA_EdgeBurstTransfer1024 = DMA_CHANNEL_CFG_TRIGBURST(1) | DMA_CHANNEL_CFG_BURSTPOWER(10), /*!< Perform 1024 transfers by edge trigger */
Kojto 148:fd96258d940d 126 } dma_trigger_burst_t;
Kojto 148:fd96258d940d 127
Kojto 148:fd96258d940d 128 /*! @brief DMA burst wrapping */
Kojto 148:fd96258d940d 129 typedef enum _dma_burst_wrap {
Kojto 148:fd96258d940d 130 kDMA_NoWrap = 0, /*!< Wrapping is disabled */
Kojto 148:fd96258d940d 131 kDMA_SrcWrap = DMA_CHANNEL_CFG_SRCBURSTWRAP(1), /*!< Wrapping is enabled for source */
Kojto 148:fd96258d940d 132 kDMA_DstWrap = DMA_CHANNEL_CFG_DSTBURSTWRAP(1), /*!< Wrapping is enabled for destination */
Kojto 148:fd96258d940d 133 kDMA_SrcAndDstWrap = DMA_CHANNEL_CFG_SRCBURSTWRAP(1) | DMA_CHANNEL_CFG_DSTBURSTWRAP(1), /*!< Wrapping is enabled for source and destination */
Kojto 148:fd96258d940d 134 } dma_burst_wrap_t;
Kojto 148:fd96258d940d 135
Kojto 148:fd96258d940d 136 /*! @brief DMA transfer type */
Kojto 148:fd96258d940d 137 typedef enum _dma_transfer_type
Kojto 148:fd96258d940d 138 {
Kojto 148:fd96258d940d 139 kDMA_MemoryToMemory = 0x0U, /*!< Transfer from memory to memory (increment source and destination) */
Kojto 148:fd96258d940d 140 kDMA_PeripheralToMemory, /*!< Transfer from peripheral to memory (increment only destination) */
Kojto 148:fd96258d940d 141 kDMA_MemoryToPeripheral, /*!< Transfer from memory to peripheral (increment only source)*/
Kojto 148:fd96258d940d 142 kDMA_StaticToStatic, /*!< Peripheral to static memory (do not increment source or destination) */
Kojto 148:fd96258d940d 143 } dma_transfer_type_t;
Kojto 148:fd96258d940d 144
Kojto 148:fd96258d940d 145 /*! @brief DMA channel trigger */
Kojto 148:fd96258d940d 146 typedef struct _dma_channel_trigger {
Kojto 148:fd96258d940d 147 dma_trigger_type_t type;
Kojto 148:fd96258d940d 148 dma_trigger_burst_t burst;
Kojto 148:fd96258d940d 149 dma_burst_wrap_t wrap;
Kojto 148:fd96258d940d 150 } dma_channel_trigger_t;
Kojto 148:fd96258d940d 151
Kojto 148:fd96258d940d 152 /*! @brief DMA transfer status */
Kojto 148:fd96258d940d 153 enum _dma_transfer_status
Kojto 148:fd96258d940d 154 {
Kojto 148:fd96258d940d 155 kStatus_DMA_Busy = MAKE_STATUS(kStatusGroup_DMA, 0), /*!< Channel is busy and can't handle the
Kojto 148:fd96258d940d 156 transfer request. */
Kojto 148:fd96258d940d 157 };
Kojto 148:fd96258d940d 158
Kojto 148:fd96258d940d 159 /*! @brief DMA transfer configuration */
Kojto 148:fd96258d940d 160 typedef struct _dma_transfer_config
Kojto 148:fd96258d940d 161 {
Kojto 148:fd96258d940d 162 uint8_t *srcAddr; /*!< Source data address */
Kojto 148:fd96258d940d 163 uint8_t *dstAddr; /*!< Destination data address */
Kojto 148:fd96258d940d 164 uint8_t *nextDesc; /*!< Chain custom descriptor */
Kojto 148:fd96258d940d 165 dma_xfercfg_t xfercfg; /*!< Transfer options */
Kojto 148:fd96258d940d 166 bool isPeriph; /*!< DMA transfer is driven by peripheral */
Kojto 148:fd96258d940d 167 } dma_transfer_config_t;
Kojto 148:fd96258d940d 168
Kojto 148:fd96258d940d 169 /*! @brief Callback for DMA */
Kojto 148:fd96258d940d 170 struct _dma_handle;
Kojto 148:fd96258d940d 171
Kojto 148:fd96258d940d 172 /*! @brief Define Callback function for DMA. */
Kojto 148:fd96258d940d 173 typedef void (*dma_callback)(struct _dma_handle *handle, void *userData, bool transferDone, uint32_t intmode);
Kojto 148:fd96258d940d 174
Kojto 148:fd96258d940d 175 /*! @brief DMA transfer handle structure */
Kojto 148:fd96258d940d 176 typedef struct _dma_handle
Kojto 148:fd96258d940d 177 {
Kojto 148:fd96258d940d 178 dma_callback callback; /*!< Callback function. Invoked when transfer
Kojto 148:fd96258d940d 179 of descriptor with interrupt flag finishes */
Kojto 148:fd96258d940d 180 void *userData; /*!< Callback function parameter */
Kojto 148:fd96258d940d 181 DMA_Type *base; /*!< DMA peripheral base address */
Kojto 148:fd96258d940d 182 uint8_t channel; /*!< DMA channel number */
Kojto 148:fd96258d940d 183 } dma_handle_t;
Kojto 148:fd96258d940d 184
Kojto 148:fd96258d940d 185 /*******************************************************************************
Kojto 148:fd96258d940d 186 * APIs
Kojto 148:fd96258d940d 187 ******************************************************************************/
Kojto 148:fd96258d940d 188 #if defined(__cplusplus)
Kojto 148:fd96258d940d 189 extern "C" {
Kojto 148:fd96258d940d 190 #endif /* __cplusplus */
Kojto 148:fd96258d940d 191
Kojto 148:fd96258d940d 192 /*!
Kojto 148:fd96258d940d 193 * @name DMA initialization and De-initialization
Kojto 148:fd96258d940d 194 * @{
Kojto 148:fd96258d940d 195 */
Kojto 148:fd96258d940d 196
Kojto 148:fd96258d940d 197 /*!
Kojto 148:fd96258d940d 198 * @brief Initializes DMA peripheral.
Kojto 148:fd96258d940d 199 *
Kojto 148:fd96258d940d 200 * This function enable the DMA clock, set descriptor table and
Kojto 148:fd96258d940d 201 * enable DMA peripheral.
Kojto 148:fd96258d940d 202 *
Kojto 148:fd96258d940d 203 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 204 */
Kojto 148:fd96258d940d 205 void DMA_Init(DMA_Type *base);
Kojto 148:fd96258d940d 206
Kojto 148:fd96258d940d 207 /*!
Kojto 148:fd96258d940d 208 * @brief Deinitializes DMA peripheral.
Kojto 148:fd96258d940d 209 *
Kojto 148:fd96258d940d 210 * This function gates the DMA clock.
Kojto 148:fd96258d940d 211 *
Kojto 148:fd96258d940d 212 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 213 */
Kojto 148:fd96258d940d 214 void DMA_Deinit(DMA_Type *base);
Kojto 148:fd96258d940d 215
Kojto 148:fd96258d940d 216 /* @} */
Kojto 148:fd96258d940d 217 /*!
Kojto 148:fd96258d940d 218 * @name DMA Channel Operation
Kojto 148:fd96258d940d 219 * @{
Kojto 148:fd96258d940d 220 */
Kojto 148:fd96258d940d 221
Kojto 148:fd96258d940d 222 /*!
Kojto 148:fd96258d940d 223 * @brief Return whether DMA channel is processing transfer
Kojto 148:fd96258d940d 224 *
Kojto 148:fd96258d940d 225 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 226 * @param channel DMA channel number.
Kojto 148:fd96258d940d 227 * @return True for active state, false otherwise.
Kojto 148:fd96258d940d 228 */
Kojto 148:fd96258d940d 229 static inline bool DMA_ChannelIsActive(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 230 {
Kojto 148:fd96258d940d 231 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 232 return (base->COMMON[DMA_CHANNEL_GROUP(channel)].ACTIVE & (1U << DMA_CHANNEL_INDEX(channel))) ? true : false;
Kojto 148:fd96258d940d 233 }
Kojto 148:fd96258d940d 234
Kojto 148:fd96258d940d 235 /*!
Kojto 148:fd96258d940d 236 * @brief Enables the interrupt source for the DMA transfer.
Kojto 148:fd96258d940d 237 *
Kojto 148:fd96258d940d 238 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 239 * @param channel DMA channel number.
Kojto 148:fd96258d940d 240 */
Kojto 148:fd96258d940d 241 static inline void DMA_EnableChannelInterrupts(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 242 {
Kojto 148:fd96258d940d 243 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 244 base->COMMON[DMA_CHANNEL_GROUP(channel)].INTENSET |= 1U << DMA_CHANNEL_INDEX(channel);
Kojto 148:fd96258d940d 245 }
Kojto 148:fd96258d940d 246
Kojto 148:fd96258d940d 247 /*!
Kojto 148:fd96258d940d 248 * @brief Disables the interrupt source for the DMA transfer.
Kojto 148:fd96258d940d 249 *
Kojto 148:fd96258d940d 250 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 251 * @param channel DMA channel number.
Kojto 148:fd96258d940d 252 */
Kojto 148:fd96258d940d 253 static inline void DMA_DisableChannelInterrupts(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 254 {
Kojto 148:fd96258d940d 255 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 256 base->COMMON[DMA_CHANNEL_GROUP(channel)].INTENCLR |= 1U << DMA_CHANNEL_INDEX(channel);
Kojto 148:fd96258d940d 257 }
Kojto 148:fd96258d940d 258
Kojto 148:fd96258d940d 259 /*!
Kojto 148:fd96258d940d 260 * @brief Enable DMA channel.
Kojto 148:fd96258d940d 261 *
Kojto 148:fd96258d940d 262 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 263 * @param channel DMA channel number.
Kojto 148:fd96258d940d 264 */
Kojto 148:fd96258d940d 265 static inline void DMA_EnableChannel(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 266 {
Kojto 148:fd96258d940d 267 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 268 base->COMMON[DMA_CHANNEL_GROUP(channel)].ENABLESET |= 1U << DMA_CHANNEL_INDEX(channel);
Kojto 148:fd96258d940d 269 }
Kojto 148:fd96258d940d 270
Kojto 148:fd96258d940d 271 /*!
Kojto 148:fd96258d940d 272 * @brief Disable DMA channel.
Kojto 148:fd96258d940d 273 *
Kojto 148:fd96258d940d 274 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 275 * @param channel DMA channel number.
Kojto 148:fd96258d940d 276 */
Kojto 148:fd96258d940d 277 static inline void DMA_DisableChannel(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 278 {
Kojto 148:fd96258d940d 279 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 280 base->COMMON[DMA_CHANNEL_GROUP(channel)].ENABLECLR |= 1U << DMA_CHANNEL_INDEX(channel);
Kojto 148:fd96258d940d 281 }
Kojto 148:fd96258d940d 282
Kojto 148:fd96258d940d 283 /*!
Kojto 148:fd96258d940d 284 * @brief Set PERIPHREQEN of channel configuration register.
Kojto 148:fd96258d940d 285 *
Kojto 148:fd96258d940d 286 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 287 * @param channel DMA channel number.
Kojto 148:fd96258d940d 288 */
Kojto 148:fd96258d940d 289 static inline void DMA_EnableChannelPeriphRq(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 290 {
Kojto 148:fd96258d940d 291 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 292 base->CHANNEL[channel].CFG |= DMA_CHANNEL_CFG_PERIPHREQEN_MASK;
Kojto 148:fd96258d940d 293 }
Kojto 148:fd96258d940d 294
Kojto 148:fd96258d940d 295 /*!
Kojto 148:fd96258d940d 296 * @brief Get PERIPHREQEN value of channel configuration register.
Kojto 148:fd96258d940d 297 *
Kojto 148:fd96258d940d 298 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 299 * @param channel DMA channel number.
Kojto 148:fd96258d940d 300 * @return True for enabled PeriphRq, false for disabled.
Kojto 148:fd96258d940d 301 */
Kojto 148:fd96258d940d 302 static inline void DMA_DisableChannelPeriphRq(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 303 {
Kojto 148:fd96258d940d 304 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 305 base->CHANNEL[channel].CFG &= ~DMA_CHANNEL_CFG_PERIPHREQEN_MASK;
Kojto 148:fd96258d940d 306 }
Kojto 148:fd96258d940d 307
Kojto 148:fd96258d940d 308 /*!
Kojto 148:fd96258d940d 309 * @brief Set trigger settings of DMA channel.
Kojto 148:fd96258d940d 310 *
Kojto 148:fd96258d940d 311 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 312 * @param channel DMA channel number.
Kojto 148:fd96258d940d 313 * @param trigger trigger configuration.
Kojto 148:fd96258d940d 314 */
Kojto 148:fd96258d940d 315 void DMA_ConfigureChannelTrigger(DMA_Type *base, uint32_t channel, dma_channel_trigger_t *trigger);
Kojto 148:fd96258d940d 316
Kojto 148:fd96258d940d 317 /*!
Kojto 148:fd96258d940d 318 * @brief Gets the remaining bytes of the current DMA descriptor transfer.
Kojto 148:fd96258d940d 319 *
Kojto 148:fd96258d940d 320 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 321 * @param channel DMA channel number.
Kojto 148:fd96258d940d 322 * @return The number of bytes which have not been transferred yet.
Kojto 148:fd96258d940d 323 */
Kojto 148:fd96258d940d 324 uint32_t DMA_GetRemainingBytes(DMA_Type *base, uint32_t channel);
Kojto 148:fd96258d940d 325
Kojto 148:fd96258d940d 326 /*!
Kojto 148:fd96258d940d 327 * @brief Set priority of channel configuration register.
Kojto 148:fd96258d940d 328 *
Kojto 148:fd96258d940d 329 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 330 * @param channel DMA channel number.
Kojto 148:fd96258d940d 331 * @param priority Channel priority value.
Kojto 148:fd96258d940d 332 */
Kojto 148:fd96258d940d 333 static inline void DMA_SetChannelPriority(DMA_Type *base, uint32_t channel, dma_priority_t priority)
Kojto 148:fd96258d940d 334 {
Kojto 148:fd96258d940d 335 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 336 base->CHANNEL[channel].CFG = (base->CHANNEL[channel].CFG & (~(DMA_CHANNEL_CFG_CHPRIORITY_MASK))) | DMA_CHANNEL_CFG_CHPRIORITY(priority);
Kojto 148:fd96258d940d 337 }
Kojto 148:fd96258d940d 338
Kojto 148:fd96258d940d 339 /*!
Kojto 148:fd96258d940d 340 * @brief Get priority of channel configuration register.
Kojto 148:fd96258d940d 341 *
Kojto 148:fd96258d940d 342 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 343 * @param channel DMA channel number.
Kojto 148:fd96258d940d 344 * @return Channel priority value.
Kojto 148:fd96258d940d 345 */
Kojto 148:fd96258d940d 346 static inline dma_priority_t DMA_GetChannelPriority(DMA_Type *base, uint32_t channel)
Kojto 148:fd96258d940d 347 {
Kojto 148:fd96258d940d 348 assert(channel < FSL_FEATURE_DMA_NUMBER_OF_CHANNELS);
Kojto 148:fd96258d940d 349 return (dma_priority_t)((base->CHANNEL[channel].CFG & DMA_CHANNEL_CFG_CHPRIORITY_MASK) >> DMA_CHANNEL_CFG_CHPRIORITY_SHIFT);
Kojto 148:fd96258d940d 350 }
Kojto 148:fd96258d940d 351
Kojto 148:fd96258d940d 352 /*!
Kojto 148:fd96258d940d 353 * @brief Create application specific DMA descriptor
Kojto 148:fd96258d940d 354 * to be used in a chain in transfer
Kojto 148:fd96258d940d 355 *
Kojto 148:fd96258d940d 356 * @param desc DMA descriptor address.
Kojto 148:fd96258d940d 357 * @param xfercfg Transfer configuration for DMA descriptor.
Kojto 148:fd96258d940d 358 * @param srcAddr Address of last item to transmit
Kojto 148:fd96258d940d 359 * @param dstAddr Address of last item to receive.
Kojto 148:fd96258d940d 360 * @param nextDesc Address of next descriptor in chain.
Kojto 148:fd96258d940d 361 */
Kojto 148:fd96258d940d 362 void DMA_CreateDescriptor(
Kojto 148:fd96258d940d 363 dma_descriptor_t *desc,
Kojto 148:fd96258d940d 364 dma_xfercfg_t *xfercfg,
Kojto 148:fd96258d940d 365 void *srcAddr,
Kojto 148:fd96258d940d 366 void *dstAddr,
Kojto 148:fd96258d940d 367 void *nextDesc
Kojto 148:fd96258d940d 368 );
Kojto 148:fd96258d940d 369
Kojto 148:fd96258d940d 370 /* @} */
Kojto 148:fd96258d940d 371
Kojto 148:fd96258d940d 372 /*!
Kojto 148:fd96258d940d 373 * @name DMA Transactional Operation
Kojto 148:fd96258d940d 374 * @{
Kojto 148:fd96258d940d 375 */
Kojto 148:fd96258d940d 376
Kojto 148:fd96258d940d 377 /*!
Kojto 148:fd96258d940d 378 * @brief Abort running transfer by handle.
Kojto 148:fd96258d940d 379 *
Kojto 148:fd96258d940d 380 * This function aborts DMA transfer specified by handle.
Kojto 148:fd96258d940d 381 *
Kojto 148:fd96258d940d 382 * @param handle DMA handle pointer.
Kojto 148:fd96258d940d 383 */
Kojto 148:fd96258d940d 384 void DMA_AbortTransfer(dma_handle_t *handle);
Kojto 148:fd96258d940d 385
Kojto 148:fd96258d940d 386 /*!
Kojto 148:fd96258d940d 387 * @brief Creates the DMA handle.
Kojto 148:fd96258d940d 388 *
Kojto 148:fd96258d940d 389 * This function is called if using transaction API for DMA. This function
Kojto 148:fd96258d940d 390 * initializes the internal state of DMA handle.
Kojto 148:fd96258d940d 391 *
Kojto 148:fd96258d940d 392 * @param handle DMA handle pointer. The DMA handle stores callback function and
Kojto 148:fd96258d940d 393 * parameters.
Kojto 148:fd96258d940d 394 * @param base DMA peripheral base address.
Kojto 148:fd96258d940d 395 * @param channel DMA channel number.
Kojto 148:fd96258d940d 396 */
Kojto 148:fd96258d940d 397 void DMA_CreateHandle(dma_handle_t *handle, DMA_Type *base, uint32_t channel);
Kojto 148:fd96258d940d 398
Kojto 148:fd96258d940d 399 /*!
Kojto 148:fd96258d940d 400 * @brief Installs a callback function for the DMA transfer.
Kojto 148:fd96258d940d 401 *
Kojto 148:fd96258d940d 402 * This callback is called in DMA IRQ handler. Use the callback to do something after
Kojto 148:fd96258d940d 403 * the current major loop transfer completes.
Kojto 148:fd96258d940d 404 *
Kojto 148:fd96258d940d 405 * @param handle DMA handle pointer.
Kojto 148:fd96258d940d 406 * @param callback DMA callback function pointer.
Kojto 148:fd96258d940d 407 * @param userData Parameter for callback function.
Kojto 148:fd96258d940d 408 */
Kojto 148:fd96258d940d 409 void DMA_SetCallback(dma_handle_t *handle, dma_callback callback, void *userData);
Kojto 148:fd96258d940d 410
Kojto 148:fd96258d940d 411 /*!
Kojto 148:fd96258d940d 412 * @brief Prepares the DMA transfer structure.
Kojto 148:fd96258d940d 413 *
Kojto 148:fd96258d940d 414 * This function prepares the transfer configuration structure according to the user input.
Kojto 148:fd96258d940d 415 *
Kojto 148:fd96258d940d 416 * @param config The user configuration structure of type dma_transfer_t.
Kojto 148:fd96258d940d 417 * @param srcAddr DMA transfer source address.
Kojto 148:fd96258d940d 418 * @param dstAddr DMA transfer destination address.
Kojto 148:fd96258d940d 419 * @param byteWidth DMA transfer destination address width(bytes).
Kojto 148:fd96258d940d 420 * @param transferBytes DMA transfer bytes to be transferred.
Kojto 148:fd96258d940d 421 * @param type DMA transfer type.
Kojto 148:fd96258d940d 422 * @param nextDesc Chain custom descriptor to transfer.
Kojto 148:fd96258d940d 423 * @note The data address and the data width must be consistent. For example, if the SRC
Kojto 148:fd96258d940d 424 * is 4 bytes, so the source address must be 4 bytes aligned, or it shall result in
Kojto 148:fd96258d940d 425 * source address error(SAE).
Kojto 148:fd96258d940d 426 */
Kojto 148:fd96258d940d 427 void DMA_PrepareTransfer(dma_transfer_config_t *config,
Kojto 148:fd96258d940d 428 void *srcAddr,
Kojto 148:fd96258d940d 429 void *dstAddr,
Kojto 148:fd96258d940d 430 uint32_t byteWidth,
Kojto 148:fd96258d940d 431 uint32_t transferBytes,
Kojto 148:fd96258d940d 432 dma_transfer_type_t type,
Kojto 148:fd96258d940d 433 void *nextDesc);
Kojto 148:fd96258d940d 434
Kojto 148:fd96258d940d 435 /*!
Kojto 148:fd96258d940d 436 * @brief Submits the DMA transfer request.
Kojto 148:fd96258d940d 437 *
Kojto 148:fd96258d940d 438 * This function submits the DMA transfer request according to the transfer configuration structure.
Kojto 148:fd96258d940d 439 * If the user submits the transfer request repeatedly, this function packs an unprocessed request as
Kojto 148:fd96258d940d 440 * a TCD and enables scatter/gather feature to process it in the next time.
Kojto 148:fd96258d940d 441 *
Kojto 148:fd96258d940d 442 * @param handle DMA handle pointer.
Kojto 148:fd96258d940d 443 * @param config Pointer to DMA transfer configuration structure.
Kojto 148:fd96258d940d 444 * @retval kStatus_DMA_Success It means submit transfer request succeed.
Kojto 148:fd96258d940d 445 * @retval kStatus_DMA_QueueFull It means TCD queue is full. Submit transfer request is not allowed.
Kojto 148:fd96258d940d 446 * @retval kStatus_DMA_Busy It means the given channel is busy, need to submit request later.
Kojto 148:fd96258d940d 447 */
Kojto 148:fd96258d940d 448 status_t DMA_SubmitTransfer(dma_handle_t *handle, dma_transfer_config_t *config);
Kojto 148:fd96258d940d 449
Kojto 148:fd96258d940d 450 /*!
Kojto 148:fd96258d940d 451 * @brief DMA start transfer.
Kojto 148:fd96258d940d 452 *
Kojto 148:fd96258d940d 453 * This function enables the channel request. User can call this function after submitting the transfer request
Kojto 148:fd96258d940d 454 * or before submitting the transfer request.
Kojto 148:fd96258d940d 455 *
Kojto 148:fd96258d940d 456 * @param handle DMA handle pointer.
Kojto 148:fd96258d940d 457 */
Kojto 148:fd96258d940d 458 void DMA_StartTransfer(dma_handle_t *handle);
Kojto 148:fd96258d940d 459
Kojto 148:fd96258d940d 460 /*!
Kojto 148:fd96258d940d 461 * @brief DMA IRQ handler for descriptor transfer complete.
Kojto 148:fd96258d940d 462 *
Kojto 148:fd96258d940d 463 * This function clears the channel major interrupt flag and call
Kojto 148:fd96258d940d 464 * the callback function if it is not NULL.
Kojto 148:fd96258d940d 465 */
Kojto 148:fd96258d940d 466 void DMA_HandleIRQ(void);
Kojto 148:fd96258d940d 467
Kojto 148:fd96258d940d 468 /* @} */
Kojto 148:fd96258d940d 469
Kojto 148:fd96258d940d 470 #if defined(__cplusplus)
Kojto 148:fd96258d940d 471 }
Kojto 148:fd96258d940d 472 #endif /* __cplusplus */
Kojto 148:fd96258d940d 473
Kojto 148:fd96258d940d 474 /* @} */
Kojto 148:fd96258d940d 475
Kojto 148:fd96258d940d 476 #endif /*_FSL_DMA_H_*/