cap.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. /**************************************************************************//**
  2. * @file cap.c
  3. * @version V0.10
  4. * $Revision: 18 $
  5. * $Date: 15/10/22 10:02a $
  6. * @brief NUC472/NUC442 CAP driver source file
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. *****************************************************************************/
  11. #include "NUC472_442.h"
  12. /** @addtogroup NUC472_442_Device_Driver NUC472/NUC442 Device Driver
  13. @{
  14. */
  15. /** @addtogroup NUC472_442_CAP_Driver CAP Driver
  16. @{
  17. */
  18. /** @addtogroup NUC472_442_CAP_EXPORTED_FUNCTIONS CAP Exported Functions
  19. @{
  20. */
  21. /**
  22. * @brief Open engine clock and sensor clock
  23. *
  24. * @param[in] u32InFormat The bits corresponding VSP, HSP, PCLK, INFMT, SNRTYPE, OUTFMT, PDORD and PNFMT configurations.
  25. * - VSP should be ether \ref CAP_PAR_VSP_LOW or \ref CAP_PAR_VSP_HIGH
  26. * - HSP should be ether \ref CAP_PAR_HSP_LOW or \ref CAP_PAR_HSP_HIGH
  27. * - PCLK should be ether \ref CAP_PAR_PCLKP_LOW or \ref CAP_PAR_PCLKP_HIGH
  28. * - INFMT should be ether \ref CAP_PAR_INFMT_YUV422 or \ref CAP_PAR_INFMT_RGB565
  29. * - SNRTYPE should be ether \ref CAP_PAR_SENTYPE_CCIR601 or \ref CAP_PAR_SENTYPE_CCIR656
  30. * - OUTFMT should be one of the following setting
  31. * - \ref CAP_PAR_OUTFMT_YUV422
  32. * - \ref CAP_PAR_OUTFMT_ONLY_Y
  33. * - \ref CAP_PAR_OUTFMT_RGB555
  34. * - \ref CAP_PAR_OUTFMT_RGB565
  35. * - PDORD should be one of the following setting
  36. * - \ref CAP_PAR_INDATORD_YUYV
  37. * - \ref CAP_PAR_INDATORD_YVYU
  38. * - \ref CAP_PAR_INDATORD_UYVY
  39. * - \ref CAP_PAR_INDATORD_VYUY
  40. * - \ref CAP_PAR_INDATORD_RGGB
  41. * - \ref CAP_PAR_INDATORD_BGGR
  42. * - \ref CAP_PAR_INDATORD_GBRG
  43. * - \ref CAP_PAR_INDATORD_GRBG
  44. * - PNFMT should be one of the following setting
  45. * - \ref CAP_PAR_PLNFMT_YUV422
  46. * - \ref CAP_PAR_PLNFMT_YUV420
  47. *
  48. * @param[in] u32OutFormet Capture output format, should be one of following setting
  49. * - \ref CAP_CTL_PKTEN
  50. * - \ref CAP_CTL_PLNEN
  51. *
  52. * @return None
  53. *
  54. * @details Initialize the Image Capture Interface. Register a call back for driver internal using
  55. */
  56. void CAP_Open(uint32_t u32InFormat, uint32_t u32OutFormet)
  57. {
  58. ICAP->PAR = (ICAP->PAR & ~0x000007BF) | u32InFormat;
  59. ICAP->CTL = (ICAP->CTL & ~0x00000060) | u32OutFormet;
  60. }
  61. /**
  62. * @brief Set Cropping Window Starting Address and Size
  63. *
  64. * @param[in] u32VStart: Cropping Window Vertical Starting Address. It should be 0 ~ 0x7FF.
  65. *
  66. * @param[in] u32HStart: Cropping Window Horizontal Starting Address. It should be 0 ~ 0x7FF.
  67. *
  68. * @param[in] u32Height: Cropping Window Height . It should be 0 ~ 0x7FF.
  69. *
  70. * @param[in] u32Width: Cropping Window Width. It should be 0 ~ 0x7FF.
  71. *
  72. * @return None
  73. *
  74. * @details Set Cropping Window Starting Address Register
  75. */
  76. void CAP_SetCroppingWindow(uint32_t u32VStart,uint32_t u32HStart, uint32_t u32Height, uint32_t u32Width)
  77. {
  78. ICAP->CWSP = (ICAP->CWSP & ~(CAP_CWSP_CWSADDRV_Msk | CAP_CWSP_CWSADDRH_Msk))
  79. | (((u32VStart << 16) | u32HStart));
  80. ICAP->CWS = (ICAP->CWS & ~(CAP_CWS_CWH_Msk | CAP_CWS_CWW_Msk))
  81. | ((u32Height << 16)| u32Width);
  82. }
  83. /**
  84. * @brief Set System Memory Packet Base Address0 Register
  85. *
  86. * @param[in] u32Address : set PKTBA0 register, It should be 0x0 ~ 0xFFFFFFFF
  87. *
  88. * @return None
  89. *
  90. * @details Set System Memory Packet Base Address Register
  91. */
  92. void CAP_SetPacketBuf(uint32_t u32Address )
  93. {
  94. ICAP->PKTBA0 = u32Address;
  95. ICAP->CTL |= CAP_CTL_UPDATE_Msk;
  96. }
  97. /**
  98. * @brief Set System Memory Planar Y, U and V Base Address Registers.
  99. *
  100. * @param[in] u32YAddr : set YBA register, It should be 0x0 ~ 0xFFFFFFFF
  101. *
  102. * @param[in] u32UAddr : set UBA register, It should be 0x0 ~ 0xFFFFFFFF
  103. *
  104. * @param[in] u32VAddr : set VBA register, It should be 0x0 ~ 0xFFFFFFFF
  105. *
  106. * @return None
  107. *
  108. * @details Set System Memory Planar Y,U and V Base Address Registers
  109. */
  110. void CAP_SetPlanarBuf(uint32_t u32YAddr, uint32_t u32UAddr, uint32_t u32VAddr)
  111. {
  112. ICAP->YBA = u32YAddr;
  113. ICAP->UBA = u32UAddr;
  114. ICAP->VBA = u32VAddr;
  115. ICAP->CTL |= CAP_CTL_UPDATE_Msk;
  116. }
  117. /**
  118. * @brief Close Image Capture Interface
  119. *
  120. * @return None
  121. */
  122. void CAP_Close(void)
  123. {
  124. ICAP->CTL &= ~CAP_CTL_CAPEN;
  125. }
  126. /**
  127. * @brief Set CAP Interrupt
  128. *
  129. * @param[in] u32IntMask Interrupt settings. It could be
  130. * - \ref CAP_INT_VIEN_Msk
  131. * - \ref CAP_INT_MEIEN_Msk
  132. * - \ref CAP_INT_ADDRMIEN_Msk
  133. * - \ref CAP_INT_MDIEN_Msk
  134. * @return None
  135. *
  136. * @details Set Video Frame End Interrupt Enable,
  137. * System Memory Error Interrupt Enable,
  138. * Address Match Interrupt Enable,
  139. * Motion Detection Output Finish Interrupt Enable.
  140. */
  141. void CAP_EnableInt(uint32_t u32IntMask)
  142. {
  143. ICAP->INT = (ICAP->INT & ~(CAP_INT_VIEN_Msk | CAP_INT_MEIEN_Msk | CAP_INT_ADDRMIEN_Msk | CAP_INT_MDIEN_Msk ) )
  144. | u32IntMask;
  145. }
  146. /**
  147. * @brief Disable CAP Interrupt
  148. *
  149. * @param[in] u32IntMask Interrupt settings. It could be
  150. * - \ref CAP_INT_VINTF_Msk
  151. * - \ref CAP_INT_MEINTF_Msk
  152. * - \ref CAP_INT_ADDRMINTF_Msk
  153. * - \ref CAP_INT_MDINTF_Msk
  154. * @return None
  155. *
  156. * @details Disable Video Frame End Interrupt ,
  157. * System Memory Error Interrupt ,
  158. * Address Match Interrupt and
  159. * Motion Detection Output Finish Interrupt .
  160. */
  161. void CAP_DisableInt(uint32_t u32IntMask)
  162. {
  163. ICAP->INT = (ICAP->INT & ~(u32IntMask) ) ;
  164. }
  165. /**
  166. * @brief Start Image Capture Interface
  167. *
  168. * @return None
  169. */
  170. void CAP_Start(void)
  171. {
  172. ICAP->CTL |= CAP_CTL_CAPEN;
  173. }
  174. /**
  175. * @brief Stop Image Capture Interface
  176. *
  177. * @param[in] u32FrameComplete :
  178. * TRUE: Capture module automatically disable the CAP module after a frame had been captured
  179. * FALSE: Stop Capture module now
  180. * @return None
  181. *
  182. * @details if u32FrameComplete is set to TRUE then get a new frame and disable CAP module
  183. */
  184. void CAP_Stop(uint32_t u32FrameComplete)
  185. {
  186. if(u32FrameComplete==FALSE)
  187. ICAP->CTL &= ~CAP_CTL_CAPEN;
  188. else {
  189. ICAP->CTL |= CAP_CTL_SHUTTER_Msk;
  190. while(CAP_IS_STOPPED());
  191. }
  192. }
  193. /**
  194. * @brief Set Packet Scaling Vertical and Horizontal Factor Register
  195. *
  196. * @param[in] u32VNumerator: Packet Scaling Vertical Factor N. It should be 0 ~ FFFF.
  197. *
  198. * @param[in] u32VDenominator: Packet Scaling Vertical Factor M. It should be 0 ~ FFFF.
  199. *
  200. * @param[in] u32HNumerator: Packet Scaling Vertical Factor N. It should be 0 ~ FFFF.
  201. *
  202. * @param[in] u32HDenominator: Packet Scaling Vertical Factor M. It should be 0 ~ FFFF.
  203. *
  204. * @return None
  205. *
  206. */
  207. void CAP_SetPacketScaling(uint32_t u32VNumerator, uint32_t u32VDenominator, uint32_t u32HNumerator, uint32_t u32HDenominator)
  208. {
  209. uint32_t u32NumeratorL, u32NumeratorH;
  210. uint32_t u32DenominatorL, u32DenominatorH;
  211. u32NumeratorL = u32VNumerator&0xFF;
  212. u32NumeratorH=u32VNumerator>>8;
  213. u32DenominatorL = u32VDenominator&0xFF;
  214. u32DenominatorH = u32VDenominator>>8;
  215. ICAP->PKTSL = (ICAP->PKTSL & ~(CAP_PKTSL_PKTSVNL_Msk | CAP_PKTSL_PKTSVML_Msk))
  216. | ((u32NumeratorL << 24)| (u32DenominatorL << 16));
  217. ICAP->PKTSM = (ICAP->PKTSM & ~(CAP_PKTSM_PKTSVNH_Msk | CAP_PKTSM_PKTSVMH_Msk))
  218. | ((u32NumeratorH << 24) | (u32DenominatorH << 16));
  219. u32NumeratorL = u32HNumerator&0xFF;
  220. u32NumeratorH=u32HNumerator>>8;
  221. u32DenominatorL = u32HDenominator&0xFF;
  222. u32DenominatorH = u32HDenominator>>8;
  223. ICAP->PKTSL = (ICAP->PKTSL & ~(CAP_PKTSL_PKTSHNL_Msk | CAP_PKTSL_PKTSHML_Msk))
  224. | ((u32NumeratorL << 8)| u32DenominatorL);
  225. ICAP->PKTSM = (ICAP->PKTSM & ~(CAP_PKTSM_PKTSHNH_Msk | CAP_PKTSM_PKTSHMH_Msk))
  226. | ((u32NumeratorH << 8) | u32DenominatorH);
  227. }
  228. /**
  229. * @brief Set Planar Scaling Vertical and Horizontal Factor Register
  230. *
  231. * @param[in] u32VNumerator: Planar Scaling Vertical Factor N. It should be 0 ~ FFFF.
  232. *
  233. * @param[in] u32VDenominator: Planar Scaling Vertical Factor M. It should be 0 ~ FFFF.
  234. *
  235. * @param[in] u32HNumerator: Planar Scaling Vertical Factor N. It should be 0 ~ FFFF.
  236. *
  237. * @param[in] u32HDenominator: Planar Scaling Vertical Factor M. It should be 0 ~ FFFF.
  238. *
  239. * @return None
  240. *
  241. */
  242. void CAP_SetPlanarScaling(uint32_t u32VNumerator, uint32_t u32VDenominator, uint32_t u32HNumerator, uint32_t u32HDenominator)
  243. {
  244. uint32_t u32NumeratorL, u32NumeratorH;
  245. uint32_t u32DenominatorL, u32DenominatorH;
  246. u32NumeratorL = u32VNumerator&0xFF;
  247. u32NumeratorH = u32VNumerator>>8;
  248. u32DenominatorL = u32VDenominator&0xFF;
  249. u32DenominatorH = u32VDenominator>>8;
  250. ICAP->PLNSL = (ICAP->PLNSL & ~(CAP_PLNSL_PLNSVNL_Msk | CAP_PLNSL_PLNSVML_Msk))
  251. | ((u32NumeratorL << 24)| (u32DenominatorL << 16));
  252. ICAP->PLNSM = (ICAP->PLNSM & ~(CAP_PLNSM_PLNSVNH_Msk | CAP_PLNSM_PLNSVMH_Msk))
  253. | ((u32NumeratorH << 24)| (u32DenominatorH << 16));
  254. u32NumeratorL = u32HNumerator&0xFF;
  255. u32NumeratorH = u32HNumerator>>8;
  256. u32DenominatorL = u32HDenominator&0xFF;
  257. u32DenominatorH = u32HDenominator>>8;
  258. ICAP->PLNSL = (ICAP->PLNSL & ~(CAP_PLNSL_PLNSHNL_Msk | CAP_PLNSL_PLNSHML_Msk))
  259. | ((u32NumeratorL << 8)| u32DenominatorL);
  260. ICAP->PLNSM = (ICAP->PLNSM & ~(CAP_PLNSM_PLNSHNH_Msk | CAP_PLNSM_PLNSHMH_Msk))
  261. | ((u32NumeratorH << 8)| u32DenominatorH);
  262. }
  263. /**
  264. * @brief Set Packet Frame Output Pixel Stride Width.
  265. *
  266. * @param[in] u32Stride : set PKTSTRIDE register, It should be 0x0 ~ 0x3FFF
  267. *
  268. * @return None
  269. *
  270. * @details Set Packet Frame Output Pixel Stride Width
  271. */
  272. void CAP_SetPacketStride(uint32_t u32Stride )
  273. {
  274. ICAP->STRIDE = (ICAP->STRIDE & ~CAP_STRIDE_PKTSTRIDE_Msk) | u32Stride;
  275. }
  276. /**
  277. * @brief Set Planar Frame Output Pixel Stride Width.
  278. *
  279. * @param[in] u32Stride : set PLNSTRIDE register, It should be 0x0 ~ 0x3FFF
  280. *
  281. * @return None
  282. *
  283. * @details Set Planar Frame Output Pixel Stride Width
  284. */
  285. void CAP_SetPlanarStride(uint32_t u32Stride )
  286. {
  287. ICAP->STRIDE = (ICAP->STRIDE & ~CAP_STRIDE_PLNSTRIDE_Msk) | u32Stride<<CAP_STRIDE_PLNSTRIDE_Pos;
  288. }
  289. /**
  290. * @brief Enable Motion Detection Function
  291. *
  292. * @param[in] u32Freq: Motion Detection Detect Frequency. It should be 0x0 ~ 0x3.
  293. *
  294. * @param[in] u32BlockSize: Motion Detection Block Size
  295. * FALSE : 16x16
  296. * TRUE : 8x8
  297. *
  298. * @param[in] u32Format: Motion Detection Save Mode
  299. * FALSE : 1 bit DIFF + 7 Y Differential
  300. * TRUE : 1 bit DIFF only
  301. *
  302. * @param[in] u32Threshold: Motion Detection Detect Threshold. It should be 0x0 ~ 0x1F.
  303. *
  304. * @param[in] u32YDetAddr : Motion Detection Detect Temp Y Output Address
  305. *
  306. * @param[in] u32DetAddr: Motion Detection Detect Address
  307. *
  308. * @return None
  309. *
  310. * @details Set Planar Frame Output Pixel Stride Width
  311. */
  312. void CAP_EnableMotionDet(uint32_t u32Freq, uint32_t u32BlockSize, uint32_t u32Format, uint32_t u32Threshold, uint32_t u32YDetAddr, uint32_t u32DetAddr)
  313. {
  314. ICAP->MD = (ICAP->MD & ~(CAP_MD_MDSM_Msk | CAP_MD_MDBS_Msk | CAP_MD_MDEN_Msk)) |
  315. ((CAP_MD_MDEN_Msk | (u32BlockSize?CAP_MD_MDBS_Msk:0)) |
  316. (u32Format?CAP_MD_MDSM_Msk:0));
  317. ICAP->MD = (ICAP->MD & ~CAP_MD_MDDF_Msk) | (u32Freq<<CAP_MD_MDDF_Pos);
  318. ICAP->MD = (ICAP->MD & ~CAP_MD_MDTHR_Msk) | (u32Threshold<<CAP_MD_MDTHR_Pos);
  319. ICAP->MDYADDR = u32YDetAddr;
  320. ICAP->MDADDR = u32DetAddr;
  321. }
  322. /**
  323. * @brief Enable Motion Detection Function
  324. *
  325. * @return None
  326. *
  327. * @details Set Planar Frame Output Pixel Stride Width
  328. */
  329. void CAP_DisableMotionDet(void)
  330. {
  331. ICAP->MD &= ~CAP_MD_MDEN_Msk;
  332. }
  333. /*@}*/ /* end of group NUC472_442_CAP_EXPORTED_FUNCTIONS */
  334. /*@}*/ /* end of group NUC472_442_CAP_Driver */
  335. /*@}*/ /* end of group NUC472_442_Device_Driver */
  336. /*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/