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

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

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

* p4 U; ~& A4 L  M
* p3 T" O. q8 \6 l6 X

0 p$ v, n; w& x, C$ }  B一、硬件部分9 H4 e$ q7 {3 o9 r7 r
1.1、LCD显示屏硬件接口部分电路
+ ~4 f5 I2 T' z6 ^ lcd.png
# F4 f) X7 M1 t
4 ~2 D8 d* y: O' N) K
- ?; Z/ ]( f- t+ a8 S
  [& T1 N9 P8 E$ a

/ D6 o# q2 H3 o7 A( M: f5 u* t
5 _; H" A$ r5 b+ B  t) n) s1.2、LTDC显示内部框图
) t0 B8 C- x& o  RLTDC可驱动24位的RGB显示屏,内部有两个显示层
) B: F; e! v5 `# x7 }/ }) F 002.png & `6 b$ O$ Q4 Z0 n# S$ [

% d9 B9 q: l5 T* _4 j
. G' W% v* u2 |7 P

, i  [0 r. l# }/ K$ }! z2 Q二、配置LTDC
8 `0 U! B0 }$ x# n5 Y# t
: p/ W# M* j. p. W; v5 ^; j2.1、屏幕的参数设置
6 [! K. n/ N3 n, h5 E# l 003.png ! w: [4 N6 j& ]! c. v+ Z4 }

8 X5 T; O% ], D/ X# n7 U9 @; d' |

. K2 p/ Q: m, l1 s) c; {! A2.2、层参数设置
1 Z5 N" |1 @- F 004.png
4 d" U4 @; P1 T5 x8 u/ g

3 ?, L( W& B- [" I+ v
; |' I# t8 J8 F1 n" {9 ?

' C3 m- K0 D0 z: m* i. j6 a2.3、LTDC引脚设置8 ]+ a% c* W/ y4 ]# O8 h- a
005.png
7 H4 A6 Q( m; D  ]% F

) a) A( d) N9 t7 i; Y2 q) Q% ?
* G4 e2 q" ?) M

- S$ E0 B, N7 }: z" [$ Y三、程序部分
$ J4 z' D$ W! R* E0 {) g6 a8 ~5 a& F2 z2 K% {9 i7 a7 m# D
3.1、在项目中添加LCD驱动程序: e, r/ g- \) _
使用官方BSP中的LCD驱动程序
  ?6 a$ U( q- O% }' g, qstm32n6570_discovery_lcd.c
7 L/ b# ~' @8 x# X; g0 y3 u
9 s* _; A; H: M2 ]& t
  1. /**
    , H/ g, W( g! `& ^
  2.   ******************************************************************************
    $ g5 Y0 f, W+ S, Z9 d' m
  3.   * @file    stm32n6570_discovery_lcd.c3 e5 k5 Q3 V3 ^
  4.   * @author  MCD Application Team
    ' [- ^3 |5 V) ?
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module
    + S! N, G: v8 D" S! \
  6.   *          mounted on STM32N6570_DK board.
    - L% m7 ~% b, m* G; L% x
  7.   ******************************************************************************
    & ~1 t6 b# ?5 O0 c9 y
  8.   * @attention- N% A% v# G1 H
  9.   *5 g( R2 J  l- Q+ E7 c" g: @
  10.   * Copyright (c) 2022 STMicroelectronics.* A" l0 @+ e% A; C( L4 S
  11.   * All rights reserved.
    2 }( v% G8 J: }* V
  12.   *( Z8 ~8 P2 h" E+ O
  13.   * This software is licensed under terms that can be found in the LICENSE file- T3 V( j) J- a
  14.   * in the root directory of this software component.2 E+ m: ^* W: L; @
  15.   * If no LICENSE file comes with this software, it is provided AS-IS." Z( |) y# j( H4 W2 T( V) ^
  16.   *
    7 z1 P: W* h9 V3 ?1 N3 i" k
  17.   ******************************************************************************4 S) [$ R7 o1 B2 ^3 F1 O
  18.   @verbatim
    " C% \5 n4 i5 H) f' _- T* j
  19.   How To use this driver:
    . j6 m+ Z; Z/ B8 A) ?
  20.   --------------------------
    1 C: p* F3 K$ z$ g4 z' S
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.
    4 U% r$ q5 T5 ^2 c! c
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component- g5 E6 `3 ?, n5 _( v$ F
  23. " c1 y  T1 Z& D+ E% S0 e; j/ N
  24.   Driver description:0 W! K* v5 u+ e; W& }+ `8 P7 t
  25.   ---------------------/ Y, a) s, p& X3 V, ^
  26.    + Initialization steps:
    ! M+ K$ m' p1 ^1 o' @* R; W1 b
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the# s$ X6 p& I0 v) |
  28.        following settings:/ G" x3 [# K' ]. c) y1 `
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888
    3 }' ^$ S( z$ g& [& @
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.
    & ]1 ?3 y4 v, a# P. ?
  31.         - Width       : LCD_DEFAULT_WIDTH (800)
    ) D5 Q0 G5 F0 m9 ^( w# }
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    2 j3 {4 P' {* [0 y( q
  33.        The default LTDC layer configured is layer 0.
    ! G3 J# U9 J$ c: y. R. C7 d
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:
    * n0 r- N; t2 u' O
  35.         - MX_LTDC_ClockConfig()
    6 y& M! Z9 p6 y" y# ]( C* u
  36.         - MX_LTDC_Init()* K" L) x- ]9 z* t
  37.         - MX_LTDC_ConfigLayer()
    * p8 p$ p  R9 V; R+ m$ E

  38.   Y' X0 }' \! g) T
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.
    4 x5 E5 d1 u( o" s$ Y
  40.   }, r$ l2 m' u# L
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.
    + O+ t) _' J7 |, m, `. R
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.
    / K# ~& h; t: a1 O
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    ! r. w$ v8 ]  V+ T
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.5 r0 K3 I# I4 P
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.
    8 w) C8 m; ?, Q* q" F: G
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.1 R. m, x4 Q  s$ q& W
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.
    2 s( R2 X2 X% f( K! K
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.5 E9 [) T5 l" v

  49. 2 W( I( u2 {% {) s! S# L. F1 F
  50.    + Options
    * v% P5 M% M5 j0 i( s. F0 r6 b
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the# l" u6 t& L5 l7 N7 y
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.. H) t9 `& Y) p# `+ P$ K' m
  53.        To control the reload mode:
    # s3 g" \: }/ B
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE
    / r( T+ e3 i( e+ x. U/ Q+ r8 Q
  55.          - Configure LTDC (color keying, transparency ..)# `, ]* }7 K3 A  i9 K
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE3 {) t% n9 Q8 p9 \( v
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload
    4 Q. e$ _! a0 C' l7 U, k
  58.            in the next vertical blanking
    9 N6 D$ ~( s* P4 ]7 y- [7 U& d" B
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()+ I% B" n1 g2 Y3 Q# w5 y
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()
    3 S) {5 v, _$ G7 l# U6 Y( U) L+ Y
  61.      o Configure and enable the color keying functionality using the# _0 z( P% ^/ t
  62.        BSP_LCD_SetColorKeying() function.
    8 X5 h$ }" @, ?  m3 d& V) U
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.  i, R' d% B# M1 ~, D
  64.      o Modify on the fly the transparency and/or the frame buffer address' {8 a1 v2 d8 ]
  65.        using the following functions:
    4 E# J/ h' t5 b
  66.        - BSP_LCD_SetTransparency()
    / W( [: a* U' F* E; I! P
  67.        - BSP_LCD_SetLayerAddress()8 c! ]. _9 H. Y
  68. 1 j4 Z) l# W0 }- _8 G/ c3 Q
  69.    + Display on LCD& x0 G8 [" e& z
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)
    ; {8 _7 n6 E0 [' }0 E
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,3 Q8 s) J( c; j) \( ~  T8 |
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.! k( P0 B9 e$ A9 t4 ^- N
  73.        The basic gui services, defined in basic_gui utility, are ready for use.
    / N# i; k( H, ]  }# \# {
  74. . U, u& U* L2 R% b4 L
  75.   Note:; D3 w5 M) [9 V/ s9 J; C- t. u
  76.   --------# x* V- e3 R( a. Q/ S  e
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select
    9 {/ d" u8 S8 n
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this, u7 P! S9 a: A# Y
  79.     parameter should be 0.
    , p5 \, q; B& [1 V. Y# ~9 M

  80. 6 @8 B3 d9 _/ T
  81.   @endverbatim7 M: N3 W+ B1 _! s2 w
  82.   ******************************************************************************
    ( f% C$ N5 g/ m8 P" M/ M) K
  83.   */5 Q2 T' w! \' ]; ?6 }9 X- O- z

  84. 5 }7 P. S  p; M, s  n
  85. /* Includes ------------------------------------------------------------------*/3 y9 x" j" q  y( Z" s5 b- A# E+ a
  86. #include "stm32n6570_discovery_lcd.h"+ g1 W. M5 P7 W2 P# k, x- K

  87. . e6 |3 k% ^9 o, B9 N7 ]* D9 s
  88. /** @addtogroup BSP1 X/ }: G$ E3 }! g9 \1 Q
  89.   * @{
    6 Z% V8 f1 Z+ ^
  90.   */
    ; f0 K* s7 o& `  S% [/ ~% N

  91. ) J7 r5 L! Q4 _9 N4 y9 D" y8 n
  92. /** @addtogroup STM32N6570_DK7 N8 f8 ^3 J' n( i4 b+ R. k
  93.   * @{
    * h. z1 V0 A: B/ G4 o' ~, K
  94.   */
    ( L$ G4 ?% |  u4 w+ X3 F
  95. , \, g! t$ p0 C* ^# a( U' x
  96. /** @defgroup STM32N6570_DK_LCD LCD
    6 d/ q. M8 ~6 Z- S! }& w* R; j' V
  97.   * @{
    $ N% E3 _7 C; [3 M, m9 u9 I% f
  98.   */9 |& Z( H) m+ Z. e+ y9 X7 |

  99.   |: @/ n' s4 n7 h7 t
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables
    # P7 J% G# `; J5 {% q. V
  101.   * @{5 K, L4 H* H9 a% P. I( P+ C5 `
  102.   */( M6 n  ]8 `& }! N  c6 e

  103. 3 q8 o: q- a0 F7 O$ r0 g/ N
  104. /**
    " a& J0 p5 N8 q1 D- s
  105.   * @}* {# @2 S+ l3 f8 n
  106.   */
    ' [4 R. L4 z' k# s: j  ~

  107. - V* D+ c# A& l6 q
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions
    3 L' N3 b$ c% s9 N8 A" \
  109.   * @{
      @1 ?: \" J) j* ]1 ]6 M
  110.   */
    . y1 g$ H1 v5 u) _4 i
  111. const LCD_UTILS_Drv_t LCD_Driver =: g# G9 z' ?- |; H; i9 [
  112. {
    ) C: p6 ?5 I8 `& ?, r9 b& a
  113.   BSP_LCD_DrawBitmap,
    9 ?, R5 ^, u* B+ u  l: S& e  A9 o
  114.   BSP_LCD_FillRGBRect,
    5 q. q: @% H' Q
  115.   BSP_LCD_DrawHLine,5 s+ w6 z; K" l- ^' |/ r4 e
  116.   BSP_LCD_DrawVLine,
    : T7 e. Q: F& [. v. p  u( ^
  117.   BSP_LCD_FillRect,
    6 ]. x% K3 p4 o* q" g
  118.   BSP_LCD_ReadPixel,
    . [/ ?! S7 w1 i3 t
  119.   BSP_LCD_WritePixel,9 d* ?5 W8 _* b+ q6 ?: k- G
  120.   BSP_LCD_GetXSize,
    " D3 N5 @, y9 {! T' S& p
  121.   BSP_LCD_GetYSize,
    ) S. e% U( e, V" x3 n! }
  122.   BSP_LCD_SetActiveLayer,
    ) H0 N" P9 o9 O% ^: n' u7 \
  123.   BSP_LCD_GetPixelFormat2 i: A- L" B" r, {. R7 Q
  124. };
    " p8 M2 C; L; |; m% F

  125. * z0 n& f: D7 B( ]8 A
  126. /**, Z$ H+ W) }) J- S4 G
  127.   * @}4 [/ i' z1 m( ~6 C! R1 ?- s1 [) Y
  128.   */$ G* Q1 Z' J  i1 O
  129. 1 v- M3 M! L0 U- y! o* h' t
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables
    3 r* t: j6 g3 C2 X# g
  131.   * @{$ b% R6 o$ ^* J* A* `
  132.   */
    . |; S1 B: h0 Y  f; q
  133. DMA2D_HandleTypeDef hlcd_dma2d;9 @, o# f- I7 E# ]/ V. \: J. x
  134. LTDC_HandleTypeDef  hlcd_ltdc;1 `$ g1 E$ n% a7 T& }! [) a" J* j
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];
    7 ?9 ^" q5 i5 k+ F" k
  136. /**- V2 O7 e+ p, @4 N
  137.   * @}, M" C, ^5 z% p" f- d  U# g% B
  138.   */3 i: O- y5 t0 p6 w, d% W
  139. , ?. k) }" R- b1 f$ ^  W& o) J0 ~
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes
    ) N! G$ `# j# T% I% ?0 o8 f; l
  141.   * @{+ x+ k8 q! e- `2 {" \
  142.   */1 d2 z% g, M, J' K
  143. % {: q/ G) [: h6 J
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);! o7 p% e/ ^# }/ ^) t
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);% r" A5 R+ y1 \' v0 I& d+ O( J* D
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);$ Z' j' Z/ s; b/ }, N' M& ]; m
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);
    & f8 {; F; I4 e4 S$ K
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);
    ' l$ l! _) P# ~
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);( M) N- U* K* {$ }" s: r
  150. /**
    $ a2 Z- F( N; C3 J) A
  151.   * @}
    # }+ |" v6 ?3 z5 W$ u% B% k
  152.   */
    $ L" \# S2 h0 X
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros
    2 r! |: f( S- U% h' u  y
  154.   * @{
    ! E9 y5 H: d0 H6 ~* A1 U
  155.   */
    + p3 ?$ q: c% ?3 C  _
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\
    - v* h2 @9 K% e% m
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\+ ~! N* {8 E$ c" v+ a  i0 [: r3 B6 R
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))# U- g; d+ c1 I7 ]# i( J
  159. 6 I7 e) s, `. u6 m, C/ C: L  L7 x
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\8 t: m0 m$ M; R
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\
    + i. i) t& w7 W8 E, _' ^0 J
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\& r4 b3 V& c, M+ }0 ^% f  Q
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))2 \$ _5 ?- Y  H+ n8 b4 `
  164. ) f/ U4 p) o6 ~5 A
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    7 S. q& f, n! `6 H3 I1 |

  166. 3 S" o0 b* v9 ^* z( X
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)
    ! \8 w9 Q0 \$ t

  168. 8 @' |$ W' q. K
  169. /**5 J7 O3 c0 z# t! z2 X3 n$ O) ~1 t+ [
  170.   * @}
    " {+ P) s2 a2 v
  171.   */
    5 b/ |+ P2 h% a7 h* N; g" I
  172.   c; o% J! z0 O, Z* \# m% N
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions
    ! a/ V0 B- c# _
  174.   * @{; M+ C2 w( L% T
  175.   */
    . F2 ~, B! y4 A( S8 O" ^2 Z
  176. /**
    7 b) ^- i* k! n$ ]& T- B' B9 R( }$ x
  177.   * @brief  Initializes the LCD in default mode.
    & ?4 E2 ~: L+ t$ b. O
  178.   * @param  Instance    LCD Instance4 f& W% N1 n6 n0 l
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE2 ]' R  [. f2 w# h5 [
  180.   * @retval BSP status7 n/ c6 A% ^2 f  @0 Q
  181.   */
    + ]+ W- m" m. G( f! H7 y: s8 T* Y

  182. % v3 y' u# x# v; }3 x* w
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)
    ! m: y: j% c# [+ L% r! l
  184. {
    9 J* T( l% E- o* w9 I$ e3 }
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);( I( _$ K" ?2 q. C/ y9 F& ?; R
  186. }; ^) Z$ ]1 ~& d  d! d

  187. , h: n6 v- f8 S- @
  188. /**% o' P3 z6 V1 L# V: r7 Z
  189.   * @brief  Initializes the LCD.2 P7 g1 t$ ~! a7 }" \
  190.   * @param  Instance    LCD Instance4 @, ]( Z) n& B/ @0 p) q8 {
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE4 t. Z8 Z# O, v. S
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888$ Q9 ^1 Q  V! l, Y  z# B. y
  193.   *                     or LCD_PIXEL_FORMAT_RGB888, G" d1 B' T% E
  194.   * @param  Width       Display width
    + }' y& g- J* q; x" f3 q- @7 e- k/ _
  195.   * @param  Height      Display height
    # G  g  z0 N* O
  196.   * @retval BSP status, P; s, p8 A7 L- A& k# l, w
  197.   */1 E" f0 ~; j. o5 T; q8 R
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)+ p; g: Q$ w5 ^* y- d* r) ~
  199. {/ W8 }# o+ K  G, \3 Y1 n& x
  200.   int32_t ret = BSP_ERROR_NONE;; S! G) G8 n  k4 }+ s
  201.   uint32_t ltdc_pixel_format;4 F6 `5 q3 k; Z* M& m! T
  202.   MX_LTDC_LayerConfig_t config = {0};
    1 a: s) E- Q: `8 n! C
  203. # m% E7 P5 q- J. t( v, C3 m7 ~
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \' D2 ~; c2 Y! S6 h7 D' ~
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \
    0 A0 f, D: d( y+ t+ [5 [: T
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))
    * A) Y, y! d2 h, l/ A. p
  207.   {1 t, M3 P: z# m9 \( @
  208.     ret = BSP_ERROR_WRONG_PARAM;% W$ ~! v1 O" e8 B1 m& g" y
  209.   }5 v8 M4 }5 I1 E1 i7 z+ v0 w
  210.   else
    ; W1 Z; [" E/ f9 ]4 \! i0 t
  211.   {. m8 ^2 @. [9 {- c
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    # B. [* [& V3 z4 e2 \! _/ F) f
  213.     {
    " m9 T4 Q! P! z
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;+ M, }2 d( }" B, ]. A
  215.       Lcd_Ctx[Instance].BppFactor = 2U;
    0 v& U9 @9 Q5 a7 g9 t& k
  216.     }
    3 I7 t& T. n" m  X# {. t
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)8 D3 S: y# {9 E. R
  218.     {
    3 q! Z( j3 p& B7 I* G7 \3 {# t
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;/ P/ g1 a5 K+ @, v- ]- M
  220.       Lcd_Ctx[Instance].BppFactor = 3U;4 E2 h3 F* E7 t3 o) Q5 E! x
  221.     }
    % t  p- ~8 A. R+ U
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)
    ; s+ |4 R/ D2 H1 N9 A# _
  223.     {
    3 Z0 q7 Q! s: b: d
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;2 \/ k3 J9 t' F6 ?" @; f" P/ @
  225.       Lcd_Ctx[Instance].BppFactor = 2U;: r+ J1 ?6 I! S4 i2 `
  226.     }( _6 O  C5 G$ y. ?4 h
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */
    . X$ v: I- H* Y* H4 h; g
  228.     {
    - `# C. J; a9 D  e+ c" _$ T
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;  b" ?% r, J+ n, L
  230.       Lcd_Ctx[Instance].BppFactor = 4U;) B# L+ ~$ C  u% F8 V# v, Z
  231.     }
    * P; r/ B" Y$ Z+ M+ A

  232. 9 B" J3 Z% Z" x
  233.     /* Store pixel format, xsize and ysize information */
    1 ?  l5 ^" U3 ~0 l: G
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;
    " M# p% [9 [5 B4 i& _8 D' Z/ Q  G
  235.     Lcd_Ctx[Instance].XSize  = Width;
    ! l  U2 Z. X/ w. \- A/ o
  236.     Lcd_Ctx[Instance].YSize  = Height;
    ; c7 a+ g3 m4 r4 V1 V6 V

  237.   {, P  z, \2 M0 g# M, B
  238.     /* Initializes peripherals instance value */
    2 t* w' S$ o5 }7 L1 {; I$ ~
  239.     hlcd_ltdc.Instance = LTDC;) p5 w$ U' U" _. V5 m: a" W
  240.     hlcd_dma2d.Instance = DMA2D;/ t# |0 h4 T0 q4 @. C8 j/ {: ]+ A: s
  241. + |" a5 I* s" J6 i, @( N% ]7 \
  242.     /* MSP initialization */
    $ Q; S# L5 F4 J3 R. z6 P
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)7 M. M# Z4 l" U- [5 l
  244.     /* Register the LTDC MSP Callbacks */
    : G1 N2 G6 k" k3 Y
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)
    ) o. P1 N' G1 t. k' u! l9 b
  246.     {% Z2 S5 o. x! u: g+ ?3 a
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)
    + B1 `' C6 s, ], V; P6 U# F
  248.       {
    0 `, \2 P* O1 s8 o
  249.         return BSP_ERROR_PERIPH_FAILURE;! w9 H' d6 l; \- g6 T) S$ v) X
  250.       }
    0 b' m/ [* _) Q. A
  251.     }4 m8 J& @# |; l0 V: @2 K
  252. #else
    4 |1 Q8 }4 x; V0 e: [
  253.     LTDC_MspInit(&hlcd_ltdc);/ e1 z/ f( R' D" j" U) y8 g
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    0 j2 h& P; \, e" x3 s% w+ j5 m  V

  255. , y) y$ a1 I! n, O0 ?
  256.     DMA2D_MspInit(&hlcd_dma2d);, L3 u; f- e& Q3 f* x8 l1 ]  J
  257. - [/ |9 e5 w  ?, I1 `& T, L
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)
    2 g1 @- V3 H  [9 x) h4 D
  259.     {
    # `& L7 y8 P% N. B1 M* _! u7 N
  260.       ret = BSP_ERROR_PERIPH_FAILURE;; S) E; K6 D! l  ~
  261.     }! P7 z$ I1 q# y- x3 ^% g  H, ]
  262.     else. j' C- r2 p2 t& k4 w- C4 Y% f3 s+ M0 Y
  263.     {
    & `8 S( D% t7 A' O
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)% R/ |5 v9 P9 K" o" @
  265.       {
    % M4 N" w6 M) b( U+ U) M
  266.         ret = BSP_ERROR_PERIPH_FAILURE;* ?* U# y1 {! a3 W0 |+ t3 o; l
  267.       }; n. i+ d& t4 J2 M
  268.     }
    , z% F- z! U. n8 i

  269. ( g! Y9 b, d# J4 x7 Z2 W# B; A
  270.     if (ret == BSP_ERROR_NONE): h5 r1 k2 u3 P" X- Q" t) O5 s5 I
  271.     {. d* i3 o9 G: W8 D
  272. #if defined(DATA_IN_ExtRAM)
      `0 f, a9 c, z0 d3 k% P9 k
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */6 J+ _% i' ~9 E1 X- u  A: t
  274.       /* Initialize the XSPI RAM */' V7 ?5 k( \4 a4 Z! Y" c3 o% F2 j
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)
    * C# _( B! l- Y
  276.       {: U% _" M' ^2 Z+ u" I) M% B( m6 {, [
  277.         ret = BSP_ERROR_NO_INIT;
    9 D  w) Y1 e/ V- n& @
  278.       }
    8 r8 ^9 D0 D: `% L
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE). B3 `+ K0 b* U- @  I, @9 g
  280.       {
    ' r  m2 H3 V, u" \! t7 m6 E
  281.         ret = BSP_ERROR_PERIPH_FAILURE;
    # L8 A( P' x  q" `
  282.       }
    8 J' V+ [% G9 [. Q+ r- _" [) |$ v( s
  283.       else
    & O: {/ y- K) Z3 r% D7 \1 Q
  284.       {* y% n  G5 ^2 ^: l! a* m% ]
  285. #endif /* DATA_IN_ExtRAM */
    ; X1 K$ |' @5 p7 E  p" x+ V
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling
    1 d8 [  h# t# M; y
  287.         BSP_LCD_ConfigLayer() at application level */$ I# x: q) r, i( v( l, z: S; i
  288.         config.X0          = 0;5 S" G; j4 u# U! [5 k4 l
  289.         config.X1          = Width;
    - t' m- x2 r3 v4 l7 \2 G+ J! e
  290.         config.Y0          = 0;8 V6 @; L( h$ n5 z" `0 G
  291.         config.Y1          = Height;& q9 R( M4 l7 @
  292.         config.PixelFormat = ltdc_pixel_format;0 q+ a- m5 D# B
  293.         config.Address     = LCD_LAYER_0_ADDRESS;
    / C8 x& v* _  B

  294. 9 F5 C3 k& x! f, T4 \
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)
    1 q3 [3 C' f0 [- F
  296.         {# n$ G. K6 p1 l0 |0 z/ z( `
  297.           ret = BSP_ERROR_PERIPH_FAILURE;8 O3 E3 ~- P8 A4 N% m+ c
  298.         }- u% h. B) k: @% M2 a9 q
  299. # A: L- w' _4 r8 D: Q. `' C
  300.         /* By default the reload is activated and executed immediately */$ D9 m4 i$ t$ U! N7 _
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;
    7 ~: u  X- [4 S- K1 Z* M
  302. #if defined(DATA_IN_ExtRAM)
    ' o5 C0 T5 i: c
  303.       }  Z; y+ E' d* H* y# n% F
  304. #endif /* DATA_IN_ExtRAM */
    # \9 N! L8 ]( v0 }, Z! z
  305.     }
    9 D  W: e, k+ x+ J; ]
  306.   }
    7 }9 q7 j, T0 T/ U9 V

  307. ' r5 n, _9 @6 T7 R. _, F  w) p
  308.   return ret;6 `- i0 {5 S* h5 n
  309. }
    ( b* L: I# ^0 {" K+ v" V

  310. , e5 ^  @! {9 p8 B  S* z/ B+ j
  311. /**
    ; T' W$ y2 y9 V5 M1 _9 F, {
  312.   * @brief  De-Initializes the LCD resources.: \: \/ q0 M8 D; C
  313.   * @param  Instance    LCD Instance
    4 W1 B# a1 V& W  O; V
  314.   * @retval BSP status, A% s4 W5 U% V6 I. a. o  d
  315.   */% g2 r2 j. |! N6 b5 a2 i9 u
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)
    & b$ ]9 r$ m7 ?" B9 `  V# w  S
  317. {9 z4 m) u4 {: ]7 }3 ^1 u& j
  318.   int32_t ret = BSP_ERROR_NONE;1 a* G2 C) y- r1 n% N4 V5 j4 t0 u
  319. ' O; g6 z$ M7 L  Q, m
  320.   if(Instance >= LCD_INSTANCES_NBR)) g3 Y: N  i; b, H( A! E. A
  321.   {$ @* g$ Q+ C* P
  322.     ret = BSP_ERROR_WRONG_PARAM;' X! ^- y: g! j. ~6 |4 M
  323.   }2 @2 {4 D" A" \) e0 X/ f- T5 }
  324.   else/ a7 s& t9 M& @% s" e( }3 r
  325.   {
    + ~7 A/ U! l6 m$ L7 h: _
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)
    ; F/ H9 B0 L$ N3 ^8 Q! C* r3 j
  327.     LTDC_MspDeInit(&hlcd_ltdc);+ C) f$ o5 B- \/ G" F  G
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */
    ' ~- Y; u" z# J
  329. 6 g; ^* w4 v* k. ]
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);
    & V3 }  t2 A  @- `5 S; q4 ^
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)
    3 n% i  ^" P. [. X. m
  332.     {( Y% N. D: \+ F: p; ~; r
  333.       ret = BSP_ERROR_PERIPH_FAILURE;6 `1 ]- g4 H9 ~% r; k; E5 I
  334.     }
    ( q0 {6 A3 |  I- N" @1 t
  335.     else( {7 h5 _$ ]* @6 e
  336.     {
    # [. G+ z# w3 i& J: y, ]
  337.       DMA2D_MspDeInit(&hlcd_dma2d);5 Y9 M4 ]8 a& M! V5 ?
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;$ O8 o. o0 _& n5 g) J8 g5 [; Q
  339.     }" D3 K/ Y$ h9 F: k3 y# |
  340.   }0 `9 j8 K0 T3 {1 i* m' E1 W2 i

  341. 9 c2 X- }3 |* ?2 X
  342.   return ret;
    9 m, n3 Q; r3 p5 l4 j  A. k5 V
  343. }0 p- D) n4 a) e) `6 B! D
  344. & _- O/ D$ g3 \' @
  345. /**( E/ s. n& ]4 }/ l
  346.   * @brief  Initializes the LTDC.
    6 r* _/ M3 B( ?2 \3 a# I3 l. d
  347.   * @param  hltdc  LTDC handle
    - W$ p2 _2 u, Z5 [2 D
  348.   * @param  Width  LTDC width1 ^: B: j7 h; Z& U: S7 y3 G
  349.   * @param  Height LTDC height1 `% v- ]# k; V
  350.   * @retval HAL status' j3 I$ a& Q3 B+ M! T, s7 b  g* Z
  351.   */: C, ?! ~+ e. K. L- F) u
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)
    # _# W: L0 ]# e1 t* ~6 X! j3 R
  353. {/ V, |, B" k! q; C9 i
  354.   hltdc->Instance = LTDC;
    7 N, ~) q2 m. `3 T5 J/ a* ^2 s
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;
    # o3 N, M$ r9 V2 Q8 R
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;# L6 P. v( u/ I" |( q# L
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;5 N( A& N; U; x
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;7 c' W3 h5 J4 j

  359. * D5 `& d# G1 N" q/ Q7 W' N) W6 X: u$ W
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;# l+ X6 r0 Q& F+ I
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;
    * h/ u" ^( k7 _0 g4 u+ h7 o
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;9 O4 x' b8 G8 K$ h5 F! E3 x
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;
    0 l" B0 A1 Z! F3 g
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;, }7 e4 _- ^/ ]$ Y0 k4 i
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;4 F$ G7 x$ [. _3 ^7 l9 X  H
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;
    + a9 n' H( q* T3 G7 q7 ]
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;! V" J1 _: ?4 @  ~
  368. ( M( P- t& \9 a' ^! b
  369.   hltdc->Init.Backcolor.Blue  = 0x0;
    % X2 H3 x8 V$ L/ u% X# @/ I& e
  370.   hltdc->Init.Backcolor.Green = 0x0;9 a4 n. H1 j" M- I5 C  c
  371.   hltdc->Init.Backcolor.Red   = 0x0;* I" \9 r/ c% M" C* M* i7 ~$ L9 `# d
  372. ) I3 ]! W4 s- X# z" ]- z! I
  373.   return HAL_LTDC_Init(hltdc);
    $ p( N, ~( m  |
  374. }
      A* d6 F; }% X) {" y; p

  375. - s' t4 S+ N1 `/ _" P
  376. /**
    * k4 X+ H& i+ A- I
  377.   * @brief  MX LTDC layer configuration.
    ' o: W$ ]/ r( F3 c+ }
  378.   * @param  hltdc      LTDC handle
    ! ?$ N& x. n% a1 C- j) r
  379.   * @param  LayerIndex Layer 0 or 16 k* ^* H/ {( @! ~+ |4 O
  380.   * @param  Config     Layer configuration
    " z8 l, g' b* o% L0 J# ]
  381.   * @retval HAL status
    % [& P+ X# i  k6 L
  382.   */
    % @) ]) r, j% q5 P8 `$ w, U
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)) L* U$ l. @: a
  384. {
    - T2 q# O7 ?" s. w/ `+ r
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};
    . [; }3 w  v$ V% S. L

  386. 3 p& z: K: V0 t% E2 m
  387.   pLayerCfg.WindowX0 = Config->X0;1 d' Y9 x3 y- i+ h' i, g
  388.   pLayerCfg.WindowX1 = Config->X1;
    8 A. p8 b% \9 a6 v5 R* |
  389.   pLayerCfg.WindowY0 = Config->Y0;! @% W0 d( x9 o+ L! y
  390.   pLayerCfg.WindowY1 = Config->Y1;. I6 N* t( ]$ U( i0 m, n# E$ s
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;3 Q! l* Q( _5 I7 ?
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;/ X1 N' r) X. F
  393.   pLayerCfg.Alpha0 = 0;% r) |9 |3 F9 K8 P
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
    9 N( g. e7 u' n& I! N' U
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
    ; X! P1 A% K5 O% f2 }6 e% i
  396.   pLayerCfg.FBStartAdress = Config->Address;; v; f" ?8 w- C! S; B) j9 y$ Q# |
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);* q# [, R, u$ g3 k( U* I
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);
    % X9 L) E7 U; }0 }
  399.   pLayerCfg.Backcolor.Blue = 0;5 i9 W7 V- m; r. f) F. l: |' F* m
  400.   pLayerCfg.Backcolor.Green = 0;5 W( D0 d! L* e3 Y1 ~# k' @
  401.   pLayerCfg.Backcolor.Red = 0;
      L, J4 N! [( N+ Q' x) v
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);7 |4 N0 p: H1 ?1 Y4 V
  403. }
    ; }$ s  _; @& l4 E: w
  404. ' Y) c9 e' G: Z3 [6 D
  405. /**
    7 V, }/ b) o! f! d4 }% s% n
  406.   * @brief  LTDC Clock Config for LCD DPI display.7 g3 l5 n; ]( e: t
  407.   * @param  hltdc  LTDC Handle- h# w- z" H' p- S
  408.   *         Being __weak it can be overwritten by the application
    , a5 m/ |2 N" k9 S7 Z" S
  409.   * @retval HAL_status
    ; t# v7 N/ s  z8 v! ~- L
  410.   */- Y, i  i/ j5 S$ }2 F* m
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)
    ) Y" y( {4 U; i. j7 g- r  V4 d" E1 i9 ~
  412. {; @: v  O  _. @+ S% U' @
  413.   /* Prevent unused argument(s) compilation warning */0 F# ~: f5 L! A) T) n
  414.   UNUSED(hltdc);
    4 L1 K- X2 @9 [. H4 }* `
  415. ) ]: c  M, u& ?' V7 Y1 z
  416.   HAL_StatusTypeDef   status =  HAL_OK;! p4 ]: c. Q* f, R  w
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};
    % W1 j# U2 A$ i$ W- u8 L. N
  418. 9 m% ^5 v& F0 u9 q4 k8 S% R6 s( R
  419.   /* LCD clock configuration */( K4 A  \/ k; x4 o' `
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */+ O& ~# x& V2 K; G5 E
  421.   /* LTDC - PLL4 */( v# a1 N$ W4 x
  422.   /* Configure LTDC clock to IC16 with PLL4  */( c# N5 V2 i) i8 ^4 R. a1 q& y

  423. 3 A2 J- e. w1 C+ {/ i2 t0 j/ g
  424.   /* LCD clock configuration *// }4 F% J/ C3 F+ m) f% `3 f
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */3 ]9 }6 _# m/ I4 a* P
  426.   /* LCD clock configuration */
    : n0 R& h* w% d2 X3 B6 m
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */
    8 K8 r; S+ P' R, x: E
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 *// L) }+ u' M* k6 p7 U, y" ~
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */9 e5 z. H1 t5 U5 t# S* }
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */
    2 a2 p2 H& B  \; e" V9 m
  431. 6 ^& k: O8 d- g- p6 n' k+ t
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;3 H7 A& X2 O' k7 }! s( L7 C
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;
    % u' g% u! Z9 Y8 D
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;
    7 I3 E6 c8 Y, F# j! ~
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;( e; ]: X: B. G' h
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    : v* N) ~6 G2 c+ @1 y3 {2 a' Q- {3 K
  437.   {
    , D* r4 ^% R1 g8 e9 K! V+ s
  438.     status = HAL_ERROR;% H- c2 j# M- l8 W
  439.   }# x- A! n$ d$ ~6 }
  440. / u1 g, l0 i, D
  441.   return status;" M) O) R2 g. _
  442. }. u( X  s6 {) T# y
  443. / e3 j) O: D8 @  e1 g# `
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    9 I* H( D6 s3 b, ~- ?$ j
  445. /**& @8 A* k$ O, O3 R8 ?
  446.   * @brief Default BSP LCD Msp Callbacks
    ; h1 w; G9 [7 d* f
  447.   * @param Instance BSP LCD Instance
    / b& \# R" j1 y/ m8 ^
  448.   * @retval BSP status
    & [* U6 _# M7 A7 X  P9 p$ s
  449.   */0 E" h8 L. g# ~& _9 D5 E  D
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)
    " o8 Y' F0 w/ w% G
  451. {' J5 X' N1 _4 K: X
  452.   int32_t ret = BSP_ERROR_NONE;6 ?/ M- |# `. J$ s

  453. : c. s7 H7 ]4 ~2 I$ ?
  454.   if(Instance >= LCD_INSTANCES_NBR)# v, W3 K6 q7 i9 e
  455.   {8 A9 R  `' X8 Z# F, o  M
  456.     ret = BSP_ERROR_WRONG_PARAM;
    5 m1 f2 u# j4 q* L6 |
  457.   }
    . q: X7 @, p- O! o' v( k
  458.   else- |8 e$ G8 S6 K" Q# O5 Y
  459.   {
    ; A5 c- d! c$ [; J8 d0 u  Y
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)
    , F+ Q6 U9 v# F6 M
  461.     {
    ) z) B0 J' ^$ ?( f
  462.       ret = BSP_ERROR_PERIPH_FAILURE;
    & B4 v- s4 h2 _
  463.     }- G2 r& c4 Y# i: {' @4 U; t
  464.     else8 t8 q! f( H/ r  {8 u, f# w
  465.     {
    ! o! r7 @( c+ F; S9 K
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    5 r. X7 z/ |2 ~3 P
  467.       {
    6 r: g9 N" F' i9 |) m: U1 B! e
  468.         ret = BSP_ERROR_PERIPH_FAILURE;% f! [0 Z. }: T! y
  469.       }; f5 d  F4 s0 r3 ?. D  T
  470.     }
    7 H) N  _, d9 U' \

  471. . a8 H; b/ ~# \# g6 N
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    # r$ D0 v& b% \) i" B$ ~" b
  473.   }
    ; ]6 D& x3 U0 E$ r

  474. ; w! \2 f2 N% f- r
  475.   return ret;
    . ]4 M! V8 E' _. _- B: O6 N3 Z* E
  476. }& w& {8 p1 J8 F

  477. * B8 y1 J* B* o5 J, \$ |7 v3 Z
  478. /**3 ]+ n6 R6 b  j* P
  479.   * @brief BSP LCD Msp Callback registering1 Q0 {; [5 U4 }# c) \2 q
  480.   * @param Instance    LCD Instance
    4 U$ P( z0 j+ m
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions" I! m! X) z7 Q0 R& Q8 b9 T5 {
  482.   * @retval BSP status
    3 u' `( T+ l/ m
  483.   */
    8 D" E6 ^, o1 m& l9 u
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)
    " n+ ]  c) f0 \6 a2 q6 X
  485. {( a; i8 z( J. V+ |! \* I, r
  486.   int32_t ret = BSP_ERROR_NONE;7 X5 h1 k! O8 ~) @& I* i+ H

  487. # k* A$ L6 N5 Q/ C
  488.   if(Instance >= LCD_INSTANCES_NBR)% F/ @3 _6 Z% |/ w
  489.   {
    ! O6 B, u) R- Y0 C  O
  490.     ret = BSP_ERROR_WRONG_PARAM;6 F% D, ^; f8 M# D
  491.   }' O/ i; J+ ~: M) ]5 O
  492.   else$ V; y6 X* g( A; L, N
  493.   {) l) ~" G7 |) g7 Q  G
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)% a: I- _* @, T
  495.     {
    ( H) Y% z! _* ?# @6 f
  496.       ret = BSP_ERROR_PERIPH_FAILURE;
    . ^' s( h9 {: B) V
  497.     }
    + G1 V) X% R6 k; j! [
  498.     else
    ' l0 I( C- n& `2 w2 ^& o6 E
  499.     {
    " `- B2 J  x7 c3 {* x4 a
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)
    - v% ?1 p0 }( J. b: U% L' {
  501.       {- ]1 c! V" x1 Z3 s2 ], X
  502.         ret = BSP_ERROR_PERIPH_FAILURE;
    ; ?! O$ W' B" ~& S3 U
  503.       }
    " K1 x6 D3 l" Q) c# \  ]+ V* ?
  504.     }
    5 ~  u1 z* P6 L% f; p7 [
  505. 9 W% F1 o5 l( R1 I* U( I
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;2 V3 i4 k* {  D" r$ O: K* k
  507.   }# L  \: C* Y$ f- g: p& x, A
  508. ( [- ^" _5 Q0 i! I8 J& L/ m8 [
  509.   return ret;; Y. }$ D9 B: e+ C
  510. }" A$ d, ?% ?3 O$ r3 x2 I* T) x- S
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */; H6 ~2 U/ m; @/ a( C2 Y

  512. 6 z9 B% k! Z) |  P% W" J( o# m
  513. /**
    + x& m4 I4 J4 Y+ M/ q0 K. Z
  514.   * @brief  LTDC layer configuration.
    , g* f. h; ^3 V& c7 G& p5 M
  515.   * @param  Instance   LCD instance
    2 r* y* f0 W" s& O
  516.   * @param  LayerIndex Layer 0 or 1
    ' v! Q6 k! K6 g. l1 ?0 h
  517.   * @param  Config     Layer configuration
    . w- w7 K# S3 x# c/ R& L8 f( o
  518.   * @retval HAL status
    - j6 N1 K3 h5 w/ p
  519.   */: V8 Q" q5 P3 g; M
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)
    ) X) |; u/ I/ F2 O! L6 R/ k' l/ [
  521. {0 ?5 E: Z& K4 M' `) j. p% }4 w5 T+ ?8 D
  522.   int32_t ret = BSP_ERROR_NONE;
    5 P+ w$ e8 u. J. e8 {! s$ E) L" k
  523.   if(Instance >= LCD_INSTANCES_NBR)7 N# x( j8 k! @1 g8 N2 z, F$ N2 Z
  524.   {
    ( n5 M$ g, R% p* O1 p% T
  525.     ret = BSP_ERROR_WRONG_PARAM;# G/ ^" a- B  ]9 ~% j+ [
  526.   }' k9 z- }" J- r' y7 a, Z
  527.   else5 C! o- d, |& a2 P
  528.   {5 Y' ^* e+ H9 Q* J7 R2 r
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)
      e% p) G& K4 g& |; @% D
  530.     {
    ; g# S, g$ {& Y' L. E4 m9 c
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;& h% y- ?+ F3 ?: s4 C
  532.     }0 ~0 b2 g( t  Z; Q, ?: q
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)
    ; u6 ?. N  c8 j( F6 [
  534.     {
    1 [* A4 t2 m! w6 X, r
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;9 {. Z- n- e/ {7 C
  536.     }
    * V4 k+ Y' T+ |6 b; a% a: W
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)2 _* b+ A0 k  f  j% b
  538.     {
    ! x4 T! _2 h" g) F9 S" M
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
    " N: I) w- M' Z; a* F# k. l( @' j+ Q
  540.     }  Y, X# M1 r/ R1 @
  541.     else" p" k# D4 `$ c1 R* Y" D# G
  542.     {
    ' z, X* Y5 h$ ]- b
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;2 W: \% l; J9 j  \  U
  544.     }
      L% U& ]" U9 `" S; q+ c
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)" e2 Z7 e# y# W( q  z
  546.     {
    5 a4 G4 L# @: R( o: Y. I
  547.       ret = BSP_ERROR_PERIPH_FAILURE;  ~" P5 q) u$ d1 l6 [% d
  548.     }+ |& c# y3 u: `$ D5 @( s0 t
  549.   }
    0 ]2 g7 e3 s5 q* t$ }$ b( ~
  550.   return ret;
    + L' e2 p* H, Z; A2 d7 |) ^
  551. }0 V' f/ D5 j! q2 n3 L+ d

  552. , c9 A4 s6 K$ @/ g$ {
  553. /**
    ) `0 m; A5 `: Y* P4 R- u7 D  }% f
  554.   * @brief  Gets the LCD Active LCD Pixel Format.
    ; d6 R! M* s$ f5 M; X) J
  555.   * @param  Instance    LCD Instance
    3 I( M9 `: b! E' K( S  k! q
  556.   * @param  PixelFormat Active LCD Pixel Format( A4 C6 K5 J( Q8 B1 B& F
  557.   * @retval BSP status
    - Z8 U! X% H) ?0 ^2 K
  558.   */
    , n3 _5 x, @6 ^4 z4 H# E
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)/ e# N7 k" ?1 x: c4 ?
  560. {
    " t. M5 J) ^7 ~% ~2 \) P) u
  561.   int32_t ret = BSP_ERROR_NONE;7 v/ P  p( P% \1 y5 D0 M

  562. 7 e5 e8 f9 y* }! T7 C
  563.   if(Instance >= LCD_INSTANCES_NBR)" `  w" Q* y& Z" m! k
  564.   {
    ( ]7 B- Z7 f1 c0 h" {! e% i! u: x: H9 |+ F
  565.     ret = BSP_ERROR_WRONG_PARAM;4 Z1 l3 D, ~6 n* f- E% V# z0 n
  566.   }
    8 K& y% w5 S) g1 U; V- j8 s
  567.   else
    9 Y* A$ M$ S) x2 t, D  _1 x
  568.   {; G/ U$ h; _* s+ r0 ^
  569.     /* Only RGB565 format is supported */+ E* Y6 }8 [- V: `* _( y
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;* i0 C. Y7 j$ D* I4 A
  571.   }
    1 Z' C7 I& T! z5 G  g7 W* M% k
  572. ! G& H5 e0 B" m6 L4 X& ^0 d
  573.   return ret;
    + _" `' a6 U, W' _
  574. }, R. K4 z' x1 O. k& i/ S- }+ y7 m" N( m
  575. , l; K* t+ _5 e+ k" V3 W  \
  576. /**$ c: o; ~" |" b( @$ B+ c) g4 d
  577.   * @brief  Set the LCD Active Layer.
    & z/ I5 b+ E" R9 o
  578.   * @param  Instance    LCD Instance
    ! y$ H- d+ `7 F( E& r7 Z2 t
  579.   * @param  LayerIndex  LCD layer index
    ) p* H/ d& I; Z: p- u
  580.   * @retval BSP status
    6 n# z% \1 g( m$ _
  581.   */
    , i. g3 ~( z: q9 h7 y1 W% G
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)
    9 A% E; F4 P  X% X3 x
  583. {
    . Y4 k6 T, \  B  c
  584.   int32_t ret = BSP_ERROR_NONE;
    ' Q* e# _; [* m: D3 |" |' z3 o
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;
    5 g3 I1 |# Z* f. L3 ]$ J" P
  586. # N2 p! u) T1 d: K2 M3 L' ?
  587.   if(Instance >= LCD_INSTANCES_NBR)
    , b% F' x- d. I: R9 L8 K
  588.   {
    0 b+ U6 h) G" o3 R8 g# u8 W5 W
  589.     ret = BSP_ERROR_WRONG_PARAM;# s& A( m* a# [; C3 G1 L
  590.   }* Z  k, u2 u5 x, D: O; P
  591.   else& B& e$ C! L7 |1 c; a6 h
  592.   {3 m. u: B) x+ h' N, d& x" `
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];
    * y$ y. F: z& P$ P5 G

  594. / D; T& u' v$ |+ R, |
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;: V+ G9 J' ~+ K' J, m
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;- R/ ]  w+ G, v5 F# o' ]/ N
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;
      W/ x- \- X( m

  598. ( X: e- g* B! g4 P. k5 q
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
    6 H: D$ k9 U0 C/ m" f6 f3 A
  600.     {% }9 ^3 D/ r9 g. z, w0 t
  601.       Lcd_Ctx[Instance].BppFactor = 2;4 s# r. o3 O9 y! ?* V& l% R3 i
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;
    , {6 C4 J3 u" j! Z  d
  603.     }
    + N$ A' E6 n/ x% Q& O; T
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)
    5 n& W% r$ X7 ~4 N9 Z4 ~
  605.     {
    3 E" M3 |  r/ o( g/ P) D2 U$ _
  606.       Lcd_Ctx[Instance].BppFactor = 2;
    9 P' K; G& W3 @3 Z. N
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;  y: U0 n5 h: x
  608.     }
    $ {. V1 O! P+ p' \- e# i
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)/ [5 E* Q7 h, k7 l: P/ H
  610.     {; c- N7 D$ n1 L+ w* f) R6 e# ]
  611.       Lcd_Ctx[Instance].BppFactor = 3;
    4 i+ x5 B5 t1 l5 d4 Y1 z
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;! q% D$ U, w% m
  613.     }
    0 J2 d6 u+ c& `( R; G
  614.     else
    ( ^9 N5 v6 W! v
  615.     {, R: j$ [1 R/ W1 T- J8 ?/ _
  616.       Lcd_Ctx[Instance].BppFactor = 4;* y7 l+ V1 H& f3 q9 c
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;
    + }" x9 m7 w2 e' O% s
  618.     }
    + n+ l# `5 n! ^! g
  619.   }, W9 R- I( n* g$ j! z+ T

  620. 3 q  s/ ^; S7 A
  621.   return ret;( O- ]/ G  Q( r# f! w. e+ b; L
  622. }
    9 [0 ?) S6 r- l8 ^; l! X' M/ @
  623. 2 s' E# H5 D* V+ b2 ~
  624. /**
    ) G5 p/ O( g6 V: ]2 ~- O) g9 f0 P) J
  625.   * @brief  Control the LTDC reload
    ' f- P( I* O% \2 {: P6 t1 q
  626.   * @param  Instance    LCD Instance
    9 A% W0 A% \1 L! ~4 I
  627.   * @param  ReloadType can be one of the following values
    " ?$ `8 l& ^, b
  628.   *         - BSP_LCD_RELOAD_NONE7 i* e! a: }- N  a
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE8 N" q. Y6 S+ ~! Z0 Y
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING
    . k& E+ v5 B' ^, ?% }: T/ F2 a
  631.   * @retval BSP status' P& ^. m2 K! f% B& M# n. B
  632.   */$ N  F4 q3 p2 y. `! m* B) }# U
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)$ H: q$ Z5 I+ r. w/ [# y5 V4 \- d  }1 g
  634. {
    ! z  e* |5 c, B, v8 X
  635.   int32_t ret = BSP_ERROR_NONE;
    ; q8 r, n3 `2 T/ r' F1 r

  636. / c( S+ f* B" b! t
  637.   if(Instance >= LCD_INSTANCES_NBR)
      ?  D' {; D# {& Y
  638.   {
    1 {0 R/ D4 |3 O  ^9 Y4 Q
  639.     ret = BSP_ERROR_WRONG_PARAM;, l3 s1 N! h8 H  T, x: n# o& I0 B6 q- w
  640.   }
    ; J4 D& }9 h8 V/ U" D) u8 C
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)8 X+ r$ Q8 L/ }( e' w' v: J# B
  642.   {
      f$ d( p( e6 i9 k5 R% j) k
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;
    4 h: F: I: C, ~: e9 G
  644.   }4 C3 H2 j/ F9 r1 s0 H3 w
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)
    $ s4 ?1 A8 J# z* k$ _
  646.   {' X7 Z* {- M& T0 k% v
  647.     ret = BSP_ERROR_PERIPH_FAILURE;& l, l& L$ ~% U$ [: o/ O( Z
  648.   }, {  g& ~* B( r1 J/ h
  649.   else
    ( s0 A, Z2 Y* k. B  s3 c; k; k( g
  650.   {+ h( Q; |! P: L1 h9 I, K
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;
    0 ~+ q4 m5 M- T% g; C1 `/ e: C0 X% c
  652.   }8 ~! g# }1 R. T4 o& O

  653. % g9 Z+ O) e  Q9 F
  654.   return ret;1 k7 Q; a: W9 S2 Y
  655. }7 M  v9 @' _. k3 W% p
  656. 1 u% D1 B( z/ Y
  657. /**
    1 j: f* G; m( ]4 ^
  658.   * @brief  Sets an LCD Layer visible# \+ P# e7 W9 c) Q
  659.   * @param  Instance    LCD Instance
    1 o; S% a7 y$ Q/ [1 }
  660.   * @param  LayerIndex  Visible Layer
    8 {4 A+ }# `+ A
  661.   * @param  State  New state of the specified layer
    " D, K4 m& w: l% q# T
  662.   *          This parameter can be one of the following values:8 u6 ^0 u  E- U- O* p% S/ o7 a
  663.   *            @arg  ENABLE4 e- q) w3 {2 Z9 D% p7 c
  664.   *            @arg  DISABLE
    + p; e0 p" k: B- @& h. i
  665.   * @retval BSP status
    - Z, h! Z% |' Z
  666.   */
    ' \# C1 w# \8 I# S
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)
    2 g. l' _, s9 j) `4 Z- o  w# U
  668. {
    $ N( a; W1 R4 ^0 O
  669.   int32_t ret = BSP_ERROR_NONE;0 X) J8 O6 Q/ h" A2 L/ O
  670. . ^/ r7 q9 L% _
  671.   if(Instance >= LCD_INSTANCES_NBR)* p2 n6 _+ H  n; r' K, ~! }+ x7 l
  672.   {
    ! A, A* }/ \  {: }8 N
  673.     ret = BSP_ERROR_WRONG_PARAM;! \& h* X% V; V/ r& C
  674.   }' z- h% Y$ l7 y" S* w1 \9 F( E& ~
  675.   else
    ! S. n% u7 W! g: X4 g
  676.   {
    3 \2 y5 H% O* D: L
  677.     if(State == ENABLE)
    % K2 T* Z  B+ B* b1 i
  678.     {, n8 X: K& N7 {
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);% l/ \& Q7 G; T
  680.     }
    # M, @" N7 f# H: v# c5 j
  681.     else
      L. ~- r9 E) c& d) _
  682.     {! O5 V$ G) I6 y3 t6 a' M+ }
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);! L+ O8 N8 g& y% e& A# W
  684.     }  Y& Q9 f8 z5 Z# D% m6 K
  685. 3 d8 q% Q4 k- \/ l; q
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)$ q4 _# b( X( z' C7 C8 z' {
  687.     {
    $ p8 t  W* S3 W5 Q7 y
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);
    " M& O9 z' {. X( Y! D' V
  689.     }
    6 T+ Y/ x( r* A
  690.   }* {6 u( g7 U4 b
  691.   _& ?7 z8 q% ?
  692.   return ret;* s5 ]0 `/ l# E) D
  693. }8 O& a0 z. h' t: Z
  694. & e1 L1 _" u5 d$ c8 q
  695. /**$ [; K6 f  P1 {# B9 d' E5 J& d' \, Y
  696.   * @brief  Configures the transparency.
    ! o, `" {& h+ Q3 V0 ]
  697.   * @param  Instance      LCD Instance) U3 S2 Z, u5 Q! I5 |8 o0 w
  698.   * @param  LayerIndex    Layer foreground or background.. G( M1 l- F" e* z0 J+ n
  699.   * @param  Transparency  Transparency- t  f" r( [1 Q5 C
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF! C' e$ z; i# X
  701.   * @retval BSP status, N. h- |# R% E) J: C( w7 q7 m0 M) O( l
  702.   */% j0 R( Z/ S% @- v2 s* A
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)
    2 P4 S1 @! w7 T# G2 Y
  704. {
    ' c2 h& T; Y6 U# m1 Y2 P5 a# E
  705.   int32_t ret = BSP_ERROR_NONE;
    $ i# k6 T9 X* x$ T  n: F
  706. 3 ]8 P, N+ C5 `  _; O
  707.   if(Instance >= LCD_INSTANCES_NBR)4 R" @& Z3 K( [3 z  X
  708.   {
    , v$ x7 X2 H# W7 w7 ?- J2 h7 ~
  709.     ret = BSP_ERROR_WRONG_PARAM;
    2 n/ k, e% x$ s# q4 A2 e) P
  710.   }- V, t/ n* Z. j
  711.   else6 {* `/ m7 q0 B. G, s# O
  712.   {
    & U" J- P$ N' _/ ^( c& {# s2 y( P* n
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    : ?# I0 W5 T+ j' J: _  G# Q5 o7 `
  714.     {
    6 m6 }$ f) E2 H0 P: X' T
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);& o* V$ N8 L3 S0 t8 E) \3 m
  716.     }0 C5 e+ i  k7 H. c4 R; ^% X
  717.     else, I. [# [& [' {- O, @5 \5 j( B  E
  718.     {
    / b7 ^9 z, j: q3 J: k7 r% {
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);& ^/ L/ D" V' v# w  ?
  720.     }
    9 \" k2 S. ]6 n1 d
  721.   }
    8 E0 V/ r" ?( ?7 s
  722.   a# K/ B/ m' X
  723.   return ret;
    ) n" M2 Y. K) s# Y- ]- |
  724. }
    9 |  O9 d6 |. x2 ^# Q% P
  725. ) M7 P0 d1 Z, l$ w3 s* q$ [
  726. /**/ l8 v( o) J# z: H; j3 X& l) ~. Z
  727.   * @brief  Sets an LCD layer frame buffer address.
    0 M7 c# |9 ^; v* Q0 b
  728.   * @param  Instance    LCD Instance
    ( X1 H4 K+ d7 N% h
  729.   * @param  LayerIndex  Layer foreground or background
      |, E" }7 e9 ]8 {5 x4 S5 G
  730.   * @param  Address     New LCD frame buffer value
      U4 \* e  N# g9 R( u
  731.   * @retval BSP status, T  J" A4 c" `+ P) ]5 p( Q: a
  732.   */
    ! ]+ c6 w, z" b
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)
    0 }+ R4 j0 d3 {& p5 W
  734. {
    1 n5 `) M; `, L
  735.   int32_t ret = BSP_ERROR_NONE;
    8 L% i% ~7 H& o" q

  736. % I( G8 h: V( x: V- q$ L3 u
  737.   if(Instance >= LCD_INSTANCES_NBR). t. V# k1 Z& {* N
  738.   {0 W6 }2 ?1 F' N2 J4 i' p
  739.     ret = BSP_ERROR_WRONG_PARAM;" K/ |, b* \$ x7 o3 B, d* U
  740.   }/ L# n! o2 ^; @- N6 d% l
  741.   else' ]- F. ^, X4 u7 ~
  742.   {! Z8 h$ o: ]* N- l
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U). P9 I( }: ~4 s( |. X' F2 r
  744.     {
    / e' P. q! s: q, ]5 I# W1 a! a
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);
    4 M# ?4 I3 u  p3 M( X2 x& l. n/ r
  746.     }3 u( b- a) S" `+ t9 K9 ]' ~. i. e
  747.     else- A7 D3 R! ?7 G3 ?9 [
  748.     {( Y2 O& _+ ]# V4 X% [
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);
    6 m8 j/ W$ q. [9 _* v- ~
  750.     }
    * W8 a4 x: J; _% }0 p
  751.   }# b) D. c( H: S% Q. Q- A  A

  752. 4 f* ]( _. D3 @& U, B6 Z
  753.   return ret;, {) T. O- ^3 p
  754. }2 j1 }" S8 m) u

  755. # B& _; c3 F+ J; W
  756. /**
    - h* ?1 o5 U8 }  Y
  757.   * @brief  Sets display window.6 H" g. u/ \# d& W- c
  758.   * @param  Instance    LCD Instance
    ! u) u( [1 E' e1 z8 S. }8 w- a
  759.   * @param  LayerIndex  Layer index" H& R7 Z7 r8 q, ]5 }4 ^
  760.   * @param  Xpos   LCD X position
    3 ^! i8 L$ i. J: u8 I) F; i; V
  761.   * @param  Ypos   LCD Y position" ~; t* |' |' C* b6 K  I# n. L% Y1 z
  762.   * @param  Width  LCD window width
    & d$ D0 U1 ]! z2 e; i5 @
  763.   * @param  Height LCD window height
    & E+ ^. E9 O2 _% V
  764.   * @retval BSP status# d4 D6 ~: |6 G5 a3 X' c
  765.   */2 D9 s4 I. ^  G# ?! N, d$ K- J. H
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
    3 G; \6 W9 {/ ?: |1 M! A7 q
  767. {
    - x) H7 G6 w9 N6 [; d3 h
  768.   int32_t ret = BSP_ERROR_NONE;
    / N+ r0 ?# v, U7 L( x  X" Q
  769. * i" v5 d! H0 U  U5 ?% T
  770.   if(Instance >= LCD_INSTANCES_NBR)
    8 r3 W! |; f( b" c7 |0 L
  771.   {
    + e1 Q6 m, `) b! f" g
  772.     ret = BSP_ERROR_WRONG_PARAM;
    8 b" q8 D; W4 K3 a- @7 ?
  773.   }/ L& u8 j4 {" D6 A( a
  774.   else
    ' b. ^$ L/ i: B! j0 ]! L" z2 x
  775.   {
    ) l$ [! N( b! S
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)! q9 B% z4 \- g  l& Z: @9 Q
  777.     {
    ' O# [9 y& K- E7 ?  O% R* e
  778.       /* Reconfigure the layer size  and position */
    ) k1 Q! u; y9 |- u" I2 A
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);4 F$ X" I* y/ l7 g
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    ' \6 c% j1 ~* P2 e+ i6 x0 P
  781.     }9 u4 o& i4 T3 e# ^+ C6 \+ C$ s- K
  782.     else# t( t; D- k5 x4 o
  783.     {
    6 }: A' A8 Z- l. `# x, S
  784.       /* Reconfigure the layer size and position */2 E* d- K! J4 d3 l( s
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);
    ; l4 K! i3 B7 s% l: s: J( f
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);1 F' A/ H1 L; b/ A/ |9 ~
  787.     }5 |$ N, y( m6 Y) N
  788. 2 ]$ O* D4 v% }: T
  789.     Lcd_Ctx[Instance].XSize = Width;
      {* V: M" a' V+ b* q( {$ t! H
  790.     Lcd_Ctx[Instance].YSize = Height;, w. m6 D* F' z) E% K7 d. b  Y
  791.   }0 ?) T3 K. p6 X

  792.   X' e2 }1 |' |0 e. `2 M
  793.   return ret;
      _7 R2 e' y! U- |
  794. }
    ; I. u; _5 O3 f1 b* g9 M$ a4 ~

  795. 2 P- a( E. n+ j) h2 {
  796. /**
    ; z( ]1 I2 A0 y5 M- x& O
  797.   * @brief  Configures and sets the color keying.6 d2 l. l1 G+ a1 j2 C( h
  798.   * @param  Instance    LCD Instance% {3 g& c+ X, J0 P+ r$ u6 M7 [
  799.   * @param  LayerIndex  Layer foreground or background) X3 p8 [# o+ E/ p, W" B
  800.   * @param  Color       Color reference
    % l. X% W$ k, Y( i- e- E
  801.   * @retval BSP status$ O- A' A/ K) t  I+ ^
  802.   */2 }2 W; w% A' k$ y9 x+ i6 C+ o
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color)2 c7 ^% J7 t; c
  804. {  O9 i$ v7 \9 N- ~% |( A- t; g! V
  805.   int32_t ret = BSP_ERROR_NONE;
      d- k1 d3 {% T! L7 q
  806. 8 C6 @  q- O/ P4 Z
  807.   if(Instance >= LCD_INSTANCES_NBR)
    ' ?& _* N7 v& D, j$ b
  808.   {
    ! v  S3 u) p# a+ B
  809.     ret = BSP_ERROR_WRONG_PARAM;. [% P6 v- _, S! _9 U) a
  810.   }
    & q0 Y. g( \5 M1 Z4 ?6 o
  811.   else
    ! }# j, F& M$ d% U7 a. ]( `
  812.   {
    ! I, }- T3 r) E/ s8 e8 z
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);
    ) [& [+ t$ D" v$ H& y
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    * }5 X  @* W1 w: `+ N
  815.     {7 A7 s* z; `/ n4 ^& X" s- T
  816.       /* Configure and Enable the color Keying for LCD Layer */3 G+ Y2 S9 `7 R7 j4 Q
  817.   d9 p" L' B9 U9 Z' |( X. u5 [
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);
    : A4 I) ]9 A' ?6 i- _% ?% t
  819.     }
    : g# S; ?+ |: r
  820.     else% @6 {8 S7 L8 q4 S4 B( r4 x0 i- F4 Q
  821.     {
    3 C) I( n2 B! d# t: t& q
  822.       /* Configure and Enable the color Keying for LCD Layer */
    9 B& r% f. a7 U( a, m$ z
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    # j# d6 s4 l' k/ Z
  824.     }8 k/ A7 w8 m8 q5 o7 Z8 Z
  825.   }
    - p# U7 N) p4 Y) s& i3 ?- g
  826. , I# g/ Z% ~' {/ H7 X
  827.   return ret;" d3 O# S  K4 o# N8 P) V
  828. }+ \* z' m: O. q9 x

  829. ' a7 T6 x, G) N( R9 R
  830. /**
    4 a# C( H9 u9 ~5 [
  831.   * @brief  Disables the color keying.
    # p  V: r; C( F
  832.   * @param  Instance    LCD Instance. v5 n0 d) F. E5 b' q, W
  833.   * @param  LayerIndex Layer foreground or background' Y1 e4 }( K8 w" L9 m
  834.   * @retval BSP status' a' Q  G. e9 w+ O! g( r9 o
  835.   *// `: Z: \! T# W4 w) l9 X6 c/ \
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)$ A) j- r. p; r, J
  837. {
    * I  T2 E! L8 K9 Q
  838.   int32_t ret = BSP_ERROR_NONE;  D6 @; p7 Q; m( C& |5 h* z
  839. 9 v% B: a0 {- U4 }
  840.   if(Instance >= LCD_INSTANCES_NBR)
    ' W/ y9 j& F! @4 s
  841.   {' e5 u- h3 R7 n2 u
  842.     ret = BSP_ERROR_WRONG_PARAM;
    " w( d# p/ q' o( @/ ?# Y6 M" D
  843.   }
    ( C. s: S1 Q7 r% ]7 L! H
  844.   else. K. f& Q3 y9 O, |
  845.   {+ f/ B0 Z) P$ @* x0 z" P, A
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ' e" u- W6 e5 g  [# c0 s, A! M
  847.     {
    + ^! _& x# `# h- j+ b0 O& f5 c
  848.       /* Disable the color Keying for LCD Layer */
    * J; m2 R  A% z% H+ D% e; Y
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    ; w& A) x& r- i! H( y2 L
  850.     }
    " s, W% b5 D* q
  851.     else
    1 D) g2 s0 o5 V# Q
  852.     {
    * s6 m1 V# @0 K8 U7 J
  853.       /* Disable the color Keying for LCD Layer */4 b( `# {7 [  i0 \7 H  _
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);; }& r+ Q9 G& K* o( z2 V; \1 i
  855.     }
    2 N1 y& }( C: h1 ^$ l' W7 l5 Z
  856.   }2 b- J  k0 \" h8 M
  857. 6 a+ v+ \% Z* Y2 _
  858.   return ret;
    / q3 U" R7 I5 E9 h* s% m6 {/ e, V. P
  859. }
    % D4 A8 o4 `/ H2 N$ b

  860. + }/ w, n  v  W! _) L) m" g
  861. /**% \' m9 b5 g/ t' g
  862.   * @brief  Gets the LCD X size.
    + ]: f; C4 S( L- h6 x) m
  863.   * @param  Instance  LCD Instance
    8 a8 R- @' G9 j& ^9 @
  864.   * @param  XSize     LCD width1 q# A# g! C% M  D
  865.   * @retval BSP status' U. G" `9 J* W+ W6 o. _0 n8 i
  866.   */
    6 {, w+ ^7 i6 v; [
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)
      ^9 T* }6 F: T: w3 U
  868. {
    . s' d+ c/ j( e) h
  869.   int32_t ret = BSP_ERROR_NONE;1 a" D, j9 }, u

  870. 8 i) m3 G  G! I
  871.   if(Instance >= LCD_INSTANCES_NBR)! O' Y7 j; q  x
  872.   {
    $ u! K& H3 W; s, u
  873.     ret = BSP_ERROR_WRONG_PARAM;0 C( a/ u7 f  z# ~8 Z! y9 T
  874.   }3 j' C- p9 L* h( b; X
  875.   else% A0 V  ^) G; O# a; X
  876.   {
    . Y1 m- H/ z7 h/ k* f
  877.     *XSize = Lcd_Ctx[Instance].XSize;7 C3 G5 c% T, w, r+ M% d. o
  878.   }
    ! L: y( c5 h: @5 H# [
  879. 1 j, z9 ?+ A! A9 q2 e9 c. t
  880.   return ret;
    7 _- b" q% D* N& \$ M* O
  881. }
    . ]% i6 K  ^2 s

  882. ! o$ P9 [$ _* t6 Y& M5 Q0 [# ^
  883. /*** t3 ?# f. G) o( f
  884.   * @brief  Gets the LCD Y size.  V) {6 m& j  p. O
  885.   * @param  Instance  LCD Instance. N: R  n& _: s3 |1 Y* ]8 n
  886.   * @param  YSize     LCD Height0 @6 f1 f  I6 f+ d
  887.   * @retval BSP status
    ; ]" b6 w" [; Y9 H
  888.   */8 l5 J8 E1 l% O' \5 ~
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
    6 V5 t7 e  W0 i4 {0 }, U8 w
  890. {1 n8 Q/ Y' Q& |- b) k/ o( o
  891.   int32_t ret = BSP_ERROR_NONE;
    - [# S1 B+ m$ x6 y& ~$ }1 w- L
  892. : P, E' {, [. ~
  893.   if(Instance >= LCD_INSTANCES_NBR)1 P- ~9 {% v* D7 c  E# U  n6 i
  894.   {
    $ V' W6 z" e# j; M# |- Q) A
  895.     ret = BSP_ERROR_WRONG_PARAM;
    0 L7 M& x9 L4 R5 n: _
  896.   }
    0 u% |: ?  M3 N1 p) l3 u6 j2 t2 j' b
  897.   else- Z  h. U* E) k! v
  898.   {
    6 L4 V. N& N( i  A& C: r
  899.     *YSize = Lcd_Ctx[Instance].YSize;
      }$ \5 q* E/ {3 K' q0 e
  900.   }
    3 z: @% a! H& @3 ?- f4 S

  901. - {" L7 W2 j/ X# ~/ }; C3 t1 r. I1 Y
  902.   return ret;
    / P3 C" d; l3 e* B
  903. }% @* S. R. J. {3 Y* }1 Z5 |" ]4 f

  904. 3 |3 L: s( t' v( U1 g
  905. /**9 E; H. |! b5 c  H. e: r$ E
  906.   * @brief  Switch On the display.6 Q1 s) F8 @/ E; ~# m
  907.   * @param  Instance    LCD Instance
    ! j0 g) A3 T4 c# C' X5 d1 C
  908.   * @retval BSP status# G- ?0 b+ b3 S" F, B) k4 j0 c
  909.   */
    + h+ w  {3 R  c# v- T/ f  P
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)
    - b: l& v4 Q# `! Y2 c
  911. {& [" M4 U3 K) C/ C9 h  j8 s
  912.   int32_t ret = BSP_ERROR_NONE;
    * s9 k# G+ _7 I3 M( J6 Y  \1 `
  913.   GPIO_InitTypeDef gpio_init_structure = {0};7 U6 @" L# l$ ~$ ~2 M1 V2 z) D5 V

  914. % t0 M! O/ k  Z
  915.   if(Instance >= LCD_INSTANCES_NBR)
    3 A4 N' A" B$ {, X' U/ X3 k
  916.   {/ C, S9 F; R2 U* w
  917.     ret = BSP_ERROR_WRONG_PARAM;2 s3 ~) Z5 L7 Y/ x" O1 k( \: e& k5 o
  918.   }
    " z( X" q- Y- B% Q$ o1 f% O
  919.   else4 u+ Q. L4 E3 `2 q9 `
  920.   {
    3 p/ C0 ]7 i! c- q8 Q& `* L
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);- Y7 q0 V9 {4 T3 Q# R: `
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
    ; f# {) b1 A/ J9 L2 ]- o9 p
  923.     gpio_init_structure.Pull = GPIO_PULLUP;4 |* Q) N$ e+ K7 ^4 b. V6 M5 l
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;
    % D5 E3 B0 K8 d" H
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);8 @9 }* o2 s/ R+ s- P

  926. 8 F# _$ d- G+ b. i) V( w
  927.     /* Assert LCD_DISP_EN pin */- I- v* l: b3 Q2 R, q0 I
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);% X# W6 Y% a( G( n
  929.   }
    ( Z/ a; }$ l- w( O7 i

  930. : N$ i  a4 j! K5 y, T2 K" ^
  931.   return ret;
    8 X. f* o  O9 H7 P( _
  932. }. J: L: D9 _& \# G! B1 b! T
  933. 3 Z* k1 t6 S/ T, ^# Y  t" h2 R" c' o
  934. /**, l! T& o. a" [" L! Y! u3 c
  935.   * @brief  Switch Off the display.$ H9 \3 o/ m( g' a6 J
  936.   * @param  Instance    LCD Instance
    + U% e$ q+ T# K/ t6 a1 g: c: h
  937.   * @retval BSP status4 \$ V2 ~- R, U, O- M% a
  938.   */
    ( W7 I/ O. {* t
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)/ ]8 X8 I6 P! M  {7 I- z2 X
  940. {$ I/ }  H. E- q& u1 P& Z0 ~$ C" }
  941.   int32_t ret = BSP_ERROR_NONE;
    - p4 c  [# E/ G% n1 L- K& W* u
  942.   GPIO_InitTypeDef gpio_init_structure = {0};
    6 F9 a4 |6 m" r0 y

  943. 9 _: w2 R3 d( _* ~' s% T
  944.   if(Instance >= LCD_INSTANCES_NBR)
    * ?4 S2 k+ `1 A# ?  O2 y
  945.   {1 X9 v9 N8 P+ v7 P5 V( V) t
  946.     ret = BSP_ERROR_WRONG_PARAM;
    : \( k" c! |- r
  947.   }
    % Q% C. e4 o* P! Q9 C7 @
  948.   else
    ) D3 |6 t' |8 F: B
  949.   {
    0 ?8 K& O* Y/ T" g
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    3 t+ @2 j- p& i2 U, K. N
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;
    9 s6 w# p9 C, g# ^9 g1 t: ~; L9 T
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;
    9 R& U; o! [+ j# C1 e# ^
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;4 W3 q& P# J/ V) d' }1 g! C
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    9 d# m( U/ }# r* U4 @

  955. 5 v# H0 k+ c; E+ u8 T  \
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);* `9 h7 o& q8 J9 [5 {: M
  957. $ A  c9 ]8 S/ I& Y6 s
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);
    3 |! i1 y" I$ k( W
  959. 0 k% h# @5 O7 `. f% c# c2 ^2 ^
  960.   }' d# V! F9 R/ ]  H. E* G$ B

  961. 9 v( ^2 b$ S' [, }2 G9 Q/ i
  962.   return ret;2 b% ~4 m4 Z$ g
  963. }9 l* F% B) H4 ^, d5 @# u" [% h9 g6 @

  964. - U: Q" V5 Y' \  Y3 S9 G! |8 n+ L  c
  965. /**
    + }' G6 N, |& y7 T
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.
    , l) L! n/ @9 c- |3 ^; f, Y
  967.   * @param  Instance LCD Instance  b0 p% w8 H" i+ _
  968.   * @param  Xpos Bmp X position in the LCD
    0 Y1 b. m% Q2 A/ J9 j8 `
  969.   * @param  Ypos Bmp Y position in the LCD. y* ^9 [% J% R# ^
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.
    % d# e: g0 M& K' ?1 m) z, S
  971.   * @retval BSP status7 p) `1 n/ R$ U  a' p
  972.   */* [% {( z( v! }% `
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)1 a  H  ]" d5 b3 U- e% r8 p3 ~
  974. {' a4 i: \2 e3 Z' F. w* O8 n, ?
  975.   int32_t ret = BSP_ERROR_NONE;
    ' G/ z3 H) y5 V) \
  976.   uint32_t index;
    - L2 ^( ?4 r+ Q5 {6 z: l2 T, B
  977.   uint32_t width;# ~+ O/ I( V' _$ `; F$ I- @
  978.   uint32_t height;8 K1 j! N- B7 S$ R+ [* |% ^$ N
  979.   uint32_t bit_pixel;6 u9 y: T7 w: |, l8 \
  980.   uint32_t Address;
    1 d: b2 c2 G* p' T, ^. s% |
  981.   uint32_t input_color_mode;
    0 M7 z( K; Q/ {6 y2 E& N0 ], {
  982.   uint8_t *pbmp;
    ; [/ f" f( c* H4 ~& f4 U1 |2 K* s
  983. # d& W7 Q- w# `& `* o
  984.   /* Get bitmap data address offset */
    : ^/ j/ O; _# m" |# b% d
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);. V# h! D7 e. N, v6 X/ ^2 u
  986. 0 _. T$ w5 G" ?" [
  987.   /* Read bitmap width */
    * J2 g. |( l, q9 Q: m- W
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);
      v: _' J8 w, |6 T- ~# `  ^6 E

  989. 3 r5 U8 _% p6 W! W# Q! |* N
  990.   /* Read bitmap height */
    ( g- a5 `  @; w" p  l
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);2 a$ A' f" d1 b+ V* {

  992. 4 U, s2 k# a, e( Z- q( A
  993.   /* Read bit/pixel */9 E! o4 Y* a+ h' `+ B7 F3 c
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);
    $ {7 T# y) W# J5 ^1 H

  995. * T1 D6 h: j( z: u' E/ G( M
  996.   /* Set the address */
    $ k: _- s( M3 X4 p* d7 h# ^
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);0 r2 E# I$ {4 L6 K

  998. + v4 Y2 h) A# G2 ^
  999.   /* Get the layer pixel format */
    ' P& j. ~, Y; b+ f: ?+ D% v* ^* _8 _' S
  1000.   if ((bit_pixel/8U) == 4U)/ E% I) S6 m* M* b/ @# w6 t+ t
  1001.   {3 R/ k% e3 f! E8 S
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;
    , b) Z1 r$ n' [/ Z
  1003.   }2 N/ F3 N  t3 v" {* t; ~! ]2 w
  1004.   else if ((bit_pixel/8U) == 2U)
    0 z/ w# [5 ~/ v) f+ L
  1005.   {
    0 o+ W5 l, j" I. i, h& X% w9 ?8 |
  1006.     input_color_mode = DMA2D_INPUT_RGB565;5 F$ Z* r0 @% v) o% {4 {8 ~
  1007.   }
    ' `* [: G! P, G, `/ x
  1008.   else5 s4 O; l) P/ C# i+ Z: Q! p
  1009.   {! Y1 H4 A  M* K9 s5 p0 y
  1010.     input_color_mode = DMA2D_INPUT_RGB888;
    0 S4 Z( f) Q- `9 m6 T% Y; C- n" B
  1011.   }
    # ]- h- x+ N4 A% w. o
  1012. % v! w$ X( [6 l( B# f& O& I9 L* F% d# Y
  1013.   /* Bypass the bitmap header */1 f2 l- @% v# w+ `/ h3 n5 L
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
      I- P  k8 J2 [$ C; ~

  1015. 5 F+ Q8 o# z9 t& M
  1016.   /* Convert picture to ARGB8888 pixel format */+ b$ T0 u; i( e' o, ]
  1017.   for(index=0; index < height; index++)& i! M6 {3 _5 z/ _
  1018.   {& g% u% T0 E- p0 P5 P' s5 b# R
  1019.     /* Pixel format conversion */
    / h; Z+ @: c3 t5 P! @% v7 z
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);
    , P. ]9 [3 p( J5 G1 |$ N6 z
  1021. ! Z6 r# f3 t/ D+ _4 n3 ~
  1022.     /* Increment the source and destination buffers */
    : S: J/ w# b8 q& ]5 g5 S
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);
    0 ]" u) ]3 |$ ~- G% ^+ y8 e
  1024.     pbmp -= width*(bit_pixel/8U);
    * a) v2 |$ ?7 t: f! W- x
  1025.   }
    + G% w+ v$ y$ K
  1026. , i( T* O' e0 S; c% V
  1027.   return ret;
    5 \0 i6 ~) g5 s5 ]: ~2 A; S
  1028. }
    : W5 m# p8 a" n. Y, G( z
  1029. + c; a; h" }8 S  |% L  b
  1030. /**3 j( ~8 h) i; w/ M
  1031.   * @brief  Draw a horizontal line on LCD./ B9 h) d% r$ U8 t* k$ D4 `
  1032.   * @param  Instance LCD Instance.  w3 `& n1 V+ ^9 G, H
  1033.   * @param  Xpos X position./ P1 D$ B0 T7 Z& ^" }
  1034.   * @param  Ypos Y position.) A9 Z4 `: q! t3 k
  1035.   * @param  pData Pointer to RGB line data& f* j5 Q) u$ ^' ~  y
  1036.   * @param  Width Rectangle width.
    * r, C) }/ |8 L: d
  1037.   * @param  Height Rectangle Height.
    0 Z5 S6 d, }0 e: L
  1038.   * @retval BSP status.
    . j4 z! O9 T* Q0 H5 L$ L$ o/ A
  1039.   */
    ' J5 i8 ^9 i2 X0 _. q7 u' u- U( Z- D
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)1 D$ g7 S4 c5 K4 J9 v# R1 q, B, N1 T
  1041. {
    ; X0 H; \+ j; h! ~
  1042.   uint32_t i;
    4 j# G( s/ |2 ]5 |- R  s
  1043.   uint8_t *pdata = pData;3 M  j5 Y5 T" n& F

  1044. % k# `, J  h! p1 T2 M6 p
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1)! B0 Z2 K3 F' K( X4 j  ?
  1046.   uint32_t  Xaddress;
    7 q  e' G2 h7 \; m( R" F& ]/ \
  1047.   for(i = 0; i < Height; i++)2 g1 `% F0 u. E8 {& f" C+ Z3 D# _
  1048.   {. N# O* Z& g2 a. f! n) X  E- W5 O
  1049.     /* Get the line address */* e- v. A' J" Z6 B4 p5 @
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));
    & Z  K) g0 s9 Q+ r1 w" _# t8 n7 V) p
  1051. * W5 T& h* V; z. g+ G
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)
    2 t  A3 O% g  {2 O9 S8 ~* K
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);
    - N% {5 s( i& d% h% t$ T# j
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */
    ' l! ~. U: h9 z1 T( C/ \
  1055. 8 _$ ?2 {  p. r7 e6 |1 d1 w0 ~5 L
  1056.     /* Write line */
    ' P4 `9 {7 \# j
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)
      Z, w2 w( D9 }8 z; c. x
  1058.     {' t- @8 x0 l+ s# o% H/ W) a- k
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);
    & F; i: |- R8 d
  1060.     }& k8 O1 K) X1 J8 K* q8 o
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)6 N: ]4 j. }, M1 {  A3 D) G' n
  1062.     {( Y0 @; A/ `8 [! ~5 R% w0 \3 A8 g
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);6 ~+ q  T( w) V2 B8 `6 R
  1064.     }
    " A. F6 V+ w- h
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)5 F" D7 a3 r' ^6 l0 [
  1066.     {# h  l' o9 ~5 W3 p$ e
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);
    & J1 F+ D0 f8 K7 e/ b9 I
  1068.     }
    2 y5 [! I. r0 X5 d
  1069.     else
    & ?+ C; n4 V2 k3 e" l8 y( F
  1070.     {
    5 y- p) U6 e1 i" \2 w: \7 d+ a
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);
    3 Z4 c' ?* \1 W) Z8 T1 a, h
  1072.     }1 o# V9 Y5 E+ Y# y( S
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;
    & `- T+ ?6 y7 [2 q" R7 B- f# l. I
  1074.   }
    3 h& \  y, x9 m" ]6 F
  1075. #else
    ( S' R+ P1 K& G
  1076.   uint32_t color;. V8 z1 x2 R- ]  ^  O
  1077.   uint32_t j;
    1 G, t  Y- u8 a/ j
  1078.   for(i = 0; i < Height; i++)
    $ L4 n; i7 T! T* n- x
  1079.   {% D* y$ F  Z7 P' Q
  1080.     for(j = 0; j < Width; j++)* u# T! l8 B& \: ?( H, `
  1081.     {" _# a" \8 Z4 H. L+ w
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));
    * u5 h3 g" J% z: c
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);
    $ R6 R$ X8 @8 v  S, G8 U
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    ! {9 j. G0 v5 [2 i3 I
  1085.     }
    & E2 V4 p: Z2 M/ E+ a  e' V1 j+ t
  1086.   }
    1 f# T0 q0 w+ A0 f6 e" Q6 T
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */  B: N$ l/ N1 L0 W% n" c# E" R0 z
  1088. - k" z3 Q* J- l% R: a# ~
  1089.   return BSP_ERROR_NONE;
    1 Y# a/ a* i& P& V$ D
  1090. }
    8 V. X. ?5 ~% d
  1091. . D+ J/ H2 t8 X: v! A
  1092. /**) |" a0 D6 }) h: h- }
  1093.   * @brief  Draws an horizontal line in currently active layer.
    7 }+ z! P8 V) a2 Q! v" x6 N
  1094.   * @param  Instance   LCD Instance
    0 R; B" l( U5 G0 m) G& q: H
  1095.   * @param  Xpos  X position9 |/ H. @5 U. B! T" o8 T- t
  1096.   * @param  Ypos  Y position, z+ u$ e: Y* m: ]
  1097.   * @param  Length  Line length
    ) _  q% a6 S7 k% p  l
  1098.   * @param  Color RGB color2 j5 H1 }$ U6 K: v3 e( O. p0 B
  1099.   * @retval BSP status; h& m" C: h* W3 A6 ], ^/ n! v
  1100.   */
    - Q( g' o/ P- M' R7 E$ a
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color). P8 [# l1 ?0 w4 ?  @
  1102. {
    ( ~) m7 b. n. `1 K, `
  1103.   uint32_t  Xaddress;! n  P; U$ [3 W! {. w5 Q( @2 d- S
  1104. ( H" z% _) K7 z3 i" P
  1105.   /* Get the line address */6 C, w! Y# h! t  c1 ]
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    ) r: F6 P6 n5 o% S: a- ]1 i6 D
  1107. / c3 a# B4 k8 L, C& \3 t
  1108.   /* Write line */
    8 O' {; T7 D; ~  Z6 K
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);
    ( ~4 y# }. C9 d; V, ^3 @
  1110. 7 G9 M, u- f; n9 V2 l
  1111.   return BSP_ERROR_NONE;
    ! Y0 Z; Z& f# ?) [1 _4 f0 o
  1112. }: V: p9 H2 [) C6 U; @; H6 x

  1113. 1 j# m' |) ^4 g, \8 T
  1114. /**
    2 e- ~) |) c. V* o* D8 ]# O
  1115.   * @brief  Draws a vertical line in currently active layer.
    , [* R1 T6 f; K8 s4 `2 E: g
  1116.   * @param  Instance   LCD Instance4 n5 L& F* e' i
  1117.   * @param  Xpos  X position
    & Y1 |7 T; f# h# s+ {% [
  1118.   * @param  Ypos  Y position. y- W+ j4 d6 y5 K6 l: l
  1119.   * @param  Length  Line length5 c. U2 h1 Z% I2 I/ n. g
  1120.   * @param  Color RGB color
      _6 X! G! w7 I/ k
  1121.   * @retval BSP status
    # B0 [; j3 j. X  F9 o* d/ n
  1122.   */* r3 k" Y, a9 J, U: K3 m1 U
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)
    * r& }' _/ X( \4 A/ U: o: ?8 h% q# i
  1124. {8 g; l. G- a" k% l6 O
  1125.   uint32_t  Xaddress;
    - m  t7 v9 ?; y0 e* Z
  1126. 0 J, l6 J" {; L: n
  1127.   /* Get the line address */
    . \- i5 ]) o3 C, F9 C1 {
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
      I% X  ?8 X  M- u. W9 @. S' a% ]8 N
  1129. & I7 Q1 \7 ~' F8 Z) X
  1130.   /* Write line */
    ' A3 D8 i- k6 ~5 g$ w7 t  v) a
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);; V6 X- q" R3 ~6 O

  1132. & |; z7 Z# `7 m; {7 a
  1133.   return BSP_ERROR_NONE;8 f6 v1 J; E% w' h3 ]7 d8 @
  1134. }7 Q+ \+ M/ N' S6 m6 C

  1135. - x( g: i8 l" K8 N' _
  1136. /**# E2 H  Z$ F' d
  1137.   * @brief  Draws a full rectangle in currently active layer.
    5 @; }1 H" j; _8 X$ N7 A$ y
  1138.   * @param  Instance   LCD Instance
    & j: [0 j8 |+ e
  1139.   * @param  Xpos X position
    . @6 A% b/ Z. o! v
  1140.   * @param  Ypos Y position& |0 n' w: H) v; T
  1141.   * @param  Width Rectangle width
    $ a  h% L2 q0 `& J0 K' B) p! h: @. Z
  1142.   * @param  Height Rectangle height
    ( a' F! ~, M" |( _% U
  1143.   * @param  Color RGB color  D& K+ R8 K3 O5 x# D' i+ j
  1144.   * @retval BSP status
    $ w. }4 t( V1 b0 b9 |1 H% e
  1145.   */
    6 P7 D9 U3 J: S% l' Z6 W
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)
    + y+ r* d5 b' Q+ y* l: Z# a+ z. \
  1147. {: P5 E3 ?7 q5 k
  1148.   uint32_t  Xaddress;
    4 a$ r6 O0 l& ~5 _- j6 {* }# R
  1149. % K/ L/ O0 m* t2 A. z
  1150.   /* Get the rectangle start address */- r( W! c( Q; w3 e$ ^% A9 U" x# u
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    ( k  ], g0 T) ?

  1152. & H  D& z: O2 D. ~( D5 {8 i
  1153.   /* Fill the rectangle */
    4 O6 n8 k7 S, u, }  j
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);
    ( j$ D- W4 c6 p- Y* O: O( ^! e
  1155. % l4 |9 t4 B2 V" p% L
  1156.   return BSP_ERROR_NONE;) R- R$ h. N, Y8 x5 q
  1157. }
    5 W) j. {( x2 @2 U) c/ C1 L- F
  1158. * `% y$ N3 H1 ^
  1159. /**
    7 N! v" z; M/ c
  1160.   * @brief  Reads a LCD pixel.
    6 D- }# \% T1 k: t  P& N4 g
  1161.   * @param  Instance    LCD Instance
    , s& Q; c* I9 t5 g4 e
  1162.   * @param  Xpos X position
    " Y3 v  q- @- v5 n) v) o9 g4 x  B9 @
  1163.   * @param  Ypos Y position
    + P4 X3 B$ G  k% A" n( t: B, H
  1164.   * @param  Color RGB pixel color
    - ?4 D3 ]  A3 X: r/ G
  1165.   * @retval BSP status* I8 I* n! k7 e5 J) u( e* l
  1166.   */
    ' j1 `0 ?3 M% V4 l5 O1 Q
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
    ' F0 |4 F4 K/ a# r! u
  1168. {3 b4 W) l# Q3 H; Y  K) n" r
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888), T% E) |, C6 A  @
  1170.   {
    6 X- X7 f: l; Z8 a; {0 i$ b2 K) y
  1171.     /* Read data value from RAM memory */# p3 O' X+ J) t
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    . M' c1 [2 N6 K! c4 I: g, C
  1173.   }
    & [3 i7 u, L1 C9 q
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888); L9 B2 m  h6 h5 a; d& w# f
  1175.   {
    $ ^1 s5 \7 Y* }1 V
  1176.     /* Read data value from RAM memory */- X, U  n" h  M2 F* ]* h" ^1 s
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    . I' k/ n" `: ~+ E7 ^; L# M
  1178.     *Color = CONVERTARGB88882RGB888(*Color);( l# k) o. {# W* I% z
  1179.   }
    * C% }8 x, A, k8 }, a0 p; m! B
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    & W: \4 m0 v( B
  1181.   {* ]! ]& z1 a& X0 u# \; d; B
  1182.     /* Read data value from RAM memory */' t4 p, r2 Y" G& z* M
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));8 u' t) T! g/ x3 h
  1184.   }0 K% d; d0 B1 f/ {. {: ~7 Z
  1185. 0 f7 c: i1 M9 e! C, n% J
  1186.   return BSP_ERROR_NONE;
    , e% l/ g- I; G% R  q
  1187. }. u* Y6 i( U- m2 Q: N$ ~
  1188. 8 f, w8 a8 d- R; b" \' n
  1189. /**7 V# l/ g1 j3 S0 p* A* J
  1190.   * @brief  Draws a pixel on LCD.
      g: x/ T/ W# t) T  a; f% m
  1191.   * @param  Instance    LCD Instance- L% x4 X) \' x
  1192.   * @param  Xpos X position/ J8 }7 U! E" [% G5 q2 A* Y  \( _0 Z
  1193.   * @param  Ypos Y position
    4 ^# ~: J( |& H1 h( p. E
  1194.   * @param  Color Pixel color
    9 w6 G& P# R1 O) \  Z2 Y4 t
  1195.   * @retval BSP status  L: y6 O) x; o2 N
  1196.   */
    / v. w; Q& _/ F8 L# O  \2 K3 _
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)2 ]$ @4 I6 O$ ~
  1198. {+ _9 s# C2 H% O% R% n
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    5 I( |# o. S% q! o1 m% \. q1 O6 h
  1200.   {
    8 _4 z, A1 o5 U; `' H
  1201.     /* Write data value to RAM memory */9 v0 W4 m0 `- f
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;* x7 Q/ y( @) F6 k& }* U
  1203.   }
    / y. n* y' S0 }
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)+ L1 O5 L% C6 a. s' f7 e1 ?
  1205.   {/ f0 ~- P+ Q% G* m  `: D
  1206.     /* Write data value to RAM memory */
    4 y3 Z% r! N# y: t( p( r
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);- v( O: V. w9 g% Z
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);
    ) N$ x/ Y$ I% ^' h, 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);5 G! Y5 U) t. m; k0 o# T. D" K
  1210.   }* h# P( O, {% T
  1211.   else4 N! Q7 ^  J( I& y. F
  1212.   {: n7 N( j# k9 Y) `  V0 I( s, x! b% g
  1213.     /* Write data value to RAM memory */
      N' K- @& }' D
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;
    - _3 C' F  B% W0 M. ?' e
  1215.   }
      d: Q: b/ K( g4 S+ K* l
  1216. - y3 }) z3 F7 t/ s
  1217.   return BSP_ERROR_NONE;
    + I1 A# V- ~8 ~6 ]7 L: a! C2 L
  1218. }8 A( P3 ]# {4 K; F2 W% Y6 C
  1219. ! M0 j( Z& B( R3 [- Z  p3 L& [, {
  1220. /**- c$ E: s' u2 o" {# n
  1221.   * @}: m) L+ w7 N5 C/ Z, m) @
  1222.   */( G" v1 l/ c$ j. L5 {
  1223. , X# o3 }$ e& S3 i
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions! L+ ]: d/ R) E2 _* ?0 W( w
  1225.   * @{
    + J8 a& ?5 U) I
  1226.   */
    1 i* V) ?6 p" e. d3 C5 F
  1227. /**
    & K0 d8 [. K  g4 P
  1228.   * @brief  Fills a buffer.
    * U) A" X5 D1 ^7 z" l* x% y. t
  1229.   * @param  Instance LCD Instance% c# `) _. }3 Q5 P  ^6 g& t
  1230.   * @param  pDst Pointer to destination buffer  z3 V" [1 T* x# X. m/ w
  1231.   * @param  xSize Buffer width
    . |! w5 ~7 L' [# L
  1232.   * @param  ySize Buffer height1 p2 s: V7 q, \
  1233.   * @param  OffLine Offset
    / G2 N, `0 G6 M
  1234.   * @param  Color RGB color! z+ x4 g1 E7 [  p5 L
  1235.   */5 X% w) m5 f6 Q- u9 h
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color). }" I- l7 R3 q0 j
  1237. {
    % o/ D+ ^  c- d' c) L$ t
  1238.   uint32_t output_color_mode;: h3 `, v: S* E2 {
  1239.   uint32_t input_color = Color;! D& {9 i* `: r4 w
  1240. 8 c* x* y4 T% Y* B8 I% K
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)0 \% _! F- I7 t  G# X3 @9 I# m
  1242.   {. b& N+ U$ p5 T8 Q5 {2 @6 J
  1243.   case LCD_PIXEL_FORMAT_RGB565:
    1 o3 ]* W/ s. E7 I" v
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */  k2 I  ^# x  \7 J+ O5 ?& a9 P
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);
    * G5 i7 [5 ^4 ]; I$ b, J
  1246.     break;
    % a; b+ }1 \- l+ v% P
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:
    - |- V& O! D2 m- j
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */
    ; o! `: S, m0 F' |* S( Y1 T0 U+ g
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);' F" [6 D. J2 _" I  a; H
  1250.     break;2 A1 F# l4 s" K# _
  1251.   case LCD_PIXEL_FORMAT_RGB888:# Y0 A1 o( m8 T5 r4 N
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */3 m7 y) A) s# P) N
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);
    ! C# V8 {7 w! c: S
  1254.     break;7 T2 O+ u5 }" w( t9 ]1 X! \
  1255.   default:6 ^" q5 c% S' I; I4 a/ x
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */& L; X( G( i+ _5 t
  1257.     break;& B0 r9 A4 b2 i9 R2 X
  1258.   }, L# X2 `$ }# @8 n

  1259.   Y1 V0 c4 s, [8 m# e+ r0 j
  1260.   /* Register to memory mode with ARGB8888 as color Mode */
    1 {0 G, T; q& b
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;9 T; `% X; q$ o$ \9 M
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
      o3 X. _+ S/ c2 j! g
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;
    2 C/ {, |5 t7 w, p1 D/ R

  1264. : J6 |, L3 F( J& r0 ~$ J( N/ ?
  1265.   hlcd_dma2d.Instance = DMA2D;' ~4 R0 e% z" D

  1266. ' g3 a1 O$ |+ ~% m" U( h0 x
  1267.   /* DMA2D Initialization *// k0 e2 T" G- ]* ]& b/ e' _% S
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    ( U1 |* y- X$ N# C/ j3 K
  1269.   {
    2 y1 d0 T* L# o
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)+ ]! G, b. ^9 Z" E/ g! f6 y  h
  1271.     {
    : x. s* g# C* b3 X; n* O1 U: \
  1272.       /* Polling For DMA transfer */
    ( ?, i$ n; d* Z
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);, W2 g- L  ]( x6 K. _
  1274.     }
    ; a- B, s: w; K; e, [# g
  1275.   }* l9 \, _1 [) r4 S
  1276. }. C( I" U1 n/ t

  1277. ! w+ U( }; Z# t. v
  1278. /**1 J$ Z0 B. z# T. j" d
  1279.   * @brief  Converts a line to an RGB pixel format.! V- c; h! D8 U+ j  [( l
  1280.   * @param  Instance LCD Instance0 I+ X3 y7 F, ^, G- w4 z3 e
  1281.   * @param  pSrc Pointer to source buffer$ U( O0 X: @) h
  1282.   * @param  pDst Output color8 @# V9 R1 B4 A( V
  1283.   * @param  xSize Buffer width
    0 ^3 l# I* z& J/ ?
  1284.   * @param  ColorMode Input color mode
    5 n0 {8 _$ k- k: [# \/ O6 |
  1285.   */3 Q2 Q$ U7 c& o1 I& A
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)
    * G) m" R. v. f
  1287. {# t* u- C' {/ B
  1288.   uint32_t output_color_mode;
    " \6 l* b0 ?- X, k. V

  1289. + J# e5 G5 v$ x* A
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)
    , k2 D6 l+ s. ]" r; a
  1291.   {
    0 F) g1 H& @3 o! H7 R* V; _
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    * S8 z, k8 |4 k+ B4 h( Q/ g, V
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    ; E, ]6 K) H* K; S$ R. Q
  1294.     break;
    & L; I# l4 i, P7 s9 h8 n6 r
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:
    / u6 ^2 N# d- L0 C$ l5 P, R
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */. C2 c$ l, V8 m% i
  1297.     break;9 [( i. _5 ?- \: A+ k4 S" L! j
  1298.   case LCD_PIXEL_FORMAT_RGB888:
    " K( b2 w5 R7 A* \
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    ) Y! C6 K+ C8 z& J# X1 }4 F
  1300.     break;8 k0 e( V- `: W' a
  1301.   default:0 E, b: L$ n  Z- e( D5 F
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    6 A: M6 y2 k3 T
  1303.     break;  H" Y) O. O0 B! L' B) i
  1304.   }
    ) |8 @/ y& p2 A( N; n
  1305. ; _2 w/ N$ j5 k
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    + H7 z3 i8 A! `# ~8 P, f9 i
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;# I" U8 Z& e: H9 x. E8 G
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;$ {- I# `5 a! `# j
  1309.   hlcd_dma2d.Init.OutputOffset = 0;
    4 Z2 Y' `3 e, x+ D; {
  1310. 8 j* E, g% L% B+ n, F/ g8 p# v! ~3 y/ R
  1311.   /* Foreground Configuration */( z5 H& K" z- A$ Y# D
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;, P1 S* ^. Y0 V3 E* I8 P
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;* X9 O  O* W7 H& q$ I6 p5 J% O
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;
    , d' L' m; k, i3 S* T4 C
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;
    ! w  o: L6 Z% i/ s( z& Z; k& p
  1316.   x1 U4 Z( P) L  y
  1317.   hlcd_dma2d.Instance = DMA2D;
    3 F$ W: U" w  F9 g8 v: E

  1318. - E. v0 p: V# C6 n
  1319.   /* DMA2D Initialization */* P9 ?' s3 z( o, M$ s( q
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
      F; @- ~! P$ n& Y+ ^0 S$ [
  1321.   {
    ' J+ E+ n$ C2 v2 `' d7 A
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)
    ) w) K% T( I' |- I
  1323.     {
    ! k; Y/ O: w; [  W
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    0 V( L: R# Z! C. W* z4 Z
  1325.       {
    / H1 v& k( Q, V2 F
  1326.         /* Polling For DMA transfer */# ~* E9 i! \. T# I- G5 k' @
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    " h% d4 U+ |: A/ w6 J2 J' O. r
  1328.       }' ^# \  t1 l+ `9 }* S- b/ @
  1329.     }
    ! j, a* l  O' K4 |$ G5 o
  1330.   }  F/ |' s- X; Z; `: b$ {
  1331. }0 d) ^/ h4 g. s/ p7 B  R

  1332. 7 N$ d. Y3 s$ c8 \
  1333. /**
    5 x" B0 D* \9 O. H
  1334.   * @brief  Initialize the BSP LTDC Msp.6 f( d3 o, Z+ u# a4 {
  1335.   * @param  hltdc  LTDC handle
    9 u  P# K4 O3 ?, P
  1336.   * @retval None- q7 h) R6 q) J; {; ~
  1337.   */$ M9 f' H( ~0 |- _( H, |, _
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)8 j4 T3 R8 {" d
  1339. {
    3 J+ _( g3 e+ i! T( Z' O
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};
    3 w. p2 D. j0 K3 X% x$ w3 Q/ W

  1341. 7 A4 x9 W& W; r3 F, ^
  1342.   if (hltdc->Instance == LTDC)
    5 E( P6 ?4 N6 i+ u+ U
  1343.   {
    2 p7 W! J! l2 N: F& [
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();
    : i# L7 A- z" ]

  1345. 7 }3 G, x1 X  l5 A
  1346.     __HAL_RCC_LTDC_FORCE_RESET();
    & W' B$ \8 `- }6 c8 d, ~$ V
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();
    + x. X1 V( C5 S* n, I
  1348. 2 N/ A' `2 r* E1 h5 F0 l
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */: d9 |, m- w+ x3 n
  1350.     /* PG0  R0          */
    7 X) n4 J6 u* e* T# j% `
  1351.     /* PD9  R1          */
    9 l  s2 p7 G' z7 w' e2 y
  1352.     /* PD15 R2          */
    1 w% x! {0 o& i8 T
  1353.     /* PB4  R3          */ // JTAG" d6 Q! g. @* [7 J
  1354.     /* PH4  R4          */+ A  P, r% q  c; a: M
  1355.     /* PA15 R5          */ // JTAG JTDI
    - R+ M6 P  p  A) I
  1356.     /* PG11 R6          */
    2 P, U& }3 [2 ]% Q( {9 C
  1357.     /* PD8  R7          */
    / a8 k) q4 s- E
  1358.     /* PG12 G0          */1 x1 b$ Q; `0 i: G  }# `, {4 ?
  1359.     /* PG1  G1          */
    8 x* p* d% d; r) L
  1360.     /* PA1  G2          */
    / F3 ~0 O. t' m0 f2 B
  1361.     /* PA0  G3          */8 R! {5 [' A5 M
  1362.     /* PB15 G4          */, y3 q# \$ x3 {3 z8 z1 k
  1363.     /* PB12 G5          */
    $ N$ h; m0 `. D: i2 `
  1364.     /* PB11 G6          */2 R  W8 [  r- H; j, Y; p
  1365.     /* PG8  G7          */
    0 w* T( o0 Y# A' T0 n! V5 J1 @9 u4 `
  1366.     /* P15  B0          */( x! C8 p, u: L& d4 i! b; [
  1367.     /* PA7  B1          */
    ( \0 p, F* i- M3 i
  1368.     /* PB2  B2          */
    & P! |$ m9 `% e0 F, C
  1369.     /* PG6  B3          */- X' z3 Z# ^+ |3 k. g
  1370.     /* PH3  B4          */1 u. E1 }& \5 b" V
  1371.     /* PH6  B5          */5 A1 V4 v) [4 y- \
  1372.     /* PA8  B6          */
    * @  Q9 M, T  T
  1373.     /* PA2  B7          */
    - Z) K$ i1 X8 y: s8 R5 |) j
  1374.     /*                  */
    ( G+ R5 [8 ^( T
  1375.     /* PG13 LCD_DE      */$ n2 g% d5 H9 m- o3 A, j0 j
  1376.     /* PQ3  LCD_ONOFF   */9 ]0 `7 J& T2 g; _3 T
  1377.     /* PB14 LCD_HSYNC   */' l% s( `" U- W- v5 I  ^. E
  1378.     /* PE11 PCD_VSYNC   */( v6 C* h0 A0 \; O; L' m; s/ I( u: D
  1379.     /* PB13 LCD_CLK     */4 P9 _+ ^9 s. q! |, J
  1380.     /* PQ4  LCD_INT     */
    , H2 x# D+ G+ E
  1381.     /* PQ6  LCD_BL_CTRL */+ G$ a) m' ^% x
  1382.     /* PE1  NRST        */
    6 M& u! }! k5 a/ @: S, V3 G" l

  1383. & [& U0 {/ |0 ~1 w3 ?+ b7 T
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();
    , F1 V$ Q9 s* ^" e* w) X$ x9 b! V2 [6 B
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();
    5 ^, L5 B" k4 j( w
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();! E  ]# w1 s1 Q. b: l' Q* s
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();
    - k; A: S3 x/ [- D
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();. `- n/ F3 f2 `% O# G
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();$ j4 e$ C; w6 }: K* _) B
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();
    # u4 H, b4 n) M& `

  1391. 2 O2 j% U2 X0 c0 ^+ j
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;6 w# T$ q& l/ d0 L* v
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;
    * i( X: ]  U2 J' A. Q
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;0 S; ?/ B$ z+ G

  1395. + O6 y* F9 W7 S& E+ b
  1396.     /* G3, G2, B7, B1, B6, R5 */2 q1 L# [* V9 j8 ]
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;: A# F# a" E: ~6 v% z6 H( s' W6 e
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    . X8 L# u7 T% I8 E
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);8 `1 ?/ W5 R9 z
  1400. ' r( w5 g2 x( ]2 L* R( _5 N4 w
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */
    ' Y$ \( x' T1 _% I( z' ]) e
  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  u" G! y1 u3 n: r4 b" Q/ l
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;2 L+ T0 j; h: ?
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);/ ~- y; P' Z# u
  1405. : Z0 J  q) |. g7 P7 q
  1406.     /* R7, R1, R2 */
    4 \+ H# v" ]0 k0 R' S# f9 r
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;0 H' I1 ]0 U" B* e) p+ B% h, B
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    ( I8 h3 n: ^6 i" y' R# }  f
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);5 N; y! Y% g! K2 p

  1410. ; c+ |& J$ T* z) I  }
  1411.     /* LCD_VSYNC */5 v; e9 t. Z2 Q
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;
    8 `2 Q7 ^+ v4 S- _1 S0 X
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    1 X% B1 }  r/ e$ Q( d
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    ) ~, h' p- R# L/ C3 }% V; f: b
  1415. ; a3 `6 h1 s, Z# H  X$ {
  1416.     /* R0, G1, B3, G7, R6, G0 */
    8 j5 j0 D) K- h) r" I5 H
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;
    # k; ^; [4 B3 {6 v1 O4 m
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;! i& K# V2 ]2 M9 D; g3 i) D
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    " \+ c0 I' i1 Y4 p9 @2 t& Z; r
  1420. : R' o( x* b; W+ V6 E) ]1 w2 X
  1421.     /* B4, R4, B5 */
    . P9 j* {# H# e8 F( T
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;
    0 I3 o  a. e4 o! ]" l. G
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    9 j& ]& |' `# b/ N5 ?& d8 f
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);; {" ~+ e! {' t, F: w
  1425. 4 [& K) _9 l1 I% b/ i
  1426.     /* NRST */4 V+ T2 X3 E2 p0 `' Y2 Q' {1 l
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;8 C2 z$ U8 P+ Q; N3 p
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;% v. o6 ~5 _0 L; Y) T. P& B
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    - t9 t  R+ a$ P  O& w
  1430. ' R  [) U3 c& a& W' n0 y
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */; U4 z8 E8 V- G5 S5 @
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;
    ' y8 z. F; N7 q' f" v, i8 {
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    2 l$ ~8 @8 x  @' n: J) r; v
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);
    4 p: }& g( F7 z6 B( g! Q* m
  1435. ( C0 P  a$ r9 G7 ?2 K$ z$ S. U
  1436.     /* LCD_DE */
    ' C1 F/ ^" x7 E  f2 x$ L" m1 v
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;
    , F3 R5 @+ D+ c, C$ j  T6 j
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    % g" D6 x2 X* T8 `* C
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    1 m/ D2 Y3 w* k3 {6 z8 m* X4 K
  1440. . m* s) R1 B- f' f# P4 I
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */3 A  Z$ B6 N6 e2 Z& T0 a
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */4 g: l) N) M' o9 W/ E& Y  S
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */& X; S) u& Q6 ^# g
  1444. * f! W& w4 {, B( Y' V  L( ~
  1445.   }. U+ h9 f, A+ g* f
  1446. }5 D  }* C% I# r4 C2 ?

  1447. $ r( m$ r2 J/ ?0 N' v$ ]0 U; n
  1448. /**, U# b/ E  ~$ }6 H# U
  1449.   * @brief  De-Initializes the BSP LTDC Msp; `! u% y. @0 o$ n6 M
  1450.   * @param  hltdc  LTDC handle
    1 B. k* o* U9 K, c. J+ O3 _
  1451.   * @retval None
    0 H) E1 g' z8 J5 p
  1452.   */
      m3 ~6 X% H- \& w. H( ?
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)
    2 H$ E* G; g$ a3 _
  1454. {
    5 |2 T; o' a0 p" ?" n
  1455.   GPIO_InitTypeDef  gpio_init_structure;
    ; J2 n; _! p! P1 g$ I" ?
  1456.   \2 j6 R3 V1 R1 x9 i+ H' u% U
  1457.   if(hltdc->Instance == LTDC)7 e- [* t; R0 ^$ N9 G/ ]; Y! s
  1458.   {; q' G" m+ \" _. Z" M2 ]( B
  1459.     /* LTDC Pins deactivation */! o6 u! A+ W# W. U
  1460.     /* GPIOA deactivation */7 F" P3 I, @+ _' d6 m
  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;
    ( k7 I8 z, B" m- f. C1 w( T6 }
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);0 G8 z$ X6 k0 {! O6 P

  1463. , l  z* z& p0 q' A. Y& s4 d' b; h
  1464.     /* GPIOB deactivation */
    4 F  N: y0 S) h* d+ [
  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;
    : u2 Y" `7 k, u
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);" K& Z0 I% s9 x/ ?! |1 D, P

  1467. % \& K) g3 t2 G2 F* j1 e1 s* P
  1468.     /* GPIOE deactivation */, O: d" D* z$ [* D' K- Y
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;3 _$ C! F( d  H7 d
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);
    5 X& X! d0 I6 u9 X7 `

  1471. * A7 F+ }4 ^9 Y4 O" u
  1472.     /* GPIOF deactivation */. T# b+ o. }5 Y+ W5 N
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;
    ; M6 D5 T8 G% {1 p( f# c8 \- u
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);
    / w' s) j. ]& t& e. a
  1475. ) {0 v0 Y/ p$ d! K$ u! P7 Y( U
  1476.     /* GPIOG deactivation */% X/ J2 X. i7 \* m
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;
    ; {) z* x+ F% H  ]  o- I2 R
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);
    2 ]* @" a& q; N6 D1 i

  1479. 3 ]+ E' j0 \  A$ p, F
  1480.     /** Force and let in reset state LTDC */
    # }: ^+ u9 x5 B7 h( ^$ S4 m
  1481.     __HAL_RCC_LTDC_FORCE_RESET();4 v. T/ r6 y' z: w
  1482. : y$ X( E3 u: I6 ~4 m6 V
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();
    3 k. `6 y0 o' U$ @+ z. J( }4 f

  1484. : B- u8 J5 O6 B  P
  1485.     /** Disable the LTDC */
    # q  C+ }9 m4 Q1 |# u% T( s
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();3 _4 K4 }) w* z$ s3 B9 x
  1487.   }
    ! P  |1 O+ k1 A
  1488. }4 ]% L0 f8 b- U4 x' p, _& U

  1489. 3 ]# g0 d' @$ Q8 {8 i: P1 n2 J
  1490. /**& I" c: C1 ^; S* E) w, ]
  1491.   * @brief  Initialize the BSP DMA2D Msp.
    & h' H# n. l0 S) S  [3 s
  1492.   * @param  hdma2d  DMA2D handle
    2 y) D/ S7 W  i9 _& \" `
  1493.   * @retval None
    * W9 [5 d; M, I8 C/ d* [
  1494.   */
    / W: F" a5 N, o, H# ^5 \
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)' f$ r- |# O: U4 b# _8 A
  1496. {7 _" g  E0 U$ S, b
  1497.   if(hdma2d->Instance == DMA2D)
    0 g# b0 G  n% B4 w( i, [0 B
  1498.   {
    * ], F8 N2 i* h; s, t$ c2 ]
  1499.     /** Enable the DMA2D clock */
    , ?8 ]+ U7 B" x$ t3 b
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();# a. ]' Q9 E" U0 W) u# ?5 n4 L
  1501. 2 d* ]6 \, W0 r, R. s
  1502.     /** Toggle Sw reset of DMA2D IP */
    1 ^  N) d" L) I3 y) W6 y0 c/ o
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();! n# T/ @0 I! b! [
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();7 V* b  y6 R# c! \# Y1 ^1 [) V) ]
  1505.   }
    . A: K. r. i! n
  1506. }
    8 q$ E; h$ w) K  i& e
  1507. # k: |) e, ?" T) G3 h
  1508. /**
    # a' R0 D* w7 H$ U4 s6 `
  1509.   * @brief  De-Initializes the BSP DMA2D Msp
    2 e5 {* h/ q4 f+ y7 D+ \0 B
  1510.   * @param  hdma2d  DMA2D handle8 T2 ~# w5 j8 \( j! s. G7 Z
  1511.   * @retval None
    5 G' z) n& [. q0 b( C. G) m
  1512.   */
    2 x5 p% O+ Z1 c) g! Q6 l
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)' l& y( d. p1 h  ^
  1514. {
    / ~0 P! K/ H% V# p8 a" X) r
  1515.   if(hdma2d->Instance == DMA2D)
    8 l3 _/ ?- N8 v+ X: g
  1516.   {+ l; u8 _+ ]! z4 C
  1517.     /** Disable IRQ of DMA2D IP */
      G+ s* k7 \% |# U" v7 n8 r
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);9 B9 U! q" v) T" f5 W  \7 W
  1519. $ `9 c/ ]' B% ~" F7 v
  1520.     /** Force and let in reset state DMA2D */
    4 w3 Z! U2 D, Y  ^5 d2 G+ c1 X
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();% }- J3 q1 d2 I# [; y& ~$ h
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();
    2 t% u' P" A% V' w# Y# k$ s+ K' {
  1523. . M& h  m' ], w) M
  1524.     /** Disable the DMA2D */# f2 E; P2 x1 k* w$ w  P, J$ u" H
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();. A4 ?) [. G# C$ r4 `  R: h3 f5 k
  1526.   }
    & b" w# S, |: H: F5 z! l  Y; w
  1527. }% w" ^0 P& u. N& ]) T
  1528. ( A  G0 @  n4 F& A3 e
  1529. /**; t' X* j' D2 f6 A( @
  1530.   * @}( Q( o  T. @7 n2 d* A( [; V0 @9 k
  1531.   */
    + F! G7 i* E0 ^+ J8 y
  1532. * |; `3 }. C, P# d% W
  1533. /**& e. |0 d! _# \" c
  1534.   * @}9 _' {6 o: X2 C; L0 l
  1535.   */
    # D9 O, x- q! @' _! V/ b7 T0 K

  1536. 0 i! t- ]+ n! w0 J" ^" y6 ?9 S
  1537. /**0 \7 R) g, b! ]+ f1 u: }
  1538.   * @}
    ! p$ l, ~( U2 |# K
  1539.   */2 ]) p' n- n) s% W! |: i1 ]

  1540. ( n# W; a  G1 ]0 A8 b+ O: g9 c. f
  1541. /**' t7 r5 O9 B. _8 H) Z- `6 F1 K
  1542.   * @}
    - Z5 ~  K; r! H- v; x7 Z/ s8 D9 o
  1543.   *// c% z+ h! f2 R" S# @7 ~) q, t# w: K

  1544. ; D# T# q' i* W/ D% g* J8 L" E
