You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

654 lines
27 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32f7xx_ll_dma2d.c
  4. * @author MCD Application Team
  5. * @version V1.2.2
  6. * @date 14-April-2017
  7. * @brief DMA2D LL module driver.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
  12. *
  13. * Redistribution and use in source and binary forms, with or without modification,
  14. * are permitted provided that the following conditions are met:
  15. * 1. Redistributions of source code must retain the above copyright notice,
  16. * this list of conditions and the following disclaimer.
  17. * 2. Redistributions in binary form must reproduce the above copyright notice,
  18. * this list of conditions and the following disclaimer in the documentation
  19. * and/or other materials provided with the distribution.
  20. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  21. * may be used to endorse or promote products derived from this software
  22. * without specific prior written permission.
  23. *
  24. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  25. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  27. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  28. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  30. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  31. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  32. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  33. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  34. *
  35. ******************************************************************************
  36. */
  37. #if defined(USE_FULL_LL_DRIVER)
  38. /* Includes ------------------------------------------------------------------*/
  39. #include "stm32f7xx_ll_dma2d.h"
  40. #include "stm32f7xx_ll_bus.h"
  41. #ifdef USE_FULL_ASSERT
  42. #include "stm32_assert.h"
  43. #else
  44. #define assert_param(expr) ((void)0U)
  45. #endif
  46. /** @addtogroup STM32F7xx_LL_Driver
  47. * @{
  48. */
  49. #if defined (DMA2D)
  50. /** @addtogroup DMA2D_LL
  51. * @{
  52. */
  53. /* Private types -------------------------------------------------------------*/
  54. /* Private variables ---------------------------------------------------------*/
  55. /* Private constants ---------------------------------------------------------*/
  56. /** @addtogroup DMA2D_LL_Private_Constants DMA2D Private Constants
  57. * @{
  58. */
  59. #define LL_DMA2D_COLOR 0xFFU /*!< Maximum output color setting */
  60. #define LL_DMA2D_NUMBEROFLINES DMA2D_NLR_NL /*!< Maximum number of lines */
  61. #define LL_DMA2D_NUMBEROFPIXELS (DMA2D_NLR_PL >> DMA2D_NLR_PL_Pos) /*!< Maximum number of pixels per lines */
  62. #define LL_DMA2D_OFFSET_MAX 0x3FFFU /*!< Maximum output line offset expressed in pixels */
  63. #define LL_DMA2D_CLUTSIZE_MAX 0xFFU /*!< Maximum CLUT size */
  64. /**
  65. * @}
  66. */
  67. /* Private macros ------------------------------------------------------------*/
  68. /** @addtogroup DMA2D_LL_Private_Macros
  69. * @{
  70. */
  71. #define IS_LL_DMA2D_MODE(MODE) (((MODE) == LL_DMA2D_MODE_M2M) || \
  72. ((MODE) == LL_DMA2D_MODE_M2M_PFC) || \
  73. ((MODE) == LL_DMA2D_MODE_M2M_BLEND) || \
  74. ((MODE) == LL_DMA2D_MODE_R2M))
  75. #define IS_LL_DMA2D_OCMODE(MODE_ARGB) (((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_ARGB8888) || \
  76. ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_RGB888) || \
  77. ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_RGB565) || \
  78. ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_ARGB1555) || \
  79. ((MODE_ARGB) == LL_DMA2D_OUTPUT_MODE_ARGB4444))
  80. #define IS_LL_DMA2D_GREEN(GREEN) ((GREEN) <= LL_DMA2D_COLOR)
  81. #define IS_LL_DMA2D_RED(RED) ((RED) <= LL_DMA2D_COLOR)
  82. #define IS_LL_DMA2D_BLUE(BLUE) ((BLUE) <= LL_DMA2D_COLOR)
  83. #define IS_LL_DMA2D_ALPHA(ALPHA) ((ALPHA) <= LL_DMA2D_COLOR)
  84. #define IS_LL_DMA2D_OFFSET(OOFFSET) ((OOFFSET) <= LL_DMA2D_OFFSET_MAX)
  85. #define IS_LL_DMA2D_LINE(LINES) ((LINES) <= LL_DMA2D_NUMBEROFLINES)
  86. #define IS_LL_DMA2D_PIXEL(PIXELS) ((PIXELS) <= LL_DMA2D_NUMBEROFPIXELS)
  87. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  88. #define IS_LL_DMA2D_ALPHAINV(ALPHA) (((ALPHA) == LL_DMA2D_ALPHA_REGULAR) || \
  89. ((ALPHA) == LL_DMA2D_ALPHA_INVERTED))
  90. #define IS_LL_DMA2D_RBSWAP(RBSWAP) (((RBSWAP) == LL_DMA2D_RB_MODE_REGULAR) || \
  91. ((RBSWAP) == LL_DMA2D_RB_MODE_SWAP))
  92. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  93. #define IS_LL_DMA2D_LCMODE(MODE_ARGB) (((MODE_ARGB) == LL_DMA2D_INPUT_MODE_ARGB8888) || \
  94. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_RGB888) || \
  95. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_RGB565) || \
  96. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_ARGB1555) || \
  97. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_ARGB4444) || \
  98. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_L8) || \
  99. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_AL44) || \
  100. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_AL88) || \
  101. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_L4) || \
  102. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_A8) || \
  103. ((MODE_ARGB) == LL_DMA2D_INPUT_MODE_A4))
  104. #define IS_LL_DMA2D_CLUTCMODE(CLUTCMODE) (((CLUTCMODE) == LL_DMA2D_CLUT_COLOR_MODE_ARGB8888) || \
  105. ((CLUTCMODE) == LL_DMA2D_CLUT_COLOR_MODE_RGB888))
  106. #define IS_LL_DMA2D_CLUTSIZE(SIZE) ((SIZE) <= LL_DMA2D_CLUTSIZE_MAX)
  107. #define IS_LL_DMA2D_ALPHAMODE(MODE) (((MODE) == LL_DMA2D_ALPHA_MODE_NO_MODIF) || \
  108. ((MODE) == LL_DMA2D_ALPHA_MODE_REPLACE) || \
  109. ((MODE) == LL_DMA2D_ALPHA_MODE_COMBINE))
  110. /**
  111. * @}
  112. */
  113. /* Private function prototypes -----------------------------------------------*/
  114. /* Exported functions --------------------------------------------------------*/
  115. /** @addtogroup DMA2D_LL_Exported_Functions
  116. * @{
  117. */
  118. /** @addtogroup DMA2D_LL_EF_Init_Functions Initialization and De-initialization Functions
  119. * @{
  120. */
  121. /**
  122. * @brief De-initialize DMA2D registers (registers restored to their default values).
  123. * @param DMA2Dx DMA2D Instance
  124. * @retval An ErrorStatus enumeration value:
  125. * - SUCCESS: DMA2D registers are de-initialized
  126. * - ERROR: DMA2D registers are not de-initialized
  127. */
  128. ErrorStatus LL_DMA2D_DeInit(DMA2D_TypeDef *DMA2Dx)
  129. {
  130. ErrorStatus status = SUCCESS;
  131. /* Check the parameters */
  132. assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx));
  133. if (DMA2Dx == DMA2D)
  134. {
  135. /* Force reset of DMA2D clock */
  136. LL_AHB1_GRP1_ForceReset(LL_AHB1_GRP1_PERIPH_DMA2D);
  137. /* Release reset of DMA2D clock */
  138. LL_AHB1_GRP1_ReleaseReset(LL_AHB1_GRP1_PERIPH_DMA2D);
  139. }
  140. else
  141. {
  142. status = ERROR;
  143. }
  144. return (status);
  145. }
  146. /**
  147. * @brief Initialize DMA2D registers according to the specified parameters in DMA2D_InitStruct.
  148. * @note DMA2D transfers must be disabled to set initialization bits in configuration registers,
  149. * otherwise ERROR result is returned.
  150. * @param DMA2Dx DMA2D Instance
  151. * @param DMA2D_InitStruct: pointer to a LL_DMA2D_InitTypeDef structure
  152. * that contains the configuration information for the specified DMA2D peripheral.
  153. * @retval An ErrorStatus enumeration value:
  154. * - SUCCESS: DMA2D registers are initialized according to DMA2D_InitStruct content
  155. * - ERROR: Issue occurred during DMA2D registers initialization
  156. */
  157. ErrorStatus LL_DMA2D_Init(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_InitTypeDef *DMA2D_InitStruct)
  158. {
  159. ErrorStatus status = ERROR;
  160. LL_DMA2D_ColorTypeDef DMA2D_ColorStruct;
  161. uint32_t tmp = 0U, tmp1 = 0U, tmp2 = 0U;
  162. /* Check the parameters */
  163. assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx));
  164. assert_param(IS_LL_DMA2D_MODE(DMA2D_InitStruct->Mode));
  165. assert_param(IS_LL_DMA2D_OCMODE(DMA2D_InitStruct->ColorMode));
  166. assert_param(IS_LL_DMA2D_GREEN(DMA2D_InitStruct->OutputGreen));
  167. assert_param(IS_LL_DMA2D_RED(DMA2D_InitStruct->OutputRed));
  168. assert_param(IS_LL_DMA2D_BLUE(DMA2D_InitStruct->OutputBlue));
  169. assert_param(IS_LL_DMA2D_ALPHA(DMA2D_InitStruct->OutputAlpha));
  170. assert_param(IS_LL_DMA2D_OFFSET(DMA2D_InitStruct->LineOffset));
  171. assert_param(IS_LL_DMA2D_LINE(DMA2D_InitStruct->NbrOfLines));
  172. assert_param(IS_LL_DMA2D_PIXEL(DMA2D_InitStruct->NbrOfPixelsPerLines));
  173. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  174. assert_param(IS_LL_DMA2D_ALPHAINV(DMA2D_InitStruct->AlphaInversionMode));
  175. assert_param(IS_LL_DMA2D_RBSWAP(DMA2D_InitStruct->RBSwapMode));
  176. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  177. /* DMA2D transfers must be disabled to configure bits in initialization registers */
  178. tmp = LL_DMA2D_IsTransferOngoing(DMA2Dx);
  179. tmp1 = LL_DMA2D_FGND_IsEnabledCLUTLoad(DMA2Dx);
  180. tmp2 = LL_DMA2D_BGND_IsEnabledCLUTLoad(DMA2Dx);
  181. if ((tmp == 0U) && (tmp1 == 0U) && (tmp2 == 0U))
  182. {
  183. /* DMA2D CR register configuration -------------------------------------------*/
  184. LL_DMA2D_SetMode(DMA2Dx, DMA2D_InitStruct->Mode);
  185. /* DMA2D OPFCCR register configuration ---------------------------------------*/
  186. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  187. MODIFY_REG(DMA2Dx->OPFCCR, (DMA2D_OPFCCR_CM | DMA2D_OPFCCR_RBS | DMA2D_OPFCCR_AI), \
  188. (DMA2D_InitStruct->ColorMode | DMA2D_InitStruct->AlphaInversionMode | DMA2D_InitStruct->RBSwapMode));
  189. #else
  190. MODIFY_REG(DMA2Dx->OPFCCR, DMA2D_OPFCCR_CM, DMA2D_InitStruct->ColorMode);
  191. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  192. /* DMA2D OOR register configuration ------------------------------------------*/
  193. LL_DMA2D_SetLineOffset(DMA2Dx, DMA2D_InitStruct->LineOffset);
  194. /* DMA2D NLR register configuration ------------------------------------------*/
  195. LL_DMA2D_ConfigSize(DMA2Dx, DMA2D_InitStruct->NbrOfLines, DMA2D_InitStruct->NbrOfPixelsPerLines);
  196. /* DMA2D OMAR register configuration ------------------------------------------*/
  197. LL_DMA2D_SetOutputMemAddr(DMA2Dx, DMA2D_InitStruct->OutputMemoryAddress);
  198. /* DMA2D OCOLR register configuration ------------------------------------------*/
  199. DMA2D_ColorStruct.ColorMode = DMA2D_InitStruct->ColorMode;
  200. DMA2D_ColorStruct.OutputBlue = DMA2D_InitStruct->OutputBlue;
  201. DMA2D_ColorStruct.OutputGreen = DMA2D_InitStruct->OutputGreen;
  202. DMA2D_ColorStruct.OutputRed = DMA2D_InitStruct->OutputRed;
  203. DMA2D_ColorStruct.OutputAlpha = DMA2D_InitStruct->OutputAlpha;
  204. LL_DMA2D_ConfigOutputColor(DMA2Dx, &DMA2D_ColorStruct);
  205. status = SUCCESS;
  206. }
  207. /* If DMA2D transfers are not disabled, return ERROR */
  208. return (status);
  209. }
  210. /**
  211. * @brief Set each @ref LL_DMA2D_InitTypeDef field to default value.
  212. * @param DMA2D_InitStruct: pointer to a @ref LL_DMA2D_InitTypeDef structure
  213. * whose fields will be set to default values.
  214. * @retval None
  215. */
  216. void LL_DMA2D_StructInit(LL_DMA2D_InitTypeDef *DMA2D_InitStruct)
  217. {
  218. /* Set DMA2D_InitStruct fields to default values */
  219. DMA2D_InitStruct->Mode = LL_DMA2D_MODE_M2M;
  220. DMA2D_InitStruct->ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB8888;
  221. DMA2D_InitStruct->LineOffset = 0x0U;
  222. DMA2D_InitStruct->OutputBlue = 0x0U;
  223. DMA2D_InitStruct->OutputGreen = 0x0U;
  224. DMA2D_InitStruct->OutputRed = 0x0U;
  225. DMA2D_InitStruct->OutputAlpha = 0x0U;
  226. DMA2D_InitStruct->OutputMemoryAddress = 0x0U;
  227. DMA2D_InitStruct->NbrOfLines = 0x0U;
  228. DMA2D_InitStruct->NbrOfPixelsPerLines = 0x0U;
  229. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  230. DMA2D_InitStruct->AlphaInversionMode = LL_DMA2D_ALPHA_REGULAR;
  231. DMA2D_InitStruct->RBSwapMode = LL_DMA2D_RB_MODE_REGULAR;
  232. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  233. }
  234. /**
  235. * @brief Configure the foreground or background according to the specified parameters
  236. * in the LL_DMA2D_LayerCfgTypeDef structure.
  237. * @param DMA2Dx DMA2D Instance
  238. * @param DMA2D_LayerCfg: pointer to a LL_DMA2D_LayerCfgTypeDef structure that contains
  239. * the configuration information for the specified layer.
  240. * @param LayerIdx: DMA2D Layer index.
  241. * This parameter can be one of the following values:
  242. * 0(background) / 1(foreground)
  243. * @retval None
  244. */
  245. void LL_DMA2D_ConfigLayer(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg, uint32_t LayerIdx)
  246. {
  247. /* Check the parameters */
  248. assert_param(IS_LL_DMA2D_OFFSET(DMA2D_LayerCfg->LineOffset));
  249. assert_param(IS_LL_DMA2D_LCMODE(DMA2D_LayerCfg->ColorMode));
  250. assert_param(IS_LL_DMA2D_CLUTCMODE(DMA2D_LayerCfg->CLUTColorMode));
  251. assert_param(IS_LL_DMA2D_CLUTSIZE(DMA2D_LayerCfg->CLUTSize));
  252. assert_param(IS_LL_DMA2D_ALPHAMODE(DMA2D_LayerCfg->AlphaMode));
  253. assert_param(IS_LL_DMA2D_GREEN(DMA2D_LayerCfg->Green));
  254. assert_param(IS_LL_DMA2D_RED(DMA2D_LayerCfg->Red));
  255. assert_param(IS_LL_DMA2D_BLUE(DMA2D_LayerCfg->Blue));
  256. assert_param(IS_LL_DMA2D_ALPHA(DMA2D_LayerCfg->Alpha));
  257. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  258. assert_param(IS_LL_DMA2D_ALPHAINV(DMA2D_LayerCfg->AlphaInversionMode));
  259. assert_param(IS_LL_DMA2D_RBSWAP(DMA2D_LayerCfg->RBSwapMode));
  260. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  261. if (LayerIdx == 0U)
  262. {
  263. /* Configure the background memory address */
  264. LL_DMA2D_BGND_SetMemAddr(DMA2Dx, DMA2D_LayerCfg->MemoryAddress);
  265. /* Configure the background line offset */
  266. LL_DMA2D_BGND_SetLineOffset(DMA2Dx, DMA2D_LayerCfg->LineOffset);
  267. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  268. /* Configure the background Alpha value, Alpha mode, RB swap, Alpha inversion
  269. CLUT size, CLUT Color mode and Color mode */
  270. MODIFY_REG(DMA2Dx->BGPFCCR, \
  271. (DMA2D_BGPFCCR_ALPHA | DMA2D_BGPFCCR_RBS | DMA2D_BGPFCCR_AI | DMA2D_BGPFCCR_AM | \
  272. DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM | DMA2D_BGPFCCR_CM), \
  273. ((DMA2D_LayerCfg->Alpha << DMA2D_BGPFCCR_ALPHA_Pos) | DMA2D_LayerCfg->RBSwapMode | \
  274. DMA2D_LayerCfg->AlphaInversionMode | DMA2D_LayerCfg->AlphaMode | \
  275. (DMA2D_LayerCfg->CLUTSize << DMA2D_BGPFCCR_CS_Pos) | DMA2D_LayerCfg->CLUTColorMode | \
  276. DMA2D_LayerCfg->ColorMode));
  277. #else
  278. /* Configure the background Alpha value, Alpha mode, CLUT size, CLUT Color mode and Color mode */
  279. MODIFY_REG(DMA2Dx->BGPFCCR, \
  280. (DMA2D_BGPFCCR_ALPHA | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_CS | DMA2D_BGPFCCR_CCM | DMA2D_BGPFCCR_CM), \
  281. ((DMA2D_LayerCfg->Alpha << DMA2D_BGPFCCR_ALPHA_Pos) | DMA2D_LayerCfg->AlphaMode | \
  282. (DMA2D_LayerCfg->CLUTSize << DMA2D_BGPFCCR_CS_Pos) | DMA2D_LayerCfg->CLUTColorMode | \
  283. DMA2D_LayerCfg->ColorMode));
  284. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  285. /* Configure the background color */
  286. LL_DMA2D_BGND_SetColor(DMA2Dx, DMA2D_LayerCfg->Red, DMA2D_LayerCfg->Green, DMA2D_LayerCfg->Blue);
  287. /* Configure the background CLUT memory address */
  288. LL_DMA2D_BGND_SetCLUTMemAddr(DMA2Dx, DMA2D_LayerCfg->CLUTMemoryAddress);
  289. }
  290. else
  291. {
  292. /* Configure the foreground memory address */
  293. LL_DMA2D_FGND_SetMemAddr(DMA2Dx, DMA2D_LayerCfg->MemoryAddress);
  294. /* Configure the foreground line offset */
  295. LL_DMA2D_FGND_SetLineOffset(DMA2Dx, DMA2D_LayerCfg->LineOffset);
  296. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  297. /* Configure the foreground Alpha value, Alpha mode, RB swap, Alpha inversion
  298. CLUT size, CLUT Color mode and Color mode */
  299. MODIFY_REG(DMA2Dx->FGPFCCR, \
  300. (DMA2D_FGPFCCR_ALPHA | DMA2D_FGPFCCR_RBS | DMA2D_FGPFCCR_AI | DMA2D_FGPFCCR_AM | \
  301. DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM | DMA2D_FGPFCCR_CM), \
  302. ((DMA2D_LayerCfg->Alpha << DMA2D_FGPFCCR_ALPHA_Pos) | DMA2D_LayerCfg->RBSwapMode | \
  303. DMA2D_LayerCfg->AlphaInversionMode | DMA2D_LayerCfg->AlphaMode | \
  304. (DMA2D_LayerCfg->CLUTSize << DMA2D_FGPFCCR_CS_Pos) | DMA2D_LayerCfg->CLUTColorMode | \
  305. DMA2D_LayerCfg->ColorMode));
  306. #else
  307. /* Configure the foreground Alpha value, Alpha mode, CLUT size, CLUT Color mode and Color mode */
  308. MODIFY_REG(DMA2Dx->FGPFCCR, \
  309. (DMA2D_FGPFCCR_ALPHA | DMA2D_FGPFCCR_AM | DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM | DMA2D_FGPFCCR_CM), \
  310. ((DMA2D_LayerCfg->Alpha << DMA2D_FGPFCCR_ALPHA_Pos) | DMA2D_LayerCfg->AlphaMode | \
  311. (DMA2D_LayerCfg->CLUTSize << DMA2D_FGPFCCR_CS_Pos) | DMA2D_LayerCfg->CLUTColorMode | \
  312. DMA2D_LayerCfg->ColorMode));
  313. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  314. /* Configure the foreground color */
  315. LL_DMA2D_FGND_SetColor(DMA2Dx, DMA2D_LayerCfg->Red, DMA2D_LayerCfg->Green, DMA2D_LayerCfg->Blue);
  316. /* Configure the foreground CLUT memory address */
  317. LL_DMA2D_FGND_SetCLUTMemAddr(DMA2Dx, DMA2D_LayerCfg->CLUTMemoryAddress);
  318. }
  319. }
  320. /**
  321. * @brief Set each @ref LL_DMA2D_LayerCfgTypeDef field to default value.
  322. * @param DMA2D_LayerCfg: pointer to a @ref LL_DMA2D_LayerCfgTypeDef structure
  323. * whose fields will be set to default values.
  324. * @retval None
  325. */
  326. void LL_DMA2D_LayerCfgStructInit(LL_DMA2D_LayerCfgTypeDef *DMA2D_LayerCfg)
  327. {
  328. /* Set DMA2D_LayerCfg fields to default values */
  329. DMA2D_LayerCfg->MemoryAddress = 0x0U;
  330. DMA2D_LayerCfg->ColorMode = LL_DMA2D_INPUT_MODE_ARGB8888;
  331. DMA2D_LayerCfg->LineOffset = 0x0U;
  332. DMA2D_LayerCfg->CLUTColorMode = LL_DMA2D_CLUT_COLOR_MODE_ARGB8888;
  333. DMA2D_LayerCfg->CLUTSize = 0x0U;
  334. DMA2D_LayerCfg->AlphaMode = LL_DMA2D_ALPHA_MODE_NO_MODIF;
  335. DMA2D_LayerCfg->Alpha = 0x0U;
  336. DMA2D_LayerCfg->Blue = 0x0U;
  337. DMA2D_LayerCfg->Green = 0x0U;
  338. DMA2D_LayerCfg->Red = 0x0U;
  339. DMA2D_LayerCfg->CLUTMemoryAddress = 0x0U;
  340. #if defined(DMA2D_ALPHA_INV_RB_SWAP_SUPPORT)
  341. DMA2D_LayerCfg->AlphaInversionMode = LL_DMA2D_ALPHA_REGULAR;
  342. DMA2D_LayerCfg->RBSwapMode = LL_DMA2D_RB_MODE_REGULAR;
  343. #endif /* DMA2D_ALPHA_INV_RB_SWAP_SUPPORT */
  344. }
  345. /**
  346. * @brief Initialize DMA2D output color register according to the specified parameters
  347. * in DMA2D_ColorStruct.
  348. * @param DMA2Dx DMA2D Instance
  349. * @param DMA2D_ColorStruct: pointer to a LL_DMA2D_ColorTypeDef structure that contains
  350. * the color configuration information for the specified DMA2D peripheral.
  351. * @retval None
  352. */
  353. void LL_DMA2D_ConfigOutputColor(DMA2D_TypeDef *DMA2Dx, LL_DMA2D_ColorTypeDef *DMA2D_ColorStruct)
  354. {
  355. uint32_t outgreen = 0U;
  356. uint32_t outred = 0U;
  357. uint32_t outalpha = 0U;
  358. /* Check the parameters */
  359. assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx));
  360. assert_param(IS_LL_DMA2D_OCMODE(DMA2D_ColorStruct->ColorMode));
  361. assert_param(IS_LL_DMA2D_GREEN(DMA2D_ColorStruct->OutputGreen));
  362. assert_param(IS_LL_DMA2D_RED(DMA2D_ColorStruct->OutputRed));
  363. assert_param(IS_LL_DMA2D_BLUE(DMA2D_ColorStruct->OutputBlue));
  364. assert_param(IS_LL_DMA2D_ALPHA(DMA2D_ColorStruct->OutputAlpha));
  365. /* DMA2D OCOLR register configuration ------------------------------------------*/
  366. if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888)
  367. {
  368. outgreen = DMA2D_ColorStruct->OutputGreen << 8U;
  369. outred = DMA2D_ColorStruct->OutputRed << 16U;
  370. outalpha = DMA2D_ColorStruct->OutputAlpha << 24U;
  371. }
  372. else if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888)
  373. {
  374. outgreen = DMA2D_ColorStruct->OutputGreen << 8U;
  375. outred = DMA2D_ColorStruct->OutputRed << 16U;
  376. outalpha = 0x00000000U;
  377. }
  378. else if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565)
  379. {
  380. outgreen = DMA2D_ColorStruct->OutputGreen << 5U;
  381. outred = DMA2D_ColorStruct->OutputRed << 11U;
  382. outalpha = 0x00000000U;
  383. }
  384. else if (DMA2D_ColorStruct->ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555)
  385. {
  386. outgreen = DMA2D_ColorStruct->OutputGreen << 5U;
  387. outred = DMA2D_ColorStruct->OutputRed << 10U;
  388. outalpha = DMA2D_ColorStruct->OutputAlpha << 15U;
  389. }
  390. else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */
  391. {
  392. outgreen = DMA2D_ColorStruct->OutputGreen << 4U;
  393. outred = DMA2D_ColorStruct->OutputRed << 8U;
  394. outalpha = DMA2D_ColorStruct->OutputAlpha << 12U;
  395. }
  396. LL_DMA2D_SetOutputColor(DMA2Dx, (outgreen | outred | DMA2D_ColorStruct->OutputBlue | outalpha));
  397. }
  398. /**
  399. * @brief Return DMA2D output Blue color.
  400. * @param DMA2Dx DMA2D Instance.
  401. * @param ColorMode This parameter can be one of the following values:
  402. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888
  403. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888
  404. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565
  405. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555
  406. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444
  407. * @retval Output Blue color value between Min_Data=0 and Max_Data=0xFF
  408. */
  409. uint32_t LL_DMA2D_GetOutputBlueColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode)
  410. {
  411. uint32_t color = 0U;
  412. /* Check the parameters */
  413. assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx));
  414. assert_param(IS_LL_DMA2D_OCMODE(ColorMode));
  415. /* DMA2D OCOLR register reading ------------------------------------------*/
  416. if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888)
  417. {
  418. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFFU));
  419. }
  420. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888)
  421. {
  422. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFFU));
  423. }
  424. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565)
  425. {
  426. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x1FU));
  427. }
  428. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555)
  429. {
  430. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x1FU));
  431. }
  432. else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */
  433. {
  434. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFU));
  435. }
  436. return color;
  437. }
  438. /**
  439. * @brief Return DMA2D output Green color.
  440. * @param DMA2Dx DMA2D Instance.
  441. * @param ColorMode This parameter can be one of the following values:
  442. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888
  443. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888
  444. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565
  445. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555
  446. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444
  447. * @retval Output Green color value between Min_Data=0 and Max_Data=0xFF
  448. */
  449. uint32_t LL_DMA2D_GetOutputGreenColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode)
  450. {
  451. uint32_t color = 0U;
  452. /* Check the parameters */
  453. assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx));
  454. assert_param(IS_LL_DMA2D_OCMODE(ColorMode));
  455. /* DMA2D OCOLR register reading ------------------------------------------*/
  456. if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888)
  457. {
  458. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF00U) >> 8U);
  459. }
  460. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888)
  461. {
  462. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF00U) >> 8U);
  463. }
  464. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565)
  465. {
  466. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x7E0U) >> 5U);
  467. }
  468. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555)
  469. {
  470. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x3E0U) >> 5U);
  471. }
  472. else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */
  473. {
  474. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF0U) >> 4U);
  475. }
  476. return color;
  477. }
  478. /**
  479. * @brief Return DMA2D output Red color.
  480. * @param DMA2Dx DMA2D Instance.
  481. * @param ColorMode This parameter can be one of the following values:
  482. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888
  483. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888
  484. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565
  485. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555
  486. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444
  487. * @retval Output Red color value between Min_Data=0 and Max_Data=0xFF
  488. */
  489. uint32_t LL_DMA2D_GetOutputRedColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode)
  490. {
  491. uint32_t color = 0U;
  492. /* Check the parameters */
  493. assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx));
  494. assert_param(IS_LL_DMA2D_OCMODE(ColorMode));
  495. /* DMA2D OCOLR register reading ------------------------------------------*/
  496. if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888)
  497. {
  498. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF0000U) >> 16U);
  499. }
  500. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888)
  501. {
  502. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF0000U) >> 16U);
  503. }
  504. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565)
  505. {
  506. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF800U) >> 11U);
  507. }
  508. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555)
  509. {
  510. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x7C00U) >> 10U);
  511. }
  512. else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */
  513. {
  514. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF00U) >> 8U);
  515. }
  516. return color;
  517. }
  518. /**
  519. * @brief Return DMA2D output Alpha color.
  520. * @param DMA2Dx DMA2D Instance.
  521. * @param ColorMode This parameter can be one of the following values:
  522. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB8888
  523. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB888
  524. * @arg @ref LL_DMA2D_OUTPUT_MODE_RGB565
  525. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB1555
  526. * @arg @ref LL_DMA2D_OUTPUT_MODE_ARGB4444
  527. * @retval Output Alpha color value between Min_Data=0 and Max_Data=0xFF
  528. */
  529. uint32_t LL_DMA2D_GetOutputAlphaColor(DMA2D_TypeDef *DMA2Dx, uint32_t ColorMode)
  530. {
  531. uint32_t color = 0U;
  532. /* Check the parameters */
  533. assert_param(IS_DMA2D_ALL_INSTANCE(DMA2Dx));
  534. assert_param(IS_LL_DMA2D_OCMODE(ColorMode));
  535. /* DMA2D OCOLR register reading ------------------------------------------*/
  536. if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB8888)
  537. {
  538. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xFF000000U) >> 24U);
  539. }
  540. else if ((ColorMode == LL_DMA2D_OUTPUT_MODE_RGB888) || (ColorMode == LL_DMA2D_OUTPUT_MODE_RGB565))
  541. {
  542. color = 0x0U;
  543. }
  544. else if (ColorMode == LL_DMA2D_OUTPUT_MODE_ARGB1555)
  545. {
  546. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0x8000U) >> 15U);
  547. }
  548. else /* ColorMode = LL_DMA2D_OUTPUT_MODE_ARGB4444 */
  549. {
  550. color = (uint32_t)(READ_BIT(DMA2Dx->OCOLR, 0xF000U) >> 12U);
  551. }
  552. return color;
  553. }
  554. /**
  555. * @brief Configure DMA2D transfer size.
  556. * @param DMA2Dx DMA2D Instance
  557. * @param NbrOfLines Value between Min_Data=0 and Max_Data=0xFFFF
  558. * @param NbrOfPixelsPerLines Value between Min_Data=0 and Max_Data=0x3FFF
  559. * @retval None
  560. */
  561. void LL_DMA2D_ConfigSize(DMA2D_TypeDef *DMA2Dx, uint32_t NbrOfLines, uint32_t NbrOfPixelsPerLines)
  562. {
  563. MODIFY_REG(DMA2Dx->NLR, (DMA2D_NLR_PL | DMA2D_NLR_NL), \
  564. ((NbrOfPixelsPerLines << DMA2D_NLR_PL_Pos) | NbrOfLines));
  565. }
  566. /**
  567. * @}
  568. */
  569. /**
  570. * @}
  571. */
  572. /**
  573. * @}
  574. */
  575. #endif /* defined (DMA2D) */
  576. /**
  577. * @}
  578. */
  579. #endif /* USE_FULL_LL_DRIVER */
  580. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/