53 #include <adi_processor.h> 54 #include <drivers/dma/adi_dma.h> 55 #include <adi_callback.h> 56 #include <rtos_map/adi_rtos_map.h> 57 #include <drivers/general/adi_drivers_general.h> 73 #pragma diag_suppress=Pm011,Pm140 79 #define CCD_ALIGN (0x400) 80 #define CCD_SIZE (32u) 91 typedef struct _DMA_CHANNEL {
92 ADI_CALLBACK pfCallback;
94 } DMA_CHANNEL_CALLBACK_INFO;
107 DMA_CHANNEL_CALLBACK_INFO CallbackInfo[NUM_DMA_CHANNELSn];
108 uint32_t ChannelsInUse;
119 ADI_ALIGNED_PRAGMA(CCD_ALIGN)
120 static ADI_DCC_TypeDef gChannelControlDataArray[CCD_SIZE * 2u] ADI_ALIGNED_ATTRIBUTE(CCD_ALIGN)
122 #ifdef ADI_DMA_DESCRIPTORS_IN_VOLATILE_MEMORY 135 ADI_DCC_TypeDef*
const pAlternateCCD = &gChannelControlDataArray[CCD_SIZE];
142 static ADI_DMA_DEV_DATA DMA_DevData = {
145 {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
146 {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
147 {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
148 {0,0}, {0,0}, {0,0}},
153 static ADI_DMA_DEV_DATA*
const pDMA_DevData = &DMA_DevData;
160 void DMA_Err_Int_Handler(
void);
177 ADI_INT_STATUS_ALLOC();
178 ADI_ENTER_CRITICAL_REGION();
180 if(
false == pDMA_DevData->Initialized )
182 pDMA_DevData->Initialized =
true;
185 pADI_DMA0->CFG |= BITM_DMA_CFG_MEN;
188 pADI_DMA0->PDBPTR = (uint32_t)pPrimaryCCD;
191 NVIC_EnableIRQ(DMA_CHAN_ERR_IRQn);
194 const uint32_t w1r_value = (uint32_t) ((1 << NUM_DMA_CHANNELSn) - 1);
195 pADI_DMA0->RMSK_SET = w1r_value;
196 pADI_DMA0->EN_CLR = w1r_value;
197 pADI_DMA0->ALT_CLR = w1r_value;
198 pADI_DMA0->PRI_CLR = w1r_value;
199 pADI_DMA0->ERRCHNL_CLR = w1r_value;
200 pADI_DMA0->ERR_CLR = w1r_value;
201 pADI_DMA0->INVALIDDESC_CLR = w1r_value;
204 ADI_EXIT_CRITICAL_REGION();
224 DMA_CHANn_TypeDef
const eChannelID,
225 ADI_CALLBACK
const pfCallback,
233 if (
false == pDMA_DevData->Initialized) {
236 const size_t numChannelId =
sizeof(pDMA_DevData->CallbackInfo) /
sizeof(DMA_CHANNEL_CALLBACK_INFO);
237 if (numChannelId <= eChannelID)
246 DMA_CHANNEL_CALLBACK_INFO * pChannel = &pDMA_DevData->CallbackInfo[eChannelID];
249 pChannel->pfCallback = pfCallback;
250 pChannel->pCBParam = pCBParam;
252 const uint32_t nChannelBit = (1u << eChannelID);
253 if (NULL != pfCallback) {
254 pDMA_DevData->ChannelsInUse |= nChannelBit;
256 pDMA_DevData->ChannelsInUse &= (~nChannelBit);
265 #if defined(__ICCARM__) 268 #define ADI_CLZ(X) __CLZ(X) 270 #elif defined(__GNUC__) 273 #define ADI_CLZ(X) __builtin_clz(X) 275 #elif defined(__CC_ARM) 278 #define ADI_CLZ(X) __clz(X) 282 #error "Macro ADI_CLZ undefined!!!" 295 void DMA_Err_Int_Handler(
void)
299 const uint32_t nErrClr = pADI_DMA0->ERR_CLR;
300 const uint32_t nErrChnClr = pADI_DMA0->ERRCHNL_CLR;
301 const uint32_t nInvdDescClr = pADI_DMA0->INVALIDDESC_CLR;
304 uint32_t functionsToBeCalled = pDMA_DevData->ChannelsInUse & (nErrChnClr | nInvdDescClr);
306 if (functionsToBeCalled > 0u)
308 const uint32_t numBits =
sizeof(uint32_t) << 3;
312 for (nlz = (uint32_t) ADI_CLZ(functionsToBeCalled); nlz < numBits; nlz = (uint32_t) ADI_CLZ(functionsToBeCalled))
314 const uint32_t bitSet = numBits - nlz - 1u;
315 const uint32_t selected_bit = ((uint32_t)1u << bitSet);
316 DMA_CHANNEL_CALLBACK_INFO* pChannel = &pDMA_DevData->CallbackInfo[bitSet];
319 if (NULL != pChannel->pfCallback)
322 uint32_t nEvent = ((nErrChnClr & selected_bit) != 0u)
327 pChannel->pfCallback (pChannel->pCBParam, nEvent, NULL );
330 functionsToBeCalled &= ~selected_bit;
335 pADI_DMA0->ERRCHNL_CLR = nErrChnClr;
336 pADI_DMA0->INVALIDDESC_CLR = nInvdDescClr;
337 pADI_DMA0->ERR_CLR = nErrClr;
ADI_DMA_RESULT adi_dma_RegisterCallback(DMA_CHANn_TypeDef const eChannelID, ADI_CALLBACK const pfCallback, void *const pCBParam)
Register a call-back function for a DMA channel.
void adi_dma_Init(void)
Initialize the DMA peripheral.