20 #include <adi_processor.h> 21 #include <drivers/dma/adi_dma.h> 22 #include <adi_callback.h> 23 #include <rtos_map/adi_rtos_map.h> 24 #include <drivers/general/adi_drivers_general.h> 40 #pragma diag_suppress=Pm011,Pm140 46 #define CCD_ALIGN (0x400) 47 #define CCD_SIZE (32u) 58 typedef struct _DMA_CHANNEL {
59 ADI_CALLBACK pfCallback;
61 } DMA_CHANNEL_CALLBACK_INFO;
74 DMA_CHANNEL_CALLBACK_INFO CallbackInfo[NUM_DMA_CHANNELSn];
75 uint32_t ChannelsInUse;
86 ADI_ALIGNED_PRAGMA(CCD_ALIGN)
87 static ADI_DCC_TypeDef gChannelControlDataArray[CCD_SIZE * 2u] ADI_ALIGNED_ATTRIBUTE(CCD_ALIGN)
89 #ifdef ADI_DMA_DESCRIPTORS_IN_VOLATILE_MEMORY 102 ADI_DCC_TypeDef*
const pAlternateCCD = &gChannelControlDataArray[CCD_SIZE];
109 static ADI_DMA_DEV_DATA DMA_DevData = {
112 {{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
113 {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
114 {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
115 {0,0}, {0,0}, {0,0}},
120 static ADI_DMA_DEV_DATA*
const pDMA_DevData = &DMA_DevData;
127 void DMA_Err_Int_Handler(
void);
157 ADI_INT_STATUS_ALLOC();
158 ADI_ENTER_CRITICAL_REGION();
160 if(
false == pDMA_DevData->Initialized )
162 pDMA_DevData->Initialized =
true;
165 pADI_DMA0->CFG |= BITM_DMA_CFG_MEN;
168 pADI_DMA0->PDBPTR = (uint32_t)pPrimaryCCD;
171 NVIC_EnableIRQ(DMA_CHAN_ERR_IRQn);
174 const uint32_t w1r_value = (uint32_t) ((1 << NUM_DMA_CHANNELSn) - 1);
175 pADI_DMA0->RMSK_SET = w1r_value;
176 pADI_DMA0->EN_CLR = w1r_value;
177 pADI_DMA0->ALT_CLR = w1r_value;
178 pADI_DMA0->PRI_CLR = w1r_value;
179 pADI_DMA0->ERRCHNL_CLR = w1r_value;
180 pADI_DMA0->ERR_CLR = w1r_value;
181 pADI_DMA0->INVALIDDESC_CLR = w1r_value;
184 ADI_EXIT_CRITICAL_REGION();
195 pDMA_DevData->Initialized =
false;
209 pADI_DMA0->CFG = BITM_DMA_CFG_MEN;
233 DMA_CHANn_TypeDef
const eChannelID,
234 ADI_CALLBACK
const pfCallback,
242 if (
false == pDMA_DevData->Initialized) {
245 const size_t numChannelId =
sizeof(pDMA_DevData->CallbackInfo) /
sizeof(DMA_CHANNEL_CALLBACK_INFO);
246 if (numChannelId <= eChannelID)
255 DMA_CHANNEL_CALLBACK_INFO * pChannel = &pDMA_DevData->CallbackInfo[eChannelID];
258 pChannel->pfCallback = pfCallback;
259 pChannel->pCBParam = pCBParam;
261 const uint32_t nChannelBit = (1u << eChannelID);
262 if (NULL != pfCallback) {
263 pDMA_DevData->ChannelsInUse |= nChannelBit;
265 pDMA_DevData->ChannelsInUse &= (~nChannelBit);
274 #if defined(__ICCARM__) 277 #define ADI_CLZ(X) __CLZ(X) 279 #elif defined(__GNUC__) 282 #define ADI_CLZ(X) __builtin_clz(X) 284 #elif defined(__CC_ARM) 287 #define ADI_CLZ(X) __clz(X) 291 #error "Macro ADI_CLZ undefined!!!" 305 void DMA_Err_Int_Handler(
void)
309 const uint32_t nErrClr = pADI_DMA0->ERR_CLR;
310 const uint32_t nErrChnClr = pADI_DMA0->ERRCHNL_CLR;
311 const uint32_t nInvdDescClr = pADI_DMA0->INVALIDDESC_CLR;
314 uint32_t functionsToBeCalled = pDMA_DevData->ChannelsInUse & (nErrChnClr | nInvdDescClr);
316 if (functionsToBeCalled > 0u)
318 const uint32_t numBits =
sizeof(uint32_t) << 3;
322 for (nlz = (uint32_t) ADI_CLZ(functionsToBeCalled); nlz < numBits; nlz = (uint32_t) ADI_CLZ(functionsToBeCalled))
324 const uint32_t bitSet = numBits - nlz - 1u;
325 const uint32_t selected_bit = ((uint32_t)1u << bitSet);
326 DMA_CHANNEL_CALLBACK_INFO* pChannel = &pDMA_DevData->CallbackInfo[bitSet];
329 if (NULL != pChannel->pfCallback)
332 uint32_t nEvent = ((nErrChnClr & selected_bit) != 0u)
337 pChannel->pfCallback (pChannel->pCBParam, nEvent, NULL );
340 functionsToBeCalled &= ~selected_bit;
345 pADI_DMA0->ERRCHNL_CLR = nErrChnClr;
346 pADI_DMA0->INVALIDDESC_CLR = nInvdDescClr;
347 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_Enable(const bool enable)
Enable/Disable the DMA.
void adi_dma_ReInit(void)
Force a DMA re-initialization.
void adi_dma_Init(void)
Initialize the DMA peripheral.