你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32N6570-DK评测】测试LCD显示

[复制链接]
TLLED 发布时间:2025-2-18 15:02

# i9 n2 P* b: R3 Q8 l' d. m7 p) D0 @

- n! w" {+ y( k7 m! z# E, d: V+ |一、硬件部分7 t) E! U3 s( Z# S' e
1.1、LCD显示屏硬件接口部分电路" S2 `) J0 Q% s
lcd.png
" K4 F% [  a+ ]  m) m, R+ T
/ }3 Q. X1 Y, ~; J

# v+ Q5 V3 @7 Q8 `1 l4 x7 a! j. y0 V: \5 a, v: }, r) j. [" l: {8 L
2 _2 \+ d- a4 T( h3 s. t7 y) }; ^& U
) d' c) V* x5 {; E5 K" [$ f5 v/ N
1.2、LTDC显示内部框图' a$ `6 W" ^9 ^
LTDC可驱动24位的RGB显示屏,内部有两个显示层
' P  g. r2 Z& p' c$ m0 K3 r 002.png ) V6 I1 W' W, ^$ ~9 \
1 x- _! `* t4 m- u" Y/ p( ~
# g9 r7 I0 F$ e; v( d

5 O. ?# d% H# R5 h6 h( C二、配置LTDC
5 h" G& Y$ I# S. ?) T5 R8 ]# i& @" X
4 t* R! G+ D# a+ y4 k2.1、屏幕的参数设置. V  }+ E) y4 ^# g! R( }9 B
003.png 8 W* q  p+ D+ `) \  w, B! }7 K
+ t  ]" U) M! r) \- f

" V+ s0 m% }) n/ a# d- e2.2、层参数设置
2 ~' u! {, U! z* q' O7 L 004.png " a+ u% B' |  r( b: a: r

/ B0 K# i* ~$ n) A8 o% f: k2 h5 e7 Y0 ^% O) l

6 z4 }5 \; V+ `: f* y* q8 }0 ]8 ?2.3、LTDC引脚设置
# R& }8 @9 Q) B( ~% b- m* B 005.png ' a  d) d/ i7 H% r) f6 n
5 Q: g0 R: N& ?7 Q& I
' l! G- w- ^1 a  N7 D; Y
- |2 d8 W& P1 O2 A
三、程序部分: R4 _% G( s2 h, V1 {
" v7 A5 F* B" {9 t( `
3.1、在项目中添加LCD驱动程序5 F# v. _9 D2 S- S9 ^4 {* g+ B4 s
使用官方BSP中的LCD驱动程序" H. v1 H# g8 r/ S# b4 b, p
stm32n6570_discovery_lcd.c, }! X" q2 X9 W3 T# Q& G

7 _& {% V* E. i9 i- z+ B: C
  1. /**
    # w% w  D/ U2 B# k$ i0 P
  2.   ******************************************************************************2 a0 L* V7 C6 @, j, {; P% c  c
  3.   * @file    stm32n6570_discovery_lcd.c  Z5 C6 B$ `( q% H
  4.   * @author  MCD Application Team4 I7 i0 S9 G8 c7 |
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module
    ; `4 r3 Z7 q" m7 s4 s0 {
  6.   *          mounted on STM32N6570_DK board.' G) v# {) p% @% G- U
  7.   ******************************************************************************6 [9 E( i& h) N3 M1 Z) X
  8.   * @attention# I2 w; k# Q5 `# O) U3 y
  9.   *
    0 {! }4 x1 q, _' |! |5 }! X( V( B* W
  10.   * Copyright (c) 2022 STMicroelectronics." @$ B+ C' p: b
  11.   * All rights reserved.
    4 j6 A' I% g- q  r% ~
  12.   *4 E! d' |# K8 C4 h8 ]: N$ W& k) _( r" y
  13.   * This software is licensed under terms that can be found in the LICENSE file
      h! u; R  a4 r- v2 l
  14.   * in the root directory of this software component.
    + Z4 s/ z" C1 K) s+ E$ X2 d0 o* e4 H7 s
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.% P4 o- F" }' @5 d- L, Y# n
  16.   *7 A2 e8 j& N( A0 D+ I4 j9 e
  17.   ******************************************************************************3 X% K7 Q& W6 u: D- |" y; f0 z( b
  18.   @verbatim
    5 g# Z+ s: `, o; O
  19.   How To use this driver:  d' w8 P( W; S, `4 @# s7 Y. m
  20.   --------------------------
    % B; ~7 Z- n' a5 Q' d6 K2 K; x7 c  X
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.8 y" e9 s3 q2 q. t9 H
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component
    " p% ]* E' ~. t4 k$ j1 U6 O. P% N, H
  23. 1 A! {$ R5 A* e- S2 F
  24.   Driver description:
    + L4 t, _* j. Z2 u
  25.   ---------------------
    , G  \: Q) }$ t3 r% \
  26.    + Initialization steps:+ P# e. V* X7 i/ q* l
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the6 t/ K1 A* P& l% k0 Z8 \# }) Q: c7 ~
  28.        following settings:
    7 g$ T" V7 p* B( g. M
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB8885 z) m3 |4 Y( e, B2 u: [
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.1 t6 j. \0 M$ ?9 I$ E- J! Z' v. ]
  31.         - Width       : LCD_DEFAULT_WIDTH (800)& i" _# h" b7 G( u2 x4 Y9 ]4 X
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
      G5 s: d0 B) K7 j5 u. Y, G
  33.        The default LTDC layer configured is layer 0.; ~! q# N- |) R; o
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:
    6 I' X; B0 }4 S" ?& O
  35.         - MX_LTDC_ClockConfig()7 w0 P) S% ]2 q9 L$ J' w6 Z
  36.         - MX_LTDC_Init()
    " c7 _7 m& k% f% N: ?$ ^: w5 N" o
  37.         - MX_LTDC_ConfigLayer()3 F! O: s# B4 s: u2 g/ F5 x$ C

  38. 1 P- i( {1 @- K5 {
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.
    9 N6 N2 x/ A' f# C7 \/ @& m. e$ _
  40. . I. z% P6 Q! `1 C
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.# F( s$ l1 u- ~! X+ ]
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.
    5 b- J3 U0 I% X/ K0 ]) N5 }7 B
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    2 O+ d# u8 }3 J( ~
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.
    ( n1 u0 v9 d- q7 x4 `! U+ d
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.# z+ F7 `. K* b1 M' T
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.* i) T1 `' I1 R; f& {* D: r
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.
    " S, q. `$ u0 ~4 Z% N0 ~" f- S
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.
    ( i8 k, P! w  v
  49. # w) _5 H* \7 T& W
  50.    + Options
    - k; Q3 |# j2 l7 x3 L
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the2 r- b+ ^9 ]5 \3 |$ b/ k% |
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.
    & F/ g$ W: ?1 X' t  V8 O
  53.        To control the reload mode:
    7 ~+ l. M: _* _
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE. `( a) Q2 X) f9 w" ^( A/ G
  55.          - Configure LTDC (color keying, transparency ..)
      K. v, A+ T& n6 K
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE1 ^2 {3 o  g! L# D8 W
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload' T! W7 f& Q! }
  58.            in the next vertical blanking
    & o$ Z" n+ e( S/ z
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()
    4 p7 P9 z4 z9 j# H
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()) m. Y4 a% F$ i
  61.      o Configure and enable the color keying functionality using the% g! F0 ~" [. R0 ?  J
  62.        BSP_LCD_SetColorKeying() function.1 P3 a2 w8 e  i0 W& p+ S1 L
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.; H& y: {/ N1 p9 ]: M; S% ?2 T
  64.      o Modify on the fly the transparency and/or the frame buffer address
    + v1 A0 {6 ~1 F0 o6 z
  65.        using the following functions:, U6 [- B8 w, Q+ h! I$ t; _
  66.        - BSP_LCD_SetTransparency()
    8 i5 z+ ?* ?4 z1 w
  67.        - BSP_LCD_SetLayerAddress()5 `. ~4 q6 s/ M6 a" ^( T- T
  68. " ?/ J* u! @9 Y9 V/ g7 s
  69.    + Display on LCD
    + E, Y/ e  _8 B
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap), j1 R+ F% h$ \" s& h
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,0 R; R( C4 m: p" k5 b
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.
    . l6 z* e* c7 f8 [  o
  73.        The basic gui services, defined in basic_gui utility, are ready for use.
    " n, L+ D* L# Z# [" l
  74. 3 ?* \# h) m* o' X) e( F+ x
  75.   Note:
    2 C2 d, ~; i9 J' W$ c7 R
  76.   --------4 {! t- f, \2 f
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select
    0 U, l9 k3 [: w
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this
    9 F9 ~& k# b; j' N% Y8 \1 O
  79.     parameter should be 0.
    ' b  u2 G" J6 O" Z+ F
  80. 6 Y- N0 a5 R" W7 P
  81.   @endverbatim
    ) [% J: i. [3 }! [) I
  82.   ******************************************************************************
    # H; r) q4 l* H
  83.   */
    : H) @1 u9 Z- ]3 g+ A

  84. 3 c& o2 V5 c5 z' ?' Z$ O
  85. /* Includes ------------------------------------------------------------------*/: @- ~3 L, _8 `5 b3 X' H2 r1 w
  86. #include "stm32n6570_discovery_lcd.h"$ J. Z* C  y& D! a) o* }
  87. . V# ^. }- |- c+ h4 o
  88. /** @addtogroup BSP
    ! h# f1 z% y; @
  89.   * @{
    0 `# c6 f2 B' q8 H
  90.   */0 \/ r# N9 J8 F

  91. ' d, R) ~: r6 O4 l, _4 ?
  92. /** @addtogroup STM32N6570_DK
    2 @# a- Z$ N, N3 n
  93.   * @{* g: M: U5 P2 y3 W
  94.   */
      k) t2 e# a. v* L9 J8 E
  95. - U) {/ t0 |. N1 L* I& D
  96. /** @defgroup STM32N6570_DK_LCD LCD
    2 H$ Q. M) e- ^& Q4 ^$ p$ Z
  97.   * @{) P7 W8 J- |4 H( [, r" j7 q
  98.   */( I# t  ^- R9 m2 v# z2 ^

  99. % n7 i. t( V  f2 o
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables9 r- u$ H  ?; ?
  101.   * @{
      q& N+ O* |- a0 O3 j# g1 @
  102.   */( U2 u3 V0 p& I
  103. % c/ d! s. w3 y6 V$ ~/ H
  104. /**: e4 ^2 K9 ?- B3 q7 n
  105.   * @}
    " X3 U. k9 Z3 W
  106.   */& E+ D! T' `4 t  ^& v

  107. ! m8 e3 l) v: M4 |; X7 ~
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions6 F4 d# u/ ^$ c/ N6 Z# _/ n
  109.   * @{. |) a6 e( g6 ]+ F! X
  110.   */
    ; c  P+ j' v) {8 q# N: ^. x; c
  111. const LCD_UTILS_Drv_t LCD_Driver =
    / B1 d/ R0 c5 P; L" b
  112. {
    1 d9 o, M0 x2 ^* d
  113.   BSP_LCD_DrawBitmap,5 u4 W' p+ h! v* y$ ?' [) k
  114.   BSP_LCD_FillRGBRect,
    2 Y' |/ F- `9 Q- y/ }. e
  115.   BSP_LCD_DrawHLine,
      x# r6 Y/ o8 [1 O
  116.   BSP_LCD_DrawVLine,
    ' l& @1 @0 F5 J! v+ w$ t
  117.   BSP_LCD_FillRect,
    8 q7 U/ ~% E" c5 l  F
  118.   BSP_LCD_ReadPixel,
    . L& j* [1 b/ D( ?' V0 F/ z
  119.   BSP_LCD_WritePixel,6 Q: ?3 j3 ]$ t1 R) v' W
  120.   BSP_LCD_GetXSize,
    6 L0 `. U3 d/ N/ K0 b9 {
  121.   BSP_LCD_GetYSize,0 a( z% ^& K/ v2 y* j0 t
  122.   BSP_LCD_SetActiveLayer,( A5 G7 v. C8 x/ V- l: B: ^
  123.   BSP_LCD_GetPixelFormat$ r1 |5 u: j! {" O6 i5 U
  124. };
    8 K1 k# I# X( K/ V' F
  125. 2 N& D( U/ m6 i, ^- K9 }8 [
  126. /**
    ' o! k( R" M& n; Q& B# `
  127.   * @}8 y& u9 K9 u" [- ?& P/ @
  128.   */
    , j6 m3 N* h6 M- K# g! m% z

  129. 9 Q, |" A8 s7 W/ e- \! V# m9 Y* o
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables
    / r) Z" h! {) G7 N$ v
  131.   * @{0 o8 |# V) J( l$ l: [% p
  132.   */
    5 u5 P5 w2 L0 `8 h$ [) `
  133. DMA2D_HandleTypeDef hlcd_dma2d;2 V+ O* v3 D5 |" Z8 r: v
  134. LTDC_HandleTypeDef  hlcd_ltdc;3 w3 t8 r/ a. _% [; P- z: g
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];9 @1 G* d. S* F' y7 T0 r! E
  136. /**% n5 \1 o6 Y9 s  F1 b
  137.   * @}
    ' i) \2 T- F+ X/ a
  138.   */
    ; k& o$ F, t# N& v& z* a
  139. - s2 J" ?0 e3 T9 H! o
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes
    & v# z8 G* h: ?/ S; H
  141.   * @{3 ~# T, s# Y! j$ \8 O0 \! p
  142.   */
    8 i1 h3 s+ [  _
  143. # H. t2 H: Z  ~, H
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
    ' N2 L8 N% d/ |: ]% w" U/ Q
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);
    & }+ ~# u+ \: I. Z. t# z+ ]
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);7 e2 s+ ~" q3 t  e2 Z3 J
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);, K9 V, `  x1 P) {6 W! [/ M
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);  p+ b) i) ]: _
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);8 I; S3 l3 u- Q! l0 W1 a
  150. /**
    9 m/ h. S  |4 H4 N) b; o" R* a( k
  151.   * @}4 X3 P4 X) F/ ^* n7 J; d
  152.   */
    9 O, M2 Y+ ^$ v$ h
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros  x' T4 ?  G+ h( c6 j% V0 g: P; x
  154.   * @{8 |2 x1 F. n1 t3 j3 b( H
  155.   */
    $ W- Y) H: h! z* J- a+ k! k0 c
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\
    , ]0 ~- }" _$ v0 V( j; }
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\8 i% d  F5 y% d
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U)); o2 V- }# u( g; y# n! l3 f

  159. ; D+ g' R4 k, w3 T7 j* @
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\
    , r$ Y, ]0 z9 Z2 W4 A* `
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\
      i2 _3 |1 }0 b) X  t" Q% e
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\$ y) |# ^8 ^1 J. h4 t, q; M9 A2 n
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))' T' T, z% g0 }  q
  164. ) ^/ Z, |! h  ^7 W( ^. a
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    # B2 c1 ?; p' F# y8 h/ Y
  166. ' e; r1 C- x7 s- W
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)" d2 A) P1 S$ g( A- d! O

  168. 3 U! H: J! i+ U( f$ K. G6 ]
  169. /**% f# [: s7 m" u% n9 @! Y
  170.   * @}/ m) z0 c0 u. F. W, k) q( Z4 E& {, J
  171.   */
    * x: J% J9 K8 E$ D6 l, j
  172. 1 t: g- o3 ^% d% p0 M" Z
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions
    ! O9 ?( e1 Z( D3 M2 n" D4 I
  174.   * @{! w9 Q/ b/ O& v7 Z0 M/ t! B0 E4 y, O
  175.   */! x% l) \6 h/ x! y
  176. /**
    ! G! }5 e$ u4 n, g0 Y
  177.   * @brief  Initializes the LCD in default mode.& ?  ^+ J8 d: v/ c
  178.   * @param  Instance    LCD Instance7 f0 o# z. j+ Z4 R. ]
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    ( L- _5 a2 }' D# A/ h7 X9 K
  180.   * @retval BSP status9 A- J/ `1 v2 L: W
  181.   */4 v* v; ^& K2 c
  182.   b9 K# x$ h! F: Z
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)
      v$ E1 z2 }% Z4 O' P' Y
  184. {
    ! G; _$ _1 ?8 W' e) U. j
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);- q3 I9 ?1 i1 K( K7 B* Y* T
  186. }$ f- W- C6 B8 F4 X. }) h4 l3 e# u
  187. 5 P! D# o( ?: M% c* v  k
  188. /**. R$ }; n( j  P7 ]/ A9 |8 `
  189.   * @brief  Initializes the LCD.% b* G( A, T& W/ l9 N) e+ n0 S
  190.   * @param  Instance    LCD Instance' m) `" d5 g8 C6 `  @
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    3 e4 C/ C1 }$ J
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888% J3 }# Q2 X. h# O* Q
  193.   *                     or LCD_PIXEL_FORMAT_RGB888
    4 N% d7 ?6 @6 @) X. R! k1 ^
  194.   * @param  Width       Display width( a" @, D9 B% `4 b, O7 }
  195.   * @param  Height      Display height8 J8 h7 A9 G# Z8 t8 x' p: i. n3 C
  196.   * @retval BSP status
    ' @* q$ C+ _$ j* V7 ~7 C  R0 m0 N$ E
  197.   */% d3 I5 n  C* R( Q, `7 @
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)
    % T2 g1 C) r. A
  199. {: z! H5 w7 o7 K0 g- i
  200.   int32_t ret = BSP_ERROR_NONE;# k0 D4 h+ b7 p' s  X8 t
  201.   uint32_t ltdc_pixel_format;
    5 ]6 g8 l" p& n
  202.   MX_LTDC_LayerConfig_t config = {0};6 X6 W" v& K  V* l- r1 J) B0 `' M

  203. ; g6 q) W+ B# V* \- m% I5 b
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \# R0 |  t& `, b1 F/ w6 W5 ~
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \6 d9 W3 a: `6 l& d1 ]- W
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))& r7 D, ~' }# D4 J
  207.   {
    : Z  b0 o" G/ E0 b
  208.     ret = BSP_ERROR_WRONG_PARAM;
    2 A/ i$ R. O/ d! t
  209.   }
    , m% P& ^* r! J( N  ^$ k: P
  210.   else" V% j  y. k* Z- Y9 I- [
  211.   {
    9 J/ \; w! V9 y6 F8 g
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    ' y6 Y# X) x6 a% K
  213.     {) b5 a; W  B3 G+ D" @* i
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;2 v6 z6 Y- L2 J& }, {& [& B0 A% o
  215.       Lcd_Ctx[Instance].BppFactor = 2U;
    ' R, V9 y& A" k2 I4 V1 Y
  216.     }
    7 ]+ V7 S( d( @" Z
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)( C0 _4 U& ^/ y0 {3 y
  218.     {: R% a/ ?6 k6 `* F5 E
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;
    & D$ ~9 {* `- u- v3 }
  220.       Lcd_Ctx[Instance].BppFactor = 3U;
    ; C) {0 g# O5 N' |
  221.     }, m! `8 A- l+ X& \9 D/ L6 Y! ?
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444), e+ v+ {; @2 [
  223.     {
    / ^( X! t: ]+ }3 v
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;, k- ~$ g1 E) F; |; N/ o
  225.       Lcd_Ctx[Instance].BppFactor = 2U;4 J! ]+ A% p2 D! j/ L
  226.     }
    7 [; m" x7 A7 \# V- @9 G0 S) S
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */
    - z5 y. n2 c( @; E& t
  228.     {8 c6 J, i% H( X/ j$ \5 N8 N5 M
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;
    : ]) G' x/ F+ w1 b
  230.       Lcd_Ctx[Instance].BppFactor = 4U;6 Y+ v  `& _( E. o+ A' I
  231.     }+ s9 B5 g% O8 F- O' O
  232. 5 y4 H) F9 X% q7 S" D8 X5 m( j
  233.     /* Store pixel format, xsize and ysize information */
    5 T! w% @' O- y" @: q, v% Q6 c- @
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;0 N& U8 c( ~. p; \7 ^' E
  235.     Lcd_Ctx[Instance].XSize  = Width;: o4 n. z7 f# a0 H/ `* v& {* p
  236.     Lcd_Ctx[Instance].YSize  = Height;2 l. K8 q+ i1 t

  237.   u6 B! L6 A4 f: H, ?
  238.     /* Initializes peripherals instance value */( Z$ e" ~* v3 u- m2 F
  239.     hlcd_ltdc.Instance = LTDC;
    3 B" }7 N0 |7 x  I
  240.     hlcd_dma2d.Instance = DMA2D;% H- A! N. C: c& n
  241. 3 j: Q  Q/ _2 d6 G( ?
  242.     /* MSP initialization */7 L$ H( Y6 ~, A+ `% Q& V8 ^6 m6 c
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    : M" v4 F, C0 c, a2 n- B; s
  244.     /* Register the LTDC MSP Callbacks */
    . c' x- `4 v* n
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)
    # w/ w/ V9 H$ M4 R
  246.     {  d5 G: j# {- O7 n5 ^* t) H
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)
    % z. G% T8 v7 W/ o$ t% N
  248.       {" _& M4 N. B: u1 ?
  249.         return BSP_ERROR_PERIPH_FAILURE;& \* B) `" r5 o( D
  250.       }
    1 {2 S) k/ {% B( m& f2 O& M6 Q
  251.     }
    ( i5 h! [/ H' Y( P9 K0 G! i5 g
  252. #else
    ) \; N8 N3 t* Q0 O8 b) h# q! l% W( s
  253.     LTDC_MspInit(&hlcd_ltdc);: ]; K% i/ e* d0 c# z, P5 l
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    ) c. B2 H4 |2 k- T8 U. a

  255. ' P0 ?, y: Q7 |
  256.     DMA2D_MspInit(&hlcd_dma2d);
    + M1 z- Q+ `8 |% q. W

  257. 1 z% K7 C4 f8 _5 p$ Y$ ^
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)
    / k  q* N' b9 D  @4 z* I
  259.     {
    7 v3 ~$ h8 l) m: q/ l( b5 Y
  260.       ret = BSP_ERROR_PERIPH_FAILURE;. [& s! o, {$ Q, i6 A: R8 s& V" D
  261.     }7 V$ \2 x( S3 p6 @2 g$ D
  262.     else5 n( @; |2 N9 T5 O5 d
  263.     {' l6 K) m! j3 E8 [4 H8 K- @
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)
    ; T- l) ~% {( E1 j( B; [2 G0 G' G
  265.       {
    1 S( T. q+ Y/ ^/ k. S
  266.         ret = BSP_ERROR_PERIPH_FAILURE;$ G( Z, f, G# K+ ]3 |4 J
  267.       }) O. v# n% S2 u- f. M9 ]
  268.     }+ Z" h; e1 ~4 a3 w) W, s1 h1 w
  269. % O$ M7 g7 @! s0 u" {, s2 ^. H
  270.     if (ret == BSP_ERROR_NONE)' [3 I7 ?* I2 u$ ^5 {
  271.     {
    & |  ^9 R$ U+ U4 t1 J+ j( J* t& I0 U
  272. #if defined(DATA_IN_ExtRAM): Q/ O5 c" d$ H3 e5 ^
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */
    ' @3 K1 K% |2 C3 r
  274.       /* Initialize the XSPI RAM */
    * F/ l* U) N* ^; e& D
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)6 I1 J8 `- c) I* U/ c
  276.       {8 v- }6 B# d* R3 R5 d
  277.         ret = BSP_ERROR_NO_INIT;/ b1 J0 p4 v$ N$ b
  278.       }+ y* \3 G3 U: n7 t' f2 Q* a
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)
    . H' p0 [1 t4 m; J
  280.       {' {/ ?+ J/ {: Q8 p  Y. @
  281.         ret = BSP_ERROR_PERIPH_FAILURE;# P* W9 {  p1 N: `6 [
  282.       }% I7 E( T, J4 a. R) a' S8 y
  283.       else
    6 Q3 I4 H7 \" l, b" c
  284.       {% ^, y% h( u* _/ K* k; w) H8 K
  285. #endif /* DATA_IN_ExtRAM */
    & I* X# f, ^4 t. }
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling
    ! n5 d/ D( b7 c; p$ e1 f( z; K4 l
  287.         BSP_LCD_ConfigLayer() at application level */6 `# S( I1 L. I( W1 C
  288.         config.X0          = 0;& x3 \& a( w. I, e
  289.         config.X1          = Width;
    ( e2 R1 n6 v2 z2 l
  290.         config.Y0          = 0;# r+ A+ }5 `" d( S0 y( A- [2 i7 i
  291.         config.Y1          = Height;0 H- O$ O) m9 ]# P$ u
  292.         config.PixelFormat = ltdc_pixel_format;
    ' E2 K1 q. T- Q% b0 B  q! I$ ~
  293.         config.Address     = LCD_LAYER_0_ADDRESS;: Y; q$ e9 w# Z# G
  294. 0 C, ?: e1 e# S" D+ {
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)9 S: W2 C: |; U4 l! g' b: p
  296.         {9 O+ L2 b- v% G
  297.           ret = BSP_ERROR_PERIPH_FAILURE;. \! @4 M8 Q9 t- @$ b4 h% S: X
  298.         }
    % s8 g) Q9 e, D; M& L: z- S+ U8 r4 R
  299. ' e, B( q' w2 k
  300.         /* By default the reload is activated and executed immediately */
    ; N: i9 L, s/ I& f, \8 i0 d* s
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;8 N. d* ~! S3 n3 P0 j+ _. A- b, c
  302. #if defined(DATA_IN_ExtRAM)
    # g' c+ n( R$ n
  303.       }
    6 Z5 V! z& \! \
  304. #endif /* DATA_IN_ExtRAM */
    , ?9 O' R. q% {- ^) h. e; p
  305.     }
    $ S( c$ a3 R# g8 v* h6 L4 C' M
  306.   }
    $ v1 a4 q- c% O" j
  307. ' E) Y+ y5 a$ e
  308.   return ret;
    ! a: I& K6 q/ P! @
  309. }6 ]6 v9 W( S( H3 k  y2 T

  310. 0 S/ y9 R; f# m, r& ^
  311. /**
    9 c: ~8 R- {+ U! P
  312.   * @brief  De-Initializes the LCD resources.9 Z7 o+ t/ E; |" o/ B1 ?
  313.   * @param  Instance    LCD Instance# H5 N0 I8 [& K1 W! C- s
  314.   * @retval BSP status& J+ N$ @; i  [7 K0 Y9 p! ~
  315.   */$ W2 G: I; I/ D$ H5 _
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)
    , o( u( H: T0 w" x/ p
  317. {' I5 U: D% U; n: p+ ]
  318.   int32_t ret = BSP_ERROR_NONE;
    ' W$ n# @/ m& @) [/ K

  319. ! j5 X7 F4 q+ r+ E3 p* N
  320.   if(Instance >= LCD_INSTANCES_NBR)
    3 ^7 p8 r0 s+ N/ ]6 z" b6 Q
  321.   {" z4 Q! w/ m. ~) j8 ]
  322.     ret = BSP_ERROR_WRONG_PARAM;0 F  E) a$ z. U: D# Y; b) [( D
  323.   }
    : C% P' c- m. z, M: t, N9 z# R
  324.   else3 n9 Y3 K/ k5 \! f6 c
  325.   {! _; e: o. \+ p0 s3 K
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)2 E% |' U/ O; N) Z3 c% Y
  327.     LTDC_MspDeInit(&hlcd_ltdc);
    9 V* g7 i9 A% v& z' G
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */
    , J4 q" D* f$ V) l# T' i

  329. * M* L, |5 ~$ ~! O# ~" u( `
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);
    ( V& d( q- Z, Q  F, G# _
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)0 G4 |5 X* P, T9 f- ]# D7 s4 k2 Y2 y
  332.     {
    ! c5 J3 N8 e& ~& s! r; h/ y
  333.       ret = BSP_ERROR_PERIPH_FAILURE;
    : J/ g* G$ A" e+ j$ p
  334.     }$ Y) C0 y$ T* V
  335.     else
    ! z, |0 ^( Y, i4 G) c0 l
  336.     {
    $ d9 k7 d; ~9 s) H, \8 F
  337.       DMA2D_MspDeInit(&hlcd_dma2d);
    7 Y5 ^9 q2 P  W; w( P8 X
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;' k$ U0 v0 b" Q$ `7 S6 W) X
  339.     }
    " E9 g/ a2 p( H0 q  `7 e
  340.   }  J' \( N/ C% q; z; ^# ?7 n, Z! Q

  341. # E, m0 z6 p$ K1 i
  342.   return ret;* C( ~, t0 C# d0 ~, f0 F* v
  343. }: o2 r7 n0 B( R% L* b

  344. $ {/ f% n0 W5 ]0 H# X7 [; c
  345. /**
    % p+ ^5 C" k' U) }( `
  346.   * @brief  Initializes the LTDC.
    " S* Y% r( y) s
  347.   * @param  hltdc  LTDC handle: l; i" x, M9 C7 K/ n
  348.   * @param  Width  LTDC width
    $ n; R! \9 v, t& T( Z1 K/ T; [
  349.   * @param  Height LTDC height4 L% R( @6 h, @8 I8 v; L. A
  350.   * @retval HAL status& d7 j& }3 j: W# \) K; y7 T' L
  351.   */
    + F( J( o; j1 C9 B1 y- b: {
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)
    8 |8 @( D& ?. j8 K% P' A5 k
  353. {
    " ?9 X) B3 [2 n" x4 }5 q  N5 b
  354.   hltdc->Instance = LTDC;/ j3 C5 u! T. h5 G
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;
    ) l; p- h* }! B, e, v$ u6 k- M
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;# o$ ^& P. b( ]
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;
    3 B) p( M3 I8 V
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;  E7 w- h6 D# L* t' ^
  359. 8 h4 W- g* O) F2 v, m
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;" _# _3 `8 Z9 Q
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;
    1 @; c9 l0 O8 U2 F! c
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;! U' d( ]& u, y, Y7 c3 ~
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;
    ; Y! d+ k, ?: Y9 d
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;
    % L! ]& e  M; {, Z/ ?
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;6 _, T7 k+ u- ]9 o% H3 ~3 e. ]
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;& J8 E" c8 I3 e. A) m
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;! C$ D1 q4 j5 H2 M" v$ J

  368. " u) V" |- |6 g8 C# d$ v+ f, f
  369.   hltdc->Init.Backcolor.Blue  = 0x0;
    3 P  L* ]6 F( ~9 h
  370.   hltdc->Init.Backcolor.Green = 0x0;2 D: x3 [+ U( I  S
  371.   hltdc->Init.Backcolor.Red   = 0x0;/ q9 y$ W7 h5 O7 a% Y+ h4 e
  372. % E8 P& J0 r% G
  373.   return HAL_LTDC_Init(hltdc);1 g4 x6 m/ H, N$ Y8 s( R8 q
  374. }
    + q9 I& l+ D; E3 H2 }
  375. 1 {+ b8 L8 W- C, T
  376. /**$ b% N$ v. ]  N/ n' u
  377.   * @brief  MX LTDC layer configuration.3 M9 b2 [3 q& i9 \
  378.   * @param  hltdc      LTDC handle
    # a% k! C8 H2 Y
  379.   * @param  LayerIndex Layer 0 or 1& K% G9 m( I3 y) Z; F) ?: g, q
  380.   * @param  Config     Layer configuration& W$ D3 M% r7 Y2 \& ]6 {, w
  381.   * @retval HAL status
    4 x8 V9 ?5 g, A6 q5 U9 Z9 k
  382.   */3 v! Y5 y) e9 Y9 U* G
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)  f$ e# b+ p% |) Y
  384. {3 `6 w; i* q3 ]5 R  j* @& w' P* w3 N
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};
    - ~' F$ k- j1 q9 k' K- A

  386. % @# y& z8 a5 t
  387.   pLayerCfg.WindowX0 = Config->X0;2 E1 J; X6 i0 q* w$ M
  388.   pLayerCfg.WindowX1 = Config->X1;
    8 \% L* Z/ S8 }7 H4 B% P0 H
  389.   pLayerCfg.WindowY0 = Config->Y0;
    0 q# D/ g& t7 l8 l
  390.   pLayerCfg.WindowY1 = Config->Y1;
    : K( Q+ }% i( f( `) c$ o
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;
    8 v2 f+ @2 S+ P/ y, d( g2 S9 f) j
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;  @0 O1 u+ d) D- E
  393.   pLayerCfg.Alpha0 = 0;
    & I, j. x5 S) v9 E- _. R9 s) y! D
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;! s5 D9 |/ c- x5 m% N! t
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;. B# |6 b7 I/ ^& H
  396.   pLayerCfg.FBStartAdress = Config->Address;" }  Y4 V$ ^; T8 ^+ A3 g! Z
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);
    6 H# L. V, F) d: Y8 @$ w) f3 \/ Q
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);
    * K! O7 `: T+ G7 w* ?; |( |
  399.   pLayerCfg.Backcolor.Blue = 0;
    5 D& ]' {4 W' B8 b
  400.   pLayerCfg.Backcolor.Green = 0;
    7 Q8 |. l5 U, @8 m" R3 a0 Y
  401.   pLayerCfg.Backcolor.Red = 0;
    3 }3 h; [, |; r4 W
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);6 ~, D) {5 w3 i  v, f
  403. }
    $ t, J' |! N  ~1 I

  404. , y  r% d1 Y0 N( k* H
  405. /**
    4 `6 ]5 `' w! \9 I; A
  406.   * @brief  LTDC Clock Config for LCD DPI display.5 L9 n. }$ T; Y) T! O  f* |; O
  407.   * @param  hltdc  LTDC Handle
    0 m7 R7 K" H1 b1 ~+ l4 ^% d
  408.   *         Being __weak it can be overwritten by the application
    ( p1 F8 d3 A) a5 n' [
  409.   * @retval HAL_status/ a# X- _  B1 ^3 E. P9 e2 h* S
  410.   */- E- v+ a; [: d" d& s
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)! M7 X6 w2 k! R' o
  412. {) `1 `0 `' h- y( N; k& d( z/ r
  413.   /* Prevent unused argument(s) compilation warning */# I: M/ @4 k2 d( u2 l" ?, n; h' r" c5 B
  414.   UNUSED(hltdc);2 C8 e' C5 J: i- s

  415. ' P7 W! [2 {' z
  416.   HAL_StatusTypeDef   status =  HAL_OK;
    ) k: V" V& C' P% R; d
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};" O. j' T& q+ ?$ f, R* o

  418. 8 P1 {+ d/ \. z, z* e
  419.   /* LCD clock configuration */, U' v1 z. |( Z! p( _$ }
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    4 v% d, C/ A# w) }2 x6 G
  421.   /* LTDC - PLL4 */
    ; A! v' `; [1 l- ^
  422.   /* Configure LTDC clock to IC16 with PLL4  */
    ( r* N& m. w. h# V

  423. ( L' w* N2 J- e4 n/ ~* \
  424.   /* LCD clock configuration */
    * ?3 ]# ~9 d4 e& q* m
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    ; q* d7 }, V+ Z! @
  426.   /* LCD clock configuration */* p9 `" q5 _7 J" b2 p( K$ d
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */+ s. m$ T+ \0 ?
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */" _5 d# S* U& p, M
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */" h5 Q& |/ U# c2 D% }
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */
    $ x# k$ U. k/ c+ f4 H, b+ t0 s

  431. * [) @( S4 `! ~- ?$ E2 b
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
      p8 a$ u' u+ U, u* {3 q8 P  ~/ U/ G
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;  y/ n: \8 N  e( I1 R
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;: d* R6 @* [; ?3 a2 f- n( h' o
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
    3 b9 K2 A9 Q3 W5 |4 u0 {
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    " v( B  s( u3 j$ q, h
  437.   {
    . \( h3 x% Y" |8 B- E
  438.     status = HAL_ERROR;# M% r& N8 E$ B
  439.   }, ]& j8 b6 @7 k" m0 b! D

  440. * D" z2 s- \) |
  441.   return status;5 G( w! j. I* Q6 Q4 q
  442. }
    3 X# E# ?( ?0 o- ^' D/ W* V9 `# r
  443. : |. B3 Z1 z9 J
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    9 b& \$ H5 d" R1 m
  445. /**) q% e  s- U" e' H% U( p: f
  446.   * @brief Default BSP LCD Msp Callbacks
    ' V/ \' U1 G: C3 D& t
  447.   * @param Instance BSP LCD Instance
    & U# M6 m+ j$ i1 d9 m
  448.   * @retval BSP status) w# E: z" u( {% A, I" e# G
  449.   */
    : U0 I' T$ V# q3 X4 Z& _
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance); T4 l2 o/ U- g3 A: F5 ^1 U
  451. {! R) B' ]& y* R1 m
  452.   int32_t ret = BSP_ERROR_NONE;( {: c; }8 C% b$ G, {4 p
  453. / h7 n4 D! _9 ~) x9 f
  454.   if(Instance >= LCD_INSTANCES_NBR)( D6 w! l# r# I9 D2 |
  455.   {; b! A( r$ w" ~+ j+ u9 ^
  456.     ret = BSP_ERROR_WRONG_PARAM;/ {! y9 p/ n! _& h) _" [2 ~, C9 z
  457.   }7 o) x* N% ]$ I! I- l% |
  458.   else
    ( r7 X5 Z1 Y9 ?2 d  J! P
  459.   {
    8 i5 |* `( \9 {/ i  T0 L
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)
    ; {, x# r9 J$ l- N4 s
  461.     {# f, ^* J# Q8 M6 [' u' h: @
  462.       ret = BSP_ERROR_PERIPH_FAILURE;
    ; h* ^1 K$ m' V6 o  X
  463.     }
    7 {0 Q2 v) X! U5 ]; s- z
  464.     else
    * e3 J' l4 _, C, ~+ f( i
  465.     {
    ; v" E) `/ `( F7 b5 O: o4 D
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    $ O; h% U: h" X  f
  467.       {, V  q# a4 j& n3 s+ [
  468.         ret = BSP_ERROR_PERIPH_FAILURE;! u  K; f" o% e: y  j' E. a( |
  469.       }
    - O( A$ D; x  f- m/ W
  470.     }: H$ U% @3 ?% L7 D2 y# O# h

  471. % u6 U: w# B* \/ N
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;. D# S) [8 h' z2 u" i2 S
  473.   }
    1 f& ^6 n, Y1 g4 R' A
  474. 6 E6 A3 h+ T/ S7 [6 |" M" F
  475.   return ret;0 x. S' K6 e& p/ Y+ D; l0 Q8 _) }
  476. }6 A& W5 `9 A3 J" a5 u: i
  477. ; A4 h, d: A! r8 ~# f# J" [
  478. /**) I1 c" O/ {- [( o8 j3 h0 |
  479.   * @brief BSP LCD Msp Callback registering
    ( Y. G( S  k0 \: V$ o  m# _4 u7 c* `
  480.   * @param Instance    LCD Instance
    # j$ e4 L; w2 m7 }  ]5 G* ^
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions
    ! C$ n7 y" @, r, h8 y% ]2 X' r7 I
  482.   * @retval BSP status! D( k% B# {& t7 o$ {
  483.   */4 K: ^. p7 n. M: V
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)4 o" I8 S% ?; z
  485. {
    , ]; O8 B7 T- Q, q, ^- P
  486.   int32_t ret = BSP_ERROR_NONE;/ H+ U# v/ W( U" p% p" R8 Z& B- e

  487. - r2 i1 z" Z+ B
  488.   if(Instance >= LCD_INSTANCES_NBR)8 g- H) B- N$ ~3 x( {
  489.   {5 m' W! e! h8 I. J9 x. }4 c
  490.     ret = BSP_ERROR_WRONG_PARAM;) Q+ _+ c% Q0 C/ \% O  ~* K; w
  491.   }# p4 ]" j& J; L2 ]5 T
  492.   else
    0 u; d  Y! }% Y
  493.   {: y, N* |" f+ A# l4 l7 R
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)
    9 |$ o; }, C$ X8 r% U# q: l1 s4 ?
  495.     {
    % S0 U* S; L9 A$ o1 D# n, N
  496.       ret = BSP_ERROR_PERIPH_FAILURE;
    & ^/ {* e( {5 E2 q
  497.     }
    7 r3 _; V, `6 M9 {, I* I% e
  498.     else2 A" q: x6 }% |. |
  499.     {( p# x! @0 d6 j# M1 E, p0 p1 P
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)
    0 G+ u4 @0 d9 y5 I$ `3 M4 |
  501.       {
    0 N5 r* x( f% }' L
  502.         ret = BSP_ERROR_PERIPH_FAILURE;
    # S- d) |2 c) D, w( j4 u) l
  503.       }( z1 j# [- e  a* I
  504.     }1 ^( v* ^, X2 `

  505. & R3 o+ S( F$ s$ w) w" T
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    ; t  |9 `( F( X( D0 u4 O3 _
  507.   }
    0 V4 c2 r5 {2 X: m# Z- q
  508.   I% L, g! D& {1 R2 V: l4 N+ p
  509.   return ret;3 m$ X, s1 X$ \  X' ^
  510. }/ a3 z( O. {# s% z
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    1 i7 S. S" v2 G& K2 n* H' X
  512. - J. d$ k. \9 R( M9 L# Z
  513. /**
    , \% \  ^, R: Z; n1 f: n$ d& R
  514.   * @brief  LTDC layer configuration.- d& E7 j, P9 O# C: s
  515.   * @param  Instance   LCD instance) D0 D. K3 H5 f6 [1 d7 g2 I% `" V
  516.   * @param  LayerIndex Layer 0 or 17 u$ S* h) z! r5 T) b8 U5 }
  517.   * @param  Config     Layer configuration
    * R% e! q9 T# ]2 C& i3 U
  518.   * @retval HAL status
    4 q/ n3 N3 Q% \3 r3 }8 ^) O9 R% F  B/ |
  519.   */
    ' |' `5 S: q: t! ~0 L. {& n: z
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)
    ! Y+ R& @' e& \+ t% y$ ^2 M) b7 W
  521. {  s( H$ Z9 [: V% U, F+ m
  522.   int32_t ret = BSP_ERROR_NONE;  s& `5 M5 l! ?* S
  523.   if(Instance >= LCD_INSTANCES_NBR)6 B. x! g8 |& F9 j$ J+ J( i
  524.   {' e9 ]7 l+ G, Y2 w- k& g, E
  525.     ret = BSP_ERROR_WRONG_PARAM;
    % u* n1 B8 G+ L/ O& \6 ~
  526.   }9 I/ P! G) A" H( f( B
  527.   else
    % r9 z3 h( B: Q- Y* w
  528.   {
    9 ]4 r. X& j; ~+ P* ?) l+ U* j3 S/ ~/ Q; @
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)
    . r4 {5 y( t; a; U" V0 v
  530.     {8 Q3 @7 a( z* B9 @7 N3 _
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;2 T: }" U- C1 m9 c2 `9 m6 q  [1 E
  532.     }1 J4 F4 \$ K9 P5 j0 L
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)
    6 z  Q4 N; {, \+ o/ d
  534.     {
    $ ]! D. T* R+ Z; i% M1 C9 W* i/ K
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;0 V' C  G' m' ^2 M/ v  L8 m
  536.     }
    3 W6 u$ `9 u1 G  M/ A2 c3 f
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888). }& _2 Q# O5 y+ i1 J
  538.     {3 k3 b5 ]/ G5 O( T* Y" S
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;$ X8 c( _7 H# r7 S# Z
  540.     }0 `4 Q6 B- X/ G1 c7 X4 Z
  541.     else
    1 r* n2 _  l% H! i: b
  542.     {
    # {6 {' P4 P2 m% @( [
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;* S4 v# `, x- j
  544.     }+ J/ p; j3 C5 W
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)
    8 J+ |1 _, S. f3 `' E0 @) x# C
  546.     {
    6 z! u) O0 w  {0 t) p; D
  547.       ret = BSP_ERROR_PERIPH_FAILURE;
    : |7 u# F. S& X) r) {" o
  548.     }: ~3 k# e5 |1 k
  549.   }
    % ]& q) |! O3 H* ]
  550.   return ret;
    % s) x8 ~- P% j! L
  551. }* }# _( [# @  f. `5 w

  552. / x( W& P/ j: m* F/ _: F# A5 c$ S
  553. /**
    3 B8 r! C7 Y' }0 p; X
  554.   * @brief  Gets the LCD Active LCD Pixel Format.! ^& L/ V) V' G' s
  555.   * @param  Instance    LCD Instance! d1 m# |/ k* A. Y. i
  556.   * @param  PixelFormat Active LCD Pixel Format1 k. z( E9 D  C/ w2 C- g
  557.   * @retval BSP status4 l2 c8 A0 E  p3 m
  558.   */
    ! |" X+ G- I, B+ ]- R9 K% R* z
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)+ m5 D# j8 N: d1 N( _( Z0 Y  _
  560. {6 L5 Q, o) }# Q% |) f- B
  561.   int32_t ret = BSP_ERROR_NONE;
    " z  o; R. U% X. u+ v$ t

  562. 9 y1 r- x$ g! C
  563.   if(Instance >= LCD_INSTANCES_NBR)+ o' G* v: N/ s3 I, c
  564.   {5 U; d8 P7 \2 i4 B
  565.     ret = BSP_ERROR_WRONG_PARAM;
    # P) p) v9 q, S5 a. F/ Y) ?- \7 a4 D
  566.   }: g' k6 J6 S9 K  g2 P# @
  567.   else+ y3 z5 b0 R. C5 {- N
  568.   {
    / w) b: ?0 ~2 ~& Q3 l; e; r1 _
  569.     /* Only RGB565 format is supported */; A: e3 e% d/ g% Q; \1 ^
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;
    * i1 K7 O0 ]0 P1 T/ M4 u
  571.   }
    3 @9 Y  N4 E3 ?

  572.   s9 H; @8 h8 B3 T
  573.   return ret;
    3 w( _3 i( \6 T) D2 v. p7 f
  574. }0 \" G- S: n/ x& \# U& m
  575. 6 v- u, P5 u4 N3 f' u, v* X! Y: _
  576. /**# M. |& {* E% ~; B
  577.   * @brief  Set the LCD Active Layer.) ^8 l8 f/ D9 {! J( {8 d4 I& C
  578.   * @param  Instance    LCD Instance" r. C( b' m; a2 i2 E- K1 A% S; l
  579.   * @param  LayerIndex  LCD layer index
    ) x- }4 o  B- q* L
  580.   * @retval BSP status* a, U; ~. R( J4 a, K$ g* y# L
  581.   */
    & W- p: P# N  E
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)
    ) e' f% B- w$ F+ p
  583. {
    + }4 Q9 [3 V. M2 @6 d
  584.   int32_t ret = BSP_ERROR_NONE;- n$ Y% z* u% }& M# M( V. x
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;; h. y* D/ v- n0 J+ F! i' z

  586. # W5 [& |7 i4 X  U! n5 X& x( Q" O
  587.   if(Instance >= LCD_INSTANCES_NBR)3 {4 }4 `/ q# g9 ~1 Z% `
  588.   {
    % O, y1 E" ^/ z2 ]2 d
  589.     ret = BSP_ERROR_WRONG_PARAM;- n3 K; `% q. n8 O- c2 z
  590.   }
    # J+ E1 q3 @. T
  591.   else
    1 D0 f# |8 r" D  U) k% @
  592.   {
    * \+ d  W* }( ?! B& m
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];
    9 G$ V2 Z* y. ^" h

  594. # ?9 n1 H& q. V5 Y$ _
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;/ U) H1 X. H& z4 V
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;
    " n# {0 x- r. @# d; R7 S: k
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;
    & a9 Z- ^7 q9 T: o; Z# B

  598. & a& H0 S+ l, I; o) y6 B8 `7 X' T
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
    ( H4 n1 P& Y2 A5 S( O, ^" [
  600.     {
    # |0 ]9 r& w. J+ J) i+ j; Z
  601.       Lcd_Ctx[Instance].BppFactor = 2;
    1 m7 R# `. z6 r
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;' V, b3 S3 t# e. X
  603.     }
    * D" D0 D4 t5 q9 G+ i+ e
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)
    4 e9 A  J" W4 ]' ^7 `- y
  605.     {) u( D) k1 V/ e! c1 C" ^
  606.       Lcd_Ctx[Instance].BppFactor = 2;
    6 A9 I5 Z% R/ D. L; G+ I
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;4 ^) Q  w* }* g$ o. Y
  608.     }, w( Q' r% `% y' t
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)- a: v% {! Q$ ^! M
  610.     {
    0 W9 x9 _+ P; p& U( K+ n) l6 r- G
  611.       Lcd_Ctx[Instance].BppFactor = 3;3 a$ u+ K. p! [2 G  I; y" W5 A
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;6 b+ |; W. t9 J+ g7 m% r
  613.     }
    + ]- r* W8 l9 U  b
  614.     else
    5 E% {8 {+ n( U3 t0 B
  615.     {6 j" w7 p! \* U+ q( p2 X
  616.       Lcd_Ctx[Instance].BppFactor = 4;1 H- F- [2 V& T5 Q
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;* ^( l. u! x0 ~' {
  618.     }7 c4 j6 q0 ~" i0 w* I% W/ V. [
  619.   }4 p: b2 s9 y+ U, w5 R

  620. 7 A- |% o- u+ Y
  621.   return ret;
    * Q  n. _; e$ c1 I& T5 {9 Y
  622. }
    ) m2 M$ \* w0 H8 r9 K
  623. 0 ]5 E0 G$ D& J
  624. /**
    ( q7 Y- [  B, t+ M/ ^0 V
  625.   * @brief  Control the LTDC reload* R) X2 J0 i" l& Q
  626.   * @param  Instance    LCD Instance
    - I8 c! t- w5 j9 n. K* ?- I1 X* j# C7 L
  627.   * @param  ReloadType can be one of the following values: L4 t6 _( Z- S
  628.   *         - BSP_LCD_RELOAD_NONE/ B) z9 l5 y( d8 G& T' N+ l4 G* `
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE
    3 _2 i1 D* _: Z3 j' l" L
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING* l7 u0 f+ L- D- ~* N) ]5 y, ?
  631.   * @retval BSP status
    ; G. E8 Q: R+ ?7 ], [
  632.   */" q* ?% i) k$ V/ z& s6 ?& d/ ]: `
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType): ?3 f# Q0 e! ?* c$ F8 G: w( q
  634. {
    7 ]8 [) _9 T; r& S1 \5 {9 Q
  635.   int32_t ret = BSP_ERROR_NONE;7 E( i! b6 X4 y2 c* _
  636. . X5 ?/ B# |. y0 |  K. n' T9 D
  637.   if(Instance >= LCD_INSTANCES_NBR)
    2 A6 {3 ~4 Z3 P4 S8 p/ F+ W
  638.   {  a3 j  X5 A9 d. K. O* W, \
  639.     ret = BSP_ERROR_WRONG_PARAM;- Q! Y0 {$ z2 \. h# u) v2 o
  640.   }
    % X& b6 {3 M9 l# b0 I" ]
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)
    : [+ g, U9 @1 [2 c
  642.   {
    7 c; O: W+ [% N4 ?  |- S
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;: c0 z. b: c( g9 g/ u; M
  644.   }
    ) n4 D/ k. A; T
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)5 c, u1 B( F: B: K' h6 |
  646.   {
    * ^7 X2 K& v# K
  647.     ret = BSP_ERROR_PERIPH_FAILURE;
    1 a1 H8 Y; x0 {% C) W
  648.   }
    6 s; [' |! R! J- {2 A5 z
  649.   else
    & }" b1 e( g: S1 H. f' r
  650.   {
    4 g" o( N/ X& S, [2 c7 P- l
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;: ]% a& P3 C( l+ T9 ~+ j3 F& i, [* B
  652.   }
    1 r% N1 [4 Y' ^/ l1 Y# I( ^
  653. 7 m# }# @& W- D1 D/ J
  654.   return ret;
    ) x7 M) c7 A6 ?- O; @# ~
  655. }- v; D8 M9 l5 M! q& u" {" Q

  656. + y" r4 L. J) ]% n4 ~
  657. /**
    ) F" H$ N' i5 i* j- Y# W8 F2 p
  658.   * @brief  Sets an LCD Layer visible5 h3 ~3 F- m9 y* W( E) d
  659.   * @param  Instance    LCD Instance
    9 H9 X+ r& K6 Z" a4 V2 _
  660.   * @param  LayerIndex  Visible Layer
    + M) I0 t7 N  F
  661.   * @param  State  New state of the specified layer
    ! Y3 k$ H9 Q  K8 j) r! ^
  662.   *          This parameter can be one of the following values:
    ( ~+ b, t6 J) E- r4 i
  663.   *            @arg  ENABLE
    . r1 u9 B8 p5 t" |
  664.   *            @arg  DISABLE
    ' z, y8 O* _, f% v% h
  665.   * @retval BSP status
    / x' e& D: d; b4 m5 ^( t, d% i5 v
  666.   */
    , I2 w9 ^  K- J8 y9 P3 I5 F
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)
    ( {  K' p; v" q) x  G
  668. {
    & B* |9 W% j7 D1 ]7 K9 a
  669.   int32_t ret = BSP_ERROR_NONE;
    & g2 D9 J, c7 F, ?1 X

  670. . Y# t8 J+ u* ?! I
  671.   if(Instance >= LCD_INSTANCES_NBR)' E9 ~( X0 X- m4 F0 m
  672.   {* M- H9 B  y: [9 H. M" a7 |# w
  673.     ret = BSP_ERROR_WRONG_PARAM;* N5 g# c3 n2 T1 l. n1 S
  674.   }9 C- M4 T0 @0 {- b
  675.   else
    * f/ F4 p' P; _5 F$ ?, F
  676.   {; ?+ C8 x9 O' {% {
  677.     if(State == ENABLE)
    & G( L1 g: `. V& o) S- ?
  678.     {9 n$ C! Y. Y' L' k* o
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);) h/ ^( u/ Z% H5 q7 S" o
  680.     }) c/ P" u5 m3 n, c
  681.     else) O1 P9 c( ?6 @, F
  682.     {, O8 `% G, ~5 J. M2 p2 A2 g
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);
    & C& ^* `" K3 J, t
  684.     }6 E1 P( E# j0 `. ~: m0 T) ^( i
  685. 6 Z6 L  n% |1 t5 O+ B
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    - i6 I! r4 `( l# o+ i5 N) h/ U
  687.     {! G% I/ p; {  D& C
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);
    ' ~% g$ C0 O% i6 X3 k
  689.     }, e7 e0 P  v  \( q+ \9 r7 s
  690.   }& \( O" M2 e4 J! o2 x
  691. 1 w6 l! _. S' U
  692.   return ret;
    4 X1 l* v! y  ^5 U
  693. }0 U- H; O. \$ P6 e- U: e

  694. 1 y5 c: I% y+ ~  E# h0 }
  695. /**
    ' v: C" W; M# k
  696.   * @brief  Configures the transparency." F9 f: r( Q+ J/ _/ B7 y9 g4 G9 N
  697.   * @param  Instance      LCD Instance$ D" M$ G4 z# x' R* E. E0 m
  698.   * @param  LayerIndex    Layer foreground or background.
    5 v1 e: x! b' F2 ?! \7 P9 b- I
  699.   * @param  Transparency  Transparency
    & f' O" L! {) J( q
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF, [5 z5 S; M& z) W
  701.   * @retval BSP status: B: E: U4 E+ @# p& o
  702.   */
    : m2 F7 R- G2 r6 ~0 u! X$ s
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)6 Y6 C5 H9 j3 y: N8 b  K
  704. {( C4 w6 f; R* _1 L$ ]
  705.   int32_t ret = BSP_ERROR_NONE;2 n2 C9 p8 Y6 g. V, @; L
  706. . T5 a0 v# i/ {' x1 C
  707.   if(Instance >= LCD_INSTANCES_NBR)
    2 d% ~2 N+ E" o; J0 q
  708.   {: ^% M1 Y: X# U
  709.     ret = BSP_ERROR_WRONG_PARAM;
    2 `8 M) _1 h  F+ x# [9 I
  710.   }9 Z5 o' d* K# J- J# l4 Q$ W
  711.   else
      H& {0 q; g% q/ L$ P$ w
  712.   {
    5 [8 J+ @. a- {- m+ ^
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ) `6 N: ^( C5 l
  714.     {
    ( ~) U9 j; P  ~9 }2 p  o
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);% o( V8 P4 \9 [! }7 |2 n4 x7 r
  716.     }( c9 x! h, b  P
  717.     else
    8 e" }. d6 _6 ]! v. Y
  718.     {
    ' M* F% f$ k; {# L, v0 o" @
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);
    0 o# I7 J* }% R7 V3 G5 a* R
  720.     }
    , a) q/ P6 Y  Y/ d0 k$ r, B4 y8 d9 |
  721.   }1 ~5 ]2 y, I! r7 d$ T, [
  722. / p0 d; ?/ D1 s( Y# H, h  Q& D$ \6 R
  723.   return ret;1 T5 J* H3 E8 q
  724. }
    5 f, [9 ]/ g; G0 Q8 N/ _: |
  725. 8 S& G" i2 b% f8 f2 {% ?! F
  726. /**1 R8 ~* }7 q! I8 o: W. _
  727.   * @brief  Sets an LCD layer frame buffer address.
    9 @! |8 H8 _1 V* i( }, X
  728.   * @param  Instance    LCD Instance
    ) h* }! _' h- r6 O6 K; t$ {$ h9 g
  729.   * @param  LayerIndex  Layer foreground or background
    / Z- o+ c0 n2 t! m! P- u5 x3 |. Z6 V
  730.   * @param  Address     New LCD frame buffer value
    ; ?3 |. K) |+ [4 @& [
  731.   * @retval BSP status
    1 z7 u& O( m7 y" O% p
  732.   */! B9 b# n2 D, T, m6 p/ E6 k& @
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)* ], _. X0 q* r7 i
  734. {4 u! J! Y! l( ~, `4 x
  735.   int32_t ret = BSP_ERROR_NONE;
    9 P0 y; u, t; V* u; S- L
  736. " x0 J* _- o4 r8 f& W, b
  737.   if(Instance >= LCD_INSTANCES_NBR)
    - A6 r6 c8 V  w2 H1 T; c  T) @4 r
  738.   {
    ( {8 f7 O1 S2 b2 R! p
  739.     ret = BSP_ERROR_WRONG_PARAM;- ?; V4 K* M/ |
  740.   }! m" V/ u1 K8 K" I+ @: r
  741.   else& G6 M, Q. I* B9 j7 ?
  742.   {
    : \1 n8 Z+ h, B" R* e
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)' ]. g) u7 [; y! L  e2 d5 ^1 O1 O
  744.     {1 U( q, U5 C, w# H" E- j1 G3 E7 v
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);
    $ ^: c9 w. S# v( a" w) D, o4 g7 ~
  746.     }  h2 u6 h$ L( m; F
  747.     else
    / Q/ @7 W) P" u* j6 D- ^) K( q
  748.     {
    # i! E# X2 U8 f; T7 ]+ e
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);4 E; H( @  j' d' F7 M
  750.     }
    5 C7 p* q# b9 Z' q
  751.   }5 b- B, F" S( {+ ^
  752. 3 v- a# c* e- {: M6 s( L
  753.   return ret;9 r: y1 h; U1 ]% q3 Y
  754. }
    5 v# @: z: t  Q$ n) L
  755. " k( V0 n# W0 K: v
  756. /**
    ) F; C" }% M: o$ U) K' l3 o0 j* k
  757.   * @brief  Sets display window.
    : ~; L4 D" L4 z/ q) n
  758.   * @param  Instance    LCD Instance
    ( K, ?- w# V; _) ~; R
  759.   * @param  LayerIndex  Layer index  Q! H8 y3 j+ q
  760.   * @param  Xpos   LCD X position! ^) n9 N; g# N- [6 ], ]
  761.   * @param  Ypos   LCD Y position$ e* B, s" n& J3 G, t
  762.   * @param  Width  LCD window width, Q0 t9 ]8 w: i
  763.   * @param  Height LCD window height5 m5 w5 \1 O/ o# q
  764.   * @retval BSP status
    8 l9 w& Q( j4 u' ]" o, _
  765.   */
    $ a1 s' C9 d4 y  I- U7 w6 n  H
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height): o- @  f( V  p( N9 H
  767. {
    1 p3 V+ z$ ]# c
  768.   int32_t ret = BSP_ERROR_NONE;
    2 W5 r0 ~1 Z. M1 l
  769. , s) u$ W0 R8 \# ~& m& A; U# K
  770.   if(Instance >= LCD_INSTANCES_NBR)
    % v/ k0 W. }6 P1 n0 E
  771.   {
    + O8 A5 W% N, @/ R1 c- Q! w
  772.     ret = BSP_ERROR_WRONG_PARAM;
    $ K1 q. F. F6 n* B' D) z& o
  773.   }
    1 C- K: M; x6 ]! f6 @
  774.   else
    , I0 {9 N- v# g& x9 r9 A
  775.   {# i* d* q. T5 J# r
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U), ~5 s1 J6 H5 V2 v
  777.     {
    . s- A, e+ T9 _9 D/ \/ o% b: ~
  778.       /* Reconfigure the layer size  and position */
    1 O/ L  U9 H- e- r  p4 c. {5 t  `
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);
    3 l# t. U7 I7 \
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);" a' }- ~5 W3 s; \
  781.     }
    8 r5 k; Z% k% y- _- h
  782.     else7 c! l4 M' c% }; q4 Y( I- f# _3 j
  783.     {
    - b; f' M' C, E  W( f# ~4 _( Y
  784.       /* Reconfigure the layer size and position */
    0 M5 A% C5 y7 |; G/ c* }
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);( H2 z4 l9 ^. b; x3 j( F
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    , d5 i+ z. [( g. P
  787.     }
    2 w6 d$ U( A* I
  788. 9 U2 q7 U" c9 d* F
  789.     Lcd_Ctx[Instance].XSize = Width;
    $ E5 B- Q/ c1 ?/ `* x8 H
  790.     Lcd_Ctx[Instance].YSize = Height;
    , z+ }0 t" k% ]. }9 N9 ~
  791.   }
      O1 n' e3 S" U/ I
  792. , V4 [* f  W5 r3 q& k
  793.   return ret;
    2 X4 C( R5 \* z, h: v) H% [; K9 @  H* T
  794. }0 L/ p0 B5 }# j4 H
  795. # V% ]( D2 R/ w9 e7 t1 B& n
  796. /**/ r+ e' r6 z) a  ^
  797.   * @brief  Configures and sets the color keying./ H1 y' ]: }& q( K
  798.   * @param  Instance    LCD Instance
    2 u2 l8 j+ c! x3 j
  799.   * @param  LayerIndex  Layer foreground or background
    5 J9 N, C( |) m1 M# q) Q6 s' e
  800.   * @param  Color       Color reference
    1 k) Y. o( f1 M% H& S; V
  801.   * @retval BSP status; h; o+ P  ?, r. `' ^1 @
  802.   */
    0 Z4 C# k+ `( v3 e& m
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color); c# N8 V1 ?4 `. w/ e) P% K+ e
  804. {
      V+ J3 N' ]1 R1 @% A
  805.   int32_t ret = BSP_ERROR_NONE;
    3 v) L7 n% k/ K
  806. ' Z+ L3 l, |$ y- W1 R. Q
  807.   if(Instance >= LCD_INSTANCES_NBR)
    % b! Z  S# b( W1 e( A
  808.   {" G0 O2 U- }$ \: g
  809.     ret = BSP_ERROR_WRONG_PARAM;
    8 L  q. _) ]# v$ x
  810.   }0 v" B" Z1 R2 u! r- _- h" A
  811.   else
    ) s1 k$ \0 q3 A8 g
  812.   {' z1 a# i! {5 _4 [
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);
    $ n, E5 y) S/ z8 d3 U/ t
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)2 c+ v: N/ e, ^
  815.     {5 l5 I- q1 S7 W' F" n
  816.       /* Configure and Enable the color Keying for LCD Layer */
    6 H# g5 C) J4 I0 l

  817. ; D( y# H0 S: b4 [. n" Y$ e# n
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);! C* x3 p( ~3 W) _
  819.     }/ v+ f1 X" w+ p( _
  820.     else. ]  j8 f1 r- D, c
  821.     {
    + v$ f( m( A5 q
  822.       /* Configure and Enable the color Keying for LCD Layer */+ e3 z3 N7 H& D& r6 h  f
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);8 i8 P1 q8 W* B7 I3 y" i
  824.     }
    , f8 `! I+ m! k, |! f) F2 ^' n
  825.   }
    / h/ w" Z. f  N% D; P% d

  826. & ]( r5 m1 S$ V. q, Z1 I0 M
  827.   return ret;
    ; j" ?. f" A. `* F
  828. }  L9 D! a5 U$ q* C4 W2 ?1 J
  829. ' S7 s2 ?+ O4 Y  [' N1 j
  830. /**; r8 {0 k, J$ ^2 \- V' h
  831.   * @brief  Disables the color keying.8 H" j5 G8 _- \8 `, U
  832.   * @param  Instance    LCD Instance
    % l2 c  o6 F  o4 o
  833.   * @param  LayerIndex Layer foreground or background
    * a1 |, j2 i% ~1 U
  834.   * @retval BSP status
      o. N: a6 C/ }) ^9 L
  835.   */( ?3 |; T0 F/ x' n
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)
    2 e) [) s! a2 ~: B" k1 ~+ N7 E8 u8 D" R
  837. {
    5 w, K& Q% |' P
  838.   int32_t ret = BSP_ERROR_NONE;+ W7 o# r" p9 Q$ P4 W. a

  839. $ f3 R* x" T, M1 M
  840.   if(Instance >= LCD_INSTANCES_NBR)/ O/ C9 i6 |' _: F
  841.   {
    + @8 h. v: h9 @1 q# L8 ?9 U) U
  842.     ret = BSP_ERROR_WRONG_PARAM;) e3 O) p4 y/ }3 M/ C/ ~4 c
  843.   }
    , D) _0 }5 ~! Q0 b2 F, F
  844.   else  F- c$ W. H* U! h, d% p( R! T
  845.   {/ P% A; Z2 {; H$ \9 {
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)0 N9 i* {, e) c  o  i/ i
  847.     {* g: y5 z) Y- D5 d$ w/ w
  848.       /* Disable the color Keying for LCD Layer */- |) x3 a! z- {5 T
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    " P- R% w1 [9 Y# o3 J/ G! d
  850.     }
    9 T5 Y$ N6 p0 I; H! U, j- a0 S" B
  851.     else' L! D, o1 D, D( t8 G( e7 g4 d) `
  852.     {
    & F* p9 X8 v0 z, t
  853.       /* Disable the color Keying for LCD Layer */7 v0 Q: q2 H* T! Q5 t
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    . }/ `6 C5 R6 Y8 b
  855.     }- k$ A& W! `2 o" Q6 S
  856.   }/ O& x$ ]8 s( G$ |  h

  857. / }$ Q% O6 h9 d4 q3 ?
  858.   return ret;
    5 A8 N* `" w& r
  859. }
    1 {" `* O4 j; X, B0 l0 ]3 D
  860. ) p! z" f# c# k( g# w( s
  861. /**
    3 A; q' T) ~+ O7 f3 v
  862.   * @brief  Gets the LCD X size.
    6 Z% j0 L6 @5 q  M
  863.   * @param  Instance  LCD Instance" O1 ?" v! Y4 G  A
  864.   * @param  XSize     LCD width
    8 O8 `4 b4 I, ^$ M) g7 |
  865.   * @retval BSP status
    ( S+ {# e9 S0 }1 `  b
  866.   */
    : i2 f- g- C, C3 W, J
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)
    " A9 ~4 v3 w9 Y- d/ |
  868. {
    1 H7 ^  Y. y8 ~7 x/ L
  869.   int32_t ret = BSP_ERROR_NONE;
    . u0 D( i0 o8 X, G& s# z* h

  870. 2 U; e/ k8 P+ D9 |8 i- z! ^, o( F
  871.   if(Instance >= LCD_INSTANCES_NBR). W- J. m0 R2 G7 T
  872.   {" @) K. w4 b* T: \# {4 N
  873.     ret = BSP_ERROR_WRONG_PARAM;
    7 Y: v! P* }' u$ r( S4 n
  874.   }/ D' u* v+ d7 Y
  875.   else
    $ X! Q% B6 Y- ?; y
  876.   {
    : j! q7 a" M/ B
  877.     *XSize = Lcd_Ctx[Instance].XSize;
    * E3 X( p# i0 {7 x6 H
  878.   }
    ' a9 R/ d7 O, s

  879. + u/ W. M+ Q; v& h  H1 O' b
  880.   return ret;' V. }. r$ m/ J2 v
  881. }
    # ?) g$ H6 l4 \- R3 d

  882. $ t, [) k# }/ N( r% E
  883. /**
    * Z% D/ @+ m( h6 ^6 O# H' d* n
  884.   * @brief  Gets the LCD Y size.; O7 n8 u# l& u3 A
  885.   * @param  Instance  LCD Instance9 F* E( y1 O+ X
  886.   * @param  YSize     LCD Height! ^7 J1 z9 v* s7 i. D' j+ @* u
  887.   * @retval BSP status
    ) z6 r* R1 a$ j) k3 ?( S$ M
  888.   */
    4 v: g' @& y' O. F
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)# x# k+ p8 H* V  v
  890. {- k4 }4 B7 [4 i3 B6 s6 w5 b
  891.   int32_t ret = BSP_ERROR_NONE;
    . Y9 Q" _/ d: ?
  892. % {8 N9 {4 P8 V- q+ Z% M( h
  893.   if(Instance >= LCD_INSTANCES_NBR)& `( J8 D8 u4 m( T0 {8 v0 E( C
  894.   {( p4 {# @' F9 s- h2 e% A/ I  C
  895.     ret = BSP_ERROR_WRONG_PARAM;0 U3 c3 M4 Z! O- E
  896.   }
    ! i4 C; C( ]* @8 }
  897.   else
    ! N3 D$ o( C, n5 r( \; v
  898.   {
    2 J, c  _+ R4 s% s" X& D
  899.     *YSize = Lcd_Ctx[Instance].YSize;6 W3 F3 F  \& Z3 U
  900.   }6 o2 y  F8 G( U2 @4 }% A
  901. & G( W6 ^3 ^7 u& z( u( t
  902.   return ret;
    # ?2 ?: y9 Y/ v0 |' L
  903. }2 e) }: {. j6 I9 j
  904. ) F0 H5 D8 Q7 N7 G
  905. /**. E" G- o& {+ P5 m
  906.   * @brief  Switch On the display.3 i$ N7 j/ z1 L
  907.   * @param  Instance    LCD Instance
    0 E. R* e0 C5 G9 X9 O
  908.   * @retval BSP status: P' V, P, M) {
  909.   */( V4 X5 P4 x/ `4 [  |
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)
    . {! x' |/ i6 y  U6 Y7 }* M0 t
  911. {
    ( d( t- E. S4 w# C/ B! |
  912.   int32_t ret = BSP_ERROR_NONE;  n( Z& S5 a+ Y
  913.   GPIO_InitTypeDef gpio_init_structure = {0};
    ! R2 Q$ c! c+ V
  914. 2 J/ b% \6 s, R: ?0 G( D
  915.   if(Instance >= LCD_INSTANCES_NBR)8 Y9 U& k2 X4 R2 G8 a: @. t" e3 A
  916.   {
    ! o/ ]0 @+ _# `3 N& p' b) s
  917.     ret = BSP_ERROR_WRONG_PARAM;3 d" Y. Q) O8 I4 h9 M) u* a2 U4 l
  918.   }: C/ F2 B4 D6 v1 F' R2 R
  919.   else
    9 u( D9 I: K! |/ [% g
  920.   {3 _. N6 r, o; k- T* r
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);
    ) A2 K+ t) g5 o+ `7 j" Q
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;7 d9 @; Z+ h+ J- Q
  923.     gpio_init_structure.Pull = GPIO_PULLUP;/ R8 x* r9 P3 {) y: T
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;6 G: e; t/ K, ]- w
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);  O3 D4 c( s% ]2 v  V

  926. 1 d0 k! Z0 L* i% \5 J  [2 M
  927.     /* Assert LCD_DISP_EN pin */  E. g8 C, C3 C% {- ~3 W' Q
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);
    # V; o2 M1 z: h: Y. Q9 N
  929.   }
    # c  w+ I" b) n# i0 Z
  930. ! W5 `2 h1 u/ a: g
  931.   return ret;
    ( K# Z) o" B* ~+ B2 A! o
  932. }
    : [2 {- ~& z7 c4 r" i4 N* n

  933. 6 A9 k/ u. ^  D4 p4 I
  934. /**
    ; s2 ~9 b% U# Z
  935.   * @brief  Switch Off the display.7 v2 V/ v) W8 {0 h* R( k
  936.   * @param  Instance    LCD Instance' i& |5 s: b+ Q, [: ^& ]
  937.   * @retval BSP status
    . J" z. q, ]/ }, y7 J! O
  938.   */
    9 \$ o. S- b6 R. ~
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)$ C: C1 l1 [3 P" s7 |
  940. {0 h$ U: ?4 h# k( ]0 k
  941.   int32_t ret = BSP_ERROR_NONE;
    ' X2 E1 @2 r! m
  942.   GPIO_InitTypeDef gpio_init_structure = {0};
    + o; d) T; d3 z$ F5 ~+ ~. `

  943. 3 ~& u$ K1 C8 ~2 G2 a! k
  944.   if(Instance >= LCD_INSTANCES_NBR)
    3 \, ]" M; s% S, F5 b5 l2 a
  945.   {5 [8 x/ ^7 m- r% Q: d. i: I
  946.     ret = BSP_ERROR_WRONG_PARAM;+ m* L( d+ Q5 s. J0 {* R
  947.   }
    2 j- C0 d! q) j, Q4 F8 y
  948.   else+ J* v) s: H( M/ e. n2 ^
  949.   {
    $ H5 U% v8 ?3 }. @/ s! j% c. U
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;# |( G! Z& J. [# ?2 R8 B9 C
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;) v$ l) R6 u/ f! T6 _* J/ m
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;
    9 C$ C" o& K1 {, y
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;' |. ^! S: P2 D; \9 V  K
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);9 l# ]0 k+ B" Z: g7 C

  955. - Z! M" `  d  V4 G
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);
    2 E! l/ W3 Q$ X& Z: M  g

  957. 3 C# ^3 g$ Y) e( n0 C
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);
    5 F$ b0 }! V6 p# S9 \# r- N

  959. $ o% a2 h; t$ z* S
  960.   }
    . g. u$ D% i$ M" V1 Q6 L
  961. ) n7 B: N# P, p7 q8 _4 ^6 e
  962.   return ret;
    & R; `9 g& h% d# o  s# h
  963. }
    . F+ k+ i3 H+ N* {1 B4 x/ X; y

  964. & r, b5 q" R* x
  965. /**
    ! N! `0 Q" K! ?# ^+ k+ i
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.% e; K0 y; b( z$ t
  967.   * @param  Instance LCD Instance
    , ]/ J5 N' n# v6 O; ^" q
  968.   * @param  Xpos Bmp X position in the LCD
    # i& M4 Y" M$ y, f7 q1 L: c$ t6 k
  969.   * @param  Ypos Bmp Y position in the LCD
    $ I- E: R) X1 U/ x7 d% p/ ?7 @( H+ J
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.
    4 M  c" {, |7 `* v9 ^0 a1 x
  971.   * @retval BSP status/ S) }4 ^" [- I2 D6 ^
  972.   */
    : x/ _: t) q) b$ {: E. _2 g/ o
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)' H+ f7 Q% q* K: U  p  v* E
  974. {
    ' m% ]( F- f. u! s  g
  975.   int32_t ret = BSP_ERROR_NONE;
    & f7 B. B8 h( s/ G
  976.   uint32_t index;7 j+ v3 C9 m/ X: _; H0 D1 s
  977.   uint32_t width;4 O6 `/ p6 j& p' f9 R  g
  978.   uint32_t height;
    & M2 ~, V4 y5 s, W, {8 Z1 V
  979.   uint32_t bit_pixel;
    8 q  Y  ?* i4 N& R& b! k: w# d
  980.   uint32_t Address;4 _2 C5 j  x9 j( m
  981.   uint32_t input_color_mode;
    1 p1 f7 a, E7 p( b1 V1 @# p3 a
  982.   uint8_t *pbmp;
    ( [/ `6 f8 V0 A; X6 ?
  983. # x) g* Q. z. ~
  984.   /* Get bitmap data address offset */+ }: ?: f2 h0 a, e% L) D% T3 F
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);
    7 }2 J" ^1 Y. ^8 u( B
  986. ) K5 u: \( C9 o+ z, _- X
  987.   /* Read bitmap width */
    3 Z: \$ D: ~% \' K4 C8 D. v  d
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);0 @6 g% {/ |" @1 Z8 S) m9 W
  989. 3 @6 J, Z3 L3 Y: ~+ J+ U/ d" i
  990.   /* Read bitmap height */8 m3 m( A) n# M0 t/ z5 ]( @
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);( V+ ~) X+ d( A

  992. / ~9 o" q- C8 m) f  d8 b
  993.   /* Read bit/pixel */
    0 N. y6 z1 ~) s+ i8 [" C
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);( `) A/ R, J; ], X" V% ~6 g
  995.   L) o8 ]' F1 L( g
  996.   /* Set the address */
    # z5 o7 s2 c6 o9 t5 h, A
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);
    4 J0 {* L5 y" q: f- `" h  V# ~
  998. 5 Q9 A+ O) S% r$ D! B  w0 Z! ~, k
  999.   /* Get the layer pixel format */( b3 g/ \% v0 }8 b
  1000.   if ((bit_pixel/8U) == 4U)
    . V2 {. ~& s. K; H% w, F! u% s
  1001.   {  }  |5 \9 Q% q. I4 s
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;! ^  ~' C( {6 d' W8 [
  1003.   }
    ; s( C: f" V( g6 C; r/ E0 y( `
  1004.   else if ((bit_pixel/8U) == 2U), |0 _5 V7 v( u& l8 j
  1005.   {
    6 a' s4 W7 m- V+ m9 P7 f, E
  1006.     input_color_mode = DMA2D_INPUT_RGB565;- E2 ?+ Q% v% t3 C! r
  1007.   }
    5 R# i: F9 i7 z' q
  1008.   else
    ( O, M3 O, X" h5 E$ o& h$ [
  1009.   {1 w, y. {0 N$ \  j; `1 d. X" q
  1010.     input_color_mode = DMA2D_INPUT_RGB888;" o. a6 C! O; d( l1 U4 y
  1011.   }
    ' @; @% D/ y6 g  w! Q

  1012. 1 Y& p( g' x) Y. z, |' g' _& [
  1013.   /* Bypass the bitmap header */
    ( S) t" i# P8 D2 q- \$ |5 V% _
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    - h& X. B3 @4 l7 P
  1015. 5 H& x" [; B: |
  1016.   /* Convert picture to ARGB8888 pixel format */
    . G( {* ^& U% x1 S/ x
  1017.   for(index=0; index < height; index++)
    / G! G6 y% C8 m" A
  1018.   {
    0 ~0 s. n2 w) ?/ X$ S
  1019.     /* Pixel format conversion */& ]+ U3 l2 d; D+ |  i- m
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);1 b! F0 g+ b  ^
  1021. 3 G. H# I5 t6 I* H+ H* b
  1022.     /* Increment the source and destination buffers */) W+ k  c  T6 T2 u7 W2 d& a
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);0 i1 ?: T( _4 p8 }* z4 k& v
  1024.     pbmp -= width*(bit_pixel/8U);
    : H* B* a1 w4 z$ V! N
  1025.   }
    3 [8 V4 S8 t8 P$ X

  1026. 5 j$ E1 d$ ^8 u$ X
  1027.   return ret;
    6 P6 W( k- G3 W; K
  1028. }
    . h* M/ h2 R* B* T, x) s! k

  1029. ; ^; F2 s' c  V
  1030. /**
    $ L. M/ I" l$ J8 L4 |
  1031.   * @brief  Draw a horizontal line on LCD.
    / G7 }3 R- @/ _. A& j
  1032.   * @param  Instance LCD Instance.9 {7 o1 r9 j% k' J
  1033.   * @param  Xpos X position.8 M0 Z$ H3 |" u" ?# f6 f9 H; S
  1034.   * @param  Ypos Y position.
      [0 v; C- |, |1 R3 m
  1035.   * @param  pData Pointer to RGB line data
    ; m" y4 u9 X8 t1 ~( V
  1036.   * @param  Width Rectangle width.
    3 K0 O) V: R" k* c& a+ S
  1037.   * @param  Height Rectangle Height.
    1 o" V. a- S' z7 t; |4 n
  1038.   * @retval BSP status.
    % y( j9 S1 M) p2 t
  1039.   */- @2 y7 `- Q1 d6 S3 Z7 `, q
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)9 O2 ?" M  _8 T: a0 m4 e8 Y
  1041. {
    2 I& _; [+ s; N
  1042.   uint32_t i;1 D, M. K; J, P6 s2 `
  1043.   uint8_t *pdata = pData;; N; b, s, |1 ~" V# z  ~6 O
  1044. $ L5 [' `- X6 h% F" j
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1), F  h) W- u, j% R  P
  1046.   uint32_t  Xaddress;& d3 |7 ~9 @8 Z6 s& t) _
  1047.   for(i = 0; i < Height; i++)5 B( \7 |  n! ~8 s
  1048.   {5 b& M0 c( H: Y5 x& q6 u0 [7 i  |
  1049.     /* Get the line address */) h7 w/ ]+ N  q4 U4 y: v, d
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));
    ' H# n! O/ d$ x' a; f
  1051. + m1 j& L0 q" m6 L& }6 K
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)
    7 j% g1 W& [" `# X  T. s- {+ k
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);0 ?8 Y# \, i+ p2 I2 Z  l
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */6 W! G# z" i2 {8 j+ t

  1055. ' Q: `3 \: J( v8 n' v# j
  1056.     /* Write line */
    4 x$ u! F$ G( a+ @9 R: S  o
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    + {% q% R- }( R/ D$ U
  1058.     {
    6 f$ k# d+ D+ f) M9 R
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);
    9 ]0 g. K3 |* [1 b9 C
  1060.     }! x6 S8 x4 N6 W% z6 c. ]
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)
    / M3 u. ~" a- Z" q/ w; E" L+ \
  1062.     {
    ( v) w" g+ Z6 j- j! K
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);9 p. ]8 e- a9 F% A, l1 Q9 T3 n
  1064.     }
    1 ?4 O  @* e- L. R
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)
    9 n' u. B8 o2 G2 Y
  1066.     {( y. }* e) j9 B; R" u4 z& X+ J
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);
    ; Q' s: H& v  M: v8 f
  1068.     }( s3 B; M- L4 Y9 h  o
  1069.     else& g3 b1 a4 C) [* L/ r  Z' g
  1070.     {# g7 l# m6 f9 k( C. g4 Q, |1 Z
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);
    - S/ G: q1 j; u  p' c
  1072.     }- c: r, E; O, Z) O9 ^
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;, |8 o" S# Y7 o6 e8 L% G8 l" w
  1074.   }. y1 S7 U, ?  H* p) Y
  1075. #else$ m' s0 g" @" n$ Z6 ?% @! {
  1076.   uint32_t color;
    : i; f/ I0 ]* `/ q( F  S4 b; O
  1077.   uint32_t j;
    . H4 K4 V  X. P: r. R
  1078.   for(i = 0; i < Height; i++)8 l. F6 k4 f( j7 y6 R3 a  l
  1079.   {
    : F3 I' D! {# N7 r1 ~! i  Y. {
  1080.     for(j = 0; j < Width; j++)8 ^/ ]3 q+ L9 \6 e% U
  1081.     {
    ! B1 Q0 _1 B  M0 F% O: V3 Y4 q
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));2 y/ M  F% H2 e8 \5 C& X! ~
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);. b3 z- @+ w. C% c7 u
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;; h1 b, P% ~% `$ \. B, u* b: y
  1085.     }  ~: h  \0 k5 b
  1086.   }
    . f4 _3 |) S% H0 Y
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */
    ; \2 Z8 A; M6 N9 m! n- X$ q* e! Z
  1088. ( i% i9 N8 k) j; z7 z/ W! Y
  1089.   return BSP_ERROR_NONE;+ x9 V+ j$ a  O
  1090. }
    & v8 g* ?7 A; `5 f7 M3 t0 W

  1091. / |6 m( `3 \% B. H
  1092. /**# \" [+ E2 ^0 ?: h; W. g
  1093.   * @brief  Draws an horizontal line in currently active layer.' q# A* g/ \( r. y, E6 l8 f
  1094.   * @param  Instance   LCD Instance
    4 d( y2 W* Z9 }+ D, v6 U$ v
  1095.   * @param  Xpos  X position( K* E5 t& ^. Y7 @1 C# b$ A8 G
  1096.   * @param  Ypos  Y position
    % ^3 B; r6 O, s7 d
  1097.   * @param  Length  Line length
    1 n. U9 q, a. c8 I8 P6 Z- d; q
  1098.   * @param  Color RGB color
    ! J; @; I* t8 W+ M# y. {- S
  1099.   * @retval BSP status& }) U  ]& m& o' @5 j
  1100.   */: U! [  w* ^9 ^* I9 z. N" q
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)
    9 |3 S$ G8 T7 E. i/ v; d$ \
  1102. {7 z3 U2 H/ f# t! {/ E" [/ L7 c% z/ {
  1103.   uint32_t  Xaddress;! x; G8 }4 R5 \, ~; k
  1104. & a# N( w% K$ V5 g  e' k
  1105.   /* Get the line address */
    ) m# b. c  W& L8 q1 ^" r+ F& T3 i
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));4 y2 K+ k/ w7 o% Q+ t6 J

  1107. ' ~3 S4 {* ^+ p$ _/ B" x
  1108.   /* Write line */
    " e( J- T; d- X
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);. q- n& \* i6 D) E1 ?/ K( }6 N; V

  1110. $ k8 Z/ e  y8 @
  1111.   return BSP_ERROR_NONE;
    , K( e% L# \9 C; _
  1112. }
    - `% f# ~; R0 f& R$ }# `

  1113. 7 @6 F; p9 A8 E
  1114. /**( K3 [6 Y4 J3 O1 u8 B) G- |
  1115.   * @brief  Draws a vertical line in currently active layer.% h0 I: u5 ^. b
  1116.   * @param  Instance   LCD Instance/ u9 ]0 t  O, \0 Q& o
  1117.   * @param  Xpos  X position
    " E" O3 V: d& o7 ~! ^2 J4 e( v7 O$ [
  1118.   * @param  Ypos  Y position
    8 I9 t" ]/ D* K
  1119.   * @param  Length  Line length4 d, {9 D+ q7 n! Z( H+ H+ R+ _
  1120.   * @param  Color RGB color
    + E6 a$ S5 ~& Z( ~5 s
  1121.   * @retval BSP status* s: H1 {4 M. x
  1122.   */( U9 ^* P  k* Y; b7 B
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)
    5 Q+ m  ?# Q) [! S. T
  1124. {6 I/ z/ j; T! Y3 ^/ f, q
  1125.   uint32_t  Xaddress;
    ) |' @# i# i& K7 T$ r8 ^

  1126. . c$ U; \+ _  }" z
  1127.   /* Get the line address */
    + ^; F. ]9 u' R+ {3 R
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));* U, o/ J* ^( \) n( q

  1129. , |6 u: B% y; F
  1130.   /* Write line */
    ; c( `% ^) C. h; m4 J  J7 F( Z
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);
    " P  C' _6 o0 R

  1132. - d. N( v# w+ t; @! L5 W
  1133.   return BSP_ERROR_NONE;/ M8 D5 S2 ~* O, \1 h$ D% b
  1134. }$ [) ^1 y  m3 i

  1135. $ E. A3 ?4 \7 |) m
  1136. /**
    0 n: a* I1 Q/ b1 n$ |! n
  1137.   * @brief  Draws a full rectangle in currently active layer.
    2 p$ `" l% s! {: u" l
  1138.   * @param  Instance   LCD Instance
    7 `9 i2 z1 v" p, q
  1139.   * @param  Xpos X position. p& N$ b, p8 o
  1140.   * @param  Ypos Y position
    , l" k/ H0 [' d9 D/ H+ B
  1141.   * @param  Width Rectangle width# l+ J) i: r$ E# D4 R
  1142.   * @param  Height Rectangle height
    4 K6 e# U# h( D9 b; c. P
  1143.   * @param  Color RGB color
    ; {8 o. m9 L: S
  1144.   * @retval BSP status( H6 l1 j. o. l! \/ n
  1145.   */5 i/ d+ a! f" H: b+ C
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)! i+ o( _9 q) a2 n
  1147. {
    5 v$ R  T! ^2 @* D! k9 ]9 Q
  1148.   uint32_t  Xaddress;4 h& I- e( s6 r  d5 I  y7 z5 a
  1149. 2 L8 k. G' j8 n9 s: g; o: Y. f% u! v
  1150.   /* Get the rectangle start address */
    - Y9 \* c( I) ~  \
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    " Q  a) c. G! V( O- M
  1152. 5 q7 ^! y7 v6 M9 L* O
  1153.   /* Fill the rectangle */9 s8 [, d1 ?3 W. e6 w3 b. k
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);
    : v6 _7 Y) M) R* E8 n" K

  1155. 4 r8 R8 J! c, r8 `( a# v+ ]# ~
  1156.   return BSP_ERROR_NONE;3 N% V) H) T( @: @9 e
  1157. }
    : G- M/ `( @# p. H4 u4 H! \
  1158. 7 k4 R4 }6 r  {$ p. _; b
  1159. /**! a1 z1 Y" j7 v6 \4 Q2 `* T
  1160.   * @brief  Reads a LCD pixel.
      H: D0 }( _( T6 I8 d
  1161.   * @param  Instance    LCD Instance
    + Z* T2 T. f+ O4 o& T9 e) J) F6 y
  1162.   * @param  Xpos X position3 ~6 ^: s/ S7 o& d8 ^, h: X0 r1 k
  1163.   * @param  Ypos Y position' D8 i. k" Y( S& M' M; X- l  r3 G- R' t
  1164.   * @param  Color RGB pixel color
    ! {3 Q# s3 u' \- |
  1165.   * @retval BSP status
    , W; P$ ~# d, T. I- s1 c, I0 N' I5 G
  1166.   */0 }- s# @4 ^+ I' Q: Z: J# j8 q% {. e
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)/ a* i6 h% Q8 u' {" l/ @5 Q
  1168. {6 i1 K" }. \) F, s- a- r4 n# @
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    , O0 z* u7 ]! f: q# R
  1170.   {6 D1 \- B( f. ^, \* @" v
  1171.     /* Read data value from RAM memory */
    - P1 S/ J% E7 t4 C) z' l6 m2 {
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
      p; D5 A: f. \' Z( {4 b& N
  1173.   }
    / o1 U- X9 \' }; K& o) Y6 N
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)+ S& Q- z& [4 e9 q/ z! C
  1175.   {
    9 V' W: x5 \) S$ b* u  P
  1176.     /* Read data value from RAM memory */, K5 I7 l4 i1 U% G. O
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));4 q# E" s7 p- a
  1178.     *Color = CONVERTARGB88882RGB888(*Color);
    - C( d' Z+ J8 L
  1179.   }8 Z/ m0 _) G7 Y. j/ s8 v8 E
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    9 e; K& g0 @! y7 m$ p0 ?. K
  1181.   {/ P2 |" t7 f, `3 b% i- q
  1182.     /* Read data value from RAM memory */
    3 F3 v, y( d; H; y1 T* Y
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    * S1 H, ^- K$ e3 d  y4 D
  1184.   }+ \* V0 U3 u" a* F' P7 `6 V6 A

  1185. , J% \+ g/ r. |, F1 W* t3 O
  1186.   return BSP_ERROR_NONE;$ U7 Z7 L* t4 g- W! g: k
  1187. }
    $ B* }/ _( q/ {% y; M- A

  1188. % f: S7 W% n: N( V5 [5 p  N- z
  1189. /**( D+ f; X' O+ i
  1190.   * @brief  Draws a pixel on LCD.8 O$ D( d/ c# ]- A: h5 ]( C4 C' v
  1191.   * @param  Instance    LCD Instance( i1 O0 A) Z9 j' Y9 R# Y7 f% }
  1192.   * @param  Xpos X position
    : ^1 \  p: l8 Z% @- d8 d
  1193.   * @param  Ypos Y position
    : Z% ]; D& d5 u
  1194.   * @param  Color Pixel color
    + f+ j  V4 E; E! [% M: D; L/ s
  1195.   * @retval BSP status# c; _: B' Q* G0 x% G% r
  1196.   */3 w3 s" e/ f. ?% F% `
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)" ^( K: P" E6 a& e/ Z
  1198. {) j' C/ ?8 F* y0 j" P3 z
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)# x+ ]3 b+ m0 F$ W
  1200.   {
      P3 E) `. P0 `$ K# M6 N& e
  1201.     /* Write data value to RAM memory */
    ; i. e3 c6 ]1 X7 B
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;. P" _- H. V% L
  1203.   }
    : [# j! E" J1 u8 Q- [2 i
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    / M9 Y( k; I0 h9 }  O  Z
  1205.   {9 ]- E2 @# G/ ~; i
  1206.     /* Write data value to RAM memory */
    ) n( E; H. M; h: g
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);
    - F' W8 J- T0 M7 i9 @( T
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);
    : b/ F! V/ z7 g; [" {) K
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);; z: G! i1 j/ p6 G- c( ?1 P
  1210.   }
    : j* [) I( U# P  V
  1211.   else
    ! x6 A) w. z0 g( Y! t. ?- A
  1212.   {
    & z" B: C  P! W' r$ D0 g
  1213.     /* Write data value to RAM memory */
    $ {5 ]2 k2 _1 r$ ^; {
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;" A9 e; K4 F# f/ Z$ k* X  j5 H+ |2 i4 Y
  1215.   }+ e, Q# w# ]' `8 D2 J  l

  1216.   ?) E1 T. B' c: F5 X. g) {* T
  1217.   return BSP_ERROR_NONE;
    , _, N( q7 D# |% W% O, d
  1218. }
    ( b- g/ \2 O" [5 O& Q4 s5 D

  1219. * B7 y% ~) g6 t4 ?+ N, {9 }" d
  1220. /**0 ]1 i% q3 s; ]! o5 F2 V% F
  1221.   * @}
    0 Q/ v9 ^* b9 g+ V9 S  o! G% V
  1222.   */4 b/ |: d; V0 r0 ~6 }
  1223. " D# @# M0 D) h1 ^. F6 v3 U# q( [
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions
    & i: D9 K: c% Q7 o( R5 |* f
  1225.   * @{
    3 s' U- n$ e( k8 [, G, M
  1226.   */  {0 X' _7 N- v8 T5 ]
  1227. /**4 a9 I* a% {* ]1 y! G9 W' J
  1228.   * @brief  Fills a buffer.
    7 k* l7 o& s- @- s6 f5 C- `6 A# J
  1229.   * @param  Instance LCD Instance6 {1 y1 G8 k/ c4 H$ C+ ^
  1230.   * @param  pDst Pointer to destination buffer
    ( b# Q! S/ B/ C6 V( L
  1231.   * @param  xSize Buffer width. h5 B) m, p" T  U# w1 E7 `
  1232.   * @param  ySize Buffer height8 f, h2 r# Q( ~' [
  1233.   * @param  OffLine Offset( E% Q" {9 N, u4 j4 P$ M
  1234.   * @param  Color RGB color: K; L# f) u/ m4 M% X+ l
  1235.   */: I6 C+ `* T: x0 J2 q
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    # j) I8 A: V8 w9 G* r0 o1 i
  1237. {  U5 f. V6 k# k5 R4 W
  1238.   uint32_t output_color_mode;
    . k- q. H  q6 b( c
  1239.   uint32_t input_color = Color;
    7 S7 o  Z3 A" T$ ]% h# G2 Z8 G

  1240. 9 G% S7 T/ ?* y
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)
    + w; @& p( `0 L1 }/ ?
  1242.   {8 }9 Z, D, ~5 A/ M5 e. y8 W; {( J
  1243.   case LCD_PIXEL_FORMAT_RGB565:0 c2 m; m1 ]5 M2 ]. D
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    ( W/ W9 a; W* Q  X8 K
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);
    ; w' k# D. |7 N% m1 b& t1 D
  1246.     break;
    0 k$ `* A" j& a8 V, P- R( [# X, X; B
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:( f) Z( q! |- z: U# Q- d! j  Z! @
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */" ^  k& O& _" V7 Q7 B! m2 \* i3 E
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);
    & M4 o! f; O9 b7 V
  1250.     break;1 |* ]' U: o% L' U! E2 x8 ~
  1251.   case LCD_PIXEL_FORMAT_RGB888:: @! y2 C% j+ u
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    # d/ I: r) w7 X+ Q$ L
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);
      k1 n9 [8 d0 g/ I8 d; e. _  m6 l. Z
  1254.     break;
    & x1 y5 a* C2 t$ r; e* ]" }% U
  1255.   default:
    ! G9 k( s$ }! Q& J% z
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    : H; U0 q1 E) A$ W* F
  1257.     break;4 z; u3 b0 n2 T, R3 c2 C! z
  1258.   }
      X0 C, |7 E6 \' K

  1259. # M; U5 x% y6 ?, ~
  1260.   /* Register to memory mode with ARGB8888 as color Mode */! C7 Q8 ]$ p; e/ T; F
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;2 t% b* ~% z# U% w/ O7 c
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    $ o5 d: D2 i# F
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;* ?9 D' U+ o" L2 @1 T: ?3 \

  1264. * `4 T# |2 I, l# _& @. n
  1265.   hlcd_dma2d.Instance = DMA2D;
    " E! W/ B0 _& i) A

  1266. # `( g# B- S8 p) ^; V
  1267.   /* DMA2D Initialization */% Y* |, M4 e0 J8 X6 U$ ~
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
      v9 p  D/ f1 v/ C* @2 @
  1269.   {  o: B5 i1 c" j1 G3 x- h" w& g
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)
    / X, v* C8 ^6 S3 s- k# H  T
  1271.     {2 a3 A+ j, B. ]: B& d, L- [: F
  1272.       /* Polling For DMA transfer */3 K7 }/ V  }6 i  X' F7 X9 z! R
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);# t$ H  y4 ?& n& ^- H
  1274.     }
    & E7 a$ W, v1 T2 B3 J
  1275.   }
    1 c; j1 L  n( m7 M& I4 O
  1276. }
    3 I; M, ]! g$ z! ^9 h* s% |
  1277. ! P* `- L% ~# m4 ~2 F4 q1 y
  1278. /**
    & v3 ?4 f) ^, {: N1 U& F
  1279.   * @brief  Converts a line to an RGB pixel format.8 X5 v# k& [* L' b8 ^0 k+ w( x
  1280.   * @param  Instance LCD Instance- C; J$ ^7 R. Q' v' g
  1281.   * @param  pSrc Pointer to source buffer
    * u- K" x! V& k
  1282.   * @param  pDst Output color
    ( [7 q5 O; m$ j% |, X9 c  v
  1283.   * @param  xSize Buffer width* D  q) ^% ~' L) E* J) E! I
  1284.   * @param  ColorMode Input color mode
    7 R3 L8 z- }* \9 G7 ~7 x) T7 a1 Y
  1285.   */3 r3 [: ]' f9 m0 q0 H
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)/ w% k# B: u3 B- s6 p" `. ?
  1287. {
    & K+ u/ Y" |* J) J9 f" V6 o0 X
  1288.   uint32_t output_color_mode;
    1 ?4 M! y" }- R4 z
  1289. 6 L; y) _. Q; y, x
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)
    * L  Q- B6 v, p2 ^2 ?- ~
  1291.   {
    4 u5 p3 M2 D$ h- K$ n' e
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    ( W9 O8 t' w0 W
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    . a& l9 y3 }8 F+ ~6 X
  1294.     break;
    : L  `0 p# S- n; S
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:
    1 c9 ~! p* m+ T, T$ Y; O; h& \% A
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */
    . ]  H+ x; J/ q5 |0 I7 M! G
  1297.     break;& b$ Y" R: ]" Y  b5 u6 s
  1298.   case LCD_PIXEL_FORMAT_RGB888:
    5 P0 B; J4 I! A0 _: W+ s$ q  n) _; j
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */1 a- O, j! y5 \& n) R4 t6 m8 x) N
  1300.     break;
    5 O8 B0 q0 |. O; D8 G6 y
  1301.   default:
    , N9 \; T# K' u
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */0 Q; Q, t5 ~$ S5 \& @4 b! e2 U8 |& S
  1303.     break;
    ) Q$ P& Z! c7 {0 c3 \7 M6 {
  1304.   }
    - q4 a9 k* _& v, p' l' e
  1305. - n2 T5 G& s# A' y2 d) H3 A- N
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    & P' }. _7 X% D- O  g7 a7 z' X3 M
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;
    5 o. \2 \* P! n! q+ |; c0 M
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    8 B, y3 l& [( `1 j# K
  1309.   hlcd_dma2d.Init.OutputOffset = 0;
    8 ]' h* i: a& h( z- s
  1310. * L% r' D2 A. i
  1311.   /* Foreground Configuration */4 `1 a/ |1 a7 N1 q, F
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
    % G( o  q* Y' a6 x5 u( ^2 M
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;. f+ ]8 E: z8 c/ D* A* h/ v
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;7 W8 X5 ~" q7 j! v( a" z' P- T
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;
    ) d0 p1 }! V8 Q  z; J4 @
  1316. 3 e. b$ }% W1 ?
  1317.   hlcd_dma2d.Instance = DMA2D;
    1 a( S  ]' m* E% e+ i

  1318. 0 d6 E, C5 F7 V5 H- h2 |8 Y0 {
  1319.   /* DMA2D Initialization */9 l- b3 A% p$ U% o* \8 T2 S; R
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)& W1 \  f0 E5 g  g% |: r+ n) [+ G" b
  1321.   {8 r( w8 `& Z  |- w8 r+ m
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)
    . t: d8 M' a" d9 |; X2 |0 A
  1323.     {
    * q6 g2 ~# v* [$ q
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)9 T1 O, B+ S0 @4 Q$ v
  1325.       {
      y5 O, Y$ S# n2 G7 g
  1326.         /* Polling For DMA transfer */
    0 t% K+ [( }0 |. s$ w* w6 Q" ]) l
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    " Q3 n. r$ r0 d3 ^* C) M$ e
  1328.       }' P$ A4 Z. v& d+ t* m, W
  1329.     }
    . H" R7 _. O$ j. L- d. r' z% Z$ Q
  1330.   }5 r# ]% B& W2 H: z" B# O
  1331. }
    & i5 B1 r4 l: [
  1332. ; T% }0 D$ c  b
  1333. /**5 n+ _2 x& M. d1 t
  1334.   * @brief  Initialize the BSP LTDC Msp.
    & y) s6 U2 D5 \; ?
  1335.   * @param  hltdc  LTDC handle6 s8 Z) }; q  F) C, r5 h& X
  1336.   * @retval None
    % \+ g0 u0 j  g8 x3 }
  1337.   */5 F5 f2 k( P- X2 ?  g) F4 p% Z6 {
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)$ X: h! t' r/ B! i# u. ]
  1339. {  e. Z+ @) B( d% J
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};
    ! D) N3 j/ K1 W8 A$ ]

  1341. + a6 i, y! _& ~1 a8 o' i1 E
  1342.   if (hltdc->Instance == LTDC)- G' A# g( S" y# r
  1343.   {: ~: ~8 U& \: E( E; K% P
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();6 |& b7 U" o" I6 d

  1345. 1 d  N/ ]7 B8 O5 r
  1346.     __HAL_RCC_LTDC_FORCE_RESET();
    ! o2 T$ |! w4 V9 v$ ?5 Q
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();3 h$ i$ Y! W; N) ^, q! m0 `( }' A6 t

  1348. ) z& ~: j8 \: w$ q  g4 R
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */. W8 q' p- g$ y5 u5 b
  1350.     /* PG0  R0          */
    $ C  [& [2 C. h
  1351.     /* PD9  R1          */. K9 k8 u; c$ A' z# `8 s2 q
  1352.     /* PD15 R2          */
    ; A! w0 q3 G4 c. A9 `/ Z! H- K
  1353.     /* PB4  R3          */ // JTAG" N/ v" y7 @) J8 K* n
  1354.     /* PH4  R4          */
    5 J0 S# A# J; r, X3 V
  1355.     /* PA15 R5          */ // JTAG JTDI0 S2 p( H3 r1 @: N8 {# s
  1356.     /* PG11 R6          */
    $ Y' O( |  J; z9 P) }4 _2 K
  1357.     /* PD8  R7          */- d( i+ ^5 f" u" z$ Q' s( g) n7 Z
  1358.     /* PG12 G0          */3 X. t: T$ I" ]
  1359.     /* PG1  G1          */, O7 T) J) _- k7 i: B
  1360.     /* PA1  G2          */- D' V( A1 ^+ {9 l3 S8 ^
  1361.     /* PA0  G3          */) Y, p9 m1 j8 W8 O
  1362.     /* PB15 G4          */
    ' f+ i, O9 m( _: a6 H
  1363.     /* PB12 G5          */
    $ o8 R  c/ [% }9 F2 d$ E  O9 t
  1364.     /* PB11 G6          */
    ( o8 q/ ]# }  g) s8 P# u+ g
  1365.     /* PG8  G7          *// ]5 I+ O, I& H$ Q
  1366.     /* P15  B0          */
    4 J/ D! a' d8 |4 f3 ]0 L& V
  1367.     /* PA7  B1          */
    ( k( G# u4 r* D
  1368.     /* PB2  B2          */+ Z5 h) U: J% T: n0 z9 ?! N
  1369.     /* PG6  B3          */& j9 ~+ E/ M% s6 D4 D$ M
  1370.     /* PH3  B4          */) S( O& N; ?' S5 }4 G2 |
  1371.     /* PH6  B5          */
    1 ^$ k3 x  t: e3 p/ k
  1372.     /* PA8  B6          */2 ]% o5 G4 B* c! A' @# p6 G
  1373.     /* PA2  B7          */: ]" h# `/ H0 a- B" t
  1374.     /*                  */
    6 e2 ]4 A% m) E  M2 M4 F
  1375.     /* PG13 LCD_DE      */8 O* N7 i' O! N
  1376.     /* PQ3  LCD_ONOFF   */
    7 U8 E5 z) `$ N$ R4 q9 x5 V
  1377.     /* PB14 LCD_HSYNC   */2 ^" ?) u( d. G! h
  1378.     /* PE11 PCD_VSYNC   */
    ; B% v! Y/ E$ a( l/ M& I
  1379.     /* PB13 LCD_CLK     */
    4 L! f& [' k! T6 Y7 b
  1380.     /* PQ4  LCD_INT     */
    5 e) L0 u5 }  u: T
  1381.     /* PQ6  LCD_BL_CTRL */
    ( T. e; c- m  [( B# d- ]! K
  1382.     /* PE1  NRST        */# y* P4 `3 ^; O* [+ Z6 r
  1383. 7 n  [! n- k3 b3 ~3 E, R
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();
    ' p0 ]& L( z- e2 Z* i4 g/ T& f
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();3 }# _" ?# z( K' s
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();, ?9 n& p' p6 o5 h) x8 P$ l
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();7 r$ _% b; N/ g* j6 V
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();
    4 m7 \/ @7 W+ ]- X- o2 |
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();
    5 j4 ^; Y9 K- q3 p2 \
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();
    6 Z( @/ ~7 u" |' ^# x
  1391. 5 T# _% u7 X, _% ^5 J) z. N
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;0 J7 I- z2 ]! D. W
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;1 _; A/ v' G# N0 S
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;
    ) W# H; x* C0 C2 M

  1395. 1 }  Z. p; X- \1 [4 D* n: N  w. N
  1396.     /* G3, G2, B7, B1, B6, R5 */8 i- e+ G- Z; m3 W
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;
    & V8 [% A& ?  ^
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;- _, F- W2 ]2 Z4 E+ k
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);
    " H, b" |" d8 @6 ]* P8 d" Q

  1400. 8 x6 y" U$ O) A$ ]
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */: G1 l+ L- W$ ]3 ]0 O' B
  1402.     gpio_init_structure.Pin       = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_15;! m# Z" A  l: b9 a" v
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    + H- A+ |( g" K6 s  M7 t
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);, f( }" p' Y! f6 c0 f  Z

  1405. 7 A7 r9 R" C, p' F. [
  1406.     /* R7, R1, R2 */* k: ?. q' W/ }* [
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;
    ( O# c9 h! K: D( z% _6 H5 Q
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;0 ^! d2 |% g. t9 N. [* T
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);7 l' Z. \0 C9 Y7 H3 b
  1410. " ^3 D. d0 i* t2 ~7 Z6 w
  1411.     /* LCD_VSYNC */
    - w  s1 P7 I5 V& w* V. e) p/ i
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;
    . o* `' z" \' `5 t4 T
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    # ]) Q* H% a0 O+ w' Z
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);6 {" n# I% ?; I' N* x

  1415. ) x* b) l0 _: I* c2 h
  1416.     /* R0, G1, B3, G7, R6, G0 */
    3 a: E. M4 R6 W; ?
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;& q- E. J: |' i' E* K1 l, `$ B
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    * f- q- X5 y8 {( p. e
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
      P1 f/ p+ b& t/ N

  1420. * x+ T1 L- Y6 g8 e
  1421.     /* B4, R4, B5 */# X' \5 N+ |; Q. Z$ w) {
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;
    9 k( F, x8 ~1 `; i! ]5 Z
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;$ n! V* ?- X- }
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);
    1 A" C# P7 `. H; U! ^8 o
  1425. + J& k: ^& L9 h
  1426.     /* NRST */0 E4 d8 P- I5 }0 ?- ]3 ^/ b
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;
    7 W. Z* S0 B4 c; N
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;' L' G& _- Q, _: y
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);* U- L: e' k$ O3 W) I7 K3 _; T
  1430. 1 }0 z, G+ H- Y+ n, H
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */+ @" |2 M& w( u. _
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;
    8 O6 P$ m3 o" G! G
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;6 e8 R" G* G/ \
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);* J& n0 ]- y2 O8 K6 W# s
  1435. 6 I+ ~/ ^+ U  F' @; }5 g7 N
  1436.     /* LCD_DE */
    & f) r8 u8 u; j
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;
    - S5 u, N( r* _
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    8 ^( L  u+ O$ ?2 G( z" d
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    6 ?) t/ f( _0 A3 r

  1440. - I& C0 P+ z5 f
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */! S  Q" @( [1 `& J. y+ Y" G
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */
    8 Z: g0 z8 W# |2 x2 t! W# M
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */3 a3 Y# o/ j0 U

  1444. 0 a2 ^- S9 x$ D; G/ |) I, n
  1445.   }
    + m% Q' G4 j- U/ i
  1446. }* h; J$ W6 @& x
  1447. 8 ~) R/ o2 O1 q/ |
  1448. /**
    5 D( s8 H4 S( o  ~: @; ?% n
  1449.   * @brief  De-Initializes the BSP LTDC Msp
    * H3 |. u6 S( \3 h
  1450.   * @param  hltdc  LTDC handle
    8 ?2 \7 ~( S6 L3 S6 ]% W, X
  1451.   * @retval None3 B. h1 ~' D- a$ ~' \  K: R
  1452.   */( i9 ?$ K; a% u5 H9 O
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)
    . ^  E6 c" w1 W/ V  P' w' `. G
  1454. {
    2 f3 W6 S' V5 J
  1455.   GPIO_InitTypeDef  gpio_init_structure;. u3 W) i: N- }& E5 R
  1456. ) }" A) k; I: q$ d. t- j
  1457.   if(hltdc->Instance == LTDC)
    - n) U4 T3 z: x+ p0 w% m% l
  1458.   {8 V; t8 @$ M6 u5 k0 N
  1459.     /* LTDC Pins deactivation */: G  ^8 y- e6 \; ~- W3 l
  1460.     /* GPIOA deactivation */
    & }5 O$ P1 @+ D% M* Q& `& j
  1461.     gpio_init_structure.Pin       = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_8|GPIO_PIN_11 |GPIO_PIN_12| GPIO_PIN_15 | GPIO_PIN_6 | GPIO_PIN_9|GPIO_PIN_10;
    $ l# u( J- S0 z. B. h5 M  I
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);
    0 a9 [) z& F; P
  1463. 5 B' D, k' _8 m
  1464.     /* GPIOB deactivation */
    1 N! b2 @: |2 f3 p9 T" c
  1465.     gpio_init_structure.Pin       = GPIO_PIN_13 | GPIO_PIN_15 | GPIO_PIN_3 |GPIO_PIN_4 | GPIO_PIN_10| GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14;
    5 ~  a+ x" ~8 j( Q" p6 S
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);
    : O; b7 ?' m! G; Y

  1467. 3 ]' ~: {: ?/ J8 I) _& j
  1468.     /* GPIOE deactivation */
    ; A# Q, t$ T% S! r( ^, R+ D) J( ]3 C
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;; K' l7 Q- ~; ]; ?$ z
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);
    , \% @/ d: A+ U/ D# e5 i) L

  1471. 7 j8 X! X6 Y+ `2 x
  1472.     /* GPIOF deactivation */
    % M. O7 H) s+ H
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;
    5 _& H5 S' x1 n- P# y: p7 _
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);
    3 S" |9 h8 k% K. Q
  1475. " g! a, r4 p& n, U! C& U
  1476.     /* GPIOG deactivation */
    , Q1 ^8 ~- W3 r! i% M* s% d: _/ V
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;
      o+ S0 i4 w# e5 a
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);  m* ?- n+ P3 w% g
  1479. # m# e4 ^4 L* j( X( j0 O5 h
  1480.     /** Force and let in reset state LTDC */6 l) E$ \6 X- P4 Z
  1481.     __HAL_RCC_LTDC_FORCE_RESET();% w+ m1 b* b4 P5 Q5 ^

  1482. % x/ V" D; O1 T- \! L* R
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();2 D! g& u+ ^9 M. A" Z- A+ w

  1484. % V+ d, i* g# U, H* b9 s$ S* s
  1485.     /** Disable the LTDC */
    % t2 g8 K& T0 f" Y- E# z
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();
    + r7 C, F  c* l  b4 Z* s) O
  1487.   }( r6 Z, [9 A, `: \! X
  1488. }4 K/ y4 i5 @1 `0 l# `+ ~+ X# _4 @' q

  1489. 0 F$ w$ m' m! s
  1490. /**
    ; I, X9 X$ q% z# X+ v! I3 L) U9 K3 l
  1491.   * @brief  Initialize the BSP DMA2D Msp.
    + ~3 T  I& G$ `. ?& F) ?1 g
  1492.   * @param  hdma2d  DMA2D handle
    1 R6 @3 v. J2 K2 \, q8 V6 f" _
  1493.   * @retval None3 S" C+ B0 ]' L7 y. G
  1494.   */
    ! A& [- s5 B, A  B+ v. q
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)
    7 z: ]* s) w& }9 u$ y( s
  1496. {
    ' N+ s/ z1 M1 ^% [  c, s% p& i
  1497.   if(hdma2d->Instance == DMA2D)& h5 g6 S( Z7 G7 Z+ B
  1498.   {. ?0 q7 r6 C( K, o2 E
  1499.     /** Enable the DMA2D clock */
    / L+ ^: d" W2 X% S( T" U2 S( O+ m, g
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();
    9 y4 t* Q: G! J4 Y' Q/ B% K/ X& N
  1501. 6 t, P% U- \) |5 @2 x: g& R9 C
  1502.     /** Toggle Sw reset of DMA2D IP */
    . D  N3 N- a  I8 T& H
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();* G; E4 k' j( c4 t( b- L/ e. v
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();
    ( K, j3 |3 t1 K8 g
  1505.   }
    8 u/ U6 r" N# G
  1506. }
    % F' N' n$ V% n1 O
  1507. : A2 G* L9 ~. H7 q) L4 H2 p. U6 |
  1508. /**
    4 o# N9 q9 h/ J0 N. p& F
  1509.   * @brief  De-Initializes the BSP DMA2D Msp5 n1 w* N( a* W( ~0 s' u
  1510.   * @param  hdma2d  DMA2D handle
    ) m( q& w) L7 |- A8 b
  1511.   * @retval None) K/ [2 W  F' }9 [  k
  1512.   */
    5 i! o0 t) H: I. |9 p
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d): b" }3 V/ I1 u  M- f  b( Y
  1514. {
    " e' y) e- T" y) A! E7 z' _
  1515.   if(hdma2d->Instance == DMA2D)
    . z0 {9 P, {# n* v& Q8 b
  1516.   {
    0 Q* ^- k8 s" l4 O' ?. Z% ]" R
  1517.     /** Disable IRQ of DMA2D IP */. H1 [) a' b; A  T0 ^2 l4 W* ~" l
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);" |% k# z! j6 ]6 ^
  1519. - @. G7 T9 a! T3 N2 M# R
  1520.     /** Force and let in reset state DMA2D */3 i1 i" R: g2 A* g2 W
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();& n, D) b7 u& O3 Y2 N
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();" [3 j4 |  j) R% q

  1523. 7 ]2 l. ]" R8 N. X
  1524.     /** Disable the DMA2D */
    ) ]5 p1 g0 A! ]; J7 Q
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();9 ~( b+ u% W7 O" e% {! ~" L
  1526.   }
    - Z# [' w1 ]+ c2 w) H2 X
  1527. }6 Y5 m# V! n: n7 }
  1528. + \+ J: `9 P: S  u) ?
  1529. /**
    8 U. h: M. u5 C; J
  1530.   * @}
    : E2 H4 |. h  G
  1531.   */( ~) |/ h% {' i" {: W
  1532. $ @+ M) ?/ d  ?7 I; U) r
  1533. /**
    " N# o2 Z6 Z9 v3 h2 y
  1534.   * @}
    1 m9 H/ H: I$ F/ F* o5 Z6 W5 c
  1535.   */
    " H6 y' {7 H$ K  l% Q5 @' T
  1536. . D: p# U' z: _; O- f
  1537. /**
    : N  i: }. g* S  s* ~3 u1 G: T3 E/ I  ^
  1538.   * @}/ L# [3 c! P8 o' U1 z
  1539.   */
    4 n, p# A3 h& R  L; q# z1 D3 u# b

  1540. " Q4 r: C1 c7 W7 F
  1541. /**3 M6 \; }7 q( o3 \& J& \, L& h
  1542.   * @}4 D- A  v$ ]; c: q8 i" L  `
  1543.   */
    0 ^9 q% d! b5 n2 l& `& v- u
  1544. 4 ?4 p) |: G  L$ ^5 u
复制代码
) ^( L% K( t8 @

4 ]+ Y5 t$ S) [3 I2.2、main.c
  r6 F) j3 u0 `3 ]" i% a# H8 \
  1. int main(void)7 X+ j6 C6 e( V
  2. {
    0 s$ r6 ^$ d  `! D6 L( f. x1 V
  3.   uint32_t x_size;
    ' A* y5 x6 L! ~" E" g
  4.   uint32_t y_size;/ N) E5 F& f) g: o6 X
  5.   uint16_t i,j;
    ! U8 b/ |& C/ F3 J, ]$ e: @9 ^( s

  6. , q2 B  I; O7 v; V# M1 X1 s
  7.   HAL_Init();
    $ y! q/ n  e+ s' e$ k! D# U# N- w; U
  8.   SystemClock_Config();
    7 v- y/ J7 v) j* i* o
  9.   ; [+ H: _) W5 J: a: D% Y: C* I
  10.   /* Update the RIF config for the used peripherals */
    3 ^* r; V1 {( v& c
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    3 G+ X% F: [; v' _( y8 L
  12.   RIMC_master.MasterCID = RIF_CID_1;
    , z( y# C0 U. b
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;
    , C. {: y. j" ]7 z& j3 _3 d
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);
    / `9 J; {2 A+ W+ S1 V
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);! t: K& J9 `; ]
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);
    ; B, v4 b. n$ {4 C: r
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);
    9 F3 c4 F! }. x1 j% H
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);
    1 ?- v; G0 O2 ?' r! E# Q, e0 G
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);0 y' j+ n" n! E# X  [+ F4 u
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);  k: n, I6 r1 G0 _/ k- K8 s7 I9 ]  c
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);# c- U  M' f6 o8 @3 k2 Y
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    3 ~  O5 H. t( e1 `. N7 b
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    - _+ b9 d, @! j% O# |0 b0 E+ M2 b
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);2 C. `: w( \: a& r2 S
  25. * K5 g0 _! ~# N& B" r6 t5 m! j6 x
  26.   BSP_LED_Init(LED_GREEN);/ Z) g  @0 |& A4 i  }5 L
  27.   BSP_LED_Init(LED_RED);9 A7 T4 i- [0 e/ T9 ]9 Q
  28.   9 ~: K) @( b2 t1 K/ l/ t
  29.   #if USE_COM_LOG: F4 a6 m. {# \9 T: n  {# |& V" T. h
  30.   COM_InitTypeDef COM_Init;
    & J& v/ t% k. W$ H: q' }

  31. * @1 M" j9 ?" ]8 ~4 n' F" R; s
  32.   /* Initialize COM init structure */
    2 U9 ]5 X& g; K" S) [
  33.   COM_Init.BaudRate   = 115200;
    $ f; e1 O4 J! j* |
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;$ ?1 z" s* s% s4 o! D
  35.   COM_Init.StopBits   = COM_STOPBITS_1;: Z" R& a/ O; S( l
  36.   COM_Init.Parity     = COM_PARITY_NONE;
    & k/ ^+ X* [0 _: C. ~2 t
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;( V2 f. P$ u- x& Y: H0 m

  38. & M$ R0 s$ I1 c1 M/ [5 T
  39.   BSP_COM_Init(COM1, &COM_Init);# K5 ]" _6 T& i

  40. + F. r. N6 C2 t) ~0 P7 G# I
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)( U! E- I7 P8 d
  42.   {5 q( \* b7 i% S9 s) I1 X$ U8 k
  43.     Error_Handler();' D$ ]6 j2 x" `6 U! }/ _% S
  44.   }6 {  \5 D* {9 O4 o
  45. #endif: K" E- i2 e: b( m
  46.   * w! R& p8 P% p5 c* L. r
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);' q6 y: u% Y! |+ O2 i) r9 D
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    ) j. _7 C# n" b( Z! X) X$ D
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    . m( T, @( f  k6 e% {! q
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
    $ v/ h3 N/ n% G( ^: j' D( j
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);
    . s- ~9 r/ J- A; ?: U5 [# y
  52.   UTIL_LCD_SetFont(&Font24);4 [1 S2 A' G) v
  53.   ) u4 ]7 o; |/ f; O0 ~% I* ^; \& i
  54.   while (1)
    5 o( V/ [0 _% |( h+ j/ o$ f- w3 x
  55.   {
    ) ?* d3 f# O/ S5 q
  56.     switch (i)
    + G. p& S3 j+ m
  57.     {
    # q+ O! u$ ]! A
  58.       case 0:
    1 ~' o4 N& W& a  H4 i% A8 {5 T
  59.       {
    # W& f" J6 ]6 v  K% |, E
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
    / }/ _4 R8 ]4 I" W) ^
  61.           break;
    ! p. j( Y) J8 R# j8 o/ y8 m: O
  62.       }9 R* s% n" C; R
  63.       case 1:
    * T( n7 f- J% j6 D4 j8 d/ O
  64.       {* Z# t1 I( X2 a# A3 s, ?4 T
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    % v7 p6 a6 y* |& C" z! V7 i! `0 s& W
  66.           break;0 y! @; T$ r/ m# _. F5 R! k" V
  67.       }
    0 g1 O% }: t: R# _4 @
  68.       case 2:! D, v& M6 A/ z: ~
  69.       {9 B" H5 a7 }6 T3 t/ E
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    # P, F! @5 x% _. E% R, Q- a5 T
  71.           break;# ^  H) E8 |! d: ?6 x: b
  72.       }9 Y& z/ s* I6 _7 v" m, G3 Y
  73.       case 3:
    , A* _  q$ i% k. i, p- u" D3 i- m
  74.       {) I" D6 y! A/ n2 L8 J$ D
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);7 V4 E' Q' a: y( z" q
  76.           break;- W% @1 ^4 w1 C  L8 G- h
  77.       }
    9 b8 F9 E* b& `, f0 W. G
  78.       case 4:0 a4 f* A  ?" }  m9 M
  79.       {
    , ]# g7 L) W& T
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);# Y) P/ o& M2 m  q1 z  q
  81.           break;
    ( @, j1 v  l4 X
  82.       }
    ( ?  {- U, {  J3 U+ z/ m
  83.       case 5:
    & }7 c4 ~6 M* J! f% o0 f
  84.       {
    5 y5 w+ r- N. x3 |  B
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);$ H6 ]3 ~9 f1 f$ S* G8 B6 Q
  86.           break;4 G/ b, _" K0 L. }8 F' o
  87.       }" `9 u" a) b# `2 r' X5 k% ^
  88.     }% M, \1 A7 O" ]$ r0 @
  89.     5 m, z0 ?5 X! n& |7 K+ m5 u, U- Q$ S
  90.     if(i==6)5 Q+ a8 Y+ G! D/ {/ {9 h
  91.     {
    : `+ }7 f5 @  c. k
  92.       i=0;$ W7 }$ o+ p0 W6 B* ?+ q) ^( G
  93.     }; u# m4 w. p! N
  94.     else
    ; \6 n' r4 m) N5 N9 f8 @
  95.     {% y! {% ~& L" T) v6 k
  96.       i++;( t' g4 V1 O3 @% J
  97.     }0 h5 ~( j1 k- h, g& f
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);
    : F4 N- p4 A: R5 R9 b8 @6 i7 Z
  99.     BSP_LED_On(LED1);
    % j. S# l9 w. w" S: _
  100.     HAL_Delay(500);
    4 Q% z7 o4 {2 {4 {. \
  101.     BSP_LED_Off(LED1);0 R5 k* S; j- c4 B
  102.     HAL_Delay(500);
    * ~% N* w2 I& d: F: }( D1 H
  103.   }+ Z. u4 B  ~5 E4 L) C1 f
  104. }
复制代码

; T# X  a, t. D  _+ s4 e. @6 t: N% n9 _7 R3 G/ U" X
- z- t* {8 g- k* ~& _. `

" E4 \; N8 b! p% Q' ]. z三、结果/ ^" L4 v5 v, _" k( a

- l) F% r' q$ }, {( s. E

( {$ o( `( L' h) g! Z8 J  l$ @* m: R下载程序到开发板,运行开发板屏幕显示如下:
6 A. a- E# Y2 f! C- u lcd.gif - l; Y$ k/ |& w8 I& Y3 z' p
0 f% N1 }8 ?# N& N" E

& Y, R' h7 j  B9 d8 w. u

& b7 B/ Q: G% P4 ~) H/ N1 @' e
* h$ l1 Q; V7 r) x% j
收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版