hv_drv_Dma.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /**
  2. * @file hv_drv_Dma.c
  3. * @brief wdg driver chip file.
  4. *
  5. * @author HiView SoC Software Team
  6. * @version 1.0.0
  7. * @date 2023-06-05
  8. * @copyright Copyright(c),2023-6, Hiview Software. All rights reserved.
  9. * </table>
  10. */
  11. #include "hv_chip_Config.h"
  12. #include "hv_vos_Comm.h"
  13. #include "hv_comm_DataType.h"
  14. #include "hv_comm_Define.h"
  15. #include "hv_cal_Dma.h"
  16. #include "hv_drv_Dma.h"
  17. #define SIZE_NO_CARE 2048
  18. typedef void (*Hv_Dma_Callback)(void);
  19. static DmaSelf* g_apDmaSelf[DMA_CHANNEL_COUNT] = {NULL};
  20. static Hv_Dma_Callback g_apDmaCallback[DMA_CHANNEL_COUNT] = {NULL};
  21. static DmaLinkedList* g_apLLI[DMA_CHANNEL_COUNT] = {NULL};
  22. static void Hv_Drv_Dma_MemMove_LinkedList(DmaSelf* pstself,DmaLinkedList* pstStemAddr, UINT32 uiSrcAddr, UINT32 uiDstAddr)
  23. {
  24. Hv_Cal_Dma_SetLinkedListAddr(pstself, pstStemAddr);
  25. Hv_Cal_Dma_MemMove(pstself, uiSrcAddr, uiDstAddr, SIZE_NO_CARE);
  26. return;
  27. }
  28. static Status Hv_Dma_CpltCallback(void* arg)
  29. {
  30. DmaSelf* pstSelf = (DmaSelf*)arg;
  31. DmaPortChannel enPortChannelNum = Hv_Cal_Dma_GetPortChannelNum(pstSelf);
  32. if (NULL != g_apLLI[enPortChannelNum])
  33. {
  34. Hv_Vos_Free(g_apLLI[enPortChannelNum]);
  35. g_apLLI[enPortChannelNum] = NULL;
  36. }
  37. Hv_Vos_InvalidAllDCache();
  38. g_apDmaCallback[enPortChannelNum]();
  39. return HV_SUCCESS;
  40. }
  41. /** @brief dma初始化,选择通道和设置回调函数。type类型0:1个src对应1个dst,size可能超过block_ts,函数内部生成linklist.
  42. * @self channelparam no.
  43. * @param Callback callback when move over.
  44. */
  45. void Hv_Drv_Dma_Init(DmaPortChannel enPortChannelNum, void* Callback)
  46. {
  47. DmaInitParam InitParam;
  48. HV_MEMSET(&InitParam,0, sizeof(DmaInitParam));
  49. InitParam.PortChannelNum = enPortChannelNum;
  50. InitParam.Application = DMA_APPLI_MEM;
  51. InitParam.transType = DMA_TYPE_LINKEDLIST;
  52. InitParam.XferCpltCallback = (XferCpltCallbackType)Hv_Dma_CpltCallback;
  53. g_apDmaCallback[enPortChannelNum] = (Hv_Dma_Callback)Callback;
  54. g_apDmaSelf[enPortChannelNum] = Hv_Cal_Dma_ChannelInit(&InitParam);
  55. return;
  56. }
  57. /** @brief dma move。
  58. * @self channelparam no.
  59. * @param SrcAddr src address。
  60. * @param DstAddr dst address。
  61. * @param Size size to move。
  62. */
  63. void Hv_Drv_Dma_MemMove(DmaPortChannel enPortChannelNum, UINT32 uiSrcAddr, UINT32 uiDstAddr, UINT32 uiSize)
  64. {
  65. DmaSelf* pstSelf = g_apDmaSelf[enPortChannelNum];
  66. UINT32 uiBlockSize = DMA_MEM_BLOCK_SIZE;
  67. UINT32 uiTotolListNum = 0;
  68. UINT32 uiLast = 0;
  69. HV_LOG_DEBUG(SYSTEM, "Hv_Drv_Dma_MemMove src %x, dst %x, size %x!\n", uiSrcAddr, uiDstAddr, uiSize);
  70. uiTotolListNum = uiSize / uiBlockSize;
  71. if (uiSize % uiBlockSize)
  72. {
  73. uiTotolListNum++;
  74. }
  75. g_apLLI[enPortChannelNum] = (DmaLinkedList*)Hv_Vos_Malloc(uiTotolListNum * sizeof(DmaLinkedList));
  76. if (g_apLLI[enPortChannelNum] == NULL)
  77. {
  78. HV_LOG_ERROR(SYSTEM, "Hv_Drv_Dma_MemMove Malloc Fail, size = 0x%x!\n", uiTotolListNum * sizeof(DmaLinkedList));
  79. return;
  80. }
  81. Hv_Cal_Dma_LLIbuild_BothContinous(g_apLLI[enPortChannelNum], uiSrcAddr, uiDstAddr, uiSize, 1);
  82. Hv_Drv_Dma_MemMove_LinkedList(pstSelf, g_apLLI[enPortChannelNum], uiSrcAddr, uiDstAddr);
  83. return;
  84. }
  85. /** @brief dma move with multy src。
  86. * @self channelparam no.
  87. * @param SrcArray src1 address, src1 size, src2 address, src2 size...。
  88. * @param ArraySize src number。
  89. * @param DstAddr dst address。
  90. */
  91. void Hv_Drv_Dma_MemMoveArray(DmaPortChannel enPortChannelNum, UINT32 *puiSrcArray, UINT32 uiArraySize, UINT32 uiDstAddr)
  92. {
  93. DmaSelf* pstSelf = g_apDmaSelf[enPortChannelNum];
  94. UINT32 uiStemAddr = 0x00;
  95. UINT32 uiLoop = 0;
  96. UINT32 uiAarryNum = 0;
  97. UINT32 uiSize = 0;
  98. UINT32 uiBlockSize = DMA_MEM_BLOCK_SIZE;
  99. UINT32 uiTotolListNum = 0;
  100. UINT32 uiIndexListNum = 0;
  101. UINT32 uiLast = 0;
  102. uiAarryNum = uiArraySize;
  103. for (uiLoop = 0; uiLoop < uiAarryNum; uiLoop++)
  104. {
  105. uiSize = *(puiSrcArray + 1 + uiLoop * 2);
  106. uiTotolListNum += uiSize / uiBlockSize;
  107. if (uiSize % uiBlockSize)
  108. {
  109. uiTotolListNum++;
  110. }
  111. }
  112. g_apLLI[enPortChannelNum] = (DmaLinkedList*)Hv_Vos_Malloc(uiTotolListNum * sizeof(DmaLinkedList));
  113. if (g_apLLI[enPortChannelNum] == NULL)
  114. {
  115. return;
  116. }
  117. for (uiLoop = 0; uiLoop < uiAarryNum; uiLoop++)
  118. {
  119. uiStemAddr = (UINT32)(g_apLLI[enPortChannelNum] + uiIndexListNum);
  120. if (uiLoop == (uiAarryNum - 1))
  121. {
  122. uiLast = 1;
  123. }
  124. uiSize = *(puiSrcArray + 1 + uiLoop * 2);
  125. Hv_Cal_Dma_LLIbuild_BothContinous((DmaLinkedList*)uiStemAddr, *(puiSrcArray + uiLoop * 2), uiDstAddr, uiSize, uiLast);
  126. uiIndexListNum += (uiSize / uiBlockSize);
  127. if (uiSize % uiBlockSize)
  128. {
  129. uiIndexListNum++;
  130. }
  131. }
  132. Hv_Drv_Dma_MemMove_LinkedList(pstSelf, g_apLLI[enPortChannelNum], *puiSrcArray, uiDstAddr);
  133. return;
  134. }