复制代码
0 Y6 @( n4 F" J
2 O0 n! s$ A$ M& b9 |
2.2、main.c
+ W' v2 f, k. _7 K5 t# S5 g8 m) ]
  1. int main(void)) l! l0 w3 f0 K) `5 j
  2. {
    + F) _3 u* {+ ^8 n4 K
  3.   uint32_t x_size;$ m& F. m6 |/ W4 H3 |* {6 m
  4.   uint32_t y_size;
    ' C0 f0 P3 D/ K7 L$ Q* o* b
  5.   uint16_t i,j;% G$ D2 h) H# R9 g

  6. 3 R7 x; q6 e% n1 q; S2 \! D
  7.   HAL_Init();6 z: _/ M; m# k7 G) X
  8.   SystemClock_Config();
    % b3 U; L  _. X( d
  9.   3 F. \' l& l' W
  10.   /* Update the RIF config for the used peripherals */1 p& r, C8 L( q$ u
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    ' g/ d8 S( |7 d9 g3 g, q* s) c+ Z
  12.   RIMC_master.MasterCID = RIF_CID_1;
    ) Y) C  Y5 K7 c  a
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;
    . u, x* H4 p# q- z) _% w0 B8 o
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);
    ' i$ c3 u: S2 v7 A3 g  z
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);4 A' l  w7 q5 F- L
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);( t# Q+ g0 q. x$ K8 w# g
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);
    1 j6 e& {; t6 M( L* I. S! x
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);& L- h6 I/ d2 Y
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    8 [4 o. {, t9 w" U
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    % Y, t" U4 _7 W& y" {% t
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);! ^/ I" C% H5 X8 g
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
      T! c  O1 z( ^% ]) ?/ O: B
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);) b$ O# r! Q# ?* B) V
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    ; K* k* d+ B0 A  r/ h$ e. A1 I) A
  25. 3 L  @- X% F5 T, T! P5 P: h
  26.   BSP_LED_Init(LED_GREEN);9 w& t2 l  a& X9 I8 _& ~0 l
  27.   BSP_LED_Init(LED_RED);- a3 |4 H. N' d1 n, o
  28.   
    ; M. b  r3 }. Z& @! u; v
  29.   #if USE_COM_LOG3 H) R3 q4 s# r) e. E8 h4 C
  30.   COM_InitTypeDef COM_Init;( v% i, ?! g: S4 K$ m! O0 @
  31. , [: u7 `5 Z/ J
  32.   /* Initialize COM init structure */
    9 x$ o4 S* O5 ^1 E
  33.   COM_Init.BaudRate   = 115200;
    . A  E: W& f* I3 q
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;, u# [/ N* F3 ?' K, E) P* d! [
  35.   COM_Init.StopBits   = COM_STOPBITS_1;3 h$ m7 e! P! m8 L3 g1 k
  36.   COM_Init.Parity     = COM_PARITY_NONE;& i' G! ^! u0 z+ z; U( Z
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;' F9 l3 `& O. B1 R# N! B! t9 F
  38. 8 u: M# o' v) w) e. V9 i- Z
  39.   BSP_COM_Init(COM1, &COM_Init);/ n7 a( D$ D7 {  p

  40. 9 i- T! M$ O2 _& A1 y" B9 A, c) f
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)
    ( M1 c3 L+ w5 u4 x9 N' s7 J! B
  42.   {
    8 s5 Z) z. ], g- z; R+ h2 P7 W% W; J
  43.     Error_Handler();
    ' _3 m; \2 [6 t2 K' \" p
  44.   }0 U# U% D: k, d: F$ @) A6 h$ F& k
  45. #endif
    : B" z( V5 |' E. A% h; y0 ?
  46.   & h0 z+ x6 R2 A7 |# D9 Q
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
    % @$ c3 C; C4 ~/ E: z5 t! a" `
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    5 z9 V3 u4 |" z6 d2 {. @* Q/ U1 v
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    & v5 k" t- R- X3 l& W9 q/ H' K
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);! `3 q0 }) x! k  |- m1 a
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);. ?; b. I/ U! ^6 J& r
  52.   UTIL_LCD_SetFont(&Font24);1 K. K/ x2 V# }, L. M
  53.   
    ; c4 t! Y  j; w7 t% v8 v4 T5 m8 y
  54.   while (1)" g5 k( w  ?/ q$ b3 }3 q5 F; ?  h
  55.   {
    % y5 N  s9 \" d$ y" z0 \2 n
  56.     switch (i)
    # F" I4 W0 y" S* ^2 `& _0 \
  57.     {
    4 Y. Y! c* I- y9 T& o
  58.       case 0:" k# T* x& Q1 ^3 u: E% X
  59.       {
    # X9 @7 t. F. F3 v
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
    8 v7 m6 A/ v" n+ I; g( D
  61.           break;4 U- h2 W  f" x
  62.       }
    8 Z" z. [# @. G" T* I( o7 ]& b
  63.       case 1:
    , y0 d! ]3 B" `6 e9 X/ S
  64.       {
    3 j+ V6 z* X- c( [
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    5 K' k3 m  v" F) [- i
  66.           break;, z8 y& j8 M" j+ @2 m% D' f2 p' N
  67.       }
    5 N" h* Z+ P' L+ h  m0 w- n
  68.       case 2:
    4 f8 f9 `1 j7 ]% F/ W
  69.       {) ~! J3 l& q7 h3 y6 x; b- A
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);, M% d" O5 M9 b" S6 b3 U3 z  M! b& W/ H
  71.           break;
    6 [4 U" M+ R8 ^: Q
  72.       }
    5 U: C. a" }/ @  Z2 G' c
  73.       case 3:0 W" P/ D: K+ k% ^! Y
  74.       {; C9 f8 d7 C1 d. H, O
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);) n2 o- Q# }7 ?/ y! }
  76.           break;
    9 a; P0 C/ Y# O- T$ v1 _) p/ _
  77.       }
    $ J; E" `0 w1 Q' T2 _
  78.       case 4:0 x4 _8 V+ S3 t. T! Y
  79.       {
    ! u+ M9 Y: P: n5 [( y) x
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);
    7 S. U( j  T3 [3 J! O+ ^& w- |2 {
  81.           break;/ {9 p$ Z9 O1 J0 ?9 R3 D7 b
  82.       }
    + W6 t/ X6 n* K* n9 M0 h% `. ?
  83.       case 5:4 T' @0 l* \5 p" [2 d
  84.       {
    ; {+ t* ]7 v) l" R
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);
    . g/ w# e5 c) J7 q  K
  86.           break;
    ' N2 _  ~0 A! r! h
  87.       }% ~& v2 p. V! p5 X! C
  88.     }, g- F; \0 U4 O/ y+ \1 o" n
  89.     ( @7 _5 w; y& q# _. d2 r  I1 ~
  90.     if(i==6)) f8 t9 G" z/ M8 [
  91.     {7 |: W) Z- @+ M4 C- u* ]
  92.       i=0;
    ! s/ `! b6 `; T" C
  93.     }' {8 U8 W" `3 A# R2 d1 V0 i$ F
  94.     else
    1 D9 @. c$ v+ @5 G$ a
  95.     {% ?* x9 z/ Y( ~' M4 p, J
  96.       i++;
    6 B1 ?' z% [/ h4 i3 W/ S7 u5 U
  97.     }
    % ~4 c+ v( G% P
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);" C$ x- h' l; }( V0 T; G0 B7 G# k
  99.     BSP_LED_On(LED1);4 j# a: D: M. k4 c# a2 \) T; V! V
  100.     HAL_Delay(500);  V, ^% X4 N6 [" K- B
  101.     BSP_LED_Off(LED1);7 v# I' N4 S0 m; ^
  102.     HAL_Delay(500);
    ! N7 ^* x( x3 [" c9 u% P
  103.   }
    * R& K: Z7 K: `* }6 v
  104. }
复制代码
! c% O9 `6 S# l1 o3 W

3 p) g& z6 w4 S& _0 o
" m$ ~+ Q6 T3 `$ u" ]

8 s/ ^* m0 T& D, X6 ^. l2 O% a; b三、结果8 N, }2 X( c1 U, f

4 a$ h" t& n/ g3 w

- S3 m" G  l; v' F' q9 ?5 M! Y下载程序到开发板,运行开发板屏幕显示如下:
( t+ ^) z  p5 R# C4 K- g lcd.gif
6 L: a3 ]1 c0 _- t6 u' ?8 y! q
( A3 }! c! d, [) {% u

% Y5 Y1 }" V4 w% i4 Z6 i
2 U- y) w  q' }+ r

$ o1 J6 T3 M4 G% Z2 G4 u$ g5 g
收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似分享

官网相关资源

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