Choco OS  V.0.16.9.0
Join to the chocolate world
oc_dma_lld.c
1 
28 #include <oc_dma_lld.h>
29 #include <oc_machine.h>
30 #include <oc_bits.h>
31 #include <oc_gpio_mslld.h>
32 #include <oc_machine_defs.h>
33 #include <oc_clock_lld.h>
34 #include <oc_dma_lld.h>
35 #include <oc_array.h>
36 #include <oc_mem_lld.h>
37 #include <oc_math.h>
38 
44 #define _________________________________________MACROS_SECTION_____________________________________________________________________________
45 
46 #define ControlTableEntry(ChannelIndex) ((ControlTableEntry_t*)ControlTable)[ChannelIndex]
47 #define AlternateControlTableEntry(ChannelIndex) ((ControlTableEntry_t*)ControlTable)[oC_DMA_LLD_ChannelIndex_NumberOfElements + ChannelIndex]
48 
49 #define DMACFG(Channel) oC_Machine_Register(Channel,DMACFG)
50 #define DMACHMAP0(Channel) oC_Machine_Register(Channel,DMACHMAP0)
51 #define DMACHMAP1(Channel) oC_Machine_Register(Channel,DMACHMAP1)
52 #define DMACHMAP2(Channel) oC_Machine_Register(Channel,DMACHMAP2)
53 #define DMACHMAP3(Channel) oC_Machine_Register(Channel,DMACHMAP3)
54 
55 #define DMASWREQ(Channel) oC_Machine_Register(Channel,DMASWREQ)
56 #define DMAENACLR(Channel) oC_Machine_Register(Channel,DMAENACLR)
57 #define DMAENASET(Channel) oC_Machine_Register(Channel,DMAENASET)
58 #define DMAPRIOSET(Channel) oC_Machine_Register(Channel,DMAPRIOSET)
59 #define DMAPRIOCLR(Channel) oC_Machine_Register(Channel,DMAPRIOCLR)
60 #define DMAALTCLR(Channel) oC_Machine_Register(Channel,DMAALTCLR)
61 #define DMAUSEBURSTCLR(Channel) oC_Machine_Register(Channel,DMAUSEBURSTCLR)
62 #define DMAREQMASKCLR(Channel) oC_Machine_Register(Channel,DMAREQMASKCLR)
63 #define DMACHIS(Channel) oC_Machine_Register(Channel,DMACHIS)
64 
65 
66 
67 
68 #define IsEventHandlerCorrect(Pointer) (oC_MEM_LLD_IsFlashAddress(Pointer) || oC_MEM_LLD_IsRamAddress(Pointer) || (Pointer == NULL) )
69 
70 #undef _________________________________________MACROS_SECTION_____________________________________________________________________________
71 
72 
78 #define _________________________________________LOCAL_TYPES_SECTION________________________________________________________________________
79 
80 //==========================================================================================================================================
84 //==========================================================================================================================================
85 typedef enum
86 {
87  TransferMode_Stop = 0x0 ,
88  TransferMode_Basic = 0x1 ,
89  TransferMode_AutoRequest = 0x2 ,
90  TransferMode_PingPong = 0x3 ,
91  TransferMode_MemoryScatterGather = 0x4 ,
92  TransferMode_AlternateMemoryScatterGather = 0x5 ,
93  TransferMode_PeripheralScatterGather = 0x6 ,
94  TransferMode_AlternatePeripheralScatterGather = 0x7
95 } TransferMode_t;
96 
97 //==========================================================================================================================================
101 //==========================================================================================================================================
102 typedef enum
103 {
104  DataSize_Byte = 0 ,
105  DataSize_HalfWord = 1 ,
106  DataSize_Word = 2
107 } DataSize_t;
108 
109 //==========================================================================================================================================
113 //==========================================================================================================================================
114 typedef enum
115 {
116  IncrementSize_Byte = 0 ,
117  IncrementSize_HalfWord = 1 ,
118  IncrementSize_Word = 2 ,
119  IncrementSize_NoIcrement = 3
120 } IncrementSize_t;
121 
122 //==========================================================================================================================================
126 //==========================================================================================================================================
127 typedef enum
128 {
129  ArbitrationSize_1Transfer = 0x0 ,
130  ArbitrationSize_2Transfers = 0x1 ,
131  ArbitrationSize_4Transfers = 0x2 ,
132  ArbitrationSize_8Transfers = 0x3 ,
133  ArbitrationSize_16Transfers = 0x4 ,
134  ArbitrationSize_32Transfers = 0x5 ,
135  ArbitrationSize_64Transfers = 0x6 ,
136  ArbitrationSize_128Transfers = 0x7 ,
137  ArbitrationSize_256Transfers = 0x8 ,
138  ArbitrationSize_512Transfers = 0x9 ,
139  ArbitrationSize_1024Transfers = 0xA ,
140 } ArbitrationSize_t;
141 
142 //==========================================================================================================================================
146 //==========================================================================================================================================
147 typedef enum
148 {
149  NextUseBurst_DontUse ,
150  NextUseBurst_Use
151 } NextUseBurst_t;
152 
153 //==========================================================================================================================================
159 //==========================================================================================================================================
160 typedef union
161 {
162  struct
163  {
164  oC_UInt_t XFERMODE:3;
165  oC_UInt_t NXTUSEBURST:1;
166  oC_UInt_t XFERSIZE:10;
167  oC_UInt_t ARBSIZE:4;
168  oC_UInt_t __reserved_18_23:6;
169  oC_UInt_t SRCSIZE:2;
170  oC_UInt_t SRCINC:2;
171  oC_UInt_t DSTSIZE:2;
172  oC_UInt_t DSTINC:2;
173  };
174  oC_UInt_t Data;
175 } DMACHCTL_t;
176 
177 typedef struct
178 {
179  void * SourceEndPointer;
180  void * DestinationEndPointer;
181  DMACHCTL_t ControlWord;
182  oC_UInt_t Unused;
184 
185 #undef _________________________________________LOCAL_TYPES_SECTION________________________________________________________________________
186 
192 #define _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________
193 
194 static void ConfigureControlWord(
195  ControlTableEntry_t * Entry ,
196  TransferMode_t TransferMode ,
197  IncrementSize_t DestinationIncrement ,
198  DataSize_t DestinationSize ,
199  IncrementSize_t SourceIncrement ,
200  DataSize_t SourceSize ,
201  ArbitrationSize_t ArbitrationSize ,
202  oC_uint16_t TransferSize ,
203  NextUseBurst_t NextUseBurst
204  );
205 
206 static inline bool IsNumberOfTransfersCorrect( oC_UInt_t NumberOfTransfers );
207 static oC_Machine_DmaChannelAssignment_t GetSoftwareChannelAssignment( oC_DMA_Channel_t DmaChannel );
208 static oC_Machine_DmaChannelAssignment_t GetPeripheralChannelAssignment( oC_DMA_Channel_t DmaChannel , oC_Channel_t Channel , oC_Machine_DmaSignalType_t SignalType );
209 
210 #undef _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________
211 
212 
218 #define _________________________________________CONSTANT_SECTION___________________________________________________________________________
219 
220 
221 #undef _________________________________________CONSTANT_SECTION___________________________________________________________________________
222 
223 
229 #define _________________________________________LOCAL_VARIABLES_SECTION___________________________________________________________________
230 
231 static bool ModuleEnabledFlag = false;
232 static bool ChannelUsedArray[oC_ModuleChannel_NumberOfElements(DMA)];
233 static oC_DMA_LLD_EventHandler_t EventHandlersArray[oC_ModuleChannel_NumberOfElements(DMA)];
234 static oC_UInt_t ControlTable[1024] __attribute__ ((aligned(1024)));
235 
236 #undef _________________________________________LOCAL_VARIABLES_SECTION___________________________________________________________________
237 
243 #define _________________________________________INTERFACE_SECTION__________________________________________________________________________
244 
245 //==========================================================================================================================================
250 //==========================================================================================================================================
251 oC_ErrorCode_t oC_DMA_LLD_TurnOnDriver( void )
252 {
253  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
254 
255  if(
256  oC_AssignErrorCodeIfFalse(&errorCode , !ModuleEnabledFlag , oC_ErrorCode_ModuleIsTurnedOn ) &&
257  oC_AssignErrorCodeIfFalse(&errorCode , oC_Channel_EnableInterrupt( oC_DMA_Channel_uDMA0 , Software), oC_ErrorCode_CannotEnableInterrupt)
258  )
259  {
260  oC_DMA_LLD_ForeachChannel(Channel)
261  {
262  oC_DMA_LLD_RestoreDefaultStateOnChannel(Channel);
263  }
264 
265  ModuleEnabledFlag = true;
266  errorCode = oC_ErrorCode_None;
267  }
268 
269  return errorCode;
270 }
271 
272 //==========================================================================================================================================
277 //==========================================================================================================================================
278 oC_ErrorCode_t oC_DMA_LLD_TurnOffDriver( void )
279 {
280  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
281 
282  if(
283  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet )
284  )
285  {
286  ModuleEnabledFlag = false;
287 
288  /* Mark each channel as used to prevent some additional problems */
289  oC_DMA_LLD_ForeachChannel(Channel)
290  {
291  oC_ChannelIndex_t channelIndex = oC_Channel_ToIndex(DMA,Channel);
292  ChannelUsedArray[channelIndex] = true;
293  }
294 
295  /* Turn off the uDMA0, because all DMA channels has only one register map */
296  DMACFG(oC_DMA_Channel_uDMA0)->MASTEN = 0;
297  oC_Machine_SetPowerStateForChannel(oC_DMA_Channel_uDMA0, oC_Power_Off);
298  oC_Channel_DisableInterrupt( oC_DMA_Channel_uDMA0 , Software );
299 
300  errorCode = oC_ErrorCode_None;
301  }
302 
303  return errorCode;
304 }
305 
306 //==========================================================================================================================================
311 //==========================================================================================================================================
312 bool oC_DMA_LLD_IsChannelAvailable( oC_DMA_Channel_t Channel )
313 {
314  return ChannelUsedArray[oC_Channel_ToIndex(DMA,Channel)] == false;
315 }
316 
317 //==========================================================================================================================================
322 //==========================================================================================================================================
323 void oC_DMA_LLD_RestoreDefaultStateOnChannel( oC_DMA_Channel_t Channel )
324 {
325  if(ModuleEnabledFlag && oC_Channel_IsCorrect(DMA,Channel))
326  {
327  oC_ChannelIndex_t channelIndex = oC_Channel_ToIndex(DMA,Channel);
328 
329  ChannelUsedArray[oC_Channel_ToIndex(DMA,Channel)] = false;
330  EventHandlersArray[oC_Channel_ToIndex(DMA,Channel)] = NULL;
331 
332  ControlTableEntry(channelIndex).ControlWord.Data = 0;
333 
334  /* Start the transfer */
335  oC_Bits_SetBitU32( (uint32_t*) &DMAENACLR(Channel)->Value, channelIndex );
336  oC_Bits_SetBitU32( (uint32_t*) &DMASWREQ(Channel)->Value, channelIndex );
337 
338  }
339 }
340 
341 //==========================================================================================================================================
346 //==========================================================================================================================================
347 bool oC_DMA_LLD_IsChannelSupportedOnDmaChannel( oC_DMA_Channel_t DmaChannel , oC_Channel_t Channel , oC_Machine_DmaSignalType_t SignalType )
348 {
349  bool registerMapSupported = false;
350 
351  oC_ARRAY_FOREACH_IN_ARRAY(oC_DmaChannelAssignments,DmaChannelAssignment)
352  {
353  if(
354  (oC_Machine_DmaChannelAssignment_GetDmaChannel( *DmaChannelAssignment) == DmaChannel ) &&
355  (oC_Machine_DmaChannelAssignment_GetChannel( *DmaChannelAssignment) == Channel ) &&
356  (oC_Machine_DmaChannelAssignment_GetDmaSignalType( *DmaChannelAssignment) == SignalType )
357  )
358  {
359  registerMapSupported = true;
360  oC_ARRAY_FOREACH_BREAK(DmaChannelAssignmentsArray);
361  }
362  }
363 
364  return registerMapSupported;
365 }
366 
367 //==========================================================================================================================================
372 //==========================================================================================================================================
373 bool oC_DMA_LLD_IsSoftwareTradeSupportedOnDmaChannel( oC_DMA_Channel_t DmaChannel )
374 {
375  bool softwareTradeSupported = false;
376 
377  oC_ARRAY_FOREACH_IN_ARRAY(oC_DmaChannelAssignments,DmaChannelAssignment)
378  {
379  if(
380  (oC_Machine_DmaChannelAssignment_GetDmaChannel( *DmaChannelAssignment) == DmaChannel ) &&
381  (oC_Machine_DmaChannelAssignment_GetChannel( *DmaChannelAssignment) == oC_Channel_Software )
382  )
383  {
384  softwareTradeSupported = true;
385  oC_ARRAY_FOREACH_BREAK(DmaChannelAssignmentsArray);
386  }
387  }
388 
389  return softwareTradeSupported;
390 }
391 
392 //==========================================================================================================================================
397 //==========================================================================================================================================
398 bool oC_DMA_LLD_DoesDmaHasAccessToAddress( oC_DMA_Channel_t Channel , const void * Address )
399 {
400  return oC_MEM_LLD_IsRamAddress(Address);
401 }
402 
403 //==========================================================================================================================================
408 //==========================================================================================================================================
409 oC_ErrorCode_t oC_DMA_LLD_ConfigureSoftwareTrade( oC_DMA_Channel_t Channel , const oC_DMA_LLD_SoftwareTradeConfig_t * Config )
410 {
411  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
412  oC_Machine_DmaChannelAssignment_t dmaChannelAssignment = GetSoftwareChannelAssignment(Channel);
413  oC_ChannelIndex_t channelIndex = oC_Channel_ToIndex(DMA,Channel);
414 
415  if(
416  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet) &&
417  oC_AssignErrorCodeIfFalse(&errorCode , oC_Channel_IsCorrect(DMA,Channel), oC_ErrorCode_WrongChannel ) &&
418  oC_AssignErrorCodeIfFalse(&errorCode , ChannelUsedArray[channelIndex] == false, oC_ErrorCode_ChannelIsUsed ) &&
419  oC_AssignErrorCodeIfFalse(&errorCode , dmaChannelAssignment != 0, oC_ErrorCode_DMASoftwareTransferNotPossibleOnThisChannel) &&
420  oC_AssignErrorCodeIfFalse(&errorCode , oC_MEM_LLD_IsRamAddress(Config) || oC_MEM_LLD_IsFlashAddress(Config) , oC_ErrorCode_WrongAddress ) &&
421  oC_AssignErrorCodeIfFalse(&errorCode , IsEventHandlerCorrect(Config->TransferCompleteEventHandler) , oC_ErrorCode_WrongEventHandlerAddress ) &&
422  oC_AssignErrorCodeIfFalse(&errorCode , oC_DMA_LLD_DoesDmaHasAccessToAddress(Channel,Config->Source) , oC_ErrorCode_DMAAddressNotHandledByDma ) &&
423  oC_AssignErrorCodeIfFalse(&errorCode , oC_DMA_LLD_DoesDmaHasAccessToAddress(Channel,Config->Destination) , oC_ErrorCode_DMAAddressNotHandledByDma ) &&
424  oC_AssignErrorCodeIfFalse(&errorCode , Config->ElementSize <= oC_DMA_LLD_ElementSize_Word , oC_ErrorCode_DMAElementSizeNotCorrect) &&
425  oC_AssignErrorCodeIfFalse(&errorCode , IsNumberOfTransfersCorrect(Config->BufferSize/(1<<Config->ElementSize)), oC_ErrorCode_SizeNotCorrect) &&
426  oC_AssignErrorCodeIfFalse(&errorCode , oC_DMA_LLD_IsSoftwareTradeSupportedOnDmaChannel(Channel) , oC_ErrorCode_DMASoftwareTransferNotPossibleOnThisChannel) &&
427  oC_AssignErrorCodeIfFalse(&errorCode , oC_Machine_SetPowerStateForChannel(Channel,oC_Power_On) , oC_ErrorCode_CannotEnableChannel )
428  )
429  {
430  oC_UInt_t numberOfTransfers = Config->BufferSize/(1<<Config->ElementSize);
431  IncrementSize_t incrementSize = (numberOfTransfers > 1) ? Config->ElementSize : IncrementSize_NoIcrement;
432 
433  ChannelUsedArray[channelIndex] = true;
434 
435  DMACFG(Channel)->MASTEN = 1;
436  oC_Machine_WriteRegister( Channel , DMACTLBASE,(uint32_t)ControlTable);
437 
438  if(Config->Priority == oC_DMA_LLD_Priority_High)
439  {
440  oC_Bits_SetBitU32( (uint32_t*) &DMAPRIOSET(Channel)->Value, channelIndex );
441  }
442  else
443  {
444  oC_Bits_SetBitU32( (uint32_t*) &DMAPRIOCLR(Channel)->Value, channelIndex );
445  }
446 
447  oC_Bits_SetBitU32( (uint32_t*) &DMAALTCLR(Channel)->Value, channelIndex );
448  oC_Bits_SetBitU32( (uint32_t*) &DMAUSEBURSTCLR(Channel)->Value, channelIndex );
449  oC_Bits_SetBitU32( (uint32_t*) &DMAREQMASKCLR(Channel)->Value, channelIndex );
450 
451  ControlTableEntry(channelIndex).SourceEndPointer = (void*)((oC_UInt_t)Config->Source + Config->BufferSize - (1<<Config->ElementSize));
452  ControlTableEntry(channelIndex).DestinationEndPointer = (void*)((oC_UInt_t)Config->Destination + Config->BufferSize - (1<<Config->ElementSize));
453 
454  ConfigureControlWord(&ControlTableEntry(channelIndex),
455  TransferMode_AutoRequest ,
456  incrementSize,
457  Config->ElementSize ,
458  incrementSize ,
459  Config->ElementSize ,
460  ArbitrationSize_1Transfer ,
461  numberOfTransfers ,
462  NextUseBurst_DontUse
463  );
464 
465  EventHandlersArray[channelIndex] = Config->TransferCompleteEventHandler;
466 
467  uint32_t * DMACHMAP;
468 
469  if(channelIndex < 8)
470  {
471  DMACHMAP = (uint32_t*)&DMACHMAP0(Channel)->Value;
472  }
473  else if(channelIndex < 16)
474  {
475  DMACHMAP = (uint32_t*)&DMACHMAP1(Channel)->Value;
476  }
477  else if(channelIndex < 24)
478  {
479  DMACHMAP = (uint32_t*)&DMACHMAP2(Channel)->Value;
480  }
481  else
482  {
483  DMACHMAP = (uint32_t*)&DMACHMAP3(Channel)->Value;
484  }
485 
487  DMACHMAP ,
489  channelIndex * 4 ,
490  (channelIndex+1) * 4 - 1);
491 
492  /* Start the transfer */
493  oC_Bits_SetBitU32( (uint32_t*) &DMAENASET(Channel)->Value, channelIndex );
494  oC_Bits_ClearBitU32( (uint32_t*) &DMASWREQ(Channel)->Value, channelIndex );
495 
496  errorCode = oC_ErrorCode_None;
497  }
498 
499  return errorCode;
500 }
501 
502 //==========================================================================================================================================
507 //==========================================================================================================================================
508 oC_ErrorCode_t oC_DMA_LLD_ConfigurePeripheralTrade( oC_DMA_Channel_t Channel , const oC_DMA_LLD_PeripheralTradeConfig_t * Config )
509 {
510  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
511  oC_ChannelIndex_t channelIndex = oC_Channel_ToIndex(DMA,Channel);
512  oC_Machine_DmaChannelAssignment_t dmaChannelAssignment = GetPeripheralChannelAssignment(Channel , Config->PeripheralChannel , Config->SignalType);
513 
514  if(
515  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet) &&
516  oC_AssignErrorCodeIfFalse(&errorCode , oC_Channel_IsCorrect(DMA,Channel) , oC_ErrorCode_WrongChannel ) &&
517  oC_AssignErrorCodeIfFalse(&errorCode , ChannelUsedArray[channelIndex] == false, oC_ErrorCode_ChannelIsUsed ) &&
518  oC_AssignErrorCodeIfFalse(&errorCode , oC_MEM_LLD_IsRamAddress(Config) || oC_MEM_LLD_IsFlashAddress(Config) , oC_ErrorCode_WrongAddress ) &&
519  oC_AssignErrorCodeIfFalse(&errorCode , dmaChannelAssignment != 0, oC_ErrorCode_DMAPeripheralTransferNotPossibleOnThisChannel) &&
520  oC_AssignErrorCodeIfFalse(&errorCode , IsEventHandlerCorrect(Config->TransferCompleteEventHandler) , oC_ErrorCode_WrongEventHandlerAddress ) &&
521  oC_AssignErrorCodeIfFalse(&errorCode , oC_DMA_LLD_DoesDmaHasAccessToAddress(Channel,Config->Buffer) , oC_ErrorCode_DMAAddressNotHandledByDma ) &&
522  oC_AssignErrorCodeIfFalse(&errorCode , Config->ElementSize <= oC_DMA_LLD_ElementSize_Word , oC_ErrorCode_DMAElementSizeNotCorrect) &&
523  oC_AssignErrorCodeIfFalse(&errorCode , Config->TransmitDirection <= oC_DMA_LLD_Direction_Receive , oC_ErrorCode_DMATransmitDirectionNotCorrect) &&
524  oC_AssignErrorCodeIfFalse(&errorCode , IsNumberOfTransfersCorrect(Config->BufferSize/(1<<Config->ElementSize)), oC_ErrorCode_DMABufferSizeMustBePowerOf2) &&
525  oC_AssignErrorCodeIfFalse(&errorCode , oC_DMA_LLD_IsSoftwareTradeSupportedOnDmaChannel(Channel) , oC_ErrorCode_DMASoftwareTransferNotPossibleOnThisChannel) &&
526  oC_AssignErrorCodeIfFalse(&errorCode , oC_Machine_SetPowerStateForChannel(Channel,oC_Power_On) , oC_ErrorCode_CannotEnableChannel )
527  )
528  {
529  oC_UInt_t numberOfTransfers = Config->BufferSize/(1<<Config->ElementSize);
530  IncrementSize_t sourceIncrementSize = (numberOfTransfers > 1) ? Config->ElementSize : IncrementSize_NoIcrement;
531  IncrementSize_t destinationIncrementSize= (numberOfTransfers > 1) ? Config->ElementSize : IncrementSize_NoIcrement;
532 
533  ChannelUsedArray[channelIndex] = true;
534 
535  DMACFG(Channel)->MASTEN = 1;
536  oC_Machine_WriteRegister( Channel , DMACTLBASE,(uint32_t)ControlTable);
537 
538  if(Config->Priority == oC_DMA_LLD_Priority_High)
539  {
540  oC_Bits_SetBitU32( (uint32_t*) &DMAPRIOSET(Channel)->Value, channelIndex );
541  }
542  else
543  {
544  oC_Bits_SetBitU32( (uint32_t*) &DMAPRIOCLR(Channel)->Value, channelIndex );
545  }
546 
547  oC_Bits_SetBitU32( (uint32_t*) &DMAALTCLR(Channel)->Value, channelIndex );
548  oC_Bits_SetBitU32( (uint32_t*) &DMAUSEBURSTCLR(Channel)->Value, channelIndex );
549  oC_Bits_SetBitU32( (uint32_t*) &DMAREQMASKCLR(Channel)->Value, channelIndex );
550 
551  if(Config->TransmitDirection == oC_DMA_LLD_Direction_Transmit)
552  {
553  ControlTableEntry(channelIndex).SourceEndPointer = (void*)((oC_UInt_t)Config->Buffer + Config->BufferSize - (1<<Config->ElementSize));
554  ControlTableEntry(channelIndex).DestinationEndPointer = Config->PeripheralData;
555  destinationIncrementSize = IncrementSize_NoIcrement;
556  }
557  else
558  {
559  ControlTableEntry(channelIndex).SourceEndPointer = Config->PeripheralData;
560  ControlTableEntry(channelIndex).DestinationEndPointer = (void*)((oC_UInt_t)Config->Buffer + Config->BufferSize - (1<<Config->ElementSize));
561  sourceIncrementSize = IncrementSize_NoIcrement;
562  }
563 
564 
565  ConfigureControlWord(&ControlTableEntry(channelIndex),
566  TransferMode_Basic ,
567  destinationIncrementSize,
568  Config->ElementSize ,
569  sourceIncrementSize ,
570  Config->ElementSize ,
571  ArbitrationSize_1Transfer ,
572  numberOfTransfers ,
573  NextUseBurst_DontUse
574  );
575 
576  EventHandlersArray[channelIndex] = Config->TransferCompleteEventHandler;
577 
578  uint32_t * DMACHMAP;
579 
580  if(channelIndex < 8)
581  {
582  DMACHMAP = (uint32_t*)&DMACHMAP0(Channel)->Value;
583  }
584  else if(channelIndex < 16)
585  {
586  DMACHMAP = (uint32_t*)&DMACHMAP1(Channel)->Value;
587  }
588  else if(channelIndex < 24)
589  {
590  DMACHMAP = (uint32_t*)&DMACHMAP2(Channel)->Value;
591  }
592  else
593  {
594  DMACHMAP = (uint32_t*)&DMACHMAP3(Channel)->Value;
595  }
596 
598  DMACHMAP ,
600  channelIndex * 4 ,
601  (channelIndex+1) * 4 - 1);
602 
603  /* Start the transfer */
604  oC_Bits_SetBitU32( (uint32_t*) &DMAENASET(Channel)->Value, channelIndex );
605  oC_Bits_ClearBitU32( (uint32_t*) &DMASWREQ(Channel)->Value, channelIndex );
606 
607  errorCode = oC_ErrorCode_None;
608  }
609 
610  return errorCode;
611 }
612 
613 //==========================================================================================================================================
618 //==========================================================================================================================================
619 bool oC_DMA_LLD_IsTransferCompleteOnChannel( oC_DMA_Channel_t Channel )
620 {
621  oC_ChannelIndex_t channelIndex = oC_Channel_ToIndex(DMA,Channel);
622 
623  return ModuleEnabledFlag && oC_Channel_IsCorrect(DMA,Channel) && (ChannelUsedArray[channelIndex] == false);
624 }
625 
626 //==========================================================================================================================================
631 //==========================================================================================================================================
632 oC_ErrorCode_t oC_DMA_LLD_ReadChannelUsedReference( oC_DMA_Channel_t Channel , bool ** outChannelUsedFlag )
633 {
634  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
635 
636  if(
637  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet) &&
638  oC_AssignErrorCodeIfFalse(&errorCode , oC_Channel_IsCorrect(DMA,Channel), oC_ErrorCode_WrongChannel ) &&
639  oC_AssignErrorCodeIfFalse(&errorCode , oC_MEM_LLD_IsRamAddress(outChannelUsedFlag), oC_ErrorCode_OutputAddressNotInRAM )
640  )
641  {
642  oC_ChannelIndex_t channelIndex = oC_Channel_ToIndex(DMA,Channel);
643 
644  *outChannelUsedFlag = &ChannelUsedArray[channelIndex];
645 
646  errorCode = oC_ErrorCode_None;
647  }
648 
649  return errorCode;
650 }
651 
652 //==========================================================================================================================================
657 //==========================================================================================================================================
658 oC_ErrorCode_t oC_DMA_LLD_FindFreeDmaChannelForPeripheralTrade( oC_DMA_Channel_t * outDmaChannel , oC_Channel_t Channel , oC_Machine_DmaSignalType_t SignalType )
659 {
660  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
661 
662  if(
663  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag , oC_ErrorCode_ModuleNotStartedYet)
664  )
665  {
666  errorCode = oC_ErrorCode_NoChannelAvailable;
667 
668  oC_ARRAY_FOREACH_IN_ARRAY(oC_DmaChannelAssignments,DmaChannelAssignment)
669  {
670  if(
671  (oC_Machine_DmaChannelAssignment_GetChannel( *DmaChannelAssignment) == Channel ) &&
672  (oC_Machine_DmaChannelAssignment_GetDmaSignalType( *DmaChannelAssignment) == SignalType )
673  )
674  {
675  *outDmaChannel = oC_Machine_DmaChannelAssignment_GetDmaChannel(*DmaChannelAssignment);
676  errorCode = oC_ErrorCode_None;
677  oC_ARRAY_FOREACH_BREAK(oC_DmaChannelAssignments);
678  }
679  }
680  }
681 
682  return errorCode;
683 }
684 
685 #undef _________________________________________INTERFACE_SECTION__________________________________________________________________________
686 
687 
693 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
694 
695 //==========================================================================================================================================
699 //==========================================================================================================================================
700 static void ConfigureControlWord(
701  ControlTableEntry_t * Entry ,
702  TransferMode_t TransferMode ,
703  IncrementSize_t DestinationIncrement ,
704  DataSize_t DestinationSize ,
705  IncrementSize_t SourceIncrement ,
706  DataSize_t SourceSize ,
707  ArbitrationSize_t ArbitrationSize ,
708  oC_uint16_t TransferSize ,
709  NextUseBurst_t NextUseBurst
710  )
711 {
712  Entry->ControlWord.XFERMODE = TransferMode;
713  Entry->ControlWord.NXTUSEBURST = NextUseBurst;
714  Entry->ControlWord.XFERSIZE = TransferSize - 1;
715  Entry->ControlWord.ARBSIZE = ArbitrationSize;
716  Entry->ControlWord.SRCSIZE = SourceSize;
717  Entry->ControlWord.SRCINC = SourceIncrement;
718  Entry->ControlWord.DSTSIZE = DestinationSize;
719  Entry->ControlWord.DSTINC = DestinationIncrement;
720 }
721 
722 //==========================================================================================================================================
726 //==========================================================================================================================================
727 static inline bool IsNumberOfTransfersCorrect( oC_UInt_t NumberOfTransfers )
728 {
729  return (NumberOfTransfers > 0) && (NumberOfTransfers <= 1024);
730 }
731 
732 //==========================================================================================================================================
736 //==========================================================================================================================================
737 static oC_Machine_DmaChannelAssignment_t GetSoftwareChannelAssignment( oC_DMA_Channel_t DmaChannel )
738 {
739  oC_Machine_DmaChannelAssignment_t channelAssignment = 0;
740 
741  oC_ARRAY_FOREACH_IN_ARRAY(oC_DmaChannelAssignments,DmaChannelAssignment)
742  {
743  if(
744  (oC_Machine_DmaChannelAssignment_GetDmaChannel( *DmaChannelAssignment) == DmaChannel) &&
745  (oC_Machine_DmaChannelAssignment_GetChannel( *DmaChannelAssignment) == oC_Channel_Software )
746  )
747  {
748  channelAssignment = *DmaChannelAssignment;
749  oC_ARRAY_FOREACH_BREAK(DmaChannelAssignmentsArray);
750  }
751  }
752 
753  return channelAssignment;
754 }
755 
756 //==========================================================================================================================================
760 //==========================================================================================================================================
761 static oC_Machine_DmaChannelAssignment_t GetPeripheralChannelAssignment( oC_DMA_Channel_t DmaChannel , oC_Channel_t Channel , oC_Machine_DmaSignalType_t SignalType )
762 {
763  oC_Machine_DmaChannelAssignment_t channelAssignment = 0;
764 
765  oC_ARRAY_FOREACH_IN_ARRAY(oC_DmaChannelAssignments,DmaChannelAssignment)
766  {
767  if(
768  (oC_Machine_DmaChannelAssignment_GetDmaChannel( *DmaChannelAssignment) == DmaChannel) &&
769  (oC_Machine_DmaChannelAssignment_GetChannel( *DmaChannelAssignment) == Channel ) &&
770  (oC_Machine_DmaChannelAssignment_GetDmaSignalType( *DmaChannelAssignment) == SignalType )
771  )
772  {
773  channelAssignment = *DmaChannelAssignment;
774  oC_ARRAY_FOREACH_BREAK(DmaChannelAssignmentsArray);
775  }
776  }
777 
778  return channelAssignment;
779 }
780 
781 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
782 
788 #define _________________________________________LOCAL_INTERRUPTS_SECTION___________________________________________________________________
789 
790 //==========================================================================================================================================
794 //==========================================================================================================================================
795 
796 //TODO: error if use oC_Channel_InterruptHandler
797 oC_InterruptHandler(uDMA0 , Software)
798 {
799  uint32_t intStatus = oC_Machine_ReadRegister(oC_DMA_Channel_uDMA0 , DMACHIS);
800 
801  while(intStatus)
802  {
803  oC_ChannelIndex_t channelIndex = oC_Bits_GetBitNumberU32(intStatus);
804  oC_DMA_Channel_t channel = oC_Channel_ToIndex(DMA,channelIndex);
805  oC_Bits_ClearBitU32(&intStatus, channelIndex);
806  oC_Bits_SetBitU32( (uint32_t*) &DMACHIS(oC_DMA_Channel_uDMA0)->Value, channelIndex );
807 
808 
809  if(EventHandlersArray[channelIndex])
810  {
811  EventHandlersArray[channelIndex](channel);
812  }
813  oC_DMA_LLD_RestoreDefaultStateOnChannel(channel);
814  }
815 
816 }
817 
818 #undef _________________________________________LOCAL_INTERRUPTS_SECTION___________________________________________________________________
#define oC_InterruptHandler(BASE_NAME, TYPE_NAME)
Define handler for interrupt.
Something is powered on.
Definition: oc_stdtypes.h:252
oC_Machine_DmaSignalType_t
type with DMA signal types
Definition: oc_machine.h:429
Basic math operations.
static bool ModuleEnabledFlag
Definition: oc_memman.c:211
#define oC_Machine_DmaChannelAssignment_GetChannel(Assignment)
returns channel from oC_Machine_DmaChannelAssignment_t type
Definition: oc_machine.h:358
#define oC_Machine_DmaChannelAssignment_GetDmaSignalType(Assignment)
returns DMA signal type from oC_Machine_DmaChannelAssignment_t type
Definition: oc_machine.h:365
Control word type.
Definition: oc_dma_lld.c:160
static uint32_t oC_Bits_SetValueU32(uint32_t *outVariable, uint32_t Value, uint8_t StartBitNr, uint8_t EndBitNr)
Definition: oc_bits.h:308
#define oC_Machine_ReadRegister(Channel, REGISTER_NAME)
redefinition of oC_Machine_ReadRegisterDirectStaticOffset
Definition: oc_machine.h:221
bool oC_MEM_LLD_IsFlashAddress(const void *Address)
checks if the pointer is in flash section
Definition: oc_mem_lld.c:433
The file with LLD interface for the MEM driver.
#define oC_Machine_WriteRegister(Channel, REGISTER_NAME, Value)
redefinition of oC_Machine_WriteRegisterDirectStaticOffset
Definition: oc_machine.h:200
#define oC_Machine_DmaChannelAssignment_GetDmaChannel(Assignment)
returns DMA channel from oC_Machine_DmaChannelAssignment_t type
Definition: oc_machine.h:351
oC_Machine_DmaChannelAssignment_t
type for storing assignment of DMA channels
Definition: oc_machine.h:448
uint16_t oC_uint16_t
type for 16 bit unsigned integer
Definition: oc_stdtypes.h:48
Something is powered off.
Definition: oc_stdtypes.h:251
The file with LLD interface for the CLOCK driver.
oC_Channel_t
stores machine channel
Definition: oc_channels.h:573
static int8_t oC_Bits_GetBitNumberU32(uint32_t BitMask)
Definition: oc_bits.h:585
#define oC_Channel_IsCorrect(MODULE_NAME, Channel)
checks if channel is correct
Definition: oc_channels.h:283
#define oC_ModuleChannel_NumberOfElements(MODULE_NAME)
Number of elements in module channel.
Definition: oc_channels.h:465
The file with functions for the bits operation.
Definition: oc_dma_lld.c:177
#define oC_Machine_DmaChannelAssignment_GetDmaEncodingValue(Assignment)
returns DMA encoding value from oC_Machine_DmaChannelAssignment_t type
Definition: oc_machine.h:372
Static array definitions.
The file with interface for the machine module.
#define oC_Channel_ToIndex(MODULE_NAME, Channel)
returns index in module according to channel
Definition: oc_channels.h:298
static uint32_t oC_Bits_SetBitU32(uint32_t *outVariable, uint8_t BitIndex)
sets bit in the variable
Definition: oc_bits.h:743
The file with LLD interface for the DMA driver.
static bool oC_Machine_SetPowerStateForChannel(oC_Channel_t Channel, oC_Power_t Power)
configures power state for machine channel
Definition: oc_machine.h:593
bool oC_MEM_LLD_IsRamAddress(const void *Address)
checks if the pointer is in ram section
Definition: oc_mem_lld.c:400
#define NULL
pointer to a zero
Definition: oc_null.h:37
const oC_Machine_DmaChannelAssignment_t oC_DmaChannelAssignments[oC_Machine_DmaChannelAssignmentIndex_NumberOfElements]
array with DMA channel assignments
Definition: oc_machine.h:496
static uint32_t oC_Bits_ClearBitU32(uint32_t *outVariable, uint8_t BitIndex)
clear selected bit
Definition: oc_bits.h:814