pdma.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /**************************************************************************//**
  2. * @file pdma.c
  3. * @version V1.00
  4. * $Revision: 8 $
  5. * $Date: 15/03/16 3:17p $
  6. * @brief NUC472/NUC442 PDMA driver source file
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include "NUC472_442.h"
  12. static uint8_t u32ChSelect[PDMA_CH_MAX];
  13. /** @addtogroup NUC472_442_Device_Driver NUC472/NUC442 Device Driver
  14. @{
  15. */
  16. /** @addtogroup NUC472_442_PDMA_Driver PDMA Driver
  17. @{
  18. */
  19. /** @addtogroup NUC472_442_PDMA_EXPORTED_FUNCTIONS PDMA Exported Functions
  20. @{
  21. */
  22. /**
  23. * @brief PDMA Open
  24. *
  25. * @param[in] u32Mask Channel enable bits.
  26. *
  27. * @return None
  28. *
  29. * @details This function enable the PDMA channels.
  30. */
  31. void PDMA_Open(uint32_t u32Mask)
  32. {
  33. int volatile i;
  34. for (i=0; i<PDMA_CH_MAX; i++) {
  35. PDMA->DSCT[i].CTL = 0;
  36. u32ChSelect[i] = 0x1f;
  37. }
  38. PDMA->CHCTL |= u32Mask;
  39. }
  40. /**
  41. * @brief PDMA Close
  42. *
  43. * @param[in] None
  44. *
  45. * @return None
  46. *
  47. * @details This function disable all PDMA channels.
  48. */
  49. void PDMA_Close(void)
  50. {
  51. PDMA->CHCTL = 0;
  52. }
  53. /**
  54. * @brief Set PDMA Transfer Count
  55. *
  56. * @param[in] u32Ch The selected channel
  57. * @param[in] u32Width Data width. PDMA_WIDTH_8, PDMA_WIDTH_16, or PDMA_WIDTH_32
  58. * @param[in] u32TransCount Transfer count
  59. *
  60. * @return None
  61. *
  62. * @details This function set the selected channel data width and transfer count.
  63. */
  64. void PDMA_SetTransferCnt(uint32_t u32Ch, uint32_t u32Width, uint32_t u32TransCount)
  65. {
  66. PDMA->DSCT[u32Ch].CTL &= ~(PDMA_DSCT_CTL_TXCNT_Msk | PDMA_DSCT_CTL_TXWIDTH_Msk);
  67. PDMA->DSCT[u32Ch].CTL |= (u32Width | ((u32TransCount-1) << PDMA_DSCT_CTL_TXCNT_Pos));
  68. }
  69. /**
  70. * @brief Set PDMA Transfer Address
  71. *
  72. * @param[in] u32Ch The selected channel
  73. * @param[in] u32SrcAddr Source address
  74. * @param[in] u32SrcCtrl Source control attribute. PDMA_SAR_INC or PDMA_SAR_FIX
  75. * @param[in] u32DstAddr destination address
  76. * @param[in] u32DstCtrl destination control attribute. PDMA_DAR_INC or PDMA_DAR_FIX
  77. *
  78. * @return None
  79. *
  80. * @details This function set the selected channel source/destination address and attribute.
  81. */
  82. void PDMA_SetTransferAddr(uint32_t u32Ch, uint32_t u32SrcAddr, uint32_t u32SrcCtrl, uint32_t u32DstAddr, uint32_t u32DstCtrl)
  83. {
  84. PDMA->DSCT[u32Ch].ENDSA = u32SrcAddr;
  85. PDMA->DSCT[u32Ch].ENDDA = u32DstAddr;
  86. PDMA->DSCT[u32Ch].CTL &= ~(PDMA_DSCT_CTL_SAINC_Msk | PDMA_DSCT_CTL_DAINC_Msk);
  87. PDMA->DSCT[u32Ch].CTL |= (u32SrcCtrl | u32DstCtrl);
  88. }
  89. /**
  90. * @brief Set PDMA Transfer Mode
  91. *
  92. * @param[in] u32Ch The selected channel
  93. * @param[in] u32Peripheral The selected peripheral. PDMA_SPI0_TX, PDMA_UART0_TX, PDMA_I2S_TX,...PDMA_MEM
  94. * @param[in] u32ScatterEn Scatter-gather mode enable
  95. * @param[in] u32DescAddr Scatter-gather descriptor address
  96. *
  97. * @return None
  98. *
  99. * @details This function set the selected channel transfer mode. Include peripheral setting.
  100. */
  101. void PDMA_SetTransferMode(uint32_t u32Ch, uint32_t u32Peripheral, uint32_t u32ScatterEn, uint32_t u32DescAddr)
  102. {
  103. u32ChSelect[u32Ch] = u32Peripheral;
  104. switch (u32Ch) {
  105. case 0:
  106. PDMA->REQSEL0_3 = (PDMA->REQSEL0_3 & ~PDMA_REQSEL0_3_REQSRC0_Msk) | u32Peripheral;
  107. break;
  108. case 1:
  109. PDMA->REQSEL0_3 = (PDMA->REQSEL0_3 & ~PDMA_REQSEL0_3_REQSRC1_Msk) | (u32Peripheral << PDMA_REQSEL0_3_REQSRC1_Pos);
  110. break;
  111. case 2:
  112. PDMA->REQSEL0_3 = (PDMA->REQSEL0_3 & ~PDMA_REQSEL0_3_REQSRC2_Msk) | (u32Peripheral << PDMA_REQSEL0_3_REQSRC2_Pos);
  113. break;
  114. case 3:
  115. PDMA->REQSEL0_3 = (PDMA->REQSEL0_3 & ~PDMA_REQSEL0_3_REQSRC3_Msk) | (u32Peripheral << PDMA_REQSEL0_3_REQSRC3_Pos);
  116. break;
  117. case 4:
  118. PDMA->REQSEL4_7 = (PDMA->REQSEL4_7 & ~PDMA_REQSEL4_7_REQSRC4_Msk) | u32Peripheral;
  119. break;
  120. case 5:
  121. PDMA->REQSEL4_7 = (PDMA->REQSEL4_7 & ~PDMA_REQSEL4_7_REQSRC5_Msk) | (u32Peripheral << PDMA_REQSEL4_7_REQSRC5_Pos);
  122. break;
  123. case 6:
  124. PDMA->REQSEL4_7 = (PDMA->REQSEL4_7 & ~PDMA_REQSEL4_7_REQSRC6_Msk) | (u32Peripheral << PDMA_REQSEL4_7_REQSRC6_Pos);
  125. break;
  126. case 7:
  127. PDMA->REQSEL4_7 = (PDMA->REQSEL4_7 & ~PDMA_REQSEL4_7_REQSRC7_Msk) | (u32Peripheral << PDMA_REQSEL4_7_REQSRC7_Pos);
  128. break;
  129. case 8:
  130. PDMA->REQSEL8_11 = (PDMA->REQSEL8_11 & ~PDMA_REQSEL8_11_REQSRC8_Msk) | u32Peripheral;
  131. break;
  132. case 9:
  133. PDMA->REQSEL8_11 = (PDMA->REQSEL8_11 & ~PDMA_REQSEL8_11_REQSRC9_Msk) | (u32Peripheral << PDMA_REQSEL8_11_REQSRC9_Pos);
  134. break;
  135. case 10:
  136. PDMA->REQSEL8_11 = (PDMA->REQSEL8_11 & ~PDMA_REQSEL8_11_REQSRC10_Msk) | (u32Peripheral << PDMA_REQSEL8_11_REQSRC10_Pos);
  137. break;
  138. case 11:
  139. PDMA->REQSEL8_11 = (PDMA->REQSEL8_11 & ~PDMA_REQSEL8_11_REQSRC11_Msk) | (u32Peripheral << PDMA_REQSEL8_11_REQSRC11_Pos);
  140. break;
  141. case 12:
  142. PDMA->REQSEL12_15 = (PDMA->REQSEL12_15 & ~PDMA_REQSEL12_15_REQSRC12_Msk) | u32Peripheral;
  143. break;
  144. case 13:
  145. PDMA->REQSEL12_15 = (PDMA->REQSEL12_15 & ~PDMA_REQSEL12_15_REQSRC13_Msk) | (u32Peripheral << PDMA_REQSEL12_15_REQSRC13_Pos);
  146. break;
  147. case 14:
  148. PDMA->REQSEL12_15 = (PDMA->REQSEL12_15 & ~PDMA_REQSEL12_15_REQSRC14_Msk) | (u32Peripheral << PDMA_REQSEL12_15_REQSRC14_Pos);
  149. break;
  150. case 15:
  151. PDMA->REQSEL12_15 = (PDMA->REQSEL12_15 & ~PDMA_REQSEL12_15_REQSRC15_Msk) | (u32Peripheral << PDMA_REQSEL12_15_REQSRC15_Pos);
  152. break;
  153. default:
  154. ;
  155. }
  156. if (u32ScatterEn) {
  157. PDMA->DSCT[u32Ch].CTL = (PDMA->DSCT[u32Ch].CTL & ~PDMA_DSCT_CTL_OPMODE_Msk) | PDMA_OP_SCATTER;
  158. PDMA->DSCT[u32Ch].NEXT = u32DescAddr - (PDMA->SCATBA);
  159. } else
  160. PDMA->DSCT[u32Ch].CTL = (PDMA->DSCT[u32Ch].CTL & ~PDMA_DSCT_CTL_OPMODE_Msk) | PDMA_OP_BASIC;
  161. }
  162. /**
  163. * @brief Set PDMA Burst Type
  164. *
  165. * @param[in] u32Ch The selected channel
  166. * @param[in] u32BurstType Burst mode or single mode
  167. * @param[in] u32BurstSize Set the size of burst mode
  168. *
  169. * @return None
  170. *
  171. * @details This function set the selected channel burst type and size.
  172. */
  173. void PDMA_SetBurstType(uint32_t u32Ch, uint32_t u32BurstType, uint32_t u32BurstSize)
  174. {
  175. PDMA->DSCT[u32Ch].CTL &= ~(PDMA_DSCT_CTL_TXTYPE_Msk | PDMA_DSCT_CTL_BURSIZE_Msk);
  176. PDMA->DSCT[u32Ch].CTL |= (u32BurstType | u32BurstSize);
  177. }
  178. /**
  179. * @brief Trigger PDMA
  180. *
  181. * @param[in] u32Ch The selected channel
  182. *
  183. * @return None
  184. *
  185. * @details This function trigger the selected channel.
  186. */
  187. void PDMA_Trigger(uint32_t u32Ch)
  188. {
  189. if (u32ChSelect[u32Ch] == PDMA_MEM)
  190. PDMA->SWREQ = (1 << u32Ch);
  191. }
  192. /**
  193. * @brief Enable Interrupt
  194. *
  195. * @param[in] u32Ch The selected channel
  196. * @param[in] u32Mask The Interrupt Type
  197. *
  198. * @return None
  199. *
  200. * @details This function enable the selected channel interrupt.
  201. */
  202. void PDMA_EnableInt(uint32_t u32Ch, uint32_t u32Mask)
  203. {
  204. PDMA->INTEN |= (1 << u32Ch);
  205. }
  206. /**
  207. * @brief Disable Interrupt
  208. *
  209. * @param[in] u32Ch The selected channel
  210. * @param[in] u32Mask The Interrupt Type
  211. *
  212. * @return None
  213. *
  214. * @details This function disable the selected channel interrupt.
  215. */
  216. void PDMA_DisableInt(uint32_t u32Ch, uint32_t u32Mask)
  217. {
  218. PDMA->INTEN &= ~(1 << u32Ch);
  219. }
  220. /*@}*/ /* end of group NUC472_442_PDMA_EXPORTED_FUNCTIONS */
  221. /*@}*/ /* end of group NUC472_442_PDMA_Driver */
  222. /*@}*/ /* end of group NUC472_442_Device_Driver */
  223. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/