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

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

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

# a' }7 U: r# M2 I
- F4 t6 A& i: d. m

, X  O; \% k' [一、硬件部分
+ R& Z" s0 O; n% u) h1.1、LCD显示屏硬件接口部分电路
0 d. z$ Y. Q4 W: |8 F! y lcd.png + h; l8 C6 b" U# U

) ~2 ]2 C4 z" ?* ^/ `6 J/ X6 |' m7 R6 ]
1 G0 d& \) L: s
  M# \' x+ C9 X  L8 q

2 ^, G: G- k. ?, ~- x! J: G# _1 P1.2、LTDC显示内部框图, ~2 i, v* Y7 D
LTDC可驱动24位的RGB显示屏,内部有两个显示层
+ L) P' h( W& C" [9 Q, P. {8 o 002.png 2 N5 {$ \& Y0 Q9 k+ @

  ?& }+ I* W- M& F7 Q. H: U
% e  N& R" D1 I$ P! a

& f1 u5 j$ L1 Z7 t二、配置LTDC
1 C, t& g3 V' e' J5 J& I
, k( t$ v0 K* I! @2.1、屏幕的参数设置( g1 m) ~- a- {" J$ c5 w
003.png
" d1 H* p' v, N/ q- j7 D  ~$ Q* Q* u3 I8 O! ^) f0 ?1 N; H
* m1 A5 v+ T2 w7 ]+ `
2.2、层参数设置; t: b" j# @. Z+ w$ ^# Q, w- R
004.png 9 y9 r4 Z' I0 t+ h% t5 R

- m! R0 `& [" U5 `
9 p- P! }; U1 w' t3 w6 [8 O
# A5 G/ j* [: n
2.3、LTDC引脚设置3 ]2 r$ H$ U2 b0 q
005.png
) @' I- d; T. ?- ~7 Z
# S: d) O: R; |3 ]9 R
; O* q3 g, Q: E" J

- q9 t; ]' i# l: N( P5 U" a/ t三、程序部分! l# i! H4 E3 v" u5 V4 m" p5 q

