UDMACC26XX.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2022, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
103 #ifndef ti_drivers_UDMACC26XX__include
104 #define ti_drivers_UDMACC26XX__include
105 
106 #include <stdint.h>
107 #include <stdbool.h>
108 
109 #include <ti/drivers/Power.h>
111 
112 #include <ti/devices/DeviceFamily.h>
113 #include DeviceFamily_constructPath(inc/hw_types.h)
114 #include DeviceFamily_constructPath(driverlib/udma.h)
115 
116 #ifdef __cplusplus
117 extern "C" {
118 #endif
119 
130 /* Add DMACC26XX_STATUS_* macros here */
131 
144 /* Add DMACC26XX_CMD_* macros here */
145 
149 #if !defined(UDMACC26XX_CONFIG_BASE)
150  #if (DeviceFamily_PARENT == DeviceFamily_PARENT_CC13X2_CC26X2)
151  /* On CC13X2, CC13X2X7, CC26X2, and CC26X2X7 devices, the uDMA table needs
152  * to be offset a few kB since the ROM area of SRAM is placed at the start
153  * of SRAM on those devices.
154  */
155  #define UDMACC26XX_CONFIG_BASE 0x20001800
156  #elif (DeviceFamily_PARENT == DeviceFamily_PARENT_CC13X1_CC26X1)
157  /*
158  * Since there is no ROM area of SRAM on the CC13X1 and CC26X1 devices, we
159  * can move the uDMA table closer to the start of SRAM. This improves the
160  * linker efficiency when using dynamically sized heaps.
161  */
162  #define UDMACC26XX_CONFIG_BASE 0x20000400
163  #elif (DeviceFamily_PARENT == DeviceFamily_PARENT_CC13X4_CC26X3_CC26X4)
164  /*
165  * Since there is no ROM area of SRAM on the CC13X4 and CC26X4 devices, we
166  * can move the uDMA table closer to the start of SRAM. This improves the
167  * linker efficiency when using dynamically sized heaps.
168  */
169  #if (SPE_ENABLED == 0)
170  #define UDMACC26XX_CONFIG_BASE 0x20000400
171  #else
172  #define UDMACC26XX_CONFIG_BASE 0x2000C400
173  #endif
174  #else
175  #define UDMACC26XX_CONFIG_BASE 0x20000400
176  #endif
177 #endif
178 
180 #if (UDMACC26XX_CONFIG_BASE & 0x3FF)
181  #error "Base address for DMA control table 'UDMACC26XX_CONFIG_BASE' must be 1024 bytes aligned."
182 #endif
183 
185 #if defined(__IAR_SYSTEMS_ICC__)
186  #define ALLOCATE_CONTROL_TABLE_ENTRY(ENTRY_NAME, CHANNEL_INDEX) \
187  __no_init static volatile tDMAControlTable ENTRY_NAME @UDMACC26XX_CONFIG_BASE + \
188  CHANNEL_INDEX * sizeof(tDMAControlTable)
189 #elif defined(__TI_COMPILER_VERSION__) || defined(__clang__)
190  #define ALLOCATE_CONTROL_TABLE_ENTRY(ENTRY_NAME, CHANNEL_INDEX) \
191  static volatile tDMAControlTable ENTRY_NAME \
192  __attribute__((retain, location(UDMACC26XX_CONFIG_BASE + CHANNEL_INDEX * sizeof(tDMAControlTable))))
193 #elif defined(__GNUC__)
194  #define ALLOCATE_CONTROL_TABLE_ENTRY(ENTRY_NAME, CHANNEL_INDEX) \
195  extern int UDMACC26XX_##ENTRY_NAME##_is_placed; \
196  __attribute__((section("." #ENTRY_NAME))) static volatile tDMAControlTable ENTRY_NAME = { \
197  &UDMACC26XX_##ENTRY_NAME##_is_placed}
198 #else
199  #error "don't know how to define ALLOCATE_CONTROL_TABLE_ENTRY for this toolchain"
200 #endif
201 
203 #define UDMACC26XX_SET_TRANSFER_SIZE(SIZE) (((SIZE - 1) << UDMA_XFER_SIZE_S) & UDMA_XFER_SIZE_M)
204 
205 #define UDMACC26XX_GET_TRANSFER_SIZE(CONTROL) (((CONTROL & UDMA_XFER_SIZE_M) >> UDMA_XFER_SIZE_S) + 1)
206 
210 typedef struct
211 {
212  bool isOpen;
213  HwiP_Struct hwi;
215 
219 typedef struct
220 {
221  uint32_t baseAddr;
222  PowerCC26XX_Resource powerMngrId;
223  uint8_t intNum;
246  uint8_t intPriority;
248 
252 typedef struct
253 {
254  void *object;
255  void const *hwAttrs;
257 
262 
263 /* Extern'd hwiIntFxn */
264 extern void UDMACC26XX_hwiIntFxn(uintptr_t callbacks);
265 
278 __STATIC_INLINE void UDMACC26XX_init(UDMACC26XX_Handle handle)
279 {
280  UDMACC26XX_Object *object;
281 
282  /* Get the pointer to the object */
283  object = (UDMACC26XX_Object *)(handle->object);
284 
285  /* mark the module as available */
286  object->isOpen = false;
287 }
288 
304 extern UDMACC26XX_Handle UDMACC26XX_open(void);
305 
319 __STATIC_INLINE void UDMACC26XX_channelEnable(UDMACC26XX_Handle handle, uint32_t channelBitMask)
320 {
321  UDMACC26XX_HWAttrs const *hwAttrs;
322 
323  /* Get the pointer to the hwAttrs */
324  hwAttrs = (UDMACC26XX_HWAttrs *)(handle->hwAttrs);
325 
326  /* Enable DMA channel */
327  HWREG(hwAttrs->baseAddr + UDMA_O_SETCHANNELEN) = channelBitMask;
328 }
329 
348 __STATIC_INLINE bool UDMACC26XX_channelDone(UDMACC26XX_Handle handle, uint32_t channelBitMask)
349 {
350  UDMACC26XX_HWAttrs const *hwAttrs;
351 
352  /* Get the pointer to the hwAttrs */
353  hwAttrs = (UDMACC26XX_HWAttrs *)(handle->hwAttrs);
354 
355  /* Check if REQDONE is set for a specific channel */
356  return (uDMAIntStatus(hwAttrs->baseAddr) & channelBitMask) ? true : false;
357 }
358 
376 __STATIC_INLINE void UDMACC26XX_clearInterrupt(UDMACC26XX_Handle handle, uint32_t channelBitMask)
377 {
378  UDMACC26XX_HWAttrs const *hwAttrs;
379 
380  /* Get the pointer to the hwAttrs and object */
381  hwAttrs = (UDMACC26XX_HWAttrs *)(handle->hwAttrs);
382 
383  /* Clear UDMA done interrupt */
384  uDMAIntClear(hwAttrs->baseAddr, channelBitMask);
385 }
386 
404 __STATIC_INLINE void UDMACC26XX_channelDisable(UDMACC26XX_Handle handle, uint32_t channelBitMask)
405 {
406  UDMACC26XX_HWAttrs const *hwAttrs;
407 
408  /* Get the pointer to the hwAttrs */
409  hwAttrs = (UDMACC26XX_HWAttrs *)(handle->hwAttrs);
410 
411  HWREG(hwAttrs->baseAddr + UDMA_O_CLEARCHANNELEN) = channelBitMask;
412 }
413 
434 __STATIC_INLINE void UDMACC26XX_disableAttribute(UDMACC26XX_Handle handle, uint32_t channelNum, uint32_t attr)
435 {
436  UDMACC26XX_HWAttrs const *hwAttrs;
437 
438  /* Get the pointer to the hwAttrs */
439  hwAttrs = (UDMACC26XX_HWAttrs *)(handle->hwAttrs);
440 
441  uDMAChannelAttributeDisable(hwAttrs->baseAddr, channelNum, attr);
442 }
443 
459 extern void UDMACC26XX_close(UDMACC26XX_Handle handle);
460 
461 #ifdef __cplusplus
462 }
463 #endif
464 
465 #endif /* ti_drivers_UDMACC26XX__include */
bool isOpen
Definition: UDMACC26XX.h:212
HwiP_Struct hwi
Definition: UDMACC26XX.h:213
void UDMACC26XX_hwiIntFxn(uintptr_t callbacks)
PowerCC26XX_Resource powerMngrId
Definition: UDMACC26XX.h:222
void UDMACC26XX_close(UDMACC26XX_Handle handle)
Function to close the DMA driver.
UDMACC26XX_Handle UDMACC26XX_open(void)
Function to initialize the CC26XX DMA peripheral.
__STATIC_INLINE void UDMACC26XX_clearInterrupt(UDMACC26XX_Handle handle, uint32_t channelBitMask)
Definition: UDMACC26XX.h:376
Power Manager.
__STATIC_INLINE void UDMACC26XX_channelEnable(UDMACC26XX_Handle handle, uint32_t channelBitMask)
Definition: UDMACC26XX.h:319
uint8_t intNum
Definition: UDMACC26XX.h:223
__STATIC_INLINE void UDMACC26XX_init(UDMACC26XX_Handle handle)
Function to initialize the CC26XX DMA driver.
Definition: UDMACC26XX.h:278
__STATIC_INLINE void UDMACC26XX_disableAttribute(UDMACC26XX_Handle handle, uint32_t channelNum, uint32_t attr)
Definition: UDMACC26XX.h:434
UDMACC26XX Global configuration.
Definition: UDMACC26XX.h:252
Power manager interface for CC26XX/CC13XX.
UDMACC26XX hardware attributes.
Definition: UDMACC26XX.h:219
void * object
Definition: UDMACC26XX.h:254
uint8_t intPriority
UDMACC26XX error interrupt priority. intPriority is the DMA peripheral&#39;s interrupt priority...
Definition: UDMACC26XX.h:246
__STATIC_INLINE void UDMACC26XX_channelDisable(UDMACC26XX_Handle handle, uint32_t channelBitMask)
Definition: UDMACC26XX.h:404
__STATIC_INLINE bool UDMACC26XX_channelDone(UDMACC26XX_Handle handle, uint32_t channelBitMask)
Definition: UDMACC26XX.h:348
uint32_t baseAddr
Definition: UDMACC26XX.h:221
UDMACC26XX object.
Definition: UDMACC26XX.h:210
UDMACC26XX_Config * UDMACC26XX_Handle
A handle that is returned from a UDMACC26XX_open() call.
Definition: UDMACC26XX.h:261
void const * hwAttrs
Definition: UDMACC26XX.h:255
© Copyright 1995-2022, Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy policy | Terms of use | Terms of sale