mbed official / mbed

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

Committer:
Kojto
Date:
Wed Apr 29 10:16:23 2015 +0100
Revision:
98:8ab26030e058
Child:
113:f141b2784e32
Release 98 of the mbed library

Changes:
- Silabs new targets (Giant, Zero, Happy, Leopard, Wonder Geckos)
- Asynchronous SPI, I2C, Serial
- LowPower classes
- Nordic - nordic SDK v8.0 update
- Teensy - gcc arm fix for startup
- Nucleo F411 - usb freq fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 98:8ab26030e058 1 /***************************************************************************//**
Kojto 98:8ab26030e058 2 * @file em_dma.h
Kojto 98:8ab26030e058 3 * @brief Direct memory access (DMA) API
Kojto 98:8ab26030e058 4 * @version 3.20.12
Kojto 98:8ab26030e058 5 *******************************************************************************
Kojto 98:8ab26030e058 6 * @section License
Kojto 98:8ab26030e058 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
Kojto 98:8ab26030e058 8 *******************************************************************************
Kojto 98:8ab26030e058 9 *
Kojto 98:8ab26030e058 10 * Permission is granted to anyone to use this software for any purpose,
Kojto 98:8ab26030e058 11 * including commercial applications, and to alter it and redistribute it
Kojto 98:8ab26030e058 12 * freely, subject to the following restrictions:
Kojto 98:8ab26030e058 13 *
Kojto 98:8ab26030e058 14 * 1. The origin of this software must not be misrepresented; you must not
Kojto 98:8ab26030e058 15 * claim that you wrote the original software.
Kojto 98:8ab26030e058 16 * 2. Altered source versions must be plainly marked as such, and must not be
Kojto 98:8ab26030e058 17 * misrepresented as being the original software.
Kojto 98:8ab26030e058 18 * 3. This notice may not be removed or altered from any source distribution.
Kojto 98:8ab26030e058 19 *
Kojto 98:8ab26030e058 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
Kojto 98:8ab26030e058 21 * obligation to support this Software. Silicon Labs is providing the
Kojto 98:8ab26030e058 22 * Software "AS IS", with no express or implied warranties of any kind,
Kojto 98:8ab26030e058 23 * including, but not limited to, any implied warranties of merchantability
Kojto 98:8ab26030e058 24 * or fitness for any particular purpose or warranties against infringement
Kojto 98:8ab26030e058 25 * of any proprietary rights of a third party.
Kojto 98:8ab26030e058 26 *
Kojto 98:8ab26030e058 27 * Silicon Labs will not be liable for any consequential, incidental, or
Kojto 98:8ab26030e058 28 * special damages, or any other relief, or for any claim by any third party,
Kojto 98:8ab26030e058 29 * arising from your use of this Software.
Kojto 98:8ab26030e058 30 *
Kojto 98:8ab26030e058 31 ******************************************************************************/
Kojto 98:8ab26030e058 32
Kojto 98:8ab26030e058 33
Kojto 98:8ab26030e058 34
Kojto 98:8ab26030e058 35 #ifndef __SILICON_LABS_EM_DMA_H_
Kojto 98:8ab26030e058 36 #define __SILICON_LABS_EM_DMA_H_
Kojto 98:8ab26030e058 37
Kojto 98:8ab26030e058 38 #include "em_device.h"
Kojto 98:8ab26030e058 39 #if defined( DMA_PRESENT )
Kojto 98:8ab26030e058 40
Kojto 98:8ab26030e058 41 #include <stdio.h>
Kojto 98:8ab26030e058 42 #include <stdbool.h>
Kojto 98:8ab26030e058 43
Kojto 98:8ab26030e058 44 #ifdef __cplusplus
Kojto 98:8ab26030e058 45 extern "C" {
Kojto 98:8ab26030e058 46 #endif
Kojto 98:8ab26030e058 47
Kojto 98:8ab26030e058 48 /***************************************************************************//**
Kojto 98:8ab26030e058 49 * @addtogroup EM_Library
Kojto 98:8ab26030e058 50 * @{
Kojto 98:8ab26030e058 51 ******************************************************************************/
Kojto 98:8ab26030e058 52
Kojto 98:8ab26030e058 53 /***************************************************************************//**
Kojto 98:8ab26030e058 54 * @addtogroup DMA
Kojto 98:8ab26030e058 55 * @{
Kojto 98:8ab26030e058 56 ******************************************************************************/
Kojto 98:8ab26030e058 57
Kojto 98:8ab26030e058 58 /*******************************************************************************
Kojto 98:8ab26030e058 59 ******************************** ENUMS ************************************
Kojto 98:8ab26030e058 60 ******************************************************************************/
Kojto 98:8ab26030e058 61
Kojto 98:8ab26030e058 62 /**
Kojto 98:8ab26030e058 63 * Amount source/destination address should be incremented for each data
Kojto 98:8ab26030e058 64 * transfer.
Kojto 98:8ab26030e058 65 */
Kojto 98:8ab26030e058 66 typedef enum
Kojto 98:8ab26030e058 67 {
Kojto 98:8ab26030e058 68 dmaDataInc1 = _DMA_CTRL_SRC_INC_BYTE, /**< Increment address 1 byte. */
Kojto 98:8ab26030e058 69 dmaDataInc2 = _DMA_CTRL_SRC_INC_HALFWORD, /**< Increment address 2 bytes. */
Kojto 98:8ab26030e058 70 dmaDataInc4 = _DMA_CTRL_SRC_INC_WORD, /**< Increment address 4 bytes. */
Kojto 98:8ab26030e058 71 dmaDataIncNone = _DMA_CTRL_SRC_INC_NONE /**< Do not increment address. */
Kojto 98:8ab26030e058 72 } DMA_DataInc_TypeDef;
Kojto 98:8ab26030e058 73
Kojto 98:8ab26030e058 74
Kojto 98:8ab26030e058 75 /** Data sizes (in number of bytes) to be read/written by DMA transfer. */
Kojto 98:8ab26030e058 76 typedef enum
Kojto 98:8ab26030e058 77 {
Kojto 98:8ab26030e058 78 dmaDataSize1 = _DMA_CTRL_SRC_SIZE_BYTE, /**< 1 byte DMA transfer size. */
Kojto 98:8ab26030e058 79 dmaDataSize2 = _DMA_CTRL_SRC_SIZE_HALFWORD, /**< 2 byte DMA transfer size. */
Kojto 98:8ab26030e058 80 dmaDataSize4 = _DMA_CTRL_SRC_SIZE_WORD /**< 4 byte DMA transfer size. */
Kojto 98:8ab26030e058 81 } DMA_DataSize_TypeDef;
Kojto 98:8ab26030e058 82
Kojto 98:8ab26030e058 83
Kojto 98:8ab26030e058 84 /** Type of DMA transfer. */
Kojto 98:8ab26030e058 85 typedef enum
Kojto 98:8ab26030e058 86 {
Kojto 98:8ab26030e058 87 /** Basic DMA cycle. */
Kojto 98:8ab26030e058 88 dmaCycleCtrlBasic = _DMA_CTRL_CYCLE_CTRL_BASIC,
Kojto 98:8ab26030e058 89 /** Auto-request DMA cycle. */
Kojto 98:8ab26030e058 90 dmaCycleCtrlAuto = _DMA_CTRL_CYCLE_CTRL_AUTO,
Kojto 98:8ab26030e058 91 /** Ping-pong DMA cycle. */
Kojto 98:8ab26030e058 92 dmaCycleCtrlPingPong = _DMA_CTRL_CYCLE_CTRL_PINGPONG,
Kojto 98:8ab26030e058 93 /** Memory scatter-gather DMA cycle. */
Kojto 98:8ab26030e058 94 dmaCycleCtrlMemScatterGather = _DMA_CTRL_CYCLE_CTRL_MEM_SCATTER_GATHER,
Kojto 98:8ab26030e058 95 /** Peripheral scatter-gather DMA cycle. */
Kojto 98:8ab26030e058 96 dmaCycleCtrlPerScatterGather = _DMA_CTRL_CYCLE_CTRL_PER_SCATTER_GATHER
Kojto 98:8ab26030e058 97 } DMA_CycleCtrl_TypeDef;
Kojto 98:8ab26030e058 98
Kojto 98:8ab26030e058 99
Kojto 98:8ab26030e058 100 /** Number of transfers before controller does new arbitration. */
Kojto 98:8ab26030e058 101 typedef enum
Kojto 98:8ab26030e058 102 {
Kojto 98:8ab26030e058 103 dmaArbitrate1 = _DMA_CTRL_R_POWER_1, /**< Arbitrate after 1 DMA transfer. */
Kojto 98:8ab26030e058 104 dmaArbitrate2 = _DMA_CTRL_R_POWER_2, /**< Arbitrate after 2 DMA transfers. */
Kojto 98:8ab26030e058 105 dmaArbitrate4 = _DMA_CTRL_R_POWER_4, /**< Arbitrate after 4 DMA transfers. */
Kojto 98:8ab26030e058 106 dmaArbitrate8 = _DMA_CTRL_R_POWER_8, /**< Arbitrate after 8 DMA transfers. */
Kojto 98:8ab26030e058 107 dmaArbitrate16 = _DMA_CTRL_R_POWER_16, /**< Arbitrate after 16 DMA transfers. */
Kojto 98:8ab26030e058 108 dmaArbitrate32 = _DMA_CTRL_R_POWER_32, /**< Arbitrate after 32 DMA transfers. */
Kojto 98:8ab26030e058 109 dmaArbitrate64 = _DMA_CTRL_R_POWER_64, /**< Arbitrate after 64 DMA transfers. */
Kojto 98:8ab26030e058 110 dmaArbitrate128 = _DMA_CTRL_R_POWER_128, /**< Arbitrate after 128 DMA transfers. */
Kojto 98:8ab26030e058 111 dmaArbitrate256 = _DMA_CTRL_R_POWER_256, /**< Arbitrate after 256 DMA transfers. */
Kojto 98:8ab26030e058 112 dmaArbitrate512 = _DMA_CTRL_R_POWER_512, /**< Arbitrate after 512 DMA transfers. */
Kojto 98:8ab26030e058 113 dmaArbitrate1024 = _DMA_CTRL_R_POWER_1024 /**< Arbitrate after 1024 DMA transfers. */
Kojto 98:8ab26030e058 114 } DMA_ArbiterConfig_TypeDef;
Kojto 98:8ab26030e058 115
Kojto 98:8ab26030e058 116
Kojto 98:8ab26030e058 117 /*******************************************************************************
Kojto 98:8ab26030e058 118 ******************************* STRUCTS ***********************************
Kojto 98:8ab26030e058 119 ******************************************************************************/
Kojto 98:8ab26030e058 120
Kojto 98:8ab26030e058 121 /**
Kojto 98:8ab26030e058 122 * @brief
Kojto 98:8ab26030e058 123 * DMA interrupt callback function pointer.
Kojto 98:8ab26030e058 124 * @details
Kojto 98:8ab26030e058 125 * Parameters:
Kojto 98:8ab26030e058 126 * @li channel - The DMA channel the callback function is invoked for.
Kojto 98:8ab26030e058 127 * @li primary - Indicates if callback is invoked for completion of primary
Kojto 98:8ab26030e058 128 * (true) or alternate (false) descriptor. This is mainly useful for
Kojto 98:8ab26030e058 129 * ping-pong DMA cycles, in order to know which descriptor to refresh.
Kojto 98:8ab26030e058 130 * @li user - User definable reference that may be used to pass information
Kojto 98:8ab26030e058 131 * to be used by the callback handler. If used, the referenced data must be
Kojto 98:8ab26030e058 132 * valid at the point when the interrupt handler invokes the callback.
Kojto 98:8ab26030e058 133 * If callback changes any data in the provided user structure, remember
Kojto 98:8ab26030e058 134 * that those changes are done in interrupt context, and proper protection
Kojto 98:8ab26030e058 135 * of data may be required.
Kojto 98:8ab26030e058 136 */
Kojto 98:8ab26030e058 137 typedef void (*DMA_FuncPtr_TypeDef)(unsigned int channel, bool primary, void *user);
Kojto 98:8ab26030e058 138
Kojto 98:8ab26030e058 139
Kojto 98:8ab26030e058 140 /**
Kojto 98:8ab26030e058 141 * @brief
Kojto 98:8ab26030e058 142 * Callback structure that can be used to define DMA complete actions.
Kojto 98:8ab26030e058 143 * @details
Kojto 98:8ab26030e058 144 * A reference to this structure is only stored in the primary descriptor
Kojto 98:8ab26030e058 145 * for a channel (if callback feature is used). If callback is required
Kojto 98:8ab26030e058 146 * for both primary and alternate descriptor completion, this must be
Kojto 98:8ab26030e058 147 * handled by one common callback, using the provided 'primary' parameter
Kojto 98:8ab26030e058 148 * with the callback function.
Kojto 98:8ab26030e058 149 */
Kojto 98:8ab26030e058 150 typedef struct
Kojto 98:8ab26030e058 151 {
Kojto 98:8ab26030e058 152 /**
Kojto 98:8ab26030e058 153 * Pointer to callback function to invoke when DMA transfer cycle done.
Kojto 98:8ab26030e058 154 * Notice that this function is invoked in interrupt context, and therefore
Kojto 98:8ab26030e058 155 * should be short and non-blocking.
Kojto 98:8ab26030e058 156 */
Kojto 98:8ab26030e058 157 DMA_FuncPtr_TypeDef cbFunc;
Kojto 98:8ab26030e058 158
Kojto 98:8ab26030e058 159 /** User defined pointer to provide with callback function. */
Kojto 98:8ab26030e058 160 void *userPtr;
Kojto 98:8ab26030e058 161
Kojto 98:8ab26030e058 162 /**
Kojto 98:8ab26030e058 163 * For internal use only: Indicates if next callback applies to primary
Kojto 98:8ab26030e058 164 * or alternate descriptor completion. Mainly useful for ping-pong DMA
Kojto 98:8ab26030e058 165 * cycles. Set this value to 0 prior to configuring callback handling.
Kojto 98:8ab26030e058 166 */
Kojto 98:8ab26030e058 167 uint8_t primary;
Kojto 98:8ab26030e058 168 } DMA_CB_TypeDef;
Kojto 98:8ab26030e058 169
Kojto 98:8ab26030e058 170
Kojto 98:8ab26030e058 171 /** Configuration structure for a channel. */
Kojto 98:8ab26030e058 172 typedef struct
Kojto 98:8ab26030e058 173 {
Kojto 98:8ab26030e058 174 /**
Kojto 98:8ab26030e058 175 * Select if channel priority is in the high or default priority group
Kojto 98:8ab26030e058 176 * with respect to arbitration. Within a priority group, lower numbered
Kojto 98:8ab26030e058 177 * channels have higher priority than higher numbered channels.
Kojto 98:8ab26030e058 178 */
Kojto 98:8ab26030e058 179 bool highPri;
Kojto 98:8ab26030e058 180
Kojto 98:8ab26030e058 181 /**
Kojto 98:8ab26030e058 182 * Select if interrupt shall be enabled for channel (triggering interrupt
Kojto 98:8ab26030e058 183 * handler when dma_done signal is asserted). It should normally be
Kojto 98:8ab26030e058 184 * enabled if using the callback feature for a channel, and disabled if
Kojto 98:8ab26030e058 185 * not using the callback feature.
Kojto 98:8ab26030e058 186 */
Kojto 98:8ab26030e058 187 bool enableInt;
Kojto 98:8ab26030e058 188
Kojto 98:8ab26030e058 189 /**
Kojto 98:8ab26030e058 190 * Channel control specifying the source of DMA signals. If accessing
Kojto 98:8ab26030e058 191 * peripherals, use one of the DMAREQ_nnn defines available for the
Kojto 98:8ab26030e058 192 * peripheral. Set it to 0 for memory-to-memory DMA cycles.
Kojto 98:8ab26030e058 193 */
Kojto 98:8ab26030e058 194 uint32_t select;
Kojto 98:8ab26030e058 195
Kojto 98:8ab26030e058 196 /**
Kojto 98:8ab26030e058 197 * @brief
Kojto 98:8ab26030e058 198 * User definable callback handling configuration.
Kojto 98:8ab26030e058 199 * @details
Kojto 98:8ab26030e058 200 * Please refer to structure definition for details. The callback
Kojto 98:8ab26030e058 201 * is invoked when the specified DMA cycle is complete (when dma_done
Kojto 98:8ab26030e058 202 * signal asserted). The callback is invoked in interrupt context,
Kojto 98:8ab26030e058 203 * and should be efficient and non-blocking. Set to NULL to not
Kojto 98:8ab26030e058 204 * use the callback feature.
Kojto 98:8ab26030e058 205 * @note
Kojto 98:8ab26030e058 206 * The referenced structure is used by the interrupt handler, and must
Kojto 98:8ab26030e058 207 * be available until no longer used. Thus, in most cases it should
Kojto 98:8ab26030e058 208 * not be located on the stack.
Kojto 98:8ab26030e058 209 */
Kojto 98:8ab26030e058 210 DMA_CB_TypeDef *cb;
Kojto 98:8ab26030e058 211 } DMA_CfgChannel_TypeDef;
Kojto 98:8ab26030e058 212
Kojto 98:8ab26030e058 213
Kojto 98:8ab26030e058 214 /**
Kojto 98:8ab26030e058 215 * Configuration structure for primary or alternate descriptor
Kojto 98:8ab26030e058 216 * (not used for scatter-gather DMA cycles).
Kojto 98:8ab26030e058 217 */
Kojto 98:8ab26030e058 218 typedef struct
Kojto 98:8ab26030e058 219 {
Kojto 98:8ab26030e058 220 /** Destination increment size for each DMA transfer */
Kojto 98:8ab26030e058 221 DMA_DataInc_TypeDef dstInc;
Kojto 98:8ab26030e058 222
Kojto 98:8ab26030e058 223 /** Source increment size for each DMA transfer */
Kojto 98:8ab26030e058 224 DMA_DataInc_TypeDef srcInc;
Kojto 98:8ab26030e058 225
Kojto 98:8ab26030e058 226 /** DMA transfer unit size. */
Kojto 98:8ab26030e058 227 DMA_DataSize_TypeDef size;
Kojto 98:8ab26030e058 228
Kojto 98:8ab26030e058 229 /**
Kojto 98:8ab26030e058 230 * Arbitration rate, ie number of DMA transfers done before rearbitration
Kojto 98:8ab26030e058 231 * takes place.
Kojto 98:8ab26030e058 232 */
Kojto 98:8ab26030e058 233 DMA_ArbiterConfig_TypeDef arbRate;
Kojto 98:8ab26030e058 234
Kojto 98:8ab26030e058 235 /**
Kojto 98:8ab26030e058 236 * HPROT signal state, please refer to reference manual, DMA chapter for
Kojto 98:8ab26030e058 237 * further details. Normally set to 0 if protection is not an issue.
Kojto 98:8ab26030e058 238 * The following bits are available:
Kojto 98:8ab26030e058 239 * @li bit 0 - HPROT[1] control for source read accesses,
Kojto 98:8ab26030e058 240 * privileged/non-privileged access
Kojto 98:8ab26030e058 241 * @li bit 3 - HPROT[1] control for destination write accesses,
Kojto 98:8ab26030e058 242 * privileged/non-privileged access
Kojto 98:8ab26030e058 243 */
Kojto 98:8ab26030e058 244 uint8_t hprot;
Kojto 98:8ab26030e058 245 } DMA_CfgDescr_TypeDef;
Kojto 98:8ab26030e058 246
Kojto 98:8ab26030e058 247
Kojto 98:8ab26030e058 248 #if defined( _DMA_LOOP0_MASK ) && defined( _DMA_LOOP1_MASK )
Kojto 98:8ab26030e058 249 /**
Kojto 98:8ab26030e058 250 * Configuration structure for loop mode
Kojto 98:8ab26030e058 251 */
Kojto 98:8ab26030e058 252 typedef struct
Kojto 98:8ab26030e058 253 {
Kojto 98:8ab26030e058 254 /** Enable repeated loop */
Kojto 98:8ab26030e058 255 bool enable;
Kojto 98:8ab26030e058 256 /** Width of transfer, reload value for nMinus1 */
Kojto 98:8ab26030e058 257 uint16_t nMinus1;
Kojto 98:8ab26030e058 258 } DMA_CfgLoop_TypeDef;
Kojto 98:8ab26030e058 259 #endif
Kojto 98:8ab26030e058 260
Kojto 98:8ab26030e058 261
Kojto 98:8ab26030e058 262 #if defined( _DMA_RECT0_MASK )
Kojto 98:8ab26030e058 263 /**
Kojto 98:8ab26030e058 264 * Configuration structure for rectangular copy
Kojto 98:8ab26030e058 265 */
Kojto 98:8ab26030e058 266 typedef struct
Kojto 98:8ab26030e058 267 {
Kojto 98:8ab26030e058 268 /** DMA channel destination stride (width of destination image, distance between lines) */
Kojto 98:8ab26030e058 269 uint16_t dstStride;
Kojto 98:8ab26030e058 270 /** DMA channel source stride (width of source image, distance between lines) */
Kojto 98:8ab26030e058 271 uint16_t srcStride;
Kojto 98:8ab26030e058 272 /** 2D copy height */
Kojto 98:8ab26030e058 273 uint16_t height;
Kojto 98:8ab26030e058 274 } DMA_CfgRect_TypeDef;
Kojto 98:8ab26030e058 275 #endif
Kojto 98:8ab26030e058 276
Kojto 98:8ab26030e058 277
Kojto 98:8ab26030e058 278 /** Configuration structure for alternate scatter-gather descriptor. */
Kojto 98:8ab26030e058 279 typedef struct
Kojto 98:8ab26030e058 280 {
Kojto 98:8ab26030e058 281 /** Pointer to location to transfer data from. */
Kojto 98:8ab26030e058 282 void *src;
Kojto 98:8ab26030e058 283
Kojto 98:8ab26030e058 284 /** Pointer to location to transfer data to. */
Kojto 98:8ab26030e058 285 void *dst;
Kojto 98:8ab26030e058 286
Kojto 98:8ab26030e058 287 /** Destination increment size for each DMA transfer */
Kojto 98:8ab26030e058 288 DMA_DataInc_TypeDef dstInc;
Kojto 98:8ab26030e058 289
Kojto 98:8ab26030e058 290 /** Source increment size for each DMA transfer */
Kojto 98:8ab26030e058 291 DMA_DataInc_TypeDef srcInc;
Kojto 98:8ab26030e058 292
Kojto 98:8ab26030e058 293 /** DMA transfer unit size. */
Kojto 98:8ab26030e058 294 DMA_DataSize_TypeDef size;
Kojto 98:8ab26030e058 295
Kojto 98:8ab26030e058 296 /**
Kojto 98:8ab26030e058 297 * Arbitration rate, ie number of DMA transfers done before rearbitration
Kojto 98:8ab26030e058 298 * takes place.
Kojto 98:8ab26030e058 299 */
Kojto 98:8ab26030e058 300 DMA_ArbiterConfig_TypeDef arbRate;
Kojto 98:8ab26030e058 301
Kojto 98:8ab26030e058 302 /** Number of DMA transfers minus 1 to do. Must be <= 1023. */
Kojto 98:8ab26030e058 303 uint16_t nMinus1;
Kojto 98:8ab26030e058 304
Kojto 98:8ab26030e058 305 /**
Kojto 98:8ab26030e058 306 * HPROT signal state, please refer to reference manual, DMA chapter for
Kojto 98:8ab26030e058 307 * further details. Normally set to 0 if protection is not an issue.
Kojto 98:8ab26030e058 308 * The following bits are available:
Kojto 98:8ab26030e058 309 * @li bit 0 - HPROT[1] control for source read accesses,
Kojto 98:8ab26030e058 310 * privileged/non-privileged access
Kojto 98:8ab26030e058 311 * @li bit 3 - HPROT[1] control for destination write accesses,
Kojto 98:8ab26030e058 312 * privileged/non-privileged access
Kojto 98:8ab26030e058 313 */
Kojto 98:8ab26030e058 314 uint8_t hprot;
Kojto 98:8ab26030e058 315
Kojto 98:8ab26030e058 316 /** Specify if a memory or peripheral scatter-gather DMA cycle. Notice
Kojto 98:8ab26030e058 317 * that this parameter should be the same for all alternate
Kojto 98:8ab26030e058 318 * descriptors.
Kojto 98:8ab26030e058 319 * @li true - this is a peripheral scatter-gather cycle
Kojto 98:8ab26030e058 320 * @li false - this is a memory scatter-gather cycle
Kojto 98:8ab26030e058 321 */
Kojto 98:8ab26030e058 322 bool peripheral;
Kojto 98:8ab26030e058 323 } DMA_CfgDescrSGAlt_TypeDef;
Kojto 98:8ab26030e058 324
Kojto 98:8ab26030e058 325
Kojto 98:8ab26030e058 326 /** DMA init structure */
Kojto 98:8ab26030e058 327 typedef struct
Kojto 98:8ab26030e058 328 {
Kojto 98:8ab26030e058 329 /**
Kojto 98:8ab26030e058 330 * HPROT signal state when accessing the primary/alternate
Kojto 98:8ab26030e058 331 * descriptors. Normally set to 0 if protection is not an issue.
Kojto 98:8ab26030e058 332 * The following bits are available:
Kojto 98:8ab26030e058 333 * @li bit 0 - HPROT[1] control for descriptor accesses (ie when
Kojto 98:8ab26030e058 334 * the DMA controller accesses the channel control block itself),
Kojto 98:8ab26030e058 335 * privileged/non-privileged access
Kojto 98:8ab26030e058 336 */
Kojto 98:8ab26030e058 337 uint8_t hprot;
Kojto 98:8ab26030e058 338
Kojto 98:8ab26030e058 339 /**
Kojto 98:8ab26030e058 340 * Pointer to the controlblock in memory holding descriptors (channel
Kojto 98:8ab26030e058 341 * control data structures). This memory must be properly aligned
Kojto 98:8ab26030e058 342 * at a 256 bytes. I.e. the 8 least significant bits must be zero.
Kojto 98:8ab26030e058 343 *
Kojto 98:8ab26030e058 344 * Please refer to the reference manual, DMA chapter for more details.
Kojto 98:8ab26030e058 345 *
Kojto 98:8ab26030e058 346 * It is possible to provide a smaller memory block, only covering
Kojto 98:8ab26030e058 347 * those channels actually used, if not all available channels are used.
Kojto 98:8ab26030e058 348 * Ie, if only using 4 channels (0-3), both primary and alternate
Kojto 98:8ab26030e058 349 * structures, then only 16*2*4 = 128 bytes must be provided. This
Kojto 98:8ab26030e058 350 * implementation has however no check if later exceeding such a limit
Kojto 98:8ab26030e058 351 * by configuring for instance channel 4, in which case memory overwrite
Kojto 98:8ab26030e058 352 * of some other data will occur.
Kojto 98:8ab26030e058 353 */
Kojto 98:8ab26030e058 354 DMA_DESCRIPTOR_TypeDef *controlBlock;
Kojto 98:8ab26030e058 355 } DMA_Init_TypeDef;
Kojto 98:8ab26030e058 356
Kojto 98:8ab26030e058 357
Kojto 98:8ab26030e058 358 /*******************************************************************************
Kojto 98:8ab26030e058 359 ***************************** PROTOTYPES **********************************
Kojto 98:8ab26030e058 360 ******************************************************************************/
Kojto 98:8ab26030e058 361
Kojto 98:8ab26030e058 362 void DMA_ActivateAuto(unsigned int channel,
Kojto 98:8ab26030e058 363 bool primary,
Kojto 98:8ab26030e058 364 void *dst,
Kojto 98:8ab26030e058 365 void *src,
Kojto 98:8ab26030e058 366 unsigned int nMinus1);
Kojto 98:8ab26030e058 367 void DMA_ActivateBasic(unsigned int channel,
Kojto 98:8ab26030e058 368 bool primary,
Kojto 98:8ab26030e058 369 bool useBurst,
Kojto 98:8ab26030e058 370 void *dst,
Kojto 98:8ab26030e058 371 void *src,
Kojto 98:8ab26030e058 372 unsigned int nMinus1);
Kojto 98:8ab26030e058 373 void DMA_ActivatePingPong(unsigned int channel,
Kojto 98:8ab26030e058 374 bool useBurst,
Kojto 98:8ab26030e058 375 void *primDst,
Kojto 98:8ab26030e058 376 void *primSrc,
Kojto 98:8ab26030e058 377 unsigned int primNMinus1,
Kojto 98:8ab26030e058 378 void *altDst,
Kojto 98:8ab26030e058 379 void *altSrc,
Kojto 98:8ab26030e058 380 unsigned int altNMinus1);
Kojto 98:8ab26030e058 381 void DMA_ActivateScatterGather(unsigned int channel,
Kojto 98:8ab26030e058 382 bool useBurst,
Kojto 98:8ab26030e058 383 DMA_DESCRIPTOR_TypeDef *altDescr,
Kojto 98:8ab26030e058 384 unsigned int count);
Kojto 98:8ab26030e058 385 void DMA_CfgChannel(unsigned int channel, DMA_CfgChannel_TypeDef *cfg);
Kojto 98:8ab26030e058 386 void DMA_CfgDescr(unsigned int channel,
Kojto 98:8ab26030e058 387 bool primary,
Kojto 98:8ab26030e058 388 DMA_CfgDescr_TypeDef *cfg);
Kojto 98:8ab26030e058 389 #if defined( _DMA_LOOP0_MASK ) && defined( _DMA_LOOP1_MASK )
Kojto 98:8ab26030e058 390 void DMA_CfgLoop(unsigned int channel, DMA_CfgLoop_TypeDef *cfg);
Kojto 98:8ab26030e058 391 #endif
Kojto 98:8ab26030e058 392
Kojto 98:8ab26030e058 393 #if defined( _DMA_RECT0_MASK )
Kojto 98:8ab26030e058 394 void DMA_CfgRect(unsigned int channel, DMA_CfgRect_TypeDef *cfg);
Kojto 98:8ab26030e058 395 #endif
Kojto 98:8ab26030e058 396
Kojto 98:8ab26030e058 397 #if defined( _DMA_LOOP0_MASK ) && defined( _DMA_LOOP1_MASK )
Kojto 98:8ab26030e058 398 /***************************************************************************//**
Kojto 98:8ab26030e058 399 * @brief
Kojto 98:8ab26030e058 400 * Clear Loop configuration for channel
Kojto 98:8ab26030e058 401 *
Kojto 98:8ab26030e058 402 * @param[in] channel
Kojto 98:8ab26030e058 403 * Channel to reset loop configuration for
Kojto 98:8ab26030e058 404 ******************************************************************************/
Kojto 98:8ab26030e058 405 __STATIC_INLINE void DMA_ResetLoop(unsigned int channel)
Kojto 98:8ab26030e058 406 {
Kojto 98:8ab26030e058 407 /* Clean loop copy operation */
Kojto 98:8ab26030e058 408 switch(channel)
Kojto 98:8ab26030e058 409 {
Kojto 98:8ab26030e058 410 case 0:
Kojto 98:8ab26030e058 411 DMA->LOOP0 = _DMA_LOOP0_RESETVALUE;
Kojto 98:8ab26030e058 412 break;
Kojto 98:8ab26030e058 413 case 1:
Kojto 98:8ab26030e058 414 DMA->LOOP1 = _DMA_LOOP1_RESETVALUE;
Kojto 98:8ab26030e058 415 break;
Kojto 98:8ab26030e058 416 default:
Kojto 98:8ab26030e058 417 break;
Kojto 98:8ab26030e058 418 }
Kojto 98:8ab26030e058 419 }
Kojto 98:8ab26030e058 420 #endif
Kojto 98:8ab26030e058 421
Kojto 98:8ab26030e058 422
Kojto 98:8ab26030e058 423 #if defined( _DMA_RECT0_MASK )
Kojto 98:8ab26030e058 424 /***************************************************************************//**
Kojto 98:8ab26030e058 425 * @brief
Kojto 98:8ab26030e058 426 * Clear Rect/2D DMA configuration for channel
Kojto 98:8ab26030e058 427 *
Kojto 98:8ab26030e058 428 * @param[in] channel
Kojto 98:8ab26030e058 429 * Channel to reset loop configuration for
Kojto 98:8ab26030e058 430 ******************************************************************************/
Kojto 98:8ab26030e058 431 __STATIC_INLINE void DMA_ResetRect(unsigned int channel)
Kojto 98:8ab26030e058 432 {
Kojto 98:8ab26030e058 433 (void) channel;
Kojto 98:8ab26030e058 434
Kojto 98:8ab26030e058 435 /* Clear rect copy operation */
Kojto 98:8ab26030e058 436 DMA->RECT0 = _DMA_RECT0_RESETVALUE;
Kojto 98:8ab26030e058 437 }
Kojto 98:8ab26030e058 438 #endif
Kojto 98:8ab26030e058 439 void DMA_CfgDescrScatterGather(DMA_DESCRIPTOR_TypeDef *descr,
Kojto 98:8ab26030e058 440 unsigned int indx,
Kojto 98:8ab26030e058 441 DMA_CfgDescrSGAlt_TypeDef *cfg);
Kojto 98:8ab26030e058 442 void DMA_ChannelEnable(unsigned int channel, bool enable);
Kojto 98:8ab26030e058 443 bool DMA_ChannelEnabled(unsigned int channel);
Kojto 98:8ab26030e058 444 void DMA_Init(DMA_Init_TypeDef *init);
Kojto 98:8ab26030e058 445 void DMA_IRQHandler(void);
Kojto 98:8ab26030e058 446 void DMA_RefreshPingPong(unsigned int channel,
Kojto 98:8ab26030e058 447 bool primary,
Kojto 98:8ab26030e058 448 bool useBurst,
Kojto 98:8ab26030e058 449 void *dst,
Kojto 98:8ab26030e058 450 void *src,
Kojto 98:8ab26030e058 451 unsigned int nMinus1,
Kojto 98:8ab26030e058 452 bool last);
Kojto 98:8ab26030e058 453 void DMA_Reset(void);
Kojto 98:8ab26030e058 454
Kojto 98:8ab26030e058 455 /** @} (end addtogroup DMA) */
Kojto 98:8ab26030e058 456 /** @} (end addtogroup EM_Library) */
Kojto 98:8ab26030e058 457
Kojto 98:8ab26030e058 458 #ifdef __cplusplus
Kojto 98:8ab26030e058 459 }
Kojto 98:8ab26030e058 460 #endif
Kojto 98:8ab26030e058 461
Kojto 98:8ab26030e058 462 #endif /* defined( DMA_PRESENT ) */
Kojto 98:8ab26030e058 463 #endif /* __SILICON_LABS_EM_DMA_H_ */