$ A; h; T" {4 d  g3.1、在项目中添加LCD驱动程序/ c5 P! U! O! A! n. e
使用官方BSP中的LCD驱动程序+ x# R* c8 m/ R+ A' g2 l
stm32n6570_discovery_lcd.c. |" l( _) v# X( Q
6 E% l, w) f. q3 Q7 E9 z5 o  Z, E
  1. /**
    ! X$ o6 L. A( H. _/ }
  2.   ******************************************************************************
    . v$ Y/ C. f) {
  3.   * @file    stm32n6570_discovery_lcd.c% G4 _' M( C7 r+ B6 X9 a% y
  4.   * @author  MCD Application Team
    ' P4 C6 E) }/ U6 J3 J7 l; W) i& n
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module8 e  `* _$ [9 b7 J
  6.   *          mounted on STM32N6570_DK board.
      c: u# C! y) C  L% N5 {( x) W
  7.   ******************************************************************************
    * ?: L- e! u' M+ o3 T) V, @! e
  8.   * @attention1 n2 P& L4 m; T0 X
  9.   *
      E, R: k, J/ D& |, L6 [0 N# P# n
  10.   * Copyright (c) 2022 STMicroelectronics.
    . A' I) t9 H' Z+ @
  11.   * All rights reserved.( o5 E+ O! H/ D' w
  12.   *; Y% B  E+ A4 O3 ?
  13.   * This software is licensed under terms that can be found in the LICENSE file
    3 m% s1 `' f7 f' B' X1 I
  14.   * in the root directory of this software component.
      H+ U$ q* H# B4 Q; v5 O& S2 b$ s
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.$ S* f$ j. l4 i1 s
  16.   *
    0 x2 |9 M3 t3 T5 _0 o4 r3 a/ m- D
  17.   ******************************************************************************0 L0 S# a' S$ ?) x
  18.   @verbatim
    7 X5 e7 ]( \0 F" q
  19.   How To use this driver:# r$ p3 P+ `; U. `
  20.   --------------------------
    ! ?6 j7 ~, N. }( \$ C0 a
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.
    & p! {" F+ h, u( L/ y" V
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component3 d8 G3 S9 m: i- ?+ Z4 J& r
  23. 2 ^) t' c" V6 {9 t2 Q, W
  24.   Driver description:
    : B; D8 G( D1 b8 i3 ]
  25.   ---------------------
    - b$ H% T  ~3 I# H0 y* e- U6 J; ^
  26.    + Initialization steps:" l. r( Y  ^( A. ?
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the. n1 f) F3 @/ u1 X5 f+ y
  28.        following settings:
    + e$ D* x1 P. T  k! U/ O
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888$ g7 w' ]. b1 w5 r5 N* q
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.
    # J; F% X5 `) @# [. M; q% v+ [% E
  31.         - Width       : LCD_DEFAULT_WIDTH (800); I( ?' g/ t; z9 m4 u7 m  R
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    3 n$ N: \& M7 J+ ^- f7 t
  33.        The default LTDC layer configured is layer 0.& B  ]' l9 O6 ]: i5 _1 f- j
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:4 J9 n5 }3 y- U
  35.         - MX_LTDC_ClockConfig()7 ^/ U+ @/ h, q0 \3 d) i  I
  36.         - MX_LTDC_Init(): m* _/ Q( T! R0 k$ L. c
  37.         - MX_LTDC_ConfigLayer()
    3 M. x: @. [; }% ^+ q6 ]- r
  38. . T+ q; F8 Z( j
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.$ C! O; G1 u+ c1 ]/ W

  40. ( e5 V, M4 N( G2 W1 @4 q
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function." g8 e2 Q9 A% Q  ~" `
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function./ X+ O$ f; u$ L, O
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    ! z: J" |& q. y  m5 C: m' Y% e
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.
    9 K" r9 d' D1 Z9 w1 ]. N' D
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function., a" o$ M- h3 p- }9 d" [5 x( I. L
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.
    $ S  l, a4 y  O8 ?0 z, ^- r! H
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.
    " C, w0 e# b& f7 b/ g% d
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.6 K+ L& [; }( u, P) y$ J; o
  49. 0 K" g4 |! W" W. h' R/ u5 A
  50.    + Options
    ( p. c8 y  E! v3 o
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the
    6 y$ `( d& H+ R/ Z) O4 f
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.
    # S5 H1 v# k/ ?7 l; Z
  53.        To control the reload mode:
    4 s: J4 r% B2 z# @, ^
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE! c3 U/ {8 g7 l9 X
  55.          - Configure LTDC (color keying, transparency ..)
    - H5 R2 ~. @# ~9 M, @: E8 Q5 |6 K
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE
    6 v% ?$ D- j! E& j( Q
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload
    ! G, J) _6 h$ ]
  58.            in the next vertical blanking
    ; a! W4 Y3 ^- \" e8 U8 B
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()+ F' H4 I/ X) q
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()
    + q, j1 y' \: X8 T
  61.      o Configure and enable the color keying functionality using the( U* L  R! q4 n1 p' |4 R, t6 U, i
  62.        BSP_LCD_SetColorKeying() function.
    : W5 w! W6 x% l. z5 s' K
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.
    . n- F' h" K' a) A. Q
  64.      o Modify on the fly the transparency and/or the frame buffer address
    * q1 r/ ]8 R, m4 i
  65.        using the following functions:- n6 Y" a/ i5 i+ C- ^, Y
  66.        - BSP_LCD_SetTransparency()7 x5 `# L* d* K, w( d( Z
  67.        - BSP_LCD_SetLayerAddress()
    : o! }9 ]9 H: Z# @
  68. 0 W  l+ Q2 l/ |* K. P
  69.    + Display on LCD5 H: [! b1 S( @
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap), R$ }2 ?  t$ w
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,* ~! p' b! _# \' O
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.+ ]& g& V/ M8 r+ \% o: V6 \
  73.        The basic gui services, defined in basic_gui utility, are ready for use.
    8 f0 Q' F7 f7 o

  74. 1 I: D- |4 y- W$ Y/ A
  75.   Note:
    ) }- A& C3 ?( I' ]! y1 @; {6 M  C
  76.   --------
    / U* B- x2 g! s1 I  d
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select
    - p; N+ _+ z( H& t9 s: X3 i
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this% ]1 n2 ], Q8 K" m+ q# n7 S3 T
  79.     parameter should be 0.$ S% p6 d6 q$ X" F

  80. / d. l% B* R  S0 P
  81.   @endverbatim
    ; E6 t) r3 v( Q' ?
  82.   ******************************************************************************- v1 p2 Y& Z) B9 @8 w
  83.   */
    ; R, X; g9 |1 E' R9 O. C, g( B

  84. . y1 _' b7 l1 g+ L. [2 _0 }! |
  85. /* Includes ------------------------------------------------------------------*/
    % W4 I* v" [- @( U4 _- G, Z2 u
  86. #include "stm32n6570_discovery_lcd.h"2 z6 t! z0 |* d
  87. + C0 y3 S4 g- ^+ K9 u' v* O
  88. /** @addtogroup BSP- {$ d5 o: t/ `
  89.   * @{
    * `& \0 p8 O" r+ a* q4 F
  90.   */( i0 b8 x7 N) k* f1 g7 a& O1 M
  91. 1 K; ?$ P% h! _* Y4 i6 t
  92. /** @addtogroup STM32N6570_DK
    ) j' _4 Y" l  a0 b
  93.   * @{
    0 N$ h/ }1 L: G
  94.   */
    7 G4 {3 Z! M8 T( w, R
  95. 4 a$ }$ n# v* ~' [( x/ w) v  O
  96. /** @defgroup STM32N6570_DK_LCD LCD6 D. \. g7 }$ D9 Z& X* L; f
  97.   * @{) ]3 S  R% E2 W& g
  98.   */
    ! v3 a1 E% `6 s6 a

  99. * c' j: d/ a) U* i- k
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables: ~6 f0 M1 x+ E2 ?
  101.   * @{5 e9 \/ D* }. r$ n7 O& [+ H
  102.   */
    5 r: y0 ?0 o4 ^7 Q

  103. " K1 M% b$ W! T$ i6 c5 s" I
  104. /**
    8 M1 P$ f! @6 y2 h9 j( m) R5 s1 h
  105.   * @}
    ' }+ G8 R& s. X1 J% x
  106.   */. }1 T6 U) B' R0 L" ]8 y
  107.   w  z9 q) E8 |' B8 c* l% A
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions+ g1 Q/ b. C, `
  109.   * @{
      v/ _& z! K7 L  ~8 r! a" y
  110.   */$ \) s; |: F' t0 |
  111. const LCD_UTILS_Drv_t LCD_Driver =
    9 |! q7 `* b3 l9 U  R# `0 }& m
  112. {& S9 W3 P. y( F7 M3 s
  113.   BSP_LCD_DrawBitmap," I* l5 l+ B5 F6 X# M. @
  114.   BSP_LCD_FillRGBRect,& C6 }/ C- w; ^4 {: |# k. l
  115.   BSP_LCD_DrawHLine,. ~; n- k9 y7 X1 W6 j3 V6 x6 Q
  116.   BSP_LCD_DrawVLine,& {5 Z7 N- A9 H
  117.   BSP_LCD_FillRect,( C  j6 f) {5 i5 {
  118.   BSP_LCD_ReadPixel,2 ~- p. w: J  @" r  k& R" n9 E
  119.   BSP_LCD_WritePixel,
    , ]* h6 [+ S: Y# F# ]$ p6 z
  120.   BSP_LCD_GetXSize,9 z) b- Y! w' m, M2 {* ^* v; r
  121.   BSP_LCD_GetYSize," G5 T8 x; M# C1 z: L0 |; g
  122.   BSP_LCD_SetActiveLayer,
    # E: W6 T& `/ d9 q5 C
  123.   BSP_LCD_GetPixelFormat( S/ {! R7 O: p& [& `6 g& w) X; e1 j
  124. };
    ; t7 u( M3 S: |7 U4 J  m8 V( k

  125. 4 j! N( G8 v2 y+ n' O/ U6 L+ }
  126. /**
    " Y! x1 H# y0 \0 a
  127.   * @}
      T. q! }5 @  x/ E# ?
  128.   */
    ) C/ g( H1 y  v+ U  e" |$ m* w4 @/ D
  129. , B& i0 E( R8 G2 N" Z/ `) `- N
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables
    + N1 Z$ u, V3 s' y) p$ k% o
  131.   * @{
    ) y4 e) j. G5 `  J1 U6 n
  132.   */
    ) B) I$ S" g# I2 ^, F. x
  133. DMA2D_HandleTypeDef hlcd_dma2d;0 ?9 p: m  t, Z5 f' K% ?% B
  134. LTDC_HandleTypeDef  hlcd_ltdc;
    & R, _; Z$ j: q" i
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];
    1 q; p/ k$ ]$ }
  136. /**
    ( H3 I8 E  d& H1 A/ b. d9 A3 e" [3 v
  137.   * @}
    ) `; U: j2 w: l+ |# h
  138.   */$ f& X  V9 K- A% v
  139. & t: v0 A. @' o- D
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes
    9 p' p. p1 `1 C: l9 t" N
  141.   * @{
    ) U7 P' O1 `& M" R. |$ M1 i6 x1 `
  142.   */
    + u1 [6 p3 ^4 x; e9 U: A

  143. - j3 H; \* i" h
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
    4 W. h& p4 \- }& N3 }
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);
    $ [6 [2 m5 _; _
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);" |+ Q* k' V9 x+ \
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);  k; L$ P& O9 V* W7 h+ \" r+ c  S
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);
    7 V" C5 f. j$ j2 Y* C
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);3 l6 J4 h# x8 p8 k* z) q
  150. /**
    " ]5 T5 Y0 l* p; P
  151.   * @}
    " Z2 T$ N1 E8 B5 i  \
  152.   */
    2 ]$ `( X7 [+ e# j; _4 a! P
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros( M; z# B( K7 P
  154.   * @{2 u" ?6 V8 M9 F8 `9 _& S; X7 U: H
  155.   */
    ( ~0 t5 ~& S; G9 O) e5 U8 U
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\" w0 z! f% N6 v5 L, [4 Q
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\
    1 C# _* h7 }% l
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))+ E7 a+ _* Z5 c% w
  159. + X; i  q2 g3 [# G2 d5 @5 b
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\
    ! M$ `0 J7 V  E$ {: M
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\
    * g" p7 b8 x! J6 o, J$ v  j% R+ J
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\8 @7 B7 @( T2 w3 }! Q
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))! {8 a3 |( L. w2 C+ ?4 o* y
  164. 3 }$ h/ H  C% C5 I2 y! H7 [
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    ; n2 S$ D4 L9 n( f+ P9 Z) z3 h+ U

  166. ( T9 n7 D8 x: q, n/ P' [
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)& {. N3 C. l# A- ?, t& d

  168. # [+ m: B# ~3 _" T2 \$ u% r
  169. /**: P( s4 e0 T& K0 ?) |
  170.   * @}: P- Y2 t  W4 r5 C
  171.   */, u* ]! f, Q, x# z

  172. 3 e( Y8 `' k8 y% y1 \% H/ a
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions
    3 d- O* X  j/ W
  174.   * @{3 a; y9 R- y; o8 ^+ o
  175.   */
    + I0 x$ |; t1 F" F% T& @& P
  176. /**" R; D/ w9 @* Y/ i; }6 `
  177.   * @brief  Initializes the LCD in default mode.
    2 H8 Y# [% [$ n
  178.   * @param  Instance    LCD Instance
    7 D  @( f5 j2 Z2 a1 S1 J
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE% ]& \/ J8 G: d( a9 c" ~
  180.   * @retval BSP status5 L- [( Z" t; |8 ^/ V5 }
  181.   */
    + Z; y* a' D- V

  182. 8 c" v- Q% k  w# j
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)
    9 s- ~* m6 _$ `) g/ R
  184. {! n% ]+ {% \/ e6 |
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
    % Q, @+ S  {  f! y2 ~1 H; X% a; E+ E
  186. }" S- {# r9 L6 X+ r  Z! [& Y  b

  187. ! p+ I7 E; }* Q6 O3 k2 n; W" Q
  188. /**
    7 k1 F" }" ^6 I) K- h
  189.   * @brief  Initializes the LCD.. {9 ^$ \. E1 M- W/ B; q  c! U
  190.   * @param  Instance    LCD Instance
    ; V( f: J# R+ }0 C7 F
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE& k0 Y( Q5 Q9 E: L; Y
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB88881 ]$ G2 h! A) E% Z' w! ]  t9 M
  193.   *                     or LCD_PIXEL_FORMAT_RGB888
    , E& X6 A9 w  s4 g
  194.   * @param  Width       Display width' T( [# D9 S; q& f6 |+ ?
  195.   * @param  Height      Display height4 {+ k- _& A7 l( H! S4 C: y! m1 I
  196.   * @retval BSP status
    9 h& K7 ?' Z% J# B6 L" a1 Z0 a  a1 x
  197.   */
    : U2 f3 P# A2 Y6 s  D% t1 A
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)) O& E2 i& q$ r4 X  z/ c
  199. {9 I& E# Y5 h' {& F
  200.   int32_t ret = BSP_ERROR_NONE;
    - M( u: N1 t; b) @
  201.   uint32_t ltdc_pixel_format;* X  k9 }  V. H6 Z8 r: r
  202.   MX_LTDC_LayerConfig_t config = {0};
    1 ^7 f' a" J/ `% ~

  203. ( o1 |0 p  S0 k9 W
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \+ `7 z7 D3 U; d$ R
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \
    # N0 F0 ^+ x8 ~6 w/ j/ o
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))
    * `1 ~+ q& W( m8 U6 _# D
  207.   {
    $ j+ P' f! t% G
  208.     ret = BSP_ERROR_WRONG_PARAM;; m1 [- w' {/ v; \1 Y7 V8 j
  209.   }" K/ b, s8 a& Q* V0 y6 R  l
  210.   else% S( D, A$ }- O0 I1 u& n- z
  211.   {. ^0 ^  O% O5 O& v
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    . `+ s# m1 X" q; y
  213.     {
    ( B& W! @! T& r0 F. v7 x
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;3 [) m8 p0 g! _0 ?. [& j# @$ @
  215.       Lcd_Ctx[Instance].BppFactor = 2U;3 M; B* |( V$ y8 ], K
  216.     }
    4 E! i8 f0 L, Q; b* `  X7 f& D
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)
    , v0 Q, e0 X: ?# C! z: k* F
  218.     {; T2 R3 e1 [4 u. O  {! M2 l) B. t, u4 z
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;
    + V* x/ p: Q! u; P1 O1 P
  220.       Lcd_Ctx[Instance].BppFactor = 3U;
    % {/ H5 }3 {& d* H" J  R
  221.     }. j/ b' c4 A& }7 d6 M% n0 x' D' }
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)
    , ]# V1 v4 N, b( l+ r1 H4 W! w8 l
  223.     {  O8 ~% H2 X+ r6 ]
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;' d) r- d! y0 Z- S
  225.       Lcd_Ctx[Instance].BppFactor = 2U;3 A  W4 l% e4 F- |  l4 [' l
  226.     }
    ' I$ V% E$ o9 k+ p
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */3 p6 h& `: \% _5 q% y9 g
  228.     {0 X/ ^+ ?' W; D* i2 s$ e
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;/ c& t5 k2 M' o) m3 i
  230.       Lcd_Ctx[Instance].BppFactor = 4U;8 ]6 C3 N! @& e* c8 x4 Z
  231.     }+ \9 q! X5 ]# P$ U6 {8 {
  232. 5 V6 b$ ?! H( n+ J, }% q+ K
  233.     /* Store pixel format, xsize and ysize information */
    0 p$ b: }% l$ O- g$ H2 b2 I- ]
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;$ ~5 G' n" Y' u* I& h( W
  235.     Lcd_Ctx[Instance].XSize  = Width;" `7 Y) t2 [/ h. ?) v
  236.     Lcd_Ctx[Instance].YSize  = Height;
      e1 z6 |- u6 x

  237.   k: ^. I" |( G  o$ Y6 ^. k3 q$ ^
  238.     /* Initializes peripherals instance value */0 g2 M( z: e' k) x( \" e- k
  239.     hlcd_ltdc.Instance = LTDC;
    ; B( e$ j" y5 s7 G
  240.     hlcd_dma2d.Instance = DMA2D;
    / d9 w: |5 J2 c- z" O: r- q& P
  241. ) ?4 s$ I0 L" w8 ]9 @& [
  242.     /* MSP initialization */! w) G# ^7 w5 C
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1): J7 R/ ]$ J8 i1 x& y3 Y
  244.     /* Register the LTDC MSP Callbacks */
    ) s/ U0 x- `3 s% O% {+ m
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U); H* }- x1 j: e
  246.     {, |5 b7 C7 u6 w  @
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)+ Q! @* w  i% h' a9 K! {* Y
  248.       {2 d7 ~. L/ |# F1 `
  249.         return BSP_ERROR_PERIPH_FAILURE;# J, \$ u. @4 y; S! W$ `% v7 i
  250.       }
    0 f7 k% L- A% v3 \: _2 L5 F
  251.     }
    : T) P) o& F. E
  252. #else
    : x* u& L6 w; m  J4 f
  253.     LTDC_MspInit(&hlcd_ltdc);
    7 t; n: C6 S; |7 M
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */5 Z) M& L; C9 b0 Q6 e

  255. 2 v. n7 {: Y6 a2 q0 V0 \) C. s4 x
  256.     DMA2D_MspInit(&hlcd_dma2d);
    + k5 T. l* P: b) J0 e
  257. 3 r+ L: g8 `4 o! s
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)- v/ p* Z. A- G6 [
  259.     {
      i' U+ ]' B# B5 l+ y# P8 s
  260.       ret = BSP_ERROR_PERIPH_FAILURE;5 O8 t6 w: p! J2 I2 M$ o
  261.     }
    # a* R$ O" I# ?/ f8 F( N* }6 W0 h
  262.     else6 M/ P7 ?. E; q2 N0 i9 f
  263.     {
    0 a2 w4 z( |( @! s/ n0 ^0 z2 w
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)
    8 M. P" Q  p' P$ q& k5 z; g. h
  265.       {
    . g2 }; |  C$ a) S4 K  r/ s
  266.         ret = BSP_ERROR_PERIPH_FAILURE;
    : R( t. h0 r% M- V7 f
  267.       }( \. ~5 w" I2 c* k7 N
  268.     }4 u' t; x* G; I
  269. 1 s5 X! g, N% f+ d
  270.     if (ret == BSP_ERROR_NONE)4 j0 N6 \% O7 a+ k
  271.     {; @+ r$ Y2 f# K4 J% e/ d9 \
  272. #if defined(DATA_IN_ExtRAM)" g0 h5 ^) {( f# k
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */
    / r3 `  o, b; F' V4 i/ ^
  274.       /* Initialize the XSPI RAM */3 E/ E  x. i2 }; K( j3 q! c
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)  B. T; R0 D/ U
  276.       {
    $ H) Y  z0 p' Q0 A8 r
  277.         ret = BSP_ERROR_NO_INIT;
    - x( U! U' N2 h$ ^; V* k# y
  278.       }; J/ X6 B/ K6 f1 B4 F$ @8 N" i
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)# Q  o- q( Z: a% G' i
  280.       {4 e) G0 ]) ~# m, M
  281.         ret = BSP_ERROR_PERIPH_FAILURE;1 I. B2 \" Y# W. _% d
  282.       }% G) a; g; {5 W4 M* {/ f
  283.       else" |/ l2 r) Q. k) \) y# N4 c
  284.       {
    % }" a7 k& z( m% m
  285. #endif /* DATA_IN_ExtRAM */& S* o6 D7 b) o
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling4 N, t; E. w& W0 h7 ^
  287.         BSP_LCD_ConfigLayer() at application level */+ z6 f: O$ w& J3 p0 z
  288.         config.X0          = 0;
    - B- B8 v4 d  @  s+ i2 d6 S" T
  289.         config.X1          = Width;* r; ?' ^% L. F* \5 n
  290.         config.Y0          = 0;
    9 x+ }: h; ^( v9 U: U9 _5 `' ?
  291.         config.Y1          = Height;' n" K/ H5 w4 w2 c6 `
  292.         config.PixelFormat = ltdc_pixel_format;* e* ~) j9 M5 p9 z; K. D0 V
  293.         config.Address     = LCD_LAYER_0_ADDRESS;
    / |* d. N0 B/ s; h! e

  294. 3 P1 M; m" u+ m3 v
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)
    + A3 v/ G" j2 P- A" E
  296.         {
    1 C& O0 H+ Q/ j( w
  297.           ret = BSP_ERROR_PERIPH_FAILURE;1 e0 d* p' M3 D+ `/ n* U9 K
  298.         }6 C% M: F; h& A* u# G
  299. ) E3 x7 e6 r3 G6 I
  300.         /* By default the reload is activated and executed immediately */
    1 g% X1 U$ r+ M& S$ R
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;4 @% q1 v7 b$ O; i6 b4 l( c
  302. #if defined(DATA_IN_ExtRAM)
    6 N; e& R1 q: a, }1 ?
  303.       }; N7 K4 I% e- l! i% r1 i
  304. #endif /* DATA_IN_ExtRAM */" g' K6 j4 R1 k6 _
  305.     }
    ; Z3 ?6 U4 i2 r0 J  J9 w
  306.   }4 X! C0 |- [, ^! `

  307. . u* ]" c& c% B5 ]& v% j& e
  308.   return ret;9 `3 ~- Y7 C) ~4 y9 ?/ c
  309. }
    , S9 u; L) n& R5 l( A3 C2 x* b" G2 ^
  310. 5 V3 i  m. b' p' P/ V7 f
  311. /**
    ! ]7 _# l" c" L* l7 ^
  312.   * @brief  De-Initializes the LCD resources.
    7 h- u5 x0 z( _8 E& _
  313.   * @param  Instance    LCD Instance
    / N7 d# Y9 Q$ ?) H- z/ V
  314.   * @retval BSP status2 S  a6 y- g, S
  315.   */& a7 `) l4 r# M6 I; r: ^
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)
    2 p6 z& d4 S/ Z' [3 p. f
  317. {  ]/ o7 x0 u9 |( y& y
  318.   int32_t ret = BSP_ERROR_NONE;7 @4 o( m3 u1 b" y5 s
  319. $ g1 E8 \8 K+ F; G9 s7 w; i
  320.   if(Instance >= LCD_INSTANCES_NBR)4 @4 {& I9 V7 E. G7 S$ \$ Q0 c
  321.   {
    2 ]8 l: D- d2 i! l+ x% p
  322.     ret = BSP_ERROR_WRONG_PARAM;# O3 Z* m- W. c, d4 n* Q
  323.   }
    / I; _' x, f  ?
  324.   else# x3 V: n" [4 q
  325.   {. [; e) S: @: E: {  \: Q
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)
    + T. M% U/ J& V" n7 U4 ?6 H  V
  327.     LTDC_MspDeInit(&hlcd_ltdc);
    9 W4 }- W% Y! I7 m
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */& ~8 _8 a- A$ }5 L( |0 Q$ V

  329. 3 t1 r. u, ^' N% }
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);
    ' ~  E5 |3 H3 t% N
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)7 }7 M& P; }7 p7 d9 j1 X
  332.     {
    - x" Z# [* Z) C" B
  333.       ret = BSP_ERROR_PERIPH_FAILURE;
    + P, u0 M! H6 w) @' E  ?* f; [
  334.     }
    . C" ~' C) d3 h" h  Q! c
  335.     else
    9 l" T$ g  Z/ o$ ~, g/ F$ C
  336.     {
    % R- A* V! `7 n7 m& H, O' t0 t$ |
  337.       DMA2D_MspDeInit(&hlcd_dma2d);
      ^9 ^0 u4 I% X) m, }
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;
    - B* C' L6 y# x6 @) n" l
  339.     }5 _" a( r* i9 x! a
  340.   }
    2 f% K) l8 ?1 K1 ]+ `
  341. 1 H* S) E. }3 f- a* q5 E* @4 k4 q
  342.   return ret;
    0 m# E9 ^3 y$ K' N8 a
  343. }& u8 A4 Y" {+ B. i: r$ m0 E

  344. * }5 ]& a4 X8 z
  345. /**
    * p$ \% J( d# U' x) `: `3 s
  346.   * @brief  Initializes the LTDC.+ ^+ d! b  ~* ]' H& o
  347.   * @param  hltdc  LTDC handle
    ) g$ r; t' k  A4 U6 o
  348.   * @param  Width  LTDC width
    3 r* ^  @- |* [+ V  j: C8 ]
  349.   * @param  Height LTDC height2 N4 d# x  P; x5 S$ F. R) x' H
  350.   * @retval HAL status
    ; E' v; D- ]& |: E) Q
  351.   */+ e8 q* q  I& P7 r: a9 |
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)
    % p- g0 P3 I5 J9 R9 o7 j  q+ |
  353. {1 @- B% v! i8 X$ d1 Q* @3 G
  354.   hltdc->Instance = LTDC;" M# D, G) G. i+ @
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;
    ' C0 J/ ]' m  W
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;
    9 W1 x, b. d2 f! ]( ~
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;0 H% ^( E; U5 X! ?- B% B" I+ ^1 W
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;
    9 e) c) g) S6 c* y" u3 E

  359. ' p2 K9 E+ \, Z. F, _- T
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;. m7 N- L) X, O; v3 y) u
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;
    + X) w1 ^- N- Z$ B
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;$ j+ h- v# h! b  V0 h, S' {$ a
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;/ Y3 h0 Z* o- @( z. P
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;
    ' ?1 {; q- F2 k0 m$ @
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;
    # D7 _9 g$ Z' ], c/ m& }
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;7 X. F' Q7 M) j4 I! i
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;
    ( ?  F1 f- e% b4 g

  368. 1 d  x2 O3 y. b7 B7 }3 `( O4 p
  369.   hltdc->Init.Backcolor.Blue  = 0x0;! i6 Z6 [$ n! S4 ]0 L
  370.   hltdc->Init.Backcolor.Green = 0x0;
    % D9 `; b3 k: J* D, V. @! [
  371.   hltdc->Init.Backcolor.Red   = 0x0;
    & L( O' z% [2 A% ?7 j0 S$ r+ l! }

  372. / \, k# s3 V0 i# c9 u
  373.   return HAL_LTDC_Init(hltdc);' }; z2 y6 W! x! ^- }2 i- I& M
  374. }& W/ Z' X  J+ t, x
  375. , |/ Z: }0 d' u2 G2 X
  376. /*** k6 v& T4 j4 T( E- W; R' x
  377.   * @brief  MX LTDC layer configuration.
    ' t8 V. F* k) r% g& p( V
  378.   * @param  hltdc      LTDC handle
    ; J& t) m! N/ X9 p
  379.   * @param  LayerIndex Layer 0 or 1: v, F; ?4 u$ F+ K$ k6 f/ f
  380.   * @param  Config     Layer configuration; l- {7 m! n! S- x
  381.   * @retval HAL status) V* b) O/ y& `6 J) p- n
  382.   */" _, d* i! {- Z% J1 w" E  \  v
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)6 t6 Q8 n" Z! e" Q- f( P
  384. {: Y0 r! ]" E- }6 i; q% u1 o0 z
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};
    : _9 a! \4 A/ K: |& j
  386. ! I" x$ H/ W; N; c4 i# F
  387.   pLayerCfg.WindowX0 = Config->X0;
    1 Q* r+ j6 k- S- w8 Y
  388.   pLayerCfg.WindowX1 = Config->X1;
    0 M+ ~; d4 x9 U6 q, p2 H. r
  389.   pLayerCfg.WindowY0 = Config->Y0;
    & E0 H. C" {, ^( V/ \$ I6 M/ @
  390.   pLayerCfg.WindowY1 = Config->Y1;, J- o, [; Y7 O$ g' i! b" F1 O
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;% ]: N' ^& @1 H
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;
    6 ?! W9 K  J7 p: H( y/ h
  393.   pLayerCfg.Alpha0 = 0;+ i& k( y5 |" l
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
    # H( [8 L- S8 _+ V0 C2 Y
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
    - a0 h2 Z7 M) o
  396.   pLayerCfg.FBStartAdress = Config->Address;  X1 I$ e+ o4 I3 t- l9 f
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);& }' x- q- @4 d, }' Y
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);
    , V! @3 M1 v, I$ B- D9 e
  399.   pLayerCfg.Backcolor.Blue = 0;
    . m, `) a+ u6 x" X
  400.   pLayerCfg.Backcolor.Green = 0;
    " O: ~3 v1 v' _/ ^, y% `$ W
  401.   pLayerCfg.Backcolor.Red = 0;) s7 `* N' N0 Z; e4 O
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);9 u: g, n; b2 a8 N* h" k. g
  403. }  S* s6 O. `# X* h3 b! ]
  404. & s! T* u+ b- P. P) Z9 r
  405. /**
    5 E4 Y. O/ [7 U8 v, z6 `
  406.   * @brief  LTDC Clock Config for LCD DPI display.+ m$ L& m. N/ _' Z) x8 r
  407.   * @param  hltdc  LTDC Handle
    + O3 H- t. D+ C: j* z3 A
  408.   *         Being __weak it can be overwritten by the application3 @' q$ N: [9 Z* _
  409.   * @retval HAL_status- A8 i+ a& c. |
  410.   */3 F$ h3 o6 E. v2 W0 [2 V
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)
    3 v! g1 ?3 C- l* l
  412. {
    ' q  h' k5 f/ Q$ B) S( a4 ?
  413.   /* Prevent unused argument(s) compilation warning */5 H9 X4 I2 N4 s
  414.   UNUSED(hltdc);4 n+ ^: {( T3 b/ ^' `: t

  415. " n  i9 K1 }* w+ O  ~5 @- A/ @
  416.   HAL_StatusTypeDef   status =  HAL_OK;4 w' @# l/ p3 M6 l. [
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};" \3 G/ o5 G* i; J! }4 E  X
  418. ; c& W: V$ D3 t2 u  T' ~6 c+ ?
  419.   /* LCD clock configuration */
    4 e/ t$ V: e; }: R5 ^* ]
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */" e! K6 ?* C9 W5 \  ?. `8 A
  421.   /* LTDC - PLL4 */1 K3 R( r1 N% ?/ B: U
  422.   /* Configure LTDC clock to IC16 with PLL4  */$ j7 Z% l4 x; z% ?2 o; _

  423. - U% M& F2 ?1 s# m' y
  424.   /* LCD clock configuration */" W" S; f0 C/ }+ h9 B) z9 r" H
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    ! h# t4 {- q, H% N
  426.   /* LCD clock configuration */
    ) k; K5 ^) l6 K+ h1 ?" W5 q
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */
    6 S$ d. h9 c& z: M7 z6 Q. e
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */$ a4 W) X5 P' d1 \8 R: u
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */
    ) v" h* X. J- J" Z. m* N+ ?8 _
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */
    + E. N5 @  p! {2 i

  431. / D: e6 N% C- g8 S  ~
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;. L/ N! K7 {7 c
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;( l: z0 J6 h3 D
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;
    $ @6 [* y$ r; ^0 [+ h
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
    / T, H5 x/ W; L& Z, D+ H
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    ! c2 E: h/ U2 a9 {9 C
  437.   {
    % N4 c5 A9 {" q2 d$ C) A% g6 ^6 m) i
  438.     status = HAL_ERROR;9 u& n  S1 A3 a
  439.   }
    $ {- K9 J- d) v  ~: s* J, o8 L

  440. 7 s( W. w8 v9 _
  441.   return status;5 ^" L4 k5 t: F' b  b; o
  442. }5 w" _9 Q  T9 v6 z+ ^) t6 ]

  443. % b7 R* O4 I& n" E7 p
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)0 K; K0 T; \" G
  445. /**
    * ^& g  B1 O$ H3 u% F. H. S. e
  446.   * @brief Default BSP LCD Msp Callbacks
    $ }6 p5 D  P  K* S: }# e3 c& K3 Z
  447.   * @param Instance BSP LCD Instance
    8 ?: i5 Y) w: ?/ z
  448.   * @retval BSP status  s; s5 h* }9 o# ]3 c
  449.   */+ }; J( ^/ Y+ a# Z; T
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)0 Y  r: w$ Z% S) q
  451. {
    % T& k/ g6 `6 |+ `
  452.   int32_t ret = BSP_ERROR_NONE;2 g0 Q1 K7 @) V# |1 v

  453. - x3 U, ~5 ~# q: X
  454.   if(Instance >= LCD_INSTANCES_NBR)
    ' r0 {& {) J7 @7 W+ t4 @: q% t, C
  455.   {; f, I) W, x2 V  G! i  }; a' z
  456.     ret = BSP_ERROR_WRONG_PARAM;& g( R- L& x; U+ x' q/ C
  457.   }- }: ^( t% [" I# Q1 O
  458.   else1 _9 q8 A; Q8 G/ l2 f3 c& t7 b
  459.   {# a2 [+ @! d1 ^$ n* \+ f: B
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)' o' Q% ]/ z4 j/ G  H4 [
  461.     {
    + n* r6 A6 v) n( n) E2 o3 @# |
  462.       ret = BSP_ERROR_PERIPH_FAILURE;
    - T# t4 X9 o. G( X5 W
  463.     }4 A* k+ D4 x) ~; H
  464.     else
    " ^- f7 {* f( t: r6 C" H
  465.     {! i; [( ]$ ~1 k" K
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    + K7 k/ c2 u7 ]7 t# W! Q& X
  467.       {0 x5 c2 e1 L9 Y8 F4 }
  468.         ret = BSP_ERROR_PERIPH_FAILURE;
    # Q: F  q" z5 A, t6 u) R$ M+ M- o/ U
  469.       }
    ; S% {9 T$ S  Y: T8 r* K
  470.     }1 V$ c: |8 c5 B- y5 U% Z. K
  471. & \7 x( V) r. a1 k
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    ( G/ W  E, j8 A
  473.   }
      @* t" H; }: ~/ \/ ~3 S9 ^0 ?
  474. 4 p$ I% G2 a! t& i7 u" a: M) ]& ]
  475.   return ret;8 l. _: j# Y6 j$ r
  476. }) [8 v; \# ]. }3 U. f1 X( ]* [
  477. : r5 Z7 o' R' G7 F8 A% }
  478. /**
    ! o% b0 i4 w/ g5 |! V& p
  479.   * @brief BSP LCD Msp Callback registering! Q, q4 k) g+ L7 R6 D" t4 h
  480.   * @param Instance    LCD Instance& ^2 Z7 s4 L- y3 E
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions
    & I. p  ~% ^) \* F
  482.   * @retval BSP status
    . O0 B5 c' j8 O" T
  483.   */
    + g$ A, q1 p3 T  Z6 s! f7 k
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)
    8 R: z" w- D, P3 J
  485. {- a; q8 Q. M1 |$ |/ Y. F
  486.   int32_t ret = BSP_ERROR_NONE;
    * s" d$ c# F& J4 u$ y
  487. ) ~% E" b% A8 p; Z
  488.   if(Instance >= LCD_INSTANCES_NBR)
    ; u8 i( l* [7 J, i6 c2 y
  489.   {7 w# m9 e8 \# R
  490.     ret = BSP_ERROR_WRONG_PARAM;
    6 |# H' q6 }  E% F
  491.   }
    4 }& g2 H; M  |2 s7 P! W! r8 m
  492.   else. ]; b; S! r8 L# o' W
  493.   {3 T- J5 V2 U* n( M$ C
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)7 k; |% B7 z8 Q( b! v
  495.     {, E7 S; T6 r6 p& d5 F8 p
  496.       ret = BSP_ERROR_PERIPH_FAILURE;: W4 K# q5 B' ^
  497.     }8 f4 j/ p9 i2 \" B8 M
  498.     else
    & M8 T4 A/ {  O+ Z4 {) h
  499.     {& {4 F, Y4 _9 e6 |8 _
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)
    - D8 ~: ]+ ~* A; A, w* z' o
  501.       {
    2 u- Q. ~) w( m- Y' ]5 X
  502.         ret = BSP_ERROR_PERIPH_FAILURE;
    7 t; Z5 }- R  i9 D8 q6 ?) M# ~
  503.       }+ d0 d0 J7 m1 [' W% D, g& V2 M% m) W
  504.     }
    1 E/ k; G. O9 p  G$ _3 L( y" F

  505. 9 e4 ~0 ]+ d# G- o
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;# l) A4 Y* O4 G$ C0 _3 g+ ^
  507.   }$ B! L/ L/ S! f( C0 D+ A: b: I
  508.   \( B% @- j6 e; Z6 w
  509.   return ret;  }+ |) w. {" N- H0 W# H7 P
  510. }% }" z5 e$ z7 M, B- L, l
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    2 R: b) Y3 L# r, K! a
  512. 2 y4 e% s0 x6 G$ q6 R" A* [
  513. /**
    8 S# ~3 Y) D% g, n# C; x1 `$ R8 V
  514.   * @brief  LTDC layer configuration.
    9 V* p* l/ m% Y% Y
  515.   * @param  Instance   LCD instance
    1 [( H: k6 l6 ^: Q+ b2 P! t
  516.   * @param  LayerIndex Layer 0 or 1! k4 ]3 v- Z$ T8 j0 T
  517.   * @param  Config     Layer configuration
    6 o2 o/ G& a7 l
  518.   * @retval HAL status
    ) Q2 T9 o" q& g6 w8 i5 K1 {
  519.   */- C& p: q9 n0 X
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)6 _2 }. H. I& |' Y3 V+ |
  521. {
    / F4 ?! s! r) T
  522.   int32_t ret = BSP_ERROR_NONE;  g/ b# c3 g7 _
  523.   if(Instance >= LCD_INSTANCES_NBR)
    ; I6 J7 r* P' m; o
  524.   {7 S" M1 B7 U7 R! c/ g8 h2 w; \9 L( w
  525.     ret = BSP_ERROR_WRONG_PARAM;; l: |$ X* F6 o0 }+ r6 h
  526.   }
      {$ h8 ^" y& U# K* X6 A+ B1 x. m9 m
  527.   else. q: `6 V# }% s+ |, C3 t
  528.   {6 G  S& {9 O6 w0 r+ o
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)
    6 n8 _# F4 ~$ X
  530.     {
    6 G) T& o' u! n) y. M5 b
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;% f$ K8 s' t1 J5 H3 K
  532.     }
    ! x) w8 b- ]. p! `3 q8 ]4 Y  p$ A& p+ a
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)+ w5 n) V/ H* {' K
  534.     {
    ! _& M0 U& W8 ^
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;' R8 ]9 R, P$ V
  536.     }5 l5 ?; e% J) u% W5 X
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)
    " s9 ?3 y4 i: [4 M# u! ]/ a% k
  538.     {
    7 U) b8 G  f& z0 s4 b2 d- L* \$ U9 H+ @
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;+ a$ h* l* S) A4 B4 R. s' I& S/ Q) B
  540.     }! g2 c9 I( Q# F
  541.     else
    9 c8 t) |$ e5 M/ h( ]. [* ~7 E
  542.     {" I% I  _9 A+ m, m1 T" ^7 C
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;. f, J. X" F7 u: l
  544.     }* X8 [& b7 v! [) _; |6 x* w
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)
    ! U  {7 A; u7 z) |# }
  546.     {
    - u0 `$ Q. _" W/ `% M# k( ?
  547.       ret = BSP_ERROR_PERIPH_FAILURE;
    6 I5 a: H( v3 a+ _- O& R) z$ i
  548.     }3 c9 A9 `+ s2 M6 D/ {+ N* Y8 ]/ C5 t7 Y
  549.   }
    - X6 V5 T; K* f+ q( ^
  550.   return ret;
    / u6 r6 z: |/ W
  551. }
    : n7 [, `7 G/ M9 d4 Q5 m8 ~; F

  552. 4 N, \- W7 }* q6 s
  553. /**
    2 b) B+ S) }; V) v* U
  554.   * @brief  Gets the LCD Active LCD Pixel Format.
    # h( d. c5 {3 P+ a0 q
  555.   * @param  Instance    LCD Instance
    ; U8 H" ^* i8 X' m9 M2 L) K) ^. U
  556.   * @param  PixelFormat Active LCD Pixel Format3 b+ _6 k) B' G  i$ l
  557.   * @retval BSP status
    7 p0 m" T6 x7 {; f8 L$ P/ m
  558.   */
    5 |% G$ R, t# m$ f+ z: s
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)
    6 L* f. N8 M0 i, I5 Y# _
  560. {
    & v/ w! f$ X4 X- R. y% `
  561.   int32_t ret = BSP_ERROR_NONE;
    ! y1 R/ C; ~+ A' ]' d+ V
  562. 5 J9 {2 w& U/ o: ^4 [' c. c
  563.   if(Instance >= LCD_INSTANCES_NBR)
    ' u# u, e- N$ J' Y7 F: t
  564.   {
    ; g: M  u2 w  m' r8 S, Y( ^
  565.     ret = BSP_ERROR_WRONG_PARAM;
    . t# C) e+ [; k1 C8 n
  566.   }. @) {. w; l8 V' R3 x! c' Y
  567.   else; g, A. A: R3 v$ ^* y9 x* U
  568.   {* \6 J2 Y1 k2 l# M6 o" }+ A
  569.     /* Only RGB565 format is supported */
    4 ]- \) u+ \* s* \) I$ a8 s
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;4 e) |( Z$ B% ]3 `+ F5 X3 i9 c
  571.   }! t" m  e. J/ G3 R$ n4 s# I
  572. ' o; D/ e3 q& u5 S& R. g* m  E
  573.   return ret;
    7 f( y! a3 q6 [; b
  574. }
    ) W) q9 y; m: Z7 {" ~' k1 V
  575.   x4 E; s$ j) H9 h8 k
  576. /**. e+ d- ]5 @  U3 F6 y6 b
  577.   * @brief  Set the LCD Active Layer.
    " D1 A* m" \0 M5 Y- c+ A% B# ~; v
  578.   * @param  Instance    LCD Instance5 v1 r! {( Q( F1 D! ?
  579.   * @param  LayerIndex  LCD layer index
    2 n9 H  Q) g9 k: W* _2 r
  580.   * @retval BSP status& K& A# W6 }8 c  h( G8 L
  581.   */6 p8 i3 |( c# f7 T+ v7 l
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)+ B& `0 G/ f, o8 X% D
  583. {
    5 M6 \/ z  g! p" _
  584.   int32_t ret = BSP_ERROR_NONE;( o4 e& ~9 t/ h8 H2 Y3 Z- n6 N
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;9 S/ T5 X1 z0 S! B& l5 B

  586. & R& U4 F5 ~- R" Y! a) Q: i
  587.   if(Instance >= LCD_INSTANCES_NBR)
    6 S6 \3 N4 y' ^( S0 U
  588.   {
    ) [6 c/ s1 J; u6 c
  589.     ret = BSP_ERROR_WRONG_PARAM;' b7 S8 Y/ e$ b
  590.   }  Q2 u# D; Y5 X( m% K4 y( q: M
  591.   else
    2 Y5 a+ X  N7 k, C% ]7 {9 |
  592.   {8 S- U4 C$ J; \5 }. _2 E! y
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];
    ; S  ^+ Z: E( F! |* W
  594. 5 `( j9 [' c$ }. @1 h
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;& ]9 v) M% |1 w# e) ^
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;9 j( v0 ]! ~  o- \% \) f* e9 {/ g
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;" [, @" r4 W+ Q6 m
  598. * Y) w' O) U" L/ T: Z3 e
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
    " f0 o5 I& V1 x/ V3 s; v& ~
  600.     {: `/ A6 C0 w) c% ~# w" d2 x/ t" [
  601.       Lcd_Ctx[Instance].BppFactor = 2;) Y) p) \" r, h( b- Q8 l
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;* |1 C! {: y, y5 B: G& O
  603.     }9 p7 c# l% m; b& l7 X0 H! Y
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)9 j& j6 G# w8 \2 m! q
  605.     {1 ~- l" C- ~# A( J5 ~6 A- A& O3 i/ E
  606.       Lcd_Ctx[Instance].BppFactor = 2;: D0 a0 ?( d) r6 k  |- |- d
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;; \- {+ @; ]+ ]6 j$ R9 t. l* y
  608.     }) |  ]$ v0 n3 i
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)
    * x8 v" O6 m( i5 q' v! x2 }; g) a
  610.     {' D6 n9 a' q5 z# x
  611.       Lcd_Ctx[Instance].BppFactor = 3;* f' o6 J. R# D
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;
    - U" h$ Y* a4 N+ V; l: D
  613.     }( k; v3 R7 ~$ |, j# D
  614.     else
    / r/ x4 f$ t  V+ s+ _0 f  x- e
  615.     {
    + p, z; M$ G* e1 d! \+ S( D
  616.       Lcd_Ctx[Instance].BppFactor = 4;
    3 T2 A* V! \  s
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;: W& L$ J) i" i3 s- {4 q
  618.     }
    , k: O) I& m/ T5 h2 ^
  619.   }
    ) m! [8 n4 E4 `+ G$ Y4 `: P

  620. - v+ C& ^$ Q' h
  621.   return ret;
    2 \  i% Q$ `0 }/ n3 _$ P
  622. }. O" Y/ t1 B: X8 `) N, N
  623. 1 F. }8 X& g7 e+ o# m$ G
  624. /**: m8 @/ O% N" V7 U$ x7 |( f+ \2 i9 h
  625.   * @brief  Control the LTDC reload
    ; W, M3 k( [) _( G7 }0 U  ]
  626.   * @param  Instance    LCD Instance# U' F0 a: C& \( n8 i& I& y! }
  627.   * @param  ReloadType can be one of the following values
    5 R6 T4 n& b, X7 @; x
  628.   *         - BSP_LCD_RELOAD_NONE
    8 g+ @' G5 ?' a3 b
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE
    ' v2 ^& p0 a; L! h8 `- c
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING
    2 U" N5 K; |7 S* k
  631.   * @retval BSP status
    - j8 H/ O$ j. N' j# }! k# y
  632.   */
    0 Z  S9 o. |# c& |: I
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)
    ! c: e5 n# }+ `" E1 S2 E# E
  634. {% Q, f2 _8 s9 u  T
  635.   int32_t ret = BSP_ERROR_NONE;/ M& D8 `4 h! L: T: \" O& B) ^% i
  636. 9 c* v- P6 t* ]* c
  637.   if(Instance >= LCD_INSTANCES_NBR)3 A1 P/ v  s/ x. u# F) r
  638.   {7 j% c. m- w  t5 s
  639.     ret = BSP_ERROR_WRONG_PARAM;0 j* t4 p, {+ l  K& w
  640.   }/ |  }" J' B) S- X( I  _$ L& I
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)
    & P2 i  O, L) X0 Z( v5 ^" H$ }
  642.   {
    9 r, k- |" d# F: H
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;
    ( ~/ ~0 W$ d' {3 ]+ E
  644.   }
    . J5 ^  O0 N4 Y% S, D
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)5 k( {% G, |+ ?' B" a6 R! L( |9 W
  646.   {- C9 S" `) A7 Y) S- r
  647.     ret = BSP_ERROR_PERIPH_FAILURE;
    ; I7 [) h5 W: M+ _( y
  648.   }
    & k" J# D' z7 z& u) a; r
  649.   else6 h0 l; r& q) Y5 K' p" F
  650.   {" S+ {- L' Z1 |4 p
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;
    , S+ i' e/ J/ ?0 A. B2 H& u
  652.   }
    $ `7 ^) T1 L$ j; A/ c

  653. 0 s" C5 Q2 R# S- r
  654.   return ret;
    # G9 e5 K6 A0 i9 D; W  k+ I
  655. }; D8 w. b: r0 u! J$ @3 r) b
  656. ! {! H& g3 r! i0 y
  657. /**% b& v# L. F- I* [: i* M8 [
  658.   * @brief  Sets an LCD Layer visible
    . W1 a/ I8 B5 U" q# c2 {
  659.   * @param  Instance    LCD Instance
    2 t! q) [" e6 H% F" R
  660.   * @param  LayerIndex  Visible Layer
    / k( j  V3 q- a# E- R- P  h" {
  661.   * @param  State  New state of the specified layer
    & a, V0 O( \/ s# p9 ?6 H- }; l: o- d
  662.   *          This parameter can be one of the following values:
    ' |& g1 \% k/ N* W4 o0 X
  663.   *            @arg  ENABLE
    " X9 J  Z' i; N4 {3 M8 J4 s9 H3 y' r
  664.   *            @arg  DISABLE
      B. ^1 V. h: l; N: j& H/ W9 D
  665.   * @retval BSP status
    4 ]# u1 b! E% G% v
  666.   */
    0 Z, ^' p+ ~2 U' D1 Y. o- o
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)
    ) {, D0 V3 h: S* N* w
  668. {
    1 Z8 W4 {2 p: H& Y* z* P8 K
  669.   int32_t ret = BSP_ERROR_NONE;
    7 w) t3 R" h! @" A' w

  670. , p- A" e7 X+ H9 {
  671.   if(Instance >= LCD_INSTANCES_NBR)+ h% {+ O1 }( v0 x3 V4 ~+ v
  672.   {/ {% h( B0 B& X& C5 i
  673.     ret = BSP_ERROR_WRONG_PARAM;
    / B, k+ v& n5 P8 @8 [2 h0 U; I$ \
  674.   }
    ! T; u0 P% T% V2 N
  675.   else6 N' \5 i+ }! s# d, v. x! m
  676.   {
    ) X' y- a9 t! R/ F$ r7 m% V, U5 \3 }
  677.     if(State == ENABLE)2 Q7 T% U/ E2 J3 F8 }) i! c- l" k
  678.     {
    0 _$ N  _' i; n: ?4 e4 @
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);
    / H1 l: w/ o% H+ j# I" g
  680.     }
    ( l" m) Y4 J% ?
  681.     else
    $ Q0 l# Y* I8 r% N0 k, ?* n
  682.     {
    $ m0 R0 u( Z: \# K: w( C3 T- P
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);
    / Y0 Y( B. v/ C( G
  684.     }
    - I; ~  e$ r6 ?, ~$ T8 x* u5 N
  685. 4 p: m0 l( o$ J6 ^! q* L
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U): U1 A) ^, p5 W. |  x
  687.     {/ Y' P9 R6 a6 H
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);+ m0 k1 _: J5 G  J  d2 Z5 b
  689.     }5 S7 O8 y5 _0 i4 B, K
  690.   }6 W' H% _/ z; m0 ]1 Y* V' k# Q
  691. 4 A* p4 ~4 }5 u. V' V* K1 [) \
  692.   return ret;. j5 I& `# J& I
  693. }
    " W, i3 K$ X5 u0 g) U+ G2 S

  694. 6 s, Z7 j, \6 K
  695. /**
    8 F3 J  a! i$ b! Y
  696.   * @brief  Configures the transparency.
    + f; e; q$ Y5 Z- Y8 J+ ~! e; u
  697.   * @param  Instance      LCD Instance$ @: t8 O5 u  \
  698.   * @param  LayerIndex    Layer foreground or background.
    6 S$ d0 h- D! R4 v6 Y! o
  699.   * @param  Transparency  Transparency
    ) [5 [4 ~$ j+ F, W( U
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF5 [' ]# z$ D3 C1 ^2 p
  701.   * @retval BSP status: k. M7 x. g* R/ X! t
  702.   */" a2 Y+ P9 Q; o. [' `1 X0 r
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)
    , f( r5 a7 `  P
  704. {7 a( S; O4 W9 ~
  705.   int32_t ret = BSP_ERROR_NONE;
    0 q8 H# u# a4 K6 k6 v1 u0 D

  706. * x2 c( y) F) Z# n3 ~& \/ a; j" \1 P: B
  707.   if(Instance >= LCD_INSTANCES_NBR)
    2 I0 X0 P6 \1 R
  708.   {
      |/ E3 P, t( K4 U1 [9 y
  709.     ret = BSP_ERROR_WRONG_PARAM;( U+ u* S+ u' \4 p
  710.   }
    5 |! z& S8 q( a: e* H+ F* ^- C
  711.   else/ _0 q( q' c' U4 P, G/ r
  712.   {# a+ O: f" p; t, N( F' T
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    9 h* d% [# |6 P. g4 p) r$ L3 ^. J8 ^
  714.     {
    . ]5 j' d! `/ Q- t
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);
    . B3 p8 l! N7 h% _
  716.     }
    4 I$ P7 V( a! s& E. }
  717.     else
    9 f/ i/ V! }  |  B* \8 F0 N: {
  718.     {# f8 w7 E# }# y3 S1 z+ G5 [
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);
    : I( A+ U& d" I$ N
  720.     }
    7 M: w3 z9 [$ g/ a- I9 h- N) j# q
  721.   }8 k7 d1 U  p0 T, w- g. S( k) R
  722. ; T$ Z7 ~9 ~# g* D  I% r* r% C
  723.   return ret;
    : _/ f% b9 u+ b1 q
  724. }
    3 y9 |7 ^% a% d7 h* ~$ m$ N

  725. ' U4 b! H; n2 Q: n- _
  726. /**, D5 {4 U5 M, p9 g3 D
  727.   * @brief  Sets an LCD layer frame buffer address.0 ~% C/ n( C* ?8 |
  728.   * @param  Instance    LCD Instance
    ' {" P* m" U5 k$ u9 L
  729.   * @param  LayerIndex  Layer foreground or background
      Q2 n# x0 @: k# D% n6 k
  730.   * @param  Address     New LCD frame buffer value
    ) y0 k! O( q. I# y4 o7 B
  731.   * @retval BSP status  C, ~: D( h' x
  732.   */! @0 j2 S: V/ `- g( v: v5 `
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)
    ) p9 P- F$ z5 z5 R; x
  734. {: {7 L/ y6 q( B) _
  735.   int32_t ret = BSP_ERROR_NONE;6 j( y6 {$ V3 A$ X

  736. 2 [) G7 E1 D4 B( h
  737.   if(Instance >= LCD_INSTANCES_NBR)$ A/ t' @2 d* v: P4 H- X4 d
  738.   {  p: ~3 `; n% B3 r# E7 A
  739.     ret = BSP_ERROR_WRONG_PARAM;
    5 Q: p4 U3 y8 j, Y/ U7 p3 p
  740.   }+ k5 B$ P0 a# F/ B1 i7 Q
  741.   else
    $ i) r% i$ [/ P# F
  742.   {7 B/ b  C, J  w8 H/ V/ V
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ! M; ]5 n1 N2 I! {; n
  744.     {
    & S5 n# X. N2 X4 }$ b4 |& F
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);
    $ w+ j6 `) r8 e4 h$ i
  746.     }
    % b; `1 e  Y' m0 h
  747.     else6 P" S; ~9 a( z, [5 X8 u7 X
  748.     {
    % ]/ l7 v& S' M9 o2 _
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);
    7 L: H6 I4 W+ X0 d/ y
  750.     }" n8 r! l6 e5 B, T( ~( Z
  751.   }
    + [5 r+ v: O6 @8 J; s0 f
  752. % s, N, }2 X/ ?( l
  753.   return ret;
    7 D, ?4 t6 ^6 B  X/ a* w, {
  754. }
    2 _" `! d6 K5 v3 _- J9 x# v( p

  755. + a: j8 }1 o' B9 l4 M1 c, j8 o
  756. /**
    6 R. L+ Z9 T; N" y  H9 z
  757.   * @brief  Sets display window.2 ]2 Q! O6 O3 U* ~- Q: D
  758.   * @param  Instance    LCD Instance
    ! D+ X' q7 M8 M% z3 U' A0 M+ @: t
  759.   * @param  LayerIndex  Layer index
    3 C# A! a; d1 a
  760.   * @param  Xpos   LCD X position1 g1 b# J* Q/ k4 H$ E5 E
  761.   * @param  Ypos   LCD Y position: [( i- S4 k! |, k/ n
  762.   * @param  Width  LCD window width
    1 }4 r/ F, _. y  [; Y$ B
  763.   * @param  Height LCD window height
    " d$ M' A8 F# x4 Y3 n- J9 O
  764.   * @retval BSP status7 @; P. Z4 e9 \  P8 V$ u) u
  765.   */0 m5 d4 J# c  m0 O- l0 s
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
    % Q& k' o+ n5 U: N
  767. {
    0 G5 M% x1 |  [" n! [
  768.   int32_t ret = BSP_ERROR_NONE;4 I  A3 e9 A0 K% i. I% s
  769. 4 H9 Q' N* I. \. h% ~- p* B+ n8 R
  770.   if(Instance >= LCD_INSTANCES_NBR)
    0 z( E" ]0 }+ O' Z$ z2 c
  771.   {' Y0 D, h( b! L# w% j* \2 g- U
  772.     ret = BSP_ERROR_WRONG_PARAM;
    : R% d; h" l% \. B8 ]2 g
  773.   }7 O; I8 t$ {; @! E5 C
  774.   else. y7 z( m0 [: ^3 B
  775.   {
    : l" A9 r& K* t
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)( K: Y$ J+ u4 M3 N
  777.     {; x- v+ m+ [" h* e6 C
  778.       /* Reconfigure the layer size  and position */6 V# Y: Y& ^: X: R" Z) V0 q7 B
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);, R# S2 i, {8 Q' ?5 o7 ~
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    1 V8 I% m3 d% o  n( z& B% ]" J
  781.     }
    ! O9 F, d/ p9 \+ ^3 z, {
  782.     else
    9 A7 g* W& x4 n6 M6 h8 c
  783.     {. c+ R- J& @0 P8 m9 t3 P
  784.       /* Reconfigure the layer size and position */
    9 }- [2 J$ {' T+ u) m" G
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);' B* G3 s  I6 h! Z
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    6 o* X9 f6 o: T; w/ N5 X  l" b3 N/ [9 o
  787.     }+ ?* v3 n- C3 U+ {3 k

  788. + p* J# u2 B" O/ d# ^/ j: B
  789.     Lcd_Ctx[Instance].XSize = Width;; c8 l5 {5 Y* F* \& P* W9 V! M
  790.     Lcd_Ctx[Instance].YSize = Height;2 m% K/ V6 j, D9 ~1 |
  791.   }
    + q  Y, @/ P( A7 I0 o8 i
  792. 0 Z: ~) \7 y0 U& K# f$ h
  793.   return ret;
    4 z) r$ ^- z# a8 z
  794. }0 }& P- I4 Y: E1 {3 c/ S
  795. & X7 C' h6 ]0 e
  796. /**" t0 N! l( r/ P+ z! b9 v
  797.   * @brief  Configures and sets the color keying.( j$ c5 N9 U( r% P+ h+ f4 W
  798.   * @param  Instance    LCD Instance
    ! I1 Z' Y6 S) Z3 ]4 ~/ R0 U9 F
  799.   * @param  LayerIndex  Layer foreground or background
    % ^* |$ A4 S6 ?! \$ X1 Y: Z2 S
  800.   * @param  Color       Color reference
    7 W+ b. G% I/ ~$ m3 e* r
  801.   * @retval BSP status- y, H, ^' w- |) c! [" n
  802.   */
    % a; t: p: U' M  [/ T8 L
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color)
    6 I, }; w/ H: V( A
  804. {. X2 I+ E) g8 u1 W
  805.   int32_t ret = BSP_ERROR_NONE;
    ( U! ]7 W* Z0 y( ~, m4 J1 x

  806. 5 A' w9 d, x2 \
  807.   if(Instance >= LCD_INSTANCES_NBR)
    2 _+ w9 O+ R2 C  e
  808.   {
    1 H6 t0 g) F* m9 E' L, y
  809.     ret = BSP_ERROR_WRONG_PARAM;0 i3 N5 F6 F: t2 I# U/ g
  810.   }
    ! E7 e8 Y* D1 s$ n2 J7 Q
  811.   else2 \( j( |7 {6 m7 G  l
  812.   {& H9 m& g' e, }& r; L  b
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);" b  F% A. V0 K2 A9 w0 ~3 G
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)5 z; O5 t1 d" b. ]( L
  815.     {
    0 e1 f/ G$ ?. c9 {3 B
  816.       /* Configure and Enable the color Keying for LCD Layer */
    ( ~0 ~8 N" S2 Y6 t2 V2 f

  817. / p$ p( v5 s% E$ P1 o, H% P
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);0 Z/ L! c4 f3 _+ W1 W
  819.     }
    ( j- K6 O+ u2 o2 J. Q, p* A
  820.     else
    % y* ~6 J( A# d/ k: u& e/ @1 B9 j
  821.     {9 h$ J0 S0 w0 J: J5 E4 k5 l
  822.       /* Configure and Enable the color Keying for LCD Layer */% m- ^$ n/ U4 E2 {% e! E9 O
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);6 {, z6 m1 N7 U/ R0 s3 G& \
  824.     }
    * Z8 v) I! U; t
  825.   }6 `  m: n+ v8 Z9 M" ]

  826. # G1 g) W$ G) N; M
  827.   return ret;
    ! q" C( @4 D% M( ]) i4 ^9 O6 l
  828. }- I, t. M9 F1 W
  829. / ]' v; u2 l: f/ Z: `  F
  830. /**
    ) T- J0 L8 \# d
  831.   * @brief  Disables the color keying.8 K& E" W( Q6 o% |. c- D# s  X# F
  832.   * @param  Instance    LCD Instance
    4 b3 i) R3 u/ I! q) m3 I$ J
  833.   * @param  LayerIndex Layer foreground or background
    ' \' q; b0 N$ z6 m
  834.   * @retval BSP status
    & F& L+ |- P, H1 c2 b6 b$ ?3 W8 m' O
  835.   */
    2 u% s! b" M; h' \
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)
    5 {9 `  [2 t2 y" o
  837. {& E# a7 [$ R& N9 e4 j& y4 l
  838.   int32_t ret = BSP_ERROR_NONE;% {3 e) U1 c& @
  839.   o* t% C# Y4 U5 t3 z3 s
  840.   if(Instance >= LCD_INSTANCES_NBR)
    : {1 X  g% S8 ^1 y7 @% `* ]2 U
  841.   {# t4 _8 `$ g' ]5 B
  842.     ret = BSP_ERROR_WRONG_PARAM;
    * R. S* ~# B2 x* ~- R+ V$ D
  843.   }
    - {9 N3 F, V6 y$ g  O+ |3 X
  844.   else# u, c  j4 y$ c' L7 m: k7 V
  845.   {
    3 Z) h$ q2 y+ L
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ! H7 N1 F+ x+ R7 F2 E
  847.     {& l% b0 Y% e' s3 @) K+ h2 [
  848.       /* Disable the color Keying for LCD Layer */9 I% y: h+ N( ?, S! s# {0 R
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    * F* }8 w) A' T/ J/ O
  850.     }
    , E# U6 t$ p" Z5 }7 m9 B) Z2 t. q) K
  851.     else8 i" r& I4 ^5 `9 Q4 F, k; ~
  852.     {
    * b$ ?( l7 M& U* s7 m9 F) y
  853.       /* Disable the color Keying for LCD Layer */* h* G4 o# S8 m4 x$ }0 c
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);% ~0 \) X' J1 }+ |
  855.     }
    . W" v, ~4 @; z* O  V& J6 j
  856.   }' X; w6 _# q' x' Q6 U" n. N
  857. . f: _- \# _/ f% [3 q5 v, A
  858.   return ret;
    6 g  Y& B; o9 U% j# R6 i
  859. }
    . R  y: _: A* Y8 R5 s% K

  860. # \) E- n6 z4 K8 K, ^, M! i
  861. /**
      C9 ]4 l$ Z: I1 }7 ]
  862.   * @brief  Gets the LCD X size.7 u, O' b; \: _0 R- A- c
  863.   * @param  Instance  LCD Instance
    : G' @! i4 T9 w- ]% o3 {2 y5 M" ~
  864.   * @param  XSize     LCD width
    8 i0 f2 }- w, J/ v; X! a3 g5 r
  865.   * @retval BSP status
    * B: w' Y, P/ G3 B, U
  866.   */
    ; J: z9 B0 s( f% V$ w, Z2 v
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)
    5 `6 C4 ~0 x* c6 |3 x0 J
  868. {- y( z: _8 F) j0 V! _
  869.   int32_t ret = BSP_ERROR_NONE;# u0 w3 H5 I8 K" W
  870. 7 v5 Q/ l* L4 o! n3 |
  871.   if(Instance >= LCD_INSTANCES_NBR)' V: s+ Z* Y7 v" S
  872.   {2 e* r' i/ U8 v9 ]/ m# C
  873.     ret = BSP_ERROR_WRONG_PARAM;
    0 P. y7 B$ j: q) Q/ Z
  874.   }
    9 _8 S0 A' x3 I1 r4 {
  875.   else) U6 o% A& g+ q+ J; L8 P+ _
  876.   {$ M& h9 N( F- S0 c! [( @+ Y1 v! f
  877.     *XSize = Lcd_Ctx[Instance].XSize;3 ?7 {& h  Z+ W  D# U) U
  878.   }
    $ i2 P: \& ^9 E4 N0 F4 T, o

  879. # g/ c, f4 i: X$ T5 _4 K
  880.   return ret;- M$ E# Y' R! d: k" y
  881. }( a6 L' U  c; S# N) a$ {8 n+ R7 }6 _, G
  882. 0 D* P8 D8 f& |7 w3 M9 c! R7 d
  883. /**
    & A$ i( e1 h* n! P9 x4 f
  884.   * @brief  Gets the LCD Y size.& V5 J) f3 f# S2 Z- m
  885.   * @param  Instance  LCD Instance. Z7 f) l$ G4 H4 Z$ Q
  886.   * @param  YSize     LCD Height/ U! R5 G: U* q9 w
  887.   * @retval BSP status9 H4 J$ v/ I: P
  888.   */
    * y( B0 U  {! \
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
    % s8 a! v' Z3 V0 l8 E3 n- m
  890. {" w( ?. Y- A! |8 h2 C( y2 T7 q
  891.   int32_t ret = BSP_ERROR_NONE;
    4 P/ J  Y; D2 O  x6 k8 X
  892. 4 J) l# N+ @. ]0 z! S9 t4 N% W
  893.   if(Instance >= LCD_INSTANCES_NBR)2 I2 e2 ^5 E# W$ h& g7 J
  894.   {
    3 j' U! q' |) a' n5 Z0 S, x
  895.     ret = BSP_ERROR_WRONG_PARAM;
    + [2 h) V' w3 o2 ?! a2 x, ^4 O3 |
  896.   }
    ; `/ z6 q9 K( e- G
  897.   else
    ) [+ D5 I! R- \1 C( f& F% R
  898.   {
      m- m% }, W7 D- {! ^/ l" Q
  899.     *YSize = Lcd_Ctx[Instance].YSize;
    : Z7 t! h- B( c  B
  900.   }
    ) i0 Z( b- U! j+ h1 R

  901. ' j/ T5 t/ Z4 e- [) b1 Q
  902.   return ret;+ j7 O  x' f" @1 N, B
  903. }
    $ Q( X1 _! N' M; H2 `1 J

  904. : {5 L% T+ r( B. E* W4 `) o
  905. /**( a7 J2 s+ m0 _3 O
  906.   * @brief  Switch On the display." r+ U1 @; {/ X% L8 W
  907.   * @param  Instance    LCD Instance
    - l  A. j+ \$ F; R3 ?8 }
  908.   * @retval BSP status. h3 q5 y) D' y  ?
  909.   */
    / h6 r6 ~; L1 z8 `, E0 r
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)
    6 \) X% {5 I& J- a3 t! I
  911. {+ T9 |: x) h2 l  W" d& W
  912.   int32_t ret = BSP_ERROR_NONE;0 L" ]) R" S) i% ?, W4 M
  913.   GPIO_InitTypeDef gpio_init_structure = {0};
    0 K2 [2 S( M$ A

  914. % P# j6 J# X' Q- Q7 T
  915.   if(Instance >= LCD_INSTANCES_NBR). ~) f8 N, a1 f
  916.   {" M  l1 C& C8 I
  917.     ret = BSP_ERROR_WRONG_PARAM;0 B' o$ k( b7 ?
  918.   }9 v0 W4 U  A8 y7 u' A9 G# `& K
  919.   else
    ; a6 F$ |) A6 h
  920.   {
    % k2 _  w4 o4 I# M: X0 K4 W7 j' y
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);
    ! T) P/ C9 N+ ~. x: v
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;0 j7 x: }: @: [/ ~
  923.     gpio_init_structure.Pull = GPIO_PULLUP;
    * P- n6 b' p; Z" B( E3 z# `
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;
    , U6 w; Q7 Z3 |
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    ' u0 y8 Z+ t& b4 P% z
  926. 2 }- l4 D2 }# H" {* V% j
  927.     /* Assert LCD_DISP_EN pin */* K4 Z7 ]9 x" d" c8 P) p
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);
    5 E0 J1 _) D1 W
  929.   }* w$ l+ V, w7 A" `. A/ o) B
  930. 7 z4 p, D2 I2 X  j3 S
  931.   return ret;# Z" ^% S5 C+ V/ C: D3 L0 R! M
  932. }$ k6 R5 z0 d: ]5 x  |$ K' M
  933. 4 [$ E" W$ W  f0 g: ]* g) Y$ `7 p" l/ a
  934. /**) N; F- h" }& `' ^# [
  935.   * @brief  Switch Off the display.! O% \! S! |# k7 F
  936.   * @param  Instance    LCD Instance
    6 P! _2 Z5 f) y3 r4 ?
  937.   * @retval BSP status" w+ i& c, q# m5 A5 J+ o
  938.   */2 \, I* c" |" x' {% `. n# v
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)
    $ \3 @' z# Y5 F4 M# W! _
  940. {
    ! b; C7 P* r3 k8 R
  941.   int32_t ret = BSP_ERROR_NONE;9 y2 J9 W1 x1 d
  942.   GPIO_InitTypeDef gpio_init_structure = {0};7 s  R3 X6 p: d

  943. 0 @; Y% K9 C. j" c, @3 B1 X+ n
  944.   if(Instance >= LCD_INSTANCES_NBR)6 ^- N  ]( O! q2 ~
  945.   {5 T# s6 b5 G" Y4 v
  946.     ret = BSP_ERROR_WRONG_PARAM;
    : N6 F  N  Q3 m+ o" B" g5 y
  947.   }* g+ v6 ]* D$ ^! e. k
  948.   else+ @9 u! s" z. s: {. Q
  949.   {( v2 A, i" s/ r9 W& |' ~; a  _
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    - j: j4 t1 u- s8 M7 c
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;
    & X3 B% {- Y1 J* K: \
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;
    6 ~( _  A: ?3 K8 p; Y7 e
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;
    ) o$ K" \; e. ^) M8 O
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    , G7 q& @& g; J
  955. ' ], u2 S% y; v; B
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);
    " F! r, H* x3 c. m

  957. 2 Q( G4 n( D2 |3 `4 l# P
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);) h% E0 J' N" u. u) T- f6 }' k- d

  959. : x' O6 \* j: h4 p+ G+ Q
  960.   }9 i& S& X: ^5 d3 b

  961. 1 z) N5 x- g0 @! J- ^, Y# i
  962.   return ret;
    & _# _& n2 V. O. @
  963. }. X7 d0 K. M  @! k( ?( L& A! s/ F
  964. 4 U; n2 \# Z$ Y- g
  965. /**, J7 x; i- M/ }( a  U
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.
    8 Y, H% j8 _. N% b" y4 A: I
  967.   * @param  Instance LCD Instance
    5 Z' z+ u5 O, o0 E
  968.   * @param  Xpos Bmp X position in the LCD
    6 y  h4 p& \) _9 H; ?
  969.   * @param  Ypos Bmp Y position in the LCD0 |  L. x8 {9 L1 w
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.
    & c: I: T1 T) P) P
  971.   * @retval BSP status
    . V& Z4 f& |  |/ @* D. d9 Q
  972.   */
    " F& r# B( q8 S" a6 }" N/ ]' i8 e# m  {
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)0 C' `- m3 \# E; S& Q
  974. {
    - d3 _* A- H! Q- `' {4 s% Q8 [
  975.   int32_t ret = BSP_ERROR_NONE;
    ( Y6 s# O: o  L) }  U2 |8 s) [# ~
  976.   uint32_t index;
    $ l0 O" K% K, \  Z1 W, R! W4 M
  977.   uint32_t width;1 m' A; A: O, T* _; P  D2 s
  978.   uint32_t height;
    1 E5 f; b5 ]4 L0 U2 P) _" `
  979.   uint32_t bit_pixel;
    ( Q' `( A0 }# G. C7 _, h
  980.   uint32_t Address;
    " s! O1 F$ L, z( l! r3 T
  981.   uint32_t input_color_mode;0 S5 H2 _1 K$ m1 x
  982.   uint8_t *pbmp;' h5 x: R4 _: I& M
  983. " O  `2 ~- R9 r7 l" b# b! ]
  984.   /* Get bitmap data address offset */
    + z8 H$ M$ f$ B) L* s, j! a
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);
    & M3 J$ G1 f" m$ u- @
  986. 5 C& ~4 }8 n4 ~- p$ B" @& d
  987.   /* Read bitmap width *// S0 G8 k9 F  H" W* H/ `3 J$ z
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);- ?% @  O5 D0 c
  989. 4 x( t" B9 Y! ~# x& v
  990.   /* Read bitmap height */
    $ {) M8 s  d" Z1 \1 t+ R7 v
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);6 t9 ^* P) L3 j) A7 p
  992. 8 l5 r# _. p3 c3 O! C
  993.   /* Read bit/pixel */& d! L% m5 \9 b8 c) \. p. D
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);
    0 I0 N8 j  v4 u- V3 |

  995. & w8 Q3 T6 q0 W+ ]8 `! z, n
  996.   /* Set the address */
    + f% r8 Y2 P2 m: A
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);; O% c) N, R1 g+ i; ?" l
  998. " h( A& @* s4 z) G. [: }
  999.   /* Get the layer pixel format */
    ' }. J8 Y5 F2 b- i0 G' Q4 w" J- k
  1000.   if ((bit_pixel/8U) == 4U)6 L2 J7 S! j9 z, h& s
  1001.   {% Z$ \) S1 {, k& O$ [1 P
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;$ L2 g/ s" }: w
  1003.   }
    ( q- e( v. \" A2 k! g* D
  1004.   else if ((bit_pixel/8U) == 2U)
    9 _2 u4 s5 i' A) _% m3 ?% [, X
  1005.   {
    " \8 I) D: f9 K5 w" j
  1006.     input_color_mode = DMA2D_INPUT_RGB565;
    ' Q) L0 ~( j; O5 }" \; C! A
  1007.   }1 i- \/ l! A* @" H4 L
  1008.   else$ p7 S/ R0 n4 W3 s6 N
  1009.   {9 @7 K! ~/ a$ E% w+ t5 v, R* c
  1010.     input_color_mode = DMA2D_INPUT_RGB888;9 j" |# ^$ v6 x# f+ v0 w% E; ]" S
  1011.   }9 V/ B  Q6 G1 H9 X/ K
  1012. % @! a. |, T+ M: u' c3 s. k  q" R
  1013.   /* Bypass the bitmap header */
    ; N' r- s4 M' t; C
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));. ~7 [% v, F+ K) u
  1015. 7 O! M( L% G+ e
  1016.   /* Convert picture to ARGB8888 pixel format */& m  l9 e+ Z( U& _* ]
  1017.   for(index=0; index < height; index++)- r! e0 Z8 D! l5 r8 `
  1018.   {
    ! E3 E6 d6 }2 b
  1019.     /* Pixel format conversion */9 s! B% {: N* A/ h2 r# b
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);
    3 F6 J! Y5 J, X* E

  1021. * V3 e! e" _. |1 W
  1022.     /* Increment the source and destination buffers */
    / [5 _* U1 u/ f; Y
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);& k2 N7 N! r" C$ N# `6 ~+ K
  1024.     pbmp -= width*(bit_pixel/8U);
      \4 j% e& \. {' O& P' s2 f
  1025.   }6 d+ H" ?3 D' x. Q! {9 r+ A

  1026.   v1 x& R* B* u6 p' ~
  1027.   return ret;
    + V+ L7 t7 Y& K0 t& n7 q0 Q+ n8 D
  1028. }
    6 m4 s1 I; |! j5 p# u  w$ i! m8 e
  1029.   F& h2 @3 M$ H3 s! b: B2 y3 x6 L
  1030. /**
    + V( M" x( F2 c  m% B
  1031.   * @brief  Draw a horizontal line on LCD.
    ' s8 b% d1 [* f( E- O# y! v3 L9 S
  1032.   * @param  Instance LCD Instance.  Q6 l# j+ t" c4 C+ a
  1033.   * @param  Xpos X position.1 W: S; v' G0 n9 F
  1034.   * @param  Ypos Y position.% C) R! L6 b! a0 {' S4 M4 b
  1035.   * @param  pData Pointer to RGB line data
    " n# q: x; s7 {, c' f6 x
  1036.   * @param  Width Rectangle width.; b$ c* h0 G( s% y: |
  1037.   * @param  Height Rectangle Height.- a7 d5 A& d. e! |
  1038.   * @retval BSP status.
    % |' `, O- \+ I1 d5 m- |
  1039.   */( j0 S4 B! t' b2 S3 v9 A5 ~/ E
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height). o2 n: Q) Q1 y) J! h) m
  1041. {, B- ]) |, k; j3 `8 A
  1042.   uint32_t i;, p! o$ t2 p% Q2 X# @2 D
  1043.   uint8_t *pdata = pData;% ?; s+ \+ J3 w

  1044. 5 ^& S) g# b; i- A
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1)
    # D/ K# M2 f; E; h
  1046.   uint32_t  Xaddress;: o6 I; M5 N' R
  1047.   for(i = 0; i < Height; i++)5 K7 d8 E6 k% p" E- @
  1048.   {
    - z$ c( r% Z6 `( F0 v1 W! M* m
  1049.     /* Get the line address */# ]% q- g" X  X9 N& M- ]: Q# Y
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));
    & z: ~; F. _# V- d

  1051. ( d* T* r# N/ B7 D$ j  t. \
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)5 J# U" `8 ?/ t% D+ C$ _
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);
    1 E4 ]: w5 ?/ a1 h% Z7 [% X$ E
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */
    5 Y8 W) F6 K. q! [2 m
  1055. / m* z! n( W: W( l
  1056.     /* Write line */
    * Y% X$ k: T  F  i7 p) \
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    $ D. Q6 d) D) f! F4 T( G0 Y
  1058.     {
    8 O2 F! L. R7 A) [4 f
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);
    % @# p0 \( C( R9 {
  1060.     }! W0 M9 B7 Y3 G$ Z$ h/ e3 }7 K
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)  o! d0 _1 W" {- Z, _( u
  1062.     {9 o8 z3 O$ f! X6 B' Q
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);
    , {, j# A1 c/ H  y1 K2 `" L
  1064.     }9 h0 `! ^# T1 o, f$ L% u' w& H
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)
      \. t3 k6 g. R- u( v; s2 n
  1066.     {
    - k  y- l$ S0 |* {4 U# @" t
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);' _' m$ H: v7 y3 ]) F2 P
  1068.     }
    ' D3 K# g+ C3 X% m  H0 a7 w% L
  1069.     else% I$ F+ g' t& j3 N+ ~
  1070.     {) W9 b/ U" [/ V) K$ k1 x% N6 O$ a2 g
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);  w8 x! C: w- s4 D/ I7 L
  1072.     }
    ! K8 z* C/ H9 ~- V$ t  Y
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;
    " h% w. j! l0 |$ n8 q5 [  _( E
  1074.   }, e' h) A  L( c3 `2 u* Z; J
  1075. #else; H- T9 {- j6 ^- B5 n- ]8 H6 x
  1076.   uint32_t color;) e; j& s2 d! x' z- n! b
  1077.   uint32_t j;' l4 O4 H7 F4 _
  1078.   for(i = 0; i < Height; i++)
    0 Q# g4 a6 I9 w# c% A
  1079.   {
    : c1 u% b: X7 {3 }6 C% D/ Q' M* ~" O
  1080.     for(j = 0; j < Width; j++)1 O5 y2 W) _7 }5 c
  1081.     {( o" f, V) X, B. t5 T
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));
    ! t6 d, S0 x4 }8 ~2 d5 U0 K
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);" I, B- d: E8 J+ t" W
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    + c( k2 [! `; D! N: O( b1 ]/ d
  1085.     }
    4 N3 F4 s3 c% }
  1086.   }" H$ k2 }2 g, |" J% ~
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */
    ) }: p1 |, B& ^& |- Y4 }
  1088. # f+ z/ P' Q. g9 m% ]8 G5 Q. p
  1089.   return BSP_ERROR_NONE;
    % ~& h& ~0 F1 ^% u0 d1 r
  1090. }
    + `% O( ]- w7 `; ^
  1091. 5 T% U0 m+ i8 Q1 j9 S, t0 f
  1092. /**' e* T  }& T  ?% h+ k
  1093.   * @brief  Draws an horizontal line in currently active layer.
    ( o- w& Y3 P6 `! E7 K
  1094.   * @param  Instance   LCD Instance
    + {. R2 [+ \9 {) B4 m
  1095.   * @param  Xpos  X position
    / K$ U" T) D! ]: i. u+ o% T
  1096.   * @param  Ypos  Y position
    # A) f( v1 u: W$ L4 {
  1097.   * @param  Length  Line length
    5 u9 [0 h' t7 @, f! v; g  a
  1098.   * @param  Color RGB color
    4 V" I8 K  ?; ]: I
  1099.   * @retval BSP status9 p: n; T, l# F% G5 n9 i# }
  1100.   */
    2 w" A; Q5 w# Z/ J( c
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)
    1 G. F) n% d& ]$ g! |
  1102. {) W- b( v% ~9 \2 J/ |
  1103.   uint32_t  Xaddress;' g" X9 H9 ?' W

  1104. + T8 n( |4 f' ]2 _2 k! H: i& [( g
  1105.   /* Get the line address */
    4 M- b' H9 J! L+ ~" m
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));% K, u  `; U5 t3 w) o+ ?; f1 N
  1107. # p1 C2 t3 f& k* f
  1108.   /* Write line */
    * B& B" z- y8 K
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);
    ! h& x3 T( _, g" g% c) K$ m

  1110. # [( ^* b, A3 r5 Q
  1111.   return BSP_ERROR_NONE;
    1 n9 l0 w, x0 S! Z% A" p
  1112. }
    1 g! p/ P3 m$ U7 W2 E5 T# O! U
  1113. 1 j3 l$ g* S% `. `- M
  1114. /*** h* x6 F# a/ o4 w  Z* j
  1115.   * @brief  Draws a vertical line in currently active layer.5 s! S! C, m) r, `7 t
  1116.   * @param  Instance   LCD Instance
    & E- x" s5 L' L6 l$ w/ J
  1117.   * @param  Xpos  X position$ z/ `- P, [9 L7 U/ w' X
  1118.   * @param  Ypos  Y position
    " H  l+ ]% V0 _/ r( f7 w7 ^
  1119.   * @param  Length  Line length6 M1 C0 g; u* t
  1120.   * @param  Color RGB color+ U! S+ K' {/ k% v7 x
  1121.   * @retval BSP status
    / e$ n  w$ S' p$ m( _6 i1 V: _
  1122.   */& H! p9 F9 ?( R# o9 Y
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)* X/ i! f! l: u
  1124. {
    4 O+ A- L* q4 T: X7 r( `7 \
  1125.   uint32_t  Xaddress;
    5 |# A0 ^7 D$ O1 H0 v2 `. R* c: K
  1126. " q# c( P; t; o  ?  M/ Q
  1127.   /* Get the line address */
    ( D! a$ [% O' c) w% T
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    % Q/ M1 f% s7 K! u2 Z# ^( D6 Z

  1129. $ j/ _7 a* ~4 Z) F+ C
  1130.   /* Write line */
    $ S4 l# T$ m, b
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);
    7 {2 Y( P& ~7 ]0 o. W

  1132. 8 S! y; L  Q2 j+ K: j
  1133.   return BSP_ERROR_NONE;' N/ l9 ]6 N, I+ t+ }4 a$ T3 L. L
  1134. }+ P, m; _# i2 y6 r  Q
  1135. 6 d6 J0 Q6 `. Q7 j
  1136. /**
    5 F( q$ i' o/ V2 V7 ^5 z, J9 F
  1137.   * @brief  Draws a full rectangle in currently active layer.! K. @) `  K, R* Z6 h) ~( N5 S$ g% S
  1138.   * @param  Instance   LCD Instance
    * @# Z& @$ _$ {( A1 A% U- u; x2 |
  1139.   * @param  Xpos X position; G( r* ~# \# N' u( C$ U
  1140.   * @param  Ypos Y position! S+ \$ p+ |! B' {
  1141.   * @param  Width Rectangle width1 Y# d" q: R9 Z, U- r. J
  1142.   * @param  Height Rectangle height
    ( {2 ^( P: y0 O' I. Y1 N
  1143.   * @param  Color RGB color( k( V7 v- G/ U& B0 W2 T
  1144.   * @retval BSP status
    6 X8 R# o  Z; {' c! ^
  1145.   */8 A* C/ @3 Q' \- f! s
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)1 c4 X' z9 F7 F. |; }
  1147. {
    3 B' a/ u, e# S$ p; T1 I
  1148.   uint32_t  Xaddress;7 d& y1 A& H$ O0 ^& D" [

  1149. # @; }6 B+ k0 ~! h! K& H
  1150.   /* Get the rectangle start address */, I# e; J0 j6 W4 p2 @2 }! s: e
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));, C. A7 J$ ^+ G2 T
  1152. $ o7 U1 M/ t8 X
  1153.   /* Fill the rectangle */0 @( s5 v& u4 H1 `: `
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);
      z9 a2 R, `- f* w( H3 I1 t

  1155. & r. R/ f7 A+ ^2 j& C1 V
  1156.   return BSP_ERROR_NONE;
    5 {: a) A# N, q. C; d
  1157. }
    / `+ d0 ?* |0 p
  1158. - N2 A0 p9 \5 ^2 U& i
  1159. /**0 R- ]  T& R& i" Q) K/ R( k
  1160.   * @brief  Reads a LCD pixel.
    5 T, C. D) S  j: @% q4 P
  1161.   * @param  Instance    LCD Instance# r2 ^7 c* t8 D+ ?. c
  1162.   * @param  Xpos X position
    ' j& O2 o! M( V2 L
  1163.   * @param  Ypos Y position
    $ _7 b# f( e3 H
  1164.   * @param  Color RGB pixel color
    7 L  k7 W  Q. z7 W7 c8 X' m
  1165.   * @retval BSP status
    2 M( ~- s1 G/ f+ [  w
  1166.   */; _# S* d# N3 s& V9 \# I! b+ x7 t
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)5 \$ v% ]  O0 }/ }# p1 n# G) Z) v
  1168. {+ C5 h+ h7 J. _: u
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)  T# B/ Y: C  R, Q# h9 c* c
  1170.   {
    5 m7 m# g8 M) i& R4 S- [- }
  1171.     /* Read data value from RAM memory */8 y! P4 e$ G3 D8 ?; E# ]$ i6 N
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));% G. `5 _& [, L' l  l7 f, v& x3 C
  1173.   }5 M& H& L3 X6 W
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)/ [$ w# G1 ]  l6 x0 n
  1175.   {
    . X% Z, M% D' V9 g! V- ^
  1176.     /* Read data value from RAM memory */
    ! C( M) G4 u+ r2 [$ U
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    # g7 J) W0 q) p$ N1 O0 D
  1178.     *Color = CONVERTARGB88882RGB888(*Color);
    , E7 t: a# n" r& [1 k
  1179.   }: m' F; y# l: }3 B3 Z1 X
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    4 ], x5 J* [: J
  1181.   {
    " W/ p9 b' }1 n4 G7 Z/ G3 d. z
  1182.     /* Read data value from RAM memory */; T6 m  \% P% `! L
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));  B" y$ `, o! @- R8 A
  1184.   }: b' W. `. B+ L' S+ K

  1185. 5 d- `  i- f4 t5 w) L7 L  N' {
  1186.   return BSP_ERROR_NONE;
    + a  ?: y( {$ |7 }
  1187. }
    6 Y/ P4 q6 T3 _* g

  1188. ( u% f% S. F, h4 ^7 C
  1189. /**' [% u  ]) f9 ~8 q4 z
  1190.   * @brief  Draws a pixel on LCD.
    - e" `# u2 G& B; R8 d7 p
  1191.   * @param  Instance    LCD Instance
    9 ^7 F8 A6 k  j$ x% |
  1192.   * @param  Xpos X position/ s2 Y& f6 f7 B6 a; e0 Q% O
  1193.   * @param  Ypos Y position
    9 q2 w" V/ x5 D  r% K1 ^/ k
  1194.   * @param  Color Pixel color5 X+ d5 u0 _# V' U' \( T( [/ T" {
  1195.   * @retval BSP status
    6 o- |1 \$ j8 v( K  l- t
  1196.   */
    - @2 b" d5 ^' E0 t: Z. O
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)) P+ a  k) `5 r: l( p0 i& v
  1198. {
    7 @; [! u1 h! y; [, c8 n
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    + ]! q- K$ ~8 M
  1200.   {8 K. m% V5 Q2 e) q* G
  1201.     /* Write data value to RAM memory */
    0 i2 l" W% Y2 T4 G! B8 j6 k  f
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;
    + c$ Z3 B0 \' }+ E* n
  1203.   }( G0 \2 Z2 a# W; o1 W2 e) T) h4 C
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    ( }$ J0 W3 c( \7 Q: l% l* J* Y2 B
  1205.   {
    : K% E6 P8 S  D# y* M
  1206.     /* Write data value to RAM memory */) c8 x0 g9 c; W2 l4 q* x
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);
    : z/ z5 n  u' K& h
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);
    # k  j& _' V+ E
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);
    ' l2 t: |- K% J' c
  1210.   }' R) L& s- ^) F0 L
  1211.   else6 C1 Y7 m- ^8 ^2 U/ j
  1212.   {
    ) `- [' u: K+ T9 J7 g! F  Z6 m
  1213.     /* Write data value to RAM memory */
    9 w2 l( t4 S' K3 ?
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;8 I- Y0 G; F( n9 l
  1215.   }
    . y9 Q( y1 d8 }4 r: `, N
  1216. 6 t$ i) |- f" P3 `( v
  1217.   return BSP_ERROR_NONE;
    & X0 ^6 k6 t6 P0 h$ a& q% d
  1218. }- _: w( j2 m6 d7 ~

  1219. 0 v$ @+ e( t5 R
  1220. /**
    1 S3 P- y; `; Q2 u' {
  1221.   * @}. ?3 V$ h$ b4 K( r( U
  1222.   */9 e5 v) k$ y( D* O2 w; _
  1223. 5 p  G6 n  a. j; c1 W3 `# I
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions& d; L5 g% V# o. C; L2 @! r
  1225.   * @{3 s, D! b; v! D8 G* P* ?$ y
  1226.   */
    * p  ]/ P3 _0 s4 }; S
  1227. /**) w( u; ^+ O) P8 d! y$ Q
  1228.   * @brief  Fills a buffer.0 \6 |5 S$ V7 L9 E, o* H" a
  1229.   * @param  Instance LCD Instance1 D+ F5 x1 D# A4 X2 l3 m2 i
  1230.   * @param  pDst Pointer to destination buffer
    2 Q. y. j+ g  n4 N0 q0 o
  1231.   * @param  xSize Buffer width1 U6 U( v$ ^2 p2 z$ O
  1232.   * @param  ySize Buffer height0 D5 U7 I. }, i  A& w
  1233.   * @param  OffLine Offset
    / x9 }) O; t% X# {# o
  1234.   * @param  Color RGB color5 \* P* P1 E3 i) ^( F
  1235.   */
    ( t; l) \$ Q' a# D2 K* E& }
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    5 Q' e! y/ j' G6 b5 M( S
  1237. {, @1 o; @8 U# V! P+ b; S  p: @
  1238.   uint32_t output_color_mode;/ J- n; |" ~3 B' }; c1 [7 c
  1239.   uint32_t input_color = Color;, b) g' z, O3 i' J! ~9 [2 x

  1240. 3 h+ k; m( H6 X) ^1 Z
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)+ G) N* g+ e( Q2 f+ A- @/ ?
  1242.   {+ g$ S1 A3 U; f- d9 l( y$ e
  1243.   case LCD_PIXEL_FORMAT_RGB565:
    % V! P: s/ ~$ G+ Q
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */8 _! m# Q8 R* r+ C4 }: t
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);
    ' g0 k& e- {' M! _/ O6 R% B
  1246.     break;* m; ?: p& x, T* q3 T
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:9 p# X7 b0 k" I* A
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */* u( Z8 U$ n# C
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);! d3 {5 A6 E8 l8 E; C
  1250.     break;. H- b/ S8 t& C! U3 @/ X' |- V
  1251.   case LCD_PIXEL_FORMAT_RGB888:3 s( ~, I9 I( ]- Q8 {
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    0 I/ R7 O& }4 O, r
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);0 s( c8 v* r+ B% C0 G2 q1 B5 Q# K
  1254.     break;+ E0 W1 s8 Q' s* P. K, w
  1255.   default:
    4 b! I' t; ^# N
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    1 Q. f" K6 ~  z: H: P
  1257.     break;! k) [) _1 Y" e. ]2 L2 l
  1258.   }% i8 C7 E1 ^3 w6 Q0 M
  1259. 0 r/ t: x' i2 v, Y( q2 u( L
  1260.   /* Register to memory mode with ARGB8888 as color Mode */
    7 T% V1 h, U3 Y4 P% m! @# y) Z
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;
    1 `, i9 }# D) E& U- F
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;( E4 G* G& k. Q" k0 o3 e- g; G) O
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;
    $ e9 t) M8 I2 C. ^/ T! r7 z

  1264. 3 s) e4 U0 [+ y1 K8 i) D( l
  1265.   hlcd_dma2d.Instance = DMA2D;" B% G2 h- e/ ?* ^. n7 N0 o
  1266. 5 I, o% j- `( I5 a, e/ g' S
  1267.   /* DMA2D Initialization */
      u8 H0 @4 C3 J& l
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    9 w" d$ f: I' D) H5 O! m  F
  1269.   {5 L9 }, I$ }1 m& P1 d  h! g
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)" G7 u! @* t/ B/ W4 [- d% A$ L
  1271.     {/ l7 ~  e8 i, W
  1272.       /* Polling For DMA transfer */
    ; Q( S2 a/ e- ^( o- \' A, H3 P5 i
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    . S9 U1 ?; {& Z6 h. b+ \
  1274.     }
    7 l$ o" ~; B" l
  1275.   }4 f- O* y. N/ J+ L1 ?7 u; n/ a
  1276. }
    * C2 F3 V7 L7 I( X) N0 M
  1277. 4 r- Z" @# l$ }
  1278. /**: T0 J% z& T8 `8 G; D5 B$ ?
  1279.   * @brief  Converts a line to an RGB pixel format.% S# \+ A1 }9 u9 p3 w
  1280.   * @param  Instance LCD Instance6 G0 ?* e' E0 x# s) G( \
  1281.   * @param  pSrc Pointer to source buffer
    + P2 y, G9 i# _$ R
  1282.   * @param  pDst Output color
    % g# j  M/ H: A+ p
  1283.   * @param  xSize Buffer width
    4 S8 `6 K  [7 A7 G
  1284.   * @param  ColorMode Input color mode4 z2 X  ]9 P' c6 P
  1285.   */6 l* C4 u# i* m) \7 K  l1 X# z' P
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)6 c: I( c& R3 y' J% W; Q
  1287. {& y/ S, W2 f$ k" p/ V
  1288.   uint32_t output_color_mode;: f$ j4 S8 J6 Z1 n4 {

  1289. % z# w1 u( ]0 l* k3 G* e
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)
    . ?0 v) z6 v& `# |2 f3 e/ O
  1291.   {
    : R4 h- d8 l( ^+ l
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    2 y: N$ ]* `; e
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    ( K) J6 M0 e4 a3 \! }! t2 v  ^" M3 w3 W. `
  1294.     break;+ q. ~7 g% }" _5 v  Y' m
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:9 \$ s+ Z% J0 x* x* T- \& T
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */1 @3 T, W7 k% F0 E. I- }( [
  1297.     break;
      z8 E0 F& s: A& I+ O0 Q
  1298.   case LCD_PIXEL_FORMAT_RGB888:
    - X% b- |" o1 d8 Z3 @, `  I1 N
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */% k4 n2 d- N4 ^/ I" r
  1300.     break;
    . a  E4 M7 R- U3 n) {/ ~
  1301.   default:
    4 j3 H. B, ~) Y1 L) y$ \2 \* k
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */& d& f1 s# w1 h
  1303.     break;% o# l  T2 }. F
  1304.   }; w  a. L# M5 x$ ]( v

  1305. 6 C& P( @) @' E" i% {0 o
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    7 E4 N6 `8 g+ G# f
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;
      t% U8 U- F6 O' k  t+ c2 u
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;5 w; K' [4 J$ ^$ M% C; T, r% R
  1309.   hlcd_dma2d.Init.OutputOffset = 0;+ M) `+ {" U. u1 W; ^( _6 ?

  1310. 3 `- F# w7 q7 P6 @9 z
  1311.   /* Foreground Configuration */" n3 k8 V3 A7 Q, c) G
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
    4 G' {8 L* E" t" D
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;
      M# _* l% n$ B0 o
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;
    1 U' Q, e# X+ |( C, ?, B4 P# m% X0 {9 v
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;
    2 V0 y8 _2 R  X2 ^& Q' \
  1316. 8 r& d$ h/ g! Y( C" ^& ~
  1317.   hlcd_dma2d.Instance = DMA2D;
    5 z9 Y- X4 S' T: `' z" A
  1318. 5 u) |' m4 i+ m  ]
  1319.   /* DMA2D Initialization */
    9 `1 d& C+ Y# l( ?  j" B
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    5 l" v2 O5 V0 n# d7 r
  1321.   {3 J( Q+ o) g3 L! U- x8 O
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)
    " V( J) _: H' H9 Z  Z
  1323.     {
    4 ?1 q- C( Z& D( @% l- J, W
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    ) T6 h/ |! ^) l( @7 D
  1325.       {
    : i& Q1 b9 \, S# c- x( `/ |) K+ P  n  L
  1326.         /* Polling For DMA transfer */  x# R" v3 }* ?9 e6 Q! q$ p
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    " f' y: x5 b2 R1 s# p) Z* B
  1328.       }  i* [9 U! ]$ h1 g3 x
  1329.     }! B! B# x+ y. s1 U
  1330.   }
      V$ ]- I* Q, b/ E; M5 i+ z( O
  1331. }4 k! T: L# L. ]% a0 m9 f) v& \3 f

  1332. 2 O- ]# X$ _  k
  1333. /**. ~* w! G) a. H0 ^$ G/ |
  1334.   * @brief  Initialize the BSP LTDC Msp.
    3 C/ u; a; Z, k+ p+ k
  1335.   * @param  hltdc  LTDC handle. \0 {' ]7 X) K0 x2 V8 h
  1336.   * @retval None
    , O3 K' _5 U8 T) e! z+ `; z0 m1 [3 w
  1337.   */
    7 E: `2 h1 b, v7 }& B  q
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
    & t# w6 Q9 E; b4 H5 E/ q
  1339. {0 N7 p1 ^& v4 w. d
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};; C4 v5 F0 I* P7 w9 s/ z

  1341. % t( A$ u' z/ h' L; m; N& X$ D! Q
  1342.   if (hltdc->Instance == LTDC)
    3 P$ Y; k# ]: @1 o% d+ Y
  1343.   {
    ! q9 ?* i* s- A* |" J
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();
    - K0 T" y9 A& V" I& N* m$ n
  1345. 8 a' H& C% I6 t
  1346.     __HAL_RCC_LTDC_FORCE_RESET();8 y" O/ w6 N2 I( Z
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();
    9 G* j" ]; U! V9 t% ?
  1348. . \' A; D! Q" n2 w. x" ?( Q
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */
    ' M) c5 M7 {6 B* [. _" U) h! Q
  1350.     /* PG0  R0          */$ R7 d8 ?* q& B: V9 J. t
  1351.     /* PD9  R1          */
    # z2 k8 x+ V/ u3 W
  1352.     /* PD15 R2          */, S, Y1 _5 i# W5 M
  1353.     /* PB4  R3          */ // JTAG
    9 N4 V9 M' d7 f
  1354.     /* PH4  R4          */
    ! R1 J* j/ X2 A3 _; z
  1355.     /* PA15 R5          */ // JTAG JTDI' t/ \( w7 e2 k* C* o4 y9 r
  1356.     /* PG11 R6          */
    % z% F! O: A( |- L
  1357.     /* PD8  R7          */1 C( x" f+ q: ?
  1358.     /* PG12 G0          */
    - g  C$ j" _) j# Y8 F
  1359.     /* PG1  G1          */; {) @* ?5 g0 C, W% w; x% Q
  1360.     /* PA1  G2          */
    ' v# g- Q9 }  y
  1361.     /* PA0  G3          */
    & W' p% ^9 m* k$ Q5 x; R
  1362.     /* PB15 G4          */
    2 {& Z6 D) R- B1 u' c2 A
  1363.     /* PB12 G5          */+ f* U1 K4 U+ D
  1364.     /* PB11 G6          */
    ! `% k. p; d" K1 |' W# Z7 k! {
  1365.     /* PG8  G7          */5 m' }* E9 ?/ ~$ |. H( z3 H  D  `
  1366.     /* P15  B0          */# X) W7 q- b  u: B* `# M
  1367.     /* PA7  B1          */
    - \$ u6 Q2 ~, ?
  1368.     /* PB2  B2          */
    $ y, J" c, y  F
  1369.     /* PG6  B3          *// K, j% i, @( H8 u5 G
  1370.     /* PH3  B4          */
    % o% E/ s& F5 r
  1371.     /* PH6  B5          */
    0 i& A6 X) ^1 Q$ T
  1372.     /* PA8  B6          */
    : ?+ p3 P% g4 e$ [- C3 v; Q
  1373.     /* PA2  B7          */
    6 i5 d% x$ J; x6 M" F: V$ U" {* g+ t0 k6 d
  1374.     /*                  */' B8 r* n5 N2 K( G, W$ a% \
  1375.     /* PG13 LCD_DE      */8 k! F. t: Q. F& {6 N
  1376.     /* PQ3  LCD_ONOFF   */, \# q/ ?+ q7 a. _" q7 N6 V
  1377.     /* PB14 LCD_HSYNC   */
    ) b3 w1 i- E' V. Q0 e' E5 E
  1378.     /* PE11 PCD_VSYNC   */+ ?+ @* ]( l6 k- s0 I1 u
  1379.     /* PB13 LCD_CLK     */
    0 F) C! x8 W4 ]+ `6 D# e' a
  1380.     /* PQ4  LCD_INT     */
    # _% |$ j2 W5 _5 x6 T$ Y9 P/ e, z
  1381.     /* PQ6  LCD_BL_CTRL */
    # G% }! K, B1 y: G& D# U9 C& k
  1382.     /* PE1  NRST        */
    ; B5 ?, w$ [$ F) g, x+ G, C- V/ B

  1383. ! @* O) r" P5 C2 A  I
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();
    1 F7 T& D# b6 |. G
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();5 Y: @, p  S/ ^5 S
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();' h( j8 N2 @1 g6 g" [) Q/ C: [( I6 H" ]
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();  K! K/ z- F. \8 O- q( }! T- u7 ?
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();
    ) Q' V* a% d3 Y+ v# X
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();
    9 `' i- O* j& L* @: V1 y  V/ C' _& F
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();; x4 R6 Y2 r/ N. |8 o, D
  1391. , D8 D+ b! W% T& s; z2 w  l
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
    - Y$ l! s# ^' Z/ w: {
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;, ?  G( m. Z7 y3 E  L, M; E
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;, Y/ j# @- `0 x
  1395. # g' i& U6 ~' M" l- M9 u5 a
  1396.     /* G3, G2, B7, B1, B6, R5 */
    4 c$ c3 k; {; H/ E
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;
    + d0 E0 q  T) q) V
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    - D4 |7 W) Z0 s) b
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);
      ^2 @! R8 V3 R' Y* ^

  1400. ; J% r& r( \' ~" [6 v
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */
    1 B# b' W" Z0 ^
  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;
    : N, [* o4 R; y2 @# n+ n, X: c5 e
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    8 c* O: e6 j3 D& {
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);& z7 z& V% H9 d/ J: F
  1405. ) J! T& s2 `9 p1 t
  1406.     /* R7, R1, R2 */
    , ^) \) w' h! {! t* Q2 H
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;
    7 `6 X1 l0 R% S1 W( m; ~# L. k
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;6 z4 I( ~% ^. \
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);
    ) S' Q" \0 L& N2 r6 l( s9 b

  1410. ' i" z9 C8 m$ Y) `5 W
  1411.     /* LCD_VSYNC */
    ' p/ W% }) w$ r( @) o  {
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;$ K8 F- l4 w9 j0 J7 x  w
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;/ ^& @- G/ P" H; z
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);4 |, w0 C" F; }4 f
  1415. 5 g) R! ~# A; \2 c( \8 p* y
  1416.     /* R0, G1, B3, G7, R6, G0 */, O0 B8 }* W3 T  V& S
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;. G1 }; ?1 s% ?+ N7 N5 Q; V5 B7 `
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;! E" Z* D& a2 b+ c2 O# w7 E' O
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    ( t+ X* C9 H4 s1 C, j2 D% o; @! l  z

  1420. * s8 @2 [2 T+ T3 B; P
  1421.     /* B4, R4, B5 */) t, {3 j2 a5 W  d* }) ~) v0 K
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;
    1 ?2 r  t7 Z% o  ?& q7 w9 S0 ^: R
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;" S, D* }/ H% ^* ~
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);
    1 H; X" K) V4 V0 q& \, E1 ^
  1425. ( V* v5 ?5 s: }0 e0 Y
  1426.     /* NRST */
    , s/ ?' P  M0 I& }) [
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;+ c6 i) e- z4 n9 g
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;, [3 Y# @; U6 b) j- `
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);2 l& s" U+ e+ c7 t7 |1 _
  1430. 4 H' W( e) d) a" r
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */' \. I9 U3 Y% g% _, q! u0 A
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;
    ( n) B  f, \, a4 M4 y& g7 s
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    6 ]2 J% ]' b: j3 R+ h
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);
    4 d$ |9 x. H6 N. f* R
  1435. ' m7 E- h6 \7 s
  1436.     /* LCD_DE */5 r0 z1 v. p7 D! C* S/ ]
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;
    1 b, k) r  Q$ y7 j. Z4 m
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;+ b; h" Y6 R4 X
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    + N! c& X6 N* ]1 @
  1440. " ?  a3 l% d" k3 x# F' o4 w
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */
    7 `( K" h6 W* a7 ?. C. D3 @0 Y. k
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */1 L: N! r8 ^$ n
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */
    ( r; a( ^5 r/ D6 D2 Z: y6 ~* _

  1444. ! C, x3 e/ ]$ g% i
  1445.   }0 r. x" V( ^0 z% W3 z0 B. K
  1446. }
    % c, y  J- {4 ]: _% B
  1447. , m9 h) ]& w- X; R
  1448. /**& C, ?( T% W- M5 _0 S6 o* h5 {
  1449.   * @brief  De-Initializes the BSP LTDC Msp6 O2 K: P! I) v( _8 k2 V+ E
  1450.   * @param  hltdc  LTDC handle6 X; ]7 K; D. L; I) \& d
  1451.   * @retval None0 o+ S# ]+ j& E
  1452.   */
    # Q2 s- C% S0 N. e8 ^- }, T. A
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)& ~2 {% p1 ]6 C6 _
  1454. {
    7 B- m" o/ S! `
  1455.   GPIO_InitTypeDef  gpio_init_structure;
    5 ^2 e" n9 P: _7 b) ^- Z

  1456. 3 y- `0 U$ C" q" _- P- M
  1457.   if(hltdc->Instance == LTDC)
    3 B3 f5 W# A" ^' Y. |% U  z
  1458.   {
    7 |' S' z% Y3 {- N% L" A' V( M
  1459.     /* LTDC Pins deactivation */2 X& j5 ^7 o6 k& C( O+ {
  1460.     /* GPIOA deactivation */2 K3 M+ f* p) x% U1 r  R8 d
  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;
    9 W* \" Y# w4 {- g: m; r  ?
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);6 y( N# O8 s' f- Z- T
  1463. . i' ]% r1 Y$ m, S5 u
  1464.     /* GPIOB deactivation */
    1 \6 o* F0 l3 c/ O; E$ f
  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;9 D! w! L& h% A
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);
    + I0 z# G% Q' s: Z5 L
  1467. 0 C$ r3 W9 S9 w" I
  1468.     /* GPIOE deactivation */  [$ U  w9 ~. ~3 }. [! J1 p7 v
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;6 {7 z5 A3 I2 J4 [; Z( h" t
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);+ g  ?7 x' }8 S, v/ D  K

  1471. 1 d/ ?! w' O" {! y
  1472.     /* GPIOF deactivation *// ]- `7 m. U. Y6 b" r
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;
    2 t: O3 |. _; K9 u1 A
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);. T! {; A/ q3 ^5 e$ O5 @
  1475.   {4 d+ v. q# v  t
  1476.     /* GPIOG deactivation */
    & ^$ K: y: V4 K  B
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;
    : o/ s' _* e) o& r5 [4 z2 ]
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);
    6 H2 ^7 A7 {+ s2 Z& @; X" e1 R1 N

  1479. , X% u! `% j" T
  1480.     /** Force and let in reset state LTDC */; O" G& [+ n$ i3 h9 Q
  1481.     __HAL_RCC_LTDC_FORCE_RESET();; [0 U0 ?( Q" n7 f

  1482. . S. ]: J. o. C( u* `5 U
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();5 z+ [8 I( }+ ^! E' v% c: P9 b: z
  1484. - P8 l. F5 }% a2 V6 |7 x, u2 K
  1485.     /** Disable the LTDC */* x  {3 Z" [$ |
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();
    / ^, g7 |# i  i3 c( K
  1487.   }. F2 ?4 h9 n/ Z2 v( E
  1488. }
    3 B7 t' A- |% S' _- b& v
  1489. 7 |  p" ~) O& d# R4 z  b
  1490. /**
    $ v/ w' s6 R3 C3 k- L8 y- V
  1491.   * @brief  Initialize the BSP DMA2D Msp.% t) R7 ~% t3 d
  1492.   * @param  hdma2d  DMA2D handle% [% S$ i" P6 O9 w
  1493.   * @retval None
    & V, C+ Q0 O$ r5 D
  1494.   */; B( S4 d: g% M% s2 O7 H
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)
    - U7 _: i. ?" J; O/ h  c
  1496. {9 O. T1 k% @5 f0 t3 x  u
  1497.   if(hdma2d->Instance == DMA2D)' h0 Q# O( ^; y; P0 m7 [
  1498.   {4 Z' l+ u! R& Q1 `
  1499.     /** Enable the DMA2D clock */9 g7 i3 b9 F% C9 W$ l1 B. N! v
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();! Y: `2 o+ \* M  M: O
  1501. * ^, V- q& ?6 ?
  1502.     /** Toggle Sw reset of DMA2D IP */
    ' F( |9 F2 M  o3 L% I
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();- u! B- @* _* ~) Y$ D6 f
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();0 l1 `4 w, a4 P
  1505.   }
    ' h& H! I3 l+ {$ e
  1506. }
    0 J) |* A+ j. F! b* j" F% g

  1507.   S! Z: i$ \. _
  1508. /**
    5 M0 K8 K+ Y' u1 H, Q- ?
  1509.   * @brief  De-Initializes the BSP DMA2D Msp& w( }& l) M! o
  1510.   * @param  hdma2d  DMA2D handle
    / z7 n5 ~: p0 J, x. i2 `! u
  1511.   * @retval None
    7 a% f% H2 i4 j
  1512.   */$ o% _, f4 ^9 p. `) v
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)# f$ T# {2 h" p$ D+ i
  1514. {
    1 U. f; v# V6 Z
  1515.   if(hdma2d->Instance == DMA2D)5 @8 O" p" N3 t* l6 T! K
  1516.   {
    ' d' O4 F; g6 u3 G! U
  1517.     /** Disable IRQ of DMA2D IP */5 l0 I5 m0 u) U" Q0 g' l
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);6 \4 Q2 S& S( h: \. E- P
  1519. 2 u! `8 K8 n1 l* \3 Y9 c
  1520.     /** Force and let in reset state DMA2D */: \9 }' [8 _; E# w* t
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();
    % F" @0 H8 `! H8 l# J) @
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();, |1 x0 R% {2 j+ ~# _2 n

  1523. 1 [" d) |! G8 ~! t. P- A- U# R
  1524.     /** Disable the DMA2D */
    $ N* d# e& S! ~  d. s
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();  N! b* R0 P7 y
  1526.   }! I7 ~! u. z9 O7 i/ S
  1527. }
    ) l. `) V& Q! X  U4 k+ B1 ~; Z
  1528. ' |1 o, {9 p# c- f4 O# q
  1529. /**( F2 p7 r9 N# e. @' j
  1530.   * @}
    - Q$ x2 h, T$ O8 `2 V3 f
  1531.   */) p5 \" i: s* z1 x, i
  1532. / ^# B; E6 Y2 z( l+ S' K9 u# y
  1533. /**
    8 x9 u! j5 P& F& t- l
  1534.   * @}0 m4 g  b! W: _1 k7 t0 U
  1535.   */
    : L4 m) P" [% D$ T5 J# w: w8 T
  1536. ; Y- J! p; r9 m* b: P/ b" h
  1537. /**  ]2 _0 w5 O( w
  1538.   * @}
    + |" h3 X. b9 ]: k& N' K
  1539.   */$ T# i1 K! `  D1 l

  1540. : b: v. n: T/ m% S% f' c( r
  1541. /**
    * I5 o/ n9 h8 g; z
  1542.   * @}
    6 B) Q9 W+ f" I+ ~
  1543.   */
    / L6 F( i/ T2 Q
  1544. 2 Z: K, E! N/ B  p( K
复制代码

. T0 U9 k+ O. y6 M9 t4 h( E
6 F9 c: o/ C# Y- F7 `% e& W$ l! j
2.2、main.c
4 Y( ^. J4 ^! d& I
  1. int main(void)
    4 E/ l- t/ ^8 P: R
  2. {
    3 ]+ t; @; |' \* \
  3.   uint32_t x_size;
    * C/ C' q. L2 v5 x9 a
  4.   uint32_t y_size;
    9 y5 C/ N% h; B% C5 u
  5.   uint16_t i,j;( X, f/ b- k' ~" T' x

  6. " ]- i, B1 c' o0 @
  7.   HAL_Init();
    " L: C5 m7 [$ E3 r9 @# t
  8.   SystemClock_Config();( ]* x5 W+ m) W( M) s. U: z6 }
  9.   1 I8 p$ t0 ~0 x
  10.   /* Update the RIF config for the used peripherals */
    * v4 T+ C, n. J3 m. R4 Y7 s
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    " z/ |. _  \5 |% B) X
  12.   RIMC_master.MasterCID = RIF_CID_1;
    : H3 j5 l9 n: ]( N* k" b1 O, G
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;
    9 v2 Y, u1 i' ?& ]  A2 e
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);
      |" t6 a0 E( N' n
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);
    ' r; K8 O( J! G  }+ |% k& |- [
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);& j, o  G+ G! S9 C  f
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);. N, z* p" w  m
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);6 C) n  _& P& ]
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);7 t. B% T1 ^; M! A
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    ! X7 c' R/ L" P. f; h. Q7 U& u
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);- \- K2 a3 q4 d1 [1 ?2 G
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);4 i9 F1 E( ^+ y) z3 B; s
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);3 h1 I+ c+ a* V! }& D6 P
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);3 ]& @7 q- R: F
  25. / a( E( ~! D! {. M" e
  26.   BSP_LED_Init(LED_GREEN);! L7 ]9 j6 q% D$ M: B8 P! k
  27.   BSP_LED_Init(LED_RED);! `) D9 n# r$ |( z" s
  28.   
    # o+ W: v' S9 s
  29.   #if USE_COM_LOG
    0 X9 Z1 r# }# H4 m2 ?* z
  30.   COM_InitTypeDef COM_Init;
    , s( A+ A3 m8 t; j$ h- k. @

  31. ; e: }/ ?# A" H5 _" s. [9 S3 p
  32.   /* Initialize COM init structure */' p0 C8 i& k& e2 N
  33.   COM_Init.BaudRate   = 115200;
    " R' H8 N. f% k
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;
    2 y# t4 ~, D8 ?
  35.   COM_Init.StopBits   = COM_STOPBITS_1;
    * M) ~, v) j) a/ j: E8 P
  36.   COM_Init.Parity     = COM_PARITY_NONE;# E! K- O7 @1 R/ _  R
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;
    # z2 @; h  X% P4 F6 P

  38. 7 Z# c/ b1 f6 B* p9 Z
  39.   BSP_COM_Init(COM1, &COM_Init);
    8 U1 p$ V. p* U9 L7 q
  40. " \0 j! A7 o6 N
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)  L: }) a: w5 O. x' n* A3 i
  42.   {' l9 o8 V7 c  W$ \3 h' S; M
  43.     Error_Handler();7 f2 i+ J. M5 E$ e
  44.   }
    " z( |) n: X8 K3 A2 b2 J1 N
  45. #endif
    % j5 N+ Y  m! X
  46.   
    # U0 S1 _5 L  s: V7 `
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
    ! _& q! N  E3 R
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    $ v! [$ ]+ T. O2 l1 J6 Z, @1 h( d
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);3 F. ?8 y1 W$ P5 g; H
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
    * _9 P# F, V# h
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);/ C: u8 ^" I4 Z) n( ?2 G
  52.   UTIL_LCD_SetFont(&Font24);
    ' m; E0 n3 ?9 i2 [1 b
  53.   
    5 T) }& L/ k3 K* W) x" f, s
  54.   while (1)
    . C! O* q- _3 b* j# {4 o* g: }
  55.   {1 [+ m2 J% e$ [7 Z+ r8 s7 o
  56.     switch (i). ^1 i3 R& \; D# k
  57.     {6 T8 X6 N% _4 O4 d7 @7 i
  58.       case 0:: e* a. }; N1 L# }2 p. |7 Y
  59.       {
    9 \" h" f, C; [& l. P
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);% h6 }4 m9 Q5 Z7 |: D& f$ |6 v
  61.           break;
    # D; ?6 g4 \2 q0 I4 x9 U
  62.       }7 S* H6 E$ f1 F7 h- x' R% T- |4 b3 M6 ~
  63.       case 1:" ?5 U9 \4 r" |7 Z
  64.       {
    ; O; N9 w1 \2 K& P, ^
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
      _+ Y; W6 E0 s$ q5 @
  66.           break;
    $ |/ G) M5 C' K# K1 h0 X
  67.       }
    + w7 e0 q% O. F9 D8 q+ }& i7 ^4 E
  68.       case 2:
    - E9 v$ D5 B7 b9 i; i3 I6 v
  69.       {9 A4 `& ?" L( Z4 P. e& F0 I5 o- _
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    2 ^' Y  ^" g8 k0 ?$ [+ `4 R
  71.           break;
    + ^. l) V( C6 `4 D  u8 B; W
  72.       }2 B+ r, x/ z& o$ G$ O! L/ o6 |
  73.       case 3:
    6 z4 K; k2 H. r- n& Q6 l
  74.       {; z4 X1 i8 o3 m0 F+ p) f
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);6 ]; y, _% V8 f$ H/ T
  76.           break;' ?; Q3 G0 X- h8 z; T6 |% T, c, Q
  77.       }
    $ Q& S9 o7 X2 M' x
  78.       case 4:
    : @* T1 e( ?" i; q- v
  79.       {
    # I* J- R! H2 d4 C. W
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);
    & p" O% R- q" l6 i( @  D/ t& ~- i
  81.           break;& s5 v5 V# G* M# A* Y
  82.       }+ t3 A) ]9 {& P3 I3 E! t+ b! Y2 U0 \
  83.       case 5:  A9 y" L6 C) k6 X, J# `! F( J
  84.       {
    3 R: s2 ?& @) g" Z. |, D- U
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);
    ! Y  @8 z& y% J0 X2 T- I
  86.           break;
    + c2 a. W% ]( h
  87.       }
    7 y! i! t2 y/ w- Z; n+ ?! Z
  88.     }2 E% A" B3 d4 g4 R# F; `) X3 K$ Y
  89.    
    : O% v* d/ x) }: M( ~: m
  90.     if(i==6)
    ( _" x+ _0 q7 @; ?3 k* `! J
  91.     {
    1 U! v% x. z& r4 s# J: d
  92.       i=0;
    ! m# |/ ?2 e4 c2 X9 |6 n" r2 E, H
  93.     }0 E. N3 l# j; M. d' [# c
  94.     else) t  D* f0 |5 M: A+ d  W
  95.     {
    $ O( n" J1 z5 D" `" d
  96.       i++;, A" P2 B$ @& u, h6 r
  97.     }$ T3 U" A% M5 \
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);
    5 j9 i/ Q8 D# w0 i
  99.     BSP_LED_On(LED1);
    8 o, b6 p) S6 |
  100.     HAL_Delay(500);1 Y# A! G5 Q1 R1 A
  101.     BSP_LED_Off(LED1);
    0 z1 t" G) c7 n1 j# A; E
  102.     HAL_Delay(500);
    ! f" ?! O: _( N3 b
  103.   }6 o$ J0 Z, |/ f' _& R' r
  104. }
复制代码

4 F& ~: E- P- ^; j4 P4 \& K* ?& b0 b
/ U$ ?- D. ~& D
$ \7 I; Y/ y2 L$ e3 Z* b
" j, a5 m! }' i3 v) b
三、结果6 t7 g+ u9 S- p! m$ g- m3 h

9 V. o7 U. P9 K
# t. e) D: ~- v
下载程序到开发板,运行开发板屏幕显示如下:+ M! p, O8 b' g6 M1 \& _$ u
lcd.gif
& ^7 b9 A% E% |5 S" x8 Y

# e: S$ x4 f# j, I' i# u8 W
$ O; Q/ E% s  F  _+ F8 F# g( x3 y, w

+ |# d, G- p( ~& o
& ^; R- c- G  N
赞 收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版