stm32l4xx_ll_dma2d.c 26 KB

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