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

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

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

- c+ z6 h2 g# e5 C& R8 K1 v2 X3 G: `( u' l7 b
5 U4 r; F) S, Q" @( a: C* J2 \5 C
一、硬件部分
& @$ m2 G5 K2 ]" M9 ~1.1、LCD显示屏硬件接口部分电路5 A: R% C  K8 I" R# A" s6 d
lcd.png
* b* \/ ]/ K' M- E" y6 ^, P
  |1 H' Z. D/ O" ?# ?' U. ]: w
1 c: S! i. p( P+ ^, x

' Q" \7 o* L& w2 u; i: [6 j7 t
) U: N4 r0 K1 O7 x, [

# C, M2 h; {1 E4 F/ C- L1.2、LTDC显示内部框图
$ G1 W3 G; f9 C* y* [( X7 t( n! bLTDC可驱动24位的RGB显示屏,内部有两个显示层5 t) h7 ^7 R! ~" _
002.png 9 N+ q: z: [/ |+ k. B5 ?9 G

% v5 }% R0 B+ u- @, A, T! u# ^+ n% r! p2 n' T4 \, I! o" ?0 H. O
( n2 J/ X1 f5 s5 V+ G
二、配置LTDC
0 q0 g: e1 q5 n7 w5 h! P7 I, V# ?0 C7 v! d3 a+ G2 |
2.1、屏幕的参数设置, b  k1 ^! |) P6 i" D7 l/ ?) h. V
003.png : f, @% T) ^9 `2 F6 t

6 d# i8 \) P2 o$ {3 O' A1 v! g" N8 G* C
9 {% e$ y3 b  y+ u& N$ T% e7 E2 L$ L
2.2、层参数设置
% F( I; |/ G, ?/ w2 g 004.png
; Q8 B/ B7 w1 Y7 f0 X8 P

5 u3 R3 F+ S9 h: u2 O$ _' z! p; n7 \4 P) ]* w: S

+ \* S  |( k- Z6 d" g$ z2.3、LTDC引脚设置& d2 j; [) b& d! d; E4 i; ]; ^
005.png + Q7 S6 \7 n  @/ ^# R
# Q- W$ K% g% G$ B  Z) r
6 ~& B, I" W  i8 ^# g8 I

3 P9 P8 A5 r! G  k三、程序部分' E0 S) v5 m4 F+ M! K  X. [. j

& v% o; Z" h" W3.1、在项目中添加LCD驱动程序
, @# W! v' R4 ]7 d' l使用官方BSP中的LCD驱动程序1 u* x7 I3 B0 b
stm32n6570_discovery_lcd.c
& T4 `0 }8 c9 J; w9 k2 o' L

# J3 q& n7 g# j& ~! q! v
  1. /*** v3 H. t  x, I" v' I0 p1 r# G+ y
  2.   ******************************************************************************2 r0 ]$ S  M: n/ G% x3 h- L. [
  3.   * @file    stm32n6570_discovery_lcd.c9 s: ^, \! a0 u$ \
  4.   * @author  MCD Application Team! `* G7 e) L5 o
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module9 O3 x: b4 {6 [6 q) f
  6.   *          mounted on STM32N6570_DK board.
    7 F2 x; R2 F$ E' T2 B5 L8 T
  7.   ******************************************************************************5 C* [! L+ B5 V( [# Q
  8.   * @attention
    8 B6 ?4 d. k3 z/ @- g
  9.   *
    - O4 I+ g: z% M8 w3 X4 p4 V" S# Y
  10.   * Copyright (c) 2022 STMicroelectronics.
    8 _! @1 i- c  s" e& e. @  R) |9 x! M" ^
  11.   * All rights reserved.2 [7 b! {, Q  D" N
  12.   *
    ; t* Y$ p/ ^0 _
  13.   * This software is licensed under terms that can be found in the LICENSE file
    ! E& T. h+ F$ e' U8 E. h
  14.   * in the root directory of this software component." F& @4 j, \; f5 L
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
    0 n: W0 P( ?3 Y; a
  16.   *) U  F2 u. W; J
  17.   ******************************************************************************& \) S, Z( {0 u6 k) b
  18.   @verbatim
    0 d% z5 x# G5 [
  19.   How To use this driver:" z4 s  h7 |& K2 V1 Q8 b8 b! i' s
  20.   --------------------------1 ~- \2 ]& T( G3 {2 U9 y
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.
    ! r+ g) ^5 P5 u0 `' ~$ f4 y
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component8 ~1 n3 `4 e$ H
  23. ' g& V; B- [# X: I% v5 K* B9 S2 G
  24.   Driver description:
    - t7 g7 r0 h6 P4 c5 V6 [
  25.   ---------------------7 ^; P, F, A' t5 [, @6 V
  26.    + Initialization steps:
    3 X/ `  r" \* w- p# O/ m) y( Y8 h
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the
    % v% S" h! Z- L& Y8 h) F
  28.        following settings:; D, ?  _4 `4 [/ i
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB8886 K2 C, p( A6 m: x, ]( E
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.; i7 F7 e' z/ R& C& S* D
  31.         - Width       : LCD_DEFAULT_WIDTH (800). O8 \) `# H, k1 C
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    + Q  a7 [. d/ m: J! w" S
  33.        The default LTDC layer configured is layer 0., x+ k1 S; z1 u: e3 P- ~4 w! o
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:* L! v! Y/ \, L; F3 j( x- B. m
  35.         - MX_LTDC_ClockConfig()
    : U: M; S- n" g; u
  36.         - MX_LTDC_Init(). C/ h* _4 U% J, W# w
  37.         - MX_LTDC_ConfigLayer()% F' @6 k* x/ n+ T7 X' `/ W

  38. # k2 T/ a5 W& r% L& b7 n) r
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.
    7 N1 ^, A9 c" o5 C* T
  40. ( @& d, T0 l- W7 ~
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.
      {; W" i- e7 v: @. W
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.
    " e; D+ u0 W  G. D, j; i
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    + X+ G  W+ j2 I5 ?5 W% l: ]
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.' b5 U* H) T: @/ {# n+ I
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function./ c) q; ~; R7 @. p
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.
    0 d9 B% m  x1 D! D! K% r
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.
    5 r' S' n& ]8 y
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.
    0 w$ F# x5 w  _5 F- I; R7 |" _! d
  49. 3 v5 Z( H" b! z4 o1 y4 H
  50.    + Options/ u( Q, {7 K$ B+ l
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the
    ( v) r1 s4 a2 n
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.; z* r/ @, K( x* ^. i" x
  53.        To control the reload mode:/ \) @( M  q) i
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE
    6 j- y1 Z( b$ z" d
  55.          - Configure LTDC (color keying, transparency ..); A  p- \2 r9 r2 O; X. i& x
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE% c. z( `! c3 X7 k
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload
    6 a" u/ z* o' H8 m
  58.            in the next vertical blanking/ s, F& P- }. e
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()
    3 x5 X0 ]$ `! G. w6 r7 G
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()
      Y7 M, a; }0 M  n
  61.      o Configure and enable the color keying functionality using the7 C/ Z+ y, W/ f( \
  62.        BSP_LCD_SetColorKeying() function.
    + r% d: w& @5 z+ Z
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.
    3 x7 R; N6 ~+ x: _* G0 H$ e( @" d! h
  64.      o Modify on the fly the transparency and/or the frame buffer address
    9 G4 P% w& N' m3 [# d' Z
  65.        using the following functions:
    % {2 H! D4 @1 N  m' X0 _- N
  66.        - BSP_LCD_SetTransparency()) ]; c2 C9 B4 A* P& E; A
  67.        - BSP_LCD_SetLayerAddress()
    0 {) Q4 L8 A, g* p! a

  68. 9 k2 ^/ \" w1 Z  e
  69.    + Display on LCD
    9 b6 w  z) G7 x1 }+ x8 _
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)+ y+ s1 v5 }0 n6 ]3 _% R
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,( S. t7 Y( @& h9 `9 T
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers., O8 f. f* O2 j5 E
  73.        The basic gui services, defined in basic_gui utility, are ready for use.
    $ K0 L3 [( ?4 o1 q2 ?( h6 q& K
  74. 1 }: W- O: T2 V: `1 m& B) }
  75.   Note:4 Z. k4 T. o8 ]8 u
  76.   --------
    ; P0 }! x# i* G  D* g
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select1 i5 u6 k1 r' g$ p2 E
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this
    ! ?5 |9 y) p( V* y( H" H! `
  79.     parameter should be 0.
    * V3 _5 |8 _7 u1 o2 H
  80. . N; F" }' q" I8 s' L# R$ Y
  81.   @endverbatim7 Q: S; R5 q# M; i; @* n
  82.   ******************************************************************************' T9 g9 g6 v8 F! Z
  83.   */
    / ]+ d. V9 E5 K2 }

  84. % _7 H$ |9 G# X0 u: B
  85. /* Includes ------------------------------------------------------------------*/5 V  B: S0 x' O$ _- x
  86. #include "stm32n6570_discovery_lcd.h"& u: {/ Q8 \6 e

  87. 9 ]5 Z/ `* J. \2 |
  88. /** @addtogroup BSP
    3 q8 d* [* ]0 Y0 B( Q
  89.   * @{$ n3 [/ _3 u- `5 p6 G1 Q
  90.   */' s3 M0 q7 |1 T, h7 ^

  91. 2 X" n. |  h2 L* Q
  92. /** @addtogroup STM32N6570_DK7 ?$ ^! y9 I1 Z' O' L
  93.   * @{9 h( |! ]& [9 q" O) K1 V
  94.   */$ G6 U0 F) c% c! Q! s

  95. 4 G7 r. {8 |: N' F& u) w" S
  96. /** @defgroup STM32N6570_DK_LCD LCD! Z/ ~3 Q( D. V
  97.   * @{7 ^4 P. {7 n8 ?: p2 S! _
  98.   */
    6 s  \0 T- ~$ T* R4 G8 p
  99. 2 L, M+ ~. L1 |' ?  a. t8 @8 a
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables# X3 l4 s. y1 @" @; g* I
  101.   * @{6 f1 p# m+ B6 G- Q0 b: Q: |
  102.   */( O2 E% f, u4 @

  103. ; ?' Z9 z+ U5 h; K) A3 H
  104. /**" e" c/ ~3 R8 w8 O9 D% w0 w% q
  105.   * @}
    ! u- X3 z# O6 k
  106.   */& l: b9 x8 O0 m
  107. % Z, e2 T6 L, m+ z- u
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions" N  N5 j- Z# U% p* U' f4 A
  109.   * @{' B2 P  b4 a3 H) M$ u1 ?( M# ~
  110.   */# Q3 a  @( Q/ X: `) [- \( e
  111. const LCD_UTILS_Drv_t LCD_Driver =
    : @% Y# O  l* v! r9 l; C
  112. {9 z2 _$ w# I% d$ ]  a( A
  113.   BSP_LCD_DrawBitmap,2 o/ `, A' d# Y4 U# `; _' _
  114.   BSP_LCD_FillRGBRect,( G* _/ l, o8 H, U
  115.   BSP_LCD_DrawHLine,9 L2 W4 b4 }$ N3 B7 B
  116.   BSP_LCD_DrawVLine,) O( k. K# l9 Y
  117.   BSP_LCD_FillRect,
      j; t  s1 k9 ^4 U
  118.   BSP_LCD_ReadPixel,
    0 R9 X+ S: x2 G1 i+ }" g: w+ l
  119.   BSP_LCD_WritePixel,* \9 T9 f" w( Q1 S4 w! X
  120.   BSP_LCD_GetXSize," e* ?* I9 Z% ~6 S+ u4 R, v
  121.   BSP_LCD_GetYSize,& ?/ j6 a+ f6 G4 [; A+ d3 L
  122.   BSP_LCD_SetActiveLayer,
    5 {$ _( J0 {2 b% w! ]! Z! j
  123.   BSP_LCD_GetPixelFormat2 T* I4 i5 g# k8 p+ k
  124. };* w! x+ p" P  j6 m

  125. ; v0 z+ a$ p0 q9 p5 B% {
  126. /**
    , D. F* d  u/ ?5 M2 c% Z- R' o
  127.   * @}. W+ a, U5 ~: h; ]) F
  128.   */
    " x1 G  g+ k9 o
  129. & v! F2 }6 V" u2 H6 x- U& R: P2 Y
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables7 C, P3 K5 x6 ~! a
  131.   * @{
    + J6 r8 s, W/ k( v9 w; \( `
  132.   */
    9 `! {# E) D& B- d* h
  133. DMA2D_HandleTypeDef hlcd_dma2d;
    ) l' x: `4 Q$ d4 O0 `3 F4 g2 W0 w& K
  134. LTDC_HandleTypeDef  hlcd_ltdc;2 M. B6 b6 N. y' v% j+ b
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];' W( [- J; L) \; c! y8 Q
  136. /**
    ; Z4 J2 i7 ]. c
  137.   * @}
    2 s1 O* S1 V' j8 Z
  138.   */
    * ?; Z$ t3 `$ U
  139. * K5 |5 W* S; g
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes
    6 }  N: p# T& k7 u" ?3 G7 s) t
  141.   * @{/ P/ U4 J: f8 ~+ n
  142.   */6 N5 I( U8 e" x3 d* h' A+ @, K, y+ ?

  143. 2 @" R1 I: W5 C5 E
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
    ! L/ ]9 A* e4 W8 `
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);% h$ w! T/ w+ F" E% I
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);" `4 Y% Z3 n- a5 Z4 d& J
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);) i2 R6 k: r* }9 y+ j+ n: ?/ ^
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);
    - K6 E5 V; z/ G- \& z1 `
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);
    ' {4 u  f( Q: M- m* x
  150. /**3 j4 ]( L+ ~2 r4 w4 L/ k8 a- k
  151.   * @}
    0 @* u8 _5 X8 @, M9 b! C0 e0 \
  152.   */# w  E* ]& v3 ]+ S8 f
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros
    1 Y' z7 @1 f; k8 ^5 F" Y6 I
  154.   * @{+ [- K0 T9 B  H' Y, r
  155.   */3 r' g) Z* Z9 W" n( M2 H. \5 Z& w7 e
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\1 N+ T8 L0 m( }: A' B; `9 k; e# S; J
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\' R: f8 T5 U( Y* |; l1 N% u
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))
    0 O1 G% [& W6 R+ {  K+ `

  159. & k5 {& Z/ v# n6 W+ L2 q9 m
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\- s8 b( X' |& }; ?4 k0 L* x
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\
    0 `- k9 @" I- o, y
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\3 [3 W/ V+ k( V/ ^1 X2 ^0 g! I
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))% b; C3 q/ O, s: u
  164. 7 V6 x. @6 H( h
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    . g$ ~8 W7 H4 j: v

  166. 2 A' G4 D" b6 _
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)
    1 J4 Q) K$ R1 o" G1 e3 n0 a" g
  168. : w+ @% |2 m2 Z0 P5 v% [# R6 b3 Q
  169. /**
    ' @5 `& n* e4 {3 ?+ o6 E
  170.   * @}$ F, E0 `. \. N7 x2 |5 `
  171.   */( y0 {- |% ~& R3 W* ~7 |" q  ?  X

  172.   C! r6 F: B2 }  e0 E
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions
    2 X3 ?5 \9 R$ @, D) u
  174.   * @{
    , C4 \) B: P3 s; G
  175.   */
    * ]+ J% k* s4 f/ \1 ^
  176. /**- T- Z( @; X% Q7 ^3 i
  177.   * @brief  Initializes the LCD in default mode.) ^; _' r& n) s9 k: t& n6 `5 U/ e% y
  178.   * @param  Instance    LCD Instance/ n* b! s' e3 }- l5 m
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE/ Q. h3 M  ?1 _4 |5 }# ^% R: K3 ?
  180.   * @retval BSP status
    5 `2 ]- F; o4 Q4 A* i
  181.   */
    6 X! L" {' Z+ q+ k
  182. % S( R6 F2 i/ C. H* p2 }! Y% E
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)* K% K$ A9 k) C" O
  184. {
    # t' _0 t- m; I; c  R8 m: p
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
    2 U/ P: x$ j  x
  186. }. k# n# ], s7 I
  187. 6 @6 v, k. i1 ?0 ~$ }" l
  188. /**! N' R  s/ D% \9 }$ }. U
  189.   * @brief  Initializes the LCD.; a5 u& E& K( m7 V
  190.   * @param  Instance    LCD Instance
    4 S; _& Y; d" M/ @/ C# e
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    # j- I- p! Q7 ]# W' h8 W
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888" v0 x$ l- g+ @1 W
  193.   *                     or LCD_PIXEL_FORMAT_RGB888( P  _( x5 c  I, ]( o
  194.   * @param  Width       Display width
    3 m( _9 M1 a5 n1 B5 K: t" ]
  195.   * @param  Height      Display height2 \; Y; J: ?( n" C( [& m  M8 Y
  196.   * @retval BSP status% K9 W5 ^/ o3 g, a. g2 S
  197.   */
    ( c5 L2 X0 `% ?& p, E5 M; v. a% o
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)
    ) v! }( t! }6 X2 t
  199. {5 V8 R# z% `  _% P
  200.   int32_t ret = BSP_ERROR_NONE;
    ; K1 u% a, K( `- V$ W% y
  201.   uint32_t ltdc_pixel_format;
    % v0 H" B  O) J0 Z$ N
  202.   MX_LTDC_LayerConfig_t config = {0};+ h: s* Y$ C' s5 g- N" y- [

  203. 7 b2 M! a' e# `' d! c* p/ [
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \; B# e) D' @# q; _' {. O
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \. F" a0 ~5 S7 f: M/ Q$ Q
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))2 Z: W; Q. W6 u- F8 l
  207.   {1 _2 G* r5 G( X" ^
  208.     ret = BSP_ERROR_WRONG_PARAM;
    # p  W. f: b, y6 B& ?! h
  209.   }' J3 d5 \: U0 f6 k* u, I" a
  210.   else# T* b# T& J0 |" P* V# W% y
  211.   {
    6 H$ o: u7 w0 O2 s9 S- E
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)' Y; W* i- `  V# V& f  C& ?
  213.     {
    . K0 M2 P) |: S6 s% z/ c7 O
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;
    % D7 g! f) J" {* @
  215.       Lcd_Ctx[Instance].BppFactor = 2U;
    ; P+ i  P  ?9 D& @0 H
  216.     }& r0 n5 i3 W) Y- r# \0 [9 W
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)
    9 n% {5 d6 X+ p& c/ Q
  218.     {( s$ Q5 Z" u9 E- F" y5 {# |
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;6 Y! h$ D: I. P4 t+ }) J. n1 @
  220.       Lcd_Ctx[Instance].BppFactor = 3U;
    " q/ @( @8 ?7 p
  221.     }0 e8 n, n/ p; u
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)' f' o" I4 j, a  w& H7 q0 S
  223.     {+ g# U4 K& {9 P1 ~
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;
    7 u1 [+ @: J- u3 c7 i* N2 J/ S6 l
  225.       Lcd_Ctx[Instance].BppFactor = 2U;
      ~  j  O9 H" m, ~9 C
  226.     }
    6 |+ R) x/ q* s( f& m3 a
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */# R1 ]) G- x9 P9 p$ i
  228.     {
    ! h- Q. k3 n* b8 W( \
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;8 o# k7 [) S+ y! A1 {
  230.       Lcd_Ctx[Instance].BppFactor = 4U;
    : q: F0 \7 A$ ]* V9 D7 a
  231.     }  x/ {- G7 V, ?3 q

  232. " R7 R4 N$ f: J6 ]
  233.     /* Store pixel format, xsize and ysize information */6 `, R0 B( c0 f% c1 m9 [
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;
    6 k8 w* C9 G# T+ G) x( d; M
  235.     Lcd_Ctx[Instance].XSize  = Width;
      w6 \) G# D6 }, {  [- j
  236.     Lcd_Ctx[Instance].YSize  = Height;
    5 Z" S9 [! b' v7 l0 i5 Y$ m# K
  237. ) m. t; g( J' @, e& g
  238.     /* Initializes peripherals instance value */) {: o9 C. P  R7 G- H
  239.     hlcd_ltdc.Instance = LTDC;
      J6 R+ G# C  n+ Y! w
  240.     hlcd_dma2d.Instance = DMA2D;
    " ]' P6 D' W9 L9 H1 `* x; @5 n

  241. ' z! b2 y+ ^+ F' N% b
  242.     /* MSP initialization */& f' l7 `. A! e* M. P
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)$ J0 J7 o7 Q2 B# y0 S& B* q
  244.     /* Register the LTDC MSP Callbacks */
    . q, s, O, ~- P7 m7 f' T' ^5 H% N
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)
    5 \1 N( e! v, R
  246.     {
    ' ~/ @8 e$ ?; _5 k0 b' l
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)& c! i( C0 T/ h( U7 e3 ~- }% c, @+ I" X
  248.       {4 O: Y' g- q8 e& g+ Z
  249.         return BSP_ERROR_PERIPH_FAILURE;$ x4 x" M- }! D# k
  250.       }! g% ^( x* _7 \5 ?  F0 |* L* o& L
  251.     }- s* x# K/ M: T9 ?2 m0 y
  252. #else, j0 Z$ l" o; n6 G1 \6 r
  253.     LTDC_MspInit(&hlcd_ltdc);8 J# h* @" Y' x; s2 I) A
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */4 e" {2 K/ R  X- W' ~# b4 e0 q

  255. ' N1 b* B6 e1 o! \
  256.     DMA2D_MspInit(&hlcd_dma2d);
    $ Y( R4 I% N" O+ d) q# r7 P. f
  257. 9 X2 k  s  k8 I% ^- Z& n
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)! E0 c9 T: [4 [
  259.     {, `- A8 S- w* V, `
  260.       ret = BSP_ERROR_PERIPH_FAILURE;) {7 r- Q. D3 x+ i% J3 n& r, h
  261.     }% T* N$ ~3 d) u$ C2 V7 p* j
  262.     else
    : r: U6 y5 N; A+ p
  263.     {; n( O9 @9 ?  `: g, j$ R: ]  w
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)
      D7 w5 w, o7 L$ B  ?7 g. N
  265.       {
    $ b( \7 ]) H; N2 p
  266.         ret = BSP_ERROR_PERIPH_FAILURE;
    7 i6 p+ o/ Q! A1 B. k
  267.       }
    ( f7 z; }' J. E" q2 R( `
  268.     }" {6 w; O' P$ N5 l  G0 D, I, [% O& V' x/ g

  269. & `/ I$ I2 Y- Q: k$ l" S& A
  270.     if (ret == BSP_ERROR_NONE)0 o, D5 M- k6 a1 i. u& U6 ~
  271.     {9 J& \- l$ P1 K" b
  272. #if defined(DATA_IN_ExtRAM)0 B- H( s# V$ K2 l
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */
    % y% c+ h- T2 s; |1 k4 q
  274.       /* Initialize the XSPI RAM */
    ! }( V1 X) s% W9 c" Q
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE), z* {# m" V: `% R
  276.       {0 W$ y! L# K* n3 F$ F; j! u
  277.         ret = BSP_ERROR_NO_INIT;
    " Y7 h& Q2 f3 j% w
  278.       }
    & Q2 e! @3 o5 Z3 w
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)( C) k) I4 h5 R7 d5 e# c' [) d2 @
  280.       {
    ( e9 a; ^) }- I1 O
  281.         ret = BSP_ERROR_PERIPH_FAILURE;
    ! |$ L7 [) c$ B8 M3 }
  282.       }: m! G5 U( p1 o
  283.       else& D  _9 M/ k& ^7 ], _& o/ C+ P; D
  284.       {
      q; T5 w& [! U' v. L
  285. #endif /* DATA_IN_ExtRAM */, C3 c$ E2 P5 f5 ]% u
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling2 N: S' X2 e! X3 @+ R
  287.         BSP_LCD_ConfigLayer() at application level */5 s. B4 n, w$ X$ @
  288.         config.X0          = 0;
    % m) g3 I6 ~+ i% X! K! J9 L% L1 w8 U
  289.         config.X1          = Width;
    1 M  U$ b* \5 {& y
  290.         config.Y0          = 0;# L3 V6 s  ]$ T
  291.         config.Y1          = Height;4 ?' Z; E( |) e# ^/ H! n
  292.         config.PixelFormat = ltdc_pixel_format;
    . m* \. k5 [- w' m
  293.         config.Address     = LCD_LAYER_0_ADDRESS;, u! s& Q+ K; F1 b' x6 U
  294. ) T5 j% F( J4 _1 f4 w" ?2 y8 e
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)
    9 e" Q  u& }& B5 q; W4 j
  296.         {
    . \* r- ^, l- y. }
  297.           ret = BSP_ERROR_PERIPH_FAILURE;; n/ j+ L0 N9 i
  298.         }9 _+ s/ @7 h) H( `: a3 o* Y

  299. / U1 V  k9 Y7 _# U! q
  300.         /* By default the reload is activated and executed immediately */) v9 p" v: Q, }$ w' j
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;! C" L5 x# A0 R! U
  302. #if defined(DATA_IN_ExtRAM)$ u3 W- B! B0 ?& [+ z! c
  303.       }; g! U5 d$ d5 T
  304. #endif /* DATA_IN_ExtRAM */5 b' u  q0 i! Q+ A( W! T3 k! b
  305.     }
    & e; ?1 E& V% t$ G: P0 ~. O
  306.   }6 B  R" W  K" u6 _9 `

  307. " Q0 e6 f# \- k; u( D6 f/ Y
  308.   return ret;
    ' H- Y% f+ S1 z3 M/ I: ^9 q" J
  309. }
    ' ?1 W+ t+ n+ n( p* E( I: \  B

  310. - z) b9 `/ m( {
  311. /**
    # S8 h4 m1 d$ K4 d4 {
  312.   * @brief  De-Initializes the LCD resources.. _, H: ?& T$ C; q9 q
  313.   * @param  Instance    LCD Instance" Q( U8 \5 [2 [6 `! m6 p
  314.   * @retval BSP status& P' H7 V" s4 F! F$ S$ f4 f
  315.   */
    % D; J5 U; c1 _+ }
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)+ d' E5 H4 X9 I# E! g  A; {
  317. {5 Z/ d8 p$ w) F
  318.   int32_t ret = BSP_ERROR_NONE;
    ) K9 |7 k: j  }, S6 `2 H# @

  319. - H$ g' x9 x. g2 G
  320.   if(Instance >= LCD_INSTANCES_NBR)
    0 Z" @' h/ U* x/ }. h$ s
  321.   {
    ' _- i' f' F; t, X! s. u6 Q
  322.     ret = BSP_ERROR_WRONG_PARAM;  w) O0 X. l+ S2 y$ o6 l
  323.   }
    , @0 r  y1 T( M5 m; s3 g6 I3 d
  324.   else
    , C$ y3 A7 `& Z  L  v7 W& B
  325.   {
      u9 ~. ^7 d2 G
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)+ u; f/ s4 v) p8 i: Y9 _. H. c
  327.     LTDC_MspDeInit(&hlcd_ltdc);
    1 R$ e/ H& C. I, S  g
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */+ f+ g4 x4 N# W& f

  329.   N7 Q* t: T. @" k, g
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);9 N6 I/ j1 b: |4 t
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)( F9 B& B$ H; i) k2 }
  332.     {3 @! S% w+ e, K6 ^7 N
  333.       ret = BSP_ERROR_PERIPH_FAILURE;
      i% T+ s, Y& e* j
  334.     }/ F9 \& c: e1 T2 @0 [$ f
  335.     else
    3 I( |. G7 P9 G7 @
  336.     {
    7 Y7 W! V5 C) q4 r% a. K. o% g) t
  337.       DMA2D_MspDeInit(&hlcd_dma2d);. p9 _. n: {" {, y6 H. l
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;7 U5 \, d  s$ ?* e& j8 L' i
  339.     }
    / D) D3 F* H/ }! A. m
  340.   }) x8 }1 l' n! G  i2 Q
  341.   [1 [" Z* \* ~/ [7 R; x
  342.   return ret;- V$ b# t% \2 k
  343. }
    9 i# Q5 h% Q3 X
  344. 9 D7 a9 o7 l% e, B( a; A
  345. /**
    2 ?* k8 a" Z% l, l
  346.   * @brief  Initializes the LTDC.
    5 p6 G2 g/ I# v
  347.   * @param  hltdc  LTDC handle7 g5 V) m' }6 U7 r3 I) h
  348.   * @param  Width  LTDC width
    # `( G: Z* I' b0 u/ O8 `; ?
  349.   * @param  Height LTDC height; o! }, ~9 `) e6 j
  350.   * @retval HAL status
    6 O! A8 ~2 S4 W% L. d
  351.   */7 D; o+ U8 Y. j( E5 R2 w- r$ I7 k4 j# v
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)* V: `, s# \# z) E7 n
  353. {3 I0 I$ S# x6 i0 c* Y
  354.   hltdc->Instance = LTDC;) T6 a9 s0 W. K" J3 Z0 ?/ B
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;+ M5 ]7 S+ A, k8 d( s8 w
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;
    : a: ^# ^0 g8 O9 K9 C3 Z7 I
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;
    0 X! X3 j" s  b
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;
    6 Y# ?; `( a0 }/ b7 f: X8 v% ^- x
  359. & B3 O4 e! s& u, }8 C1 j
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;
    ( e8 s* w6 V( }/ V9 O: X
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;
    * o+ e1 w/ n3 R! `. n( }
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;  T( d$ Q% A# i
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;
    / E4 y, E3 i/ C1 _: t/ Z, D( @( r2 J
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;
      l1 j2 M8 W7 Z) N6 i/ r
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;
    - U! H; g# Z& e; c2 h- t0 Q2 K
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;
    ; p  H5 m% X1 i; o7 w9 \7 S: l
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;
    8 U2 l: \" P. x' ^6 S

  368. ! W, C/ x% o/ C9 Z" f
  369.   hltdc->Init.Backcolor.Blue  = 0x0;
    / ?) r: x  Y+ K/ t4 c
  370.   hltdc->Init.Backcolor.Green = 0x0;
    9 Q( P$ B+ V4 B, J0 ?
  371.   hltdc->Init.Backcolor.Red   = 0x0;
    3 x& u/ G3 c) ?) z  Y
  372. $ _9 M6 {; j  O
  373.   return HAL_LTDC_Init(hltdc);
    $ n3 k  `2 U8 ~8 p+ K5 U" Y9 o
  374. }
    ( r( F3 h( G/ M6 z! o
  375. 7 E# Q* u/ V/ @8 M1 {( [! s
  376. /**. k, T3 F) `, ?( c
  377.   * @brief  MX LTDC layer configuration.
    3 {! I8 d- y" m6 w: E
  378.   * @param  hltdc      LTDC handle& g% U: K3 h3 W2 {& V2 h" k% z0 G
  379.   * @param  LayerIndex Layer 0 or 1. Q9 b  K  l) s& v( _! A3 W/ l$ r$ s: ^
  380.   * @param  Config     Layer configuration
    ' z; ?, V8 ?) h. w7 f, M1 U3 b
  381.   * @retval HAL status+ j+ L! Z' e1 |% S
  382.   */
    $ j5 q$ n9 n8 E5 F5 E
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)
    ; |1 [3 H2 G: H4 B5 ]& o0 M9 h% [7 e
  384. {
    * k) M  M8 }+ }$ i$ f
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};) v0 @% b* H0 ^+ ]

  386. $ s; _" B( k5 Z
  387.   pLayerCfg.WindowX0 = Config->X0;( z7 U: e5 b: n6 C- R. T) {, g
  388.   pLayerCfg.WindowX1 = Config->X1;
    2 H* ]( p# P4 b0 Z9 p5 S% z7 i; o
  389.   pLayerCfg.WindowY0 = Config->Y0;
    ; ^. C& ^! [6 m9 @+ ^
  390.   pLayerCfg.WindowY1 = Config->Y1;1 O/ B; l( ~0 m6 X6 |: e
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;4 @0 R4 R$ N6 e* H
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;
    ; w) ]- |" V& L" ^' R8 {$ c
  393.   pLayerCfg.Alpha0 = 0;
    * k8 T1 H1 q$ ^% g6 }3 @% X
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;/ \0 g" v: b# x) T# p) U* O
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
    1 ?' ^2 t2 V/ a1 e( {# |
  396.   pLayerCfg.FBStartAdress = Config->Address;
    ) ~2 R% Z+ O+ u- u8 C' X7 s
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);
    & K0 m. Q6 \/ ?5 c8 M' ?; h) A
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);
    & C0 Z5 e& [) t3 V- d! P, _
  399.   pLayerCfg.Backcolor.Blue = 0;
    6 Z+ m+ w3 n! N
  400.   pLayerCfg.Backcolor.Green = 0;
    8 y$ |, X+ A$ H' X: L! l) ?
  401.   pLayerCfg.Backcolor.Red = 0;
    ; f! w) j- E1 g2 y1 ~, P
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);
      f+ L; g& C# f: l1 b4 D
  403. }
    ! I+ ~; e8 ]* T/ `) e" J/ J8 @
  404. 2 l: u3 F" _' y6 {  k8 u6 G
  405. /**2 b1 A$ _5 m3 m4 `+ J- ~1 Y% @
  406.   * @brief  LTDC Clock Config for LCD DPI display.1 w; y  J; r9 d  h$ d# G: K) f2 A% {
  407.   * @param  hltdc  LTDC Handle. l' R: |$ i- L8 V' z! f, u: M
  408.   *         Being __weak it can be overwritten by the application* h, s1 X& W7 Z0 {' t
  409.   * @retval HAL_status
    , x1 V4 ]8 A: u. b8 y( p; T
  410.   */" X8 s. I5 [  T9 N& e+ J% v
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)
    7 Z, ~' y# v$ ~) `
  412. {: u, D! ^- L9 x. h
  413.   /* Prevent unused argument(s) compilation warning */" j) P4 D" R  l/ c* \
  414.   UNUSED(hltdc);! g3 @3 b" w% t5 C& C" ^
  415. ; Y. H4 z8 l) n' ]# u
  416.   HAL_StatusTypeDef   status =  HAL_OK;# p, v' J0 _) P! D' U& h5 t0 z
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};& K# E) b6 Y( L3 g+ C

  418. , v. r" c0 T1 w+ `$ _: L& ?& u
  419.   /* LCD clock configuration */
    $ [7 `8 H$ h, V! \$ U, @
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock *// H3 g2 k* s  b
  421.   /* LTDC - PLL4 */# q; P; ?7 x  T4 K* D! u
  422.   /* Configure LTDC clock to IC16 with PLL4  */
    7 G! r% ~' K* |# `* X

  423. / b- k$ s: T4 T" @0 W4 J
  424.   /* LCD clock configuration */; a+ K3 N. S( y7 S
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    $ u; Z2 {! g  k. ~# Y
  426.   /* LCD clock configuration */9 Q/ }' ?8 y9 i" |$ `
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */
    - [) @7 J9 S% ?, b' v
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */, n6 X# V& S% a& t& `! C
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */) A) B% Z( j- E) `2 d" O1 Y
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */
    - [$ L5 s# M  p% z# |) M1 \

  431. $ _+ k$ r) e1 H# a. K( ~; e
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
    ) `4 D6 j5 s0 S) J5 l& R
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;% _% d) p. F1 ^$ V. n  o' L
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;' x& ~+ z% }/ r# i& x. n
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
    . Z! l/ ?, _8 `( E, l8 O! C* a
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    3 F# Q7 h% T) w5 z$ U
  437.   {! w# `+ N0 C6 Y
  438.     status = HAL_ERROR;# O0 X) X! J3 T) W; t8 `% L! k
  439.   }
    4 b0 H8 P/ R8 k; N$ J0 v* v

  440. ; e2 o0 \2 f: u  F, ?. [6 J! q2 x
  441.   return status;7 G" C1 o9 d# Z
  442. }4 \+ W1 n7 M. {% k4 f  h
  443. + z0 z8 [9 F4 ~7 i& l  Y. e9 g
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    ) b7 y  b- {8 o# k
  445. /*** u% m& V5 z  E- Y5 ^7 y9 D1 }
  446.   * @brief Default BSP LCD Msp Callbacks
    % s, X0 f% t- p- P; J
  447.   * @param Instance BSP LCD Instance
    ( W! W+ b% X3 v
  448.   * @retval BSP status! F! K7 Y: p. M4 j' B' \
  449.   */6 F. a" E# M) B# L  _. u8 ~
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)4 u8 G- r1 i4 X" p
  451. {( f/ _4 W% O5 N9 P9 H
  452.   int32_t ret = BSP_ERROR_NONE;( @! j; t0 v9 Z  p, n3 \

  453. " m2 p/ j7 ]4 U8 G; g: I8 P7 U! k9 @* G
  454.   if(Instance >= LCD_INSTANCES_NBR)
    " n/ {* Q$ y  o, Q
  455.   {' r/ u1 @8 T. [% m- \* Q
  456.     ret = BSP_ERROR_WRONG_PARAM;: K9 R7 A+ i4 e) @- l, ]( G/ L
  457.   }6 K5 i8 w# d  H1 K9 [
  458.   else
    ( {& S4 B6 h" O4 \
  459.   {" N8 F6 n4 K, A+ Y9 r* G" ]
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)' H2 d' z5 ~0 R1 ~8 z
  461.     {. U) a( ]' u+ j% z9 `( J" d
  462.       ret = BSP_ERROR_PERIPH_FAILURE;
    1 ~2 W6 A: S7 W, S! m; Y
  463.     }
    . X+ Z. Y$ u9 a' c% |7 R
  464.     else
    + r, G: C+ F0 e4 Z/ x  f; F3 m
  465.     {- {) c$ s% p, E, t! q* \, r
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    * x+ y$ ^& w5 A& s
  467.       {; X& p6 Q9 @, c
  468.         ret = BSP_ERROR_PERIPH_FAILURE;8 b0 |/ u0 m! }# t3 V+ V, N- e( a
  469.       }
    , w7 b: z. V# d( b' w
  470.     }' F8 c. K) ^# {4 ~5 H. m2 z( G
  471.   @* {6 ^& B2 L# x5 q& l8 c
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    6 i2 T' ?: c* w6 @" N; s9 L
  473.   }
    . X# T4 C& S9 [/ c

  474. ) k, S  k/ P# V" c
  475.   return ret;
    ; ?5 o8 n& i' A0 I. Q; C. p$ |1 }
  476. }
    + j5 x% |- j' o+ }) e2 z

  477. + I, C% V5 `' j' z) M0 P
  478. /**
    " L6 w2 q+ q, i4 W
  479.   * @brief BSP LCD Msp Callback registering
    " m  ]% g& Z8 v3 Y
  480.   * @param Instance    LCD Instance
    " e" }3 ^) L( B! ]) \
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions
    . `- s7 y$ x8 [9 C0 I4 p
  482.   * @retval BSP status. ?1 S* ^: K; g9 B9 N
  483.   */  R, b1 u, g% [! j. I9 [
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)+ b+ @/ r% j" C8 y9 q) h- s; a4 `
  485. {
    & ?2 ~9 Z$ \% [4 o
  486.   int32_t ret = BSP_ERROR_NONE;" D2 i, n5 m, G/ D1 W5 y5 w9 C
  487. 6 ?, Y# q+ `- k; ]+ u9 ?
  488.   if(Instance >= LCD_INSTANCES_NBR)
    ! L) ^- f+ P3 `: t$ P* o; p
  489.   {! T1 c+ M& r! A* f5 ?8 m
  490.     ret = BSP_ERROR_WRONG_PARAM;
    0 Q3 Z! M4 _9 C1 D6 t3 s
  491.   }
    9 D, X( J- R' \, E, e
  492.   else
    / r( V; _" a6 P: g% l8 Q' C
  493.   {
    4 h8 u5 X3 w9 a! L) ]+ q/ g1 @
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)
    & {2 C) a2 g2 o3 T4 U2 g! W( h
  495.     {
    - I: K8 X% O" P: _9 [
  496.       ret = BSP_ERROR_PERIPH_FAILURE;
    ! b1 n$ O& Y! S; c5 l
  497.     }. V) D6 l' ?8 B! F
  498.     else
    3 K. l4 D" W/ d8 i
  499.     {
    # t. c& w- f' `
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)3 k* O- x6 M, t+ @9 D" }' ~6 |
  501.       {9 L& E1 a8 D: s: }3 |5 c
  502.         ret = BSP_ERROR_PERIPH_FAILURE;3 q% }& L  b3 f
  503.       }7 h, g' p8 w) @% K; \9 R
  504.     }
    4 R. `6 ]" C8 Q! |% [

  505. % y, b5 z# w1 M, e, j( K  H+ A
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    2 x, c) T# E* {' O/ e$ d. B5 D* w
  507.   }
    8 [5 u: }  F, a( r; n
  508. 2 u/ A9 t7 T1 u) l, r
  509.   return ret;
    7 ~7 |1 B6 h) I5 W  ^2 v
  510. }
    ' V% E; c5 \  U. w" Z! I1 R* p- V
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */+ U# a- [; |6 x& _4 {
  512. 1 n! ]5 x  D0 `6 c! J
  513. /**4 {, y$ C6 y7 X' F
  514.   * @brief  LTDC layer configuration.
    5 t$ u6 x. T+ k
  515.   * @param  Instance   LCD instance# H" U- @- }1 j
  516.   * @param  LayerIndex Layer 0 or 1  S* ?  c  r" |9 U
  517.   * @param  Config     Layer configuration7 F% V  D, D: \$ i. a
  518.   * @retval HAL status9 ], {% _' A$ H7 x0 [3 K: t& V
  519.   */
    $ y$ P& |# J6 C! ^& y
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)9 |! J/ [: K; z
  521. {2 r2 _) H) a) H" W4 f2 f: N
  522.   int32_t ret = BSP_ERROR_NONE;
    6 i( Y$ C+ u  N2 _0 R6 P3 E8 N. a6 p
  523.   if(Instance >= LCD_INSTANCES_NBR)
    6 C& }3 L2 V1 \& k; Y, [6 s; }; h1 s
  524.   {
    . x4 f* `: M3 |5 [, t
  525.     ret = BSP_ERROR_WRONG_PARAM;3 C7 R% E& |0 f; S& U
  526.   }
    1 [- C# N$ f) Z3 v, s  w# ?* q
  527.   else' v/ z4 e! ?) C/ s1 m
  528.   {
    3 Z' a. [6 n+ D
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)
    ( @& v# m: r( w8 ^' y
  530.     {0 X  _# y; H1 ^8 M. t0 L- l/ O) v
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;9 p0 {( W0 Z) \# `6 w! r  y  a0 P
  532.     }* S- M  ^$ n5 x# g' A
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)
    9 u6 ]# U+ x/ r8 J; S
  534.     {
    , e/ b, S% m+ a  X. s
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;6 E7 p. W- j& i% X# U# S" h
  536.     }
    7 z- R; V  T( e8 H7 O
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)+ v* S% y! b( r( a
  538.     {
      R* N2 X5 A9 k0 o7 b
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
    5 a, I7 N7 ^- p# }
  540.     }
    8 x3 s( x, P; ?7 ~
  541.     else3 D) K& |) f; {- Z4 @% f3 a2 r
  542.     {1 r- o: u. o/ z! R: B
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
    ! V: @( E- `( L; ^
  544.     }
    / |$ A. d! M, T1 M
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)/ ?" d) i7 D* t" \" Z
  546.     {' }4 P5 U  K2 G8 ^. ^' N4 h
  547.       ret = BSP_ERROR_PERIPH_FAILURE;5 p) E# V* x3 p+ W9 [5 v
  548.     }' H6 z* A5 p3 A$ W9 y8 N8 J" y7 P! ]
  549.   }
    7 {$ j6 l5 W* Y7 L( m2 T" T
  550.   return ret;) i2 Y* Y/ g6 a3 Q2 v% O
  551. }( E/ w9 O( ^: S0 B

  552. 9 G+ O, H6 h. q& T$ b% r9 p1 D
  553. /**4 Q3 G# u3 M. }" z
  554.   * @brief  Gets the LCD Active LCD Pixel Format.
    - \6 ~4 u, j, D4 S
  555.   * @param  Instance    LCD Instance
    $ u- q4 O) }  b% T2 r: {9 R
  556.   * @param  PixelFormat Active LCD Pixel Format
    2 C0 O6 |- l- O/ T
  557.   * @retval BSP status3 v: u, Y- I, k5 \  g
  558.   */
    " g, O; p* f4 O1 o- }5 c* b/ d  Z; {# a
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)
    ) M' N7 l; z- D- n, ?6 D" x
  560. {+ W" X' O) u6 f/ J
  561.   int32_t ret = BSP_ERROR_NONE;
    ( k: a) q* I) l4 {

  562. 8 d9 G* h( E) W* l4 U: N' i
  563.   if(Instance >= LCD_INSTANCES_NBR)! h2 k5 v$ s; o/ z  r5 T
  564.   {/ I/ q. ?8 m% \3 {6 z4 T+ L! z
  565.     ret = BSP_ERROR_WRONG_PARAM;
    " a( P2 [- o. v& I- A% F
  566.   }% y6 {8 d! k/ {/ {  I8 w% F. B
  567.   else
    2 c) P5 P& A' E0 ?; R
  568.   {3 G/ s; k4 ?& [
  569.     /* Only RGB565 format is supported */
    0 `( R* O* T! z5 q2 m
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;7 o4 W7 o" |0 b' W9 b
  571.   }7 A0 _3 w6 f6 R. ]

  572. ) N, Y2 R" L8 r7 b2 r% O+ |* k2 P. n
  573.   return ret;
    / U6 x: I% C$ \! p3 e
  574. }/ j" J/ M# R4 |

  575. ' m: |+ ^- \( x( _
  576. /**
    3 w& s. D# ]  T/ P, ]& @$ r4 B4 `
  577.   * @brief  Set the LCD Active Layer.) i$ v% e% {; p' D8 c8 `
  578.   * @param  Instance    LCD Instance5 h# }  h" E! Q! w+ h
  579.   * @param  LayerIndex  LCD layer index
    ; S: l+ s# G. P0 t
  580.   * @retval BSP status. M; M2 L" L" c1 V- U2 ^
  581.   */
    9 {  s! f& L+ i! \- c( J# \9 _
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)0 v7 p+ x- Y5 E6 ?
  583. {
    % ^6 [% T# _: z
  584.   int32_t ret = BSP_ERROR_NONE;
    5 R% q% P5 d- i/ C7 o3 K/ a+ g
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;$ L1 d# _' H3 ?) p0 S- t
  586. & ?; ?4 n4 U2 w3 j% b
  587.   if(Instance >= LCD_INSTANCES_NBR)- H8 [, B. l+ {3 F) w
  588.   {$ ~2 a: }6 Z5 u3 d6 o; ^
  589.     ret = BSP_ERROR_WRONG_PARAM;
    9 v4 N1 S7 x* A9 Z2 r$ k; @
  590.   }) U) `. I: `( x' }; W
  591.   else
    ! C: `) O" ^1 b5 g; C3 i7 v- f# F
  592.   {
    : s' g% f- L6 b4 Z; M
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];
    5 T% N) ?/ ?5 G* f

  594. # `" @# W+ ~0 l8 |5 Z
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;
    ) N* X: r. h+ F4 i+ n0 `0 `
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;
    6 ]- @8 z' P! E
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;1 g. F- n2 Z$ `3 g# J- d: C4 N

  598. 3 ~% r4 C* H. q" F; O+ l8 Y
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
    $ J( E, G7 D. I  y4 h
  600.     {. }4 B) A. R2 a5 @2 Z# C
  601.       Lcd_Ctx[Instance].BppFactor = 2;
    ( n, J0 ]) e3 l3 J4 G
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;
    1 Z# f& R$ r; T2 [! o$ x. `- @
  603.     }" H7 d7 u1 l0 y; z1 F1 V0 b
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)
    ) W1 H) ]) k/ @" C6 N7 {7 g7 b
  605.     {
    6 ~/ M" H) z4 W5 ]) A% i
  606.       Lcd_Ctx[Instance].BppFactor = 2;
    , L" v& P7 A7 V  `) }
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;. k" U$ ?4 F) ~
  608.     }5 A$ B% O3 J* Z0 R% L
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)
    % j& U) j- x5 K4 {, k; i
  610.     {
    ! o: }. F) Z2 i% m, \
  611.       Lcd_Ctx[Instance].BppFactor = 3;, F2 v2 H; ~; x
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;
    9 u# T- }! |# l
  613.     }! a! F8 z& Q& f2 ^
  614.     else* a9 h( i* p# [* `
  615.     {5 j' s$ t4 A8 y, g3 g7 G3 v
  616.       Lcd_Ctx[Instance].BppFactor = 4;
    7 ^; A% f; _; @7 P+ v1 z
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;. k+ I$ d% Y7 e7 h) T' z
  618.     }4 X: c6 v; ~7 o+ b1 S
  619.   }
    & `; u2 V- w* g3 j

  620. % D5 ~2 P4 U% X
  621.   return ret;( e, ^2 @1 z: k4 B
  622. }* J; h7 k, U4 F/ @1 F* `

  623. , P0 X# D$ a2 @: y4 d6 C' P
  624. /**" i* c; ~1 q; R- |( S( [& {8 I% Y
  625.   * @brief  Control the LTDC reload2 e4 P& G8 }0 u2 y6 K0 ^
  626.   * @param  Instance    LCD Instance
    ' C% A; g. _2 ~3 {
  627.   * @param  ReloadType can be one of the following values+ C6 o7 R! @, E) w
  628.   *         - BSP_LCD_RELOAD_NONE3 K6 s: W6 n) d0 D" ~
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE
      u* N* v5 p7 _: ~& E3 A. |
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING8 u: F9 c8 V; _. f; r" X8 t: r; L
  631.   * @retval BSP status
    . s! L9 Z* F/ b0 n* _) h
  632.   */
    $ K6 X+ k8 i' B- W, i
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)! D6 Q) {$ E  r4 s: o, Q$ x/ B: C
  634. {
    # B3 m6 ~: L* s4 |( c& X
  635.   int32_t ret = BSP_ERROR_NONE;
    4 ^' g( w2 ~( G

  636. 7 N! H2 z3 ~& ^0 R% ~1 Z* m
  637.   if(Instance >= LCD_INSTANCES_NBR)
    ) B- r. X7 K# j
  638.   {
    4 {! X1 s2 O# c6 g0 Q/ F& W
  639.     ret = BSP_ERROR_WRONG_PARAM;
    * B" z8 Z+ q9 D. f' z4 y* _
  640.   }1 g+ R# l. X- e1 b
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)
    0 e$ y& `8 o3 G1 U1 r$ \
  642.   {- F& [5 X* c! I* d( w4 F  w# c
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;, a  f% p, D6 K; G% ~1 M
  644.   }0 K+ A7 O# ?' p, d
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)3 `* v) ^  L; U$ v& M
  646.   {% B( T$ z; z+ V& P- F$ K( b
  647.     ret = BSP_ERROR_PERIPH_FAILURE;' U# F( `0 q" N1 m, ^2 D% C
  648.   }5 ?' Q$ C9 [" b2 F
  649.   else2 ?- N$ g, I" k4 F8 v! G; B
  650.   {
    7 I& c7 U- q2 ?: D
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;
    2 v- @+ Q; B3 _3 ]) r; C
  652.   }8 r9 D5 q6 N# T/ q
  653. * B' V" k. e/ X; ]/ A& @
  654.   return ret;
    6 K9 Y' x8 ]0 D& B0 k0 _
  655. }7 p  b8 `/ m- Z/ M# `2 `
  656. & i) u7 f9 z2 ~1 J9 m2 ~0 F+ j3 V
  657. /**) j! f5 S+ b& r' r2 f# F& d1 X
  658.   * @brief  Sets an LCD Layer visible
    : b1 o& m' }6 B- `( j9 M: [1 M
  659.   * @param  Instance    LCD Instance
    8 h6 {) ?1 q/ Y) L0 |( f" ^" R1 Z
  660.   * @param  LayerIndex  Visible Layer
    ! O! J$ q" I3 l- [0 W2 u" Z
  661.   * @param  State  New state of the specified layer
    / r! f' K. c4 w$ M, N0 i0 m
  662.   *          This parameter can be one of the following values:8 A' h' c8 k: C4 a  r8 [
  663.   *            @arg  ENABLE6 f, Q4 t7 ?, z/ ~
  664.   *            @arg  DISABLE
    7 p0 y% J" X& R* e$ ?* u; p
  665.   * @retval BSP status! H' q( m' A  t& t0 g- Y
  666.   */6 m0 u8 V( r# i* _& @! F6 F7 K
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)3 y% |% u3 T# A
  668. {1 J2 z, U) |) m* h9 S- J
  669.   int32_t ret = BSP_ERROR_NONE;
    8 B* x$ x. @' q' u+ E) V
  670. 1 h& o+ g1 a2 D" ]: _& L
  671.   if(Instance >= LCD_INSTANCES_NBR)4 y% Y) b8 e* `7 U& S
  672.   {
    ) i& S* ~& D* f7 e  a2 [
  673.     ret = BSP_ERROR_WRONG_PARAM;
    $ u6 }& y; e8 s5 T
  674.   }
    6 `& _0 Q6 I  r
  675.   else- f: T& `/ M9 N  U3 k
  676.   {
    . x' D) G& h2 j7 o  ?
  677.     if(State == ENABLE)! |3 r8 l  O; @+ _
  678.     {
    2 j8 \; h8 O' l) I
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);: u% q# Y: S' }7 H. U8 L
  680.     }
    * J# p$ A6 F3 S& R' g& _
  681.     else
    0 _2 x( B: q$ v& p( l$ J; x
  682.     {) O$ N5 c7 E9 U$ l& t) I" a. z8 I
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);- M: \0 C3 c2 K& [+ i9 W4 Q3 N5 q
  684.     }+ u" w$ B9 N/ Q6 r6 p9 O

  685. 2 D! P* V. H, E6 ^' F
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)5 A% I0 l/ j3 ^8 S
  687.     {& ~9 U) C# B" A; I; p
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);+ }" z0 f1 Q) ~3 F
  689.     }
    8 R* [4 q1 w& G4 U
  690.   }; W% o+ E2 M# |- r$ r

  691. ) I4 y# `  X$ \' x5 U8 Q
  692.   return ret;
    ; f0 S) a7 l1 ]4 O" d
  693. }
    9 t! a& f  `! e

  694. 1 a5 ]1 j0 N# E& I+ }' [
  695. /**
    * b) g& l- ]2 t8 n+ O+ ^
  696.   * @brief  Configures the transparency.
    ( u7 p  h! O# Q' W6 u% U
  697.   * @param  Instance      LCD Instance9 x1 }$ I; E. l9 b, i6 O
  698.   * @param  LayerIndex    Layer foreground or background.! l" Q) ^$ v. F  U9 t, Z
  699.   * @param  Transparency  Transparency
    - W6 ^1 {# H2 G
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF4 x( Y) L5 _& P( m. l3 r/ L
  701.   * @retval BSP status
    ( ^6 t* @6 |; `! D1 ?( J  z' p& u
  702.   */8 G; R+ x/ a& f! |9 X5 H% w
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)$ V. h4 X! ~* F- w7 j! ]+ e' r
  704. {
    8 E$ W# N4 ^% S% Z
  705.   int32_t ret = BSP_ERROR_NONE;# ~( |1 ~7 ]4 m; p  C1 s! i

  706. 3 A* d# L' [' C$ E2 ?
  707.   if(Instance >= LCD_INSTANCES_NBR)" h4 B' g; \6 r) ]  Y4 S; Y
  708.   {
    + I  W  S0 a+ J$ t. b& v
  709.     ret = BSP_ERROR_WRONG_PARAM;3 o  k7 F/ \' C) {* v
  710.   }
    3 o; i# f% H" [1 |0 E
  711.   else
    & T) q4 T* q2 j# `$ T
  712.   {1 }8 S# h/ @8 E5 m/ V* v% [
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U): v) a) ?5 M+ V$ B
  714.     {: g7 K( D5 e4 v5 S4 k
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);8 Z" A2 \; _0 I7 Y& W( b7 ~
  716.     }
    9 G3 ^8 [$ O( r5 _. `7 A, W
  717.     else
    7 O1 @, t( Y: g
  718.     {
      W- S# F" u  r
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);
    * q8 J) D0 l) \3 G: [. w8 i4 u2 m
  720.     }
    $ i" U8 z) }5 r: V
  721.   }
    7 |8 x: A$ d1 K, [# ^

  722. 1 }0 L  z6 T) s" h1 L
  723.   return ret;# F+ V3 Z$ r* Z5 l% {$ a( @* M
  724. }( t, h+ J4 m" D) G, b5 [6 U) h5 t
  725. 8 _8 }& K! M0 A+ Y: r
  726. /**0 T* B6 n0 Q: M5 r* v' t5 L
  727.   * @brief  Sets an LCD layer frame buffer address.9 n! ~9 X1 a, O; _; o
  728.   * @param  Instance    LCD Instance/ g* f5 l) g+ n! Q* e
  729.   * @param  LayerIndex  Layer foreground or background1 m8 A" x6 o( _
  730.   * @param  Address     New LCD frame buffer value3 l$ m8 `$ Q5 A8 E* N
  731.   * @retval BSP status* ^9 u& Y& q" C- b# ~( c
  732.   */
    8 a7 A/ O5 n3 d" Z( \
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)
    0 a" T9 F; w3 w2 W+ f2 V
  734. {
    " ?. W: t2 `- n- w3 P
  735.   int32_t ret = BSP_ERROR_NONE;* w$ v2 V3 t* N0 c$ l, |/ A

  736. 9 r+ V' {* b& Y' y& P5 j/ F
  737.   if(Instance >= LCD_INSTANCES_NBR)
    % E8 ~" q3 k( D- S4 r" J
  738.   {/ W# w7 `) Z- d6 I+ Q& P
  739.     ret = BSP_ERROR_WRONG_PARAM;, ?3 j' [+ c0 v
  740.   }
    8 `* y/ B/ N( C. @* Z; n2 Z5 m  b
  741.   else
    0 k% v+ e- e: F% H4 a2 F0 _% m. Z
  742.   {
    6 g6 H7 x1 u, T0 ?7 h( Z; ^7 B. Y
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ' f4 a9 s3 V. g1 W8 y& x
  744.     {+ K6 U; X# Y- ~# d0 k( ?
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);
      n1 _8 ?& A, d
  746.     }
    6 @$ c, x* w4 Z( \% s" e1 D
  747.     else! U, x2 \* n' }! f
  748.     {
    8 S$ L9 B" g( ~# `4 H( z
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);( T7 P7 \2 d- C
  750.     }$ o9 a' `- @- }- G
  751.   }
    , @- R; \- q0 ?& m
  752. ) d* J7 p" K0 k( y; c+ ~  |. j0 E
  753.   return ret;
    0 T; k7 |" {5 R7 N4 q& i
  754. }' [: p" ?8 W  s2 p' O
  755. 8 x% o9 x" z# _' T2 Y
  756. /**
    2 }4 K3 N: M" o) y; {- K
  757.   * @brief  Sets display window.( D* ?% e' y4 A' G$ g% e
  758.   * @param  Instance    LCD Instance
      i1 D( {" a% x5 c
  759.   * @param  LayerIndex  Layer index2 L; R' R5 w( F! O! ]" [3 u, U
  760.   * @param  Xpos   LCD X position
    0 @1 {" K0 o; I. }( F: o
  761.   * @param  Ypos   LCD Y position
    4 x+ D* l7 B4 ?) a/ q' y
  762.   * @param  Width  LCD window width
    - A  x1 D) S& c; I8 H4 i
  763.   * @param  Height LCD window height( D. r- _( Z0 O, D# F4 O! n
  764.   * @retval BSP status
    ! j8 y0 ~5 `& `
  765.   */( X- p9 e, m! J4 U9 T
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)& }: s8 z! o4 n! k$ a4 U6 b
  767. {' o" D% p; @: x1 _3 E
  768.   int32_t ret = BSP_ERROR_NONE;% J( J! K- x5 ~$ k# Q
  769.   y% X: D6 S% ^" _
  770.   if(Instance >= LCD_INSTANCES_NBR)
      m! S4 x+ f1 \
  771.   {
    ) }, X8 J5 ^9 |3 C- J$ S; C5 u' E/ i
  772.     ret = BSP_ERROR_WRONG_PARAM;
    2 A0 t5 Q6 H, _
  773.   }
    ' }8 K& P7 n" G& ?4 |7 z4 D% R. G
  774.   else
    1 H1 ~4 q- ?- _& U* j5 n6 \) t
  775.   {
    0 C  }! B- W3 P0 S. R* E  }0 y
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U), M. X+ s# f" I
  777.     {
    ! ]. b0 F; y; l( n, Q' s# f
  778.       /* Reconfigure the layer size  and position */
    7 N. N+ B& N" N
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);
    ) r/ P7 @' L$ B: M. f
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    3 G" j4 {, m% C* d; d9 ]
  781.     }
    5 E# \3 w5 D, G! _- V
  782.     else
    ; M7 d1 d3 J9 d/ S6 h6 J- ?4 o
  783.     {) j5 ]! s! E0 }* l+ L- t0 x
  784.       /* Reconfigure the layer size and position */
    / C- f& |- G" X& N( F
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);
    - k2 H% i1 n# F( z+ K4 G
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);1 \, A9 U' F4 |3 l+ X" r
  787.     }
    - t  s* m! M# _- v$ r8 `
  788. 3 B" ?7 y! e) [% i! @" |' q# d
  789.     Lcd_Ctx[Instance].XSize = Width;1 r  L: L3 z/ x: e3 M
  790.     Lcd_Ctx[Instance].YSize = Height;
    + Z6 C' f; g5 N% m- D6 B5 \
  791.   }
    , b, [! K9 _6 G2 I9 h0 V' x* C2 H

  792.   g' n4 b8 w2 f8 ]1 N$ u0 E; J5 u
  793.   return ret;; {- Z  Q/ w. H
  794. }# [9 d- `, h& Y4 b. p. T3 }6 O

  795. 1 p/ `% U! x- m* A# G& d! D
  796. /**
    8 {* z6 g: P. w1 b- ~2 U
  797.   * @brief  Configures and sets the color keying.; {# \. u' h' }, h5 I2 }- f
  798.   * @param  Instance    LCD Instance' \. ?& {. q% F# z' i
  799.   * @param  LayerIndex  Layer foreground or background
    + B  g# A, s/ @- X: s
  800.   * @param  Color       Color reference
    . Y8 e+ ~$ n$ c) u
  801.   * @retval BSP status; o* l5 e) _7 I
  802.   */8 G/ S+ u# v' C6 ~5 c/ u
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color): g* S4 z( Z5 H$ i( U
  804. {0 `% ]. n0 d* L% u4 R4 e
  805.   int32_t ret = BSP_ERROR_NONE;3 n: p' W3 N6 Z2 H
  806. 5 ~$ m4 ?: _8 R* p' z
  807.   if(Instance >= LCD_INSTANCES_NBR)' P. e# W, P+ Y/ Q4 \" C3 l& f
  808.   {
    % H% B0 B7 t% O; |/ s- P
  809.     ret = BSP_ERROR_WRONG_PARAM;
    4 \  t7 h5 p# B2 k8 d
  810.   }
    ) \7 l2 ]- S3 u* Y- K3 D
  811.   else# a7 U/ g2 W- j( C
  812.   {
    ) M- O: l/ ~- x# z0 P
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);
    4 x7 [$ k, I' V0 S
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ' B; V( s" ?% i. j, g* _0 R
  815.     {
    2 G- O! X$ ]$ Q( h, V# t. J
  816.       /* Configure and Enable the color Keying for LCD Layer */
    0 n" X, V$ @/ n- o
  817. 9 s( s2 J& z8 c5 o
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);
    ( X: ]7 S- l4 m- g3 |+ p' p
  819.     }: h  F, {0 p! O7 P" ~2 _
  820.     else' R  r; J) i( V0 I4 S7 @
  821.     {
    : ~, b# W3 c5 i" z$ h: O) v# v# l
  822.       /* Configure and Enable the color Keying for LCD Layer */
    ! X" b0 @( k; ~
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    9 a$ ~/ m0 V# ~) e1 H) `5 f( |
  824.     }
    ( c% w. Q8 b( Z' T8 t
  825.   }! _1 u) {* ]0 W# \* S
  826. : X$ n1 n3 s2 ]/ ~0 ^, c1 B7 }: x4 l
  827.   return ret;- a- a5 V: e( M* T& T1 R
  828. }
    $ Q- L2 c6 ?7 U' P
  829. ( p" Y! W" ~  U
  830. /**8 L, c7 Z' G# k" ~; t7 k
  831.   * @brief  Disables the color keying.
    1 N3 Q# M  r3 Z9 d5 E9 u
  832.   * @param  Instance    LCD Instance
    ! R! P4 k2 g7 ^( B. S
  833.   * @param  LayerIndex Layer foreground or background
      f6 c0 q1 o4 {4 F2 H. d7 P. h! b/ w
  834.   * @retval BSP status
    5 r# x8 |# a6 A( Q; e
  835.   */
    8 \4 Z, ~4 O+ X3 |- L5 z' g
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)+ Y( ^9 g" |0 ^2 G. N0 s
  837. {
    ' H6 p, {& g* \. t3 f/ I  ]: \
  838.   int32_t ret = BSP_ERROR_NONE;8 Z1 s" |# C! I

  839. ( \7 n7 \4 c6 U- @5 U: _& O+ v5 A
  840.   if(Instance >= LCD_INSTANCES_NBR)* }) q8 u2 f$ v8 U& g4 ?4 R4 }& m' l2 ~
  841.   {
    $ S0 N. \6 j! S: M) {) j
  842.     ret = BSP_ERROR_WRONG_PARAM;% D8 I  J8 Y' p( s: E
  843.   }" _, m( t7 X# D: e- U5 l
  844.   else' W9 L* g2 h% ^9 |0 i5 S: i
  845.   {
    ; L1 N9 c8 n5 v  x" e
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    1 f7 B! x* Z2 G; U
  847.     {! R! k; l+ A. e2 I
  848.       /* Disable the color Keying for LCD Layer */- i/ E5 A5 q8 ?% Z% P7 C
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    5 T# j/ u! N6 ]$ P+ z
  850.     }
    ! N4 a# S, r4 s9 d! g" d
  851.     else1 d3 \1 P; y) |: |# E- Q
  852.     {$ m( {$ R# X4 O7 V6 \
  853.       /* Disable the color Keying for LCD Layer */
    # J0 X. B# }7 z: I9 ], g$ }
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    . z% H: g# J  V: V4 }
  855.     }* M( i* B6 y0 B# }# K
  856.   }" s3 l3 b# x5 E( G5 Z

  857.   W# V4 R( |, L4 Y2 G
  858.   return ret;
    ; Z+ X* a2 h2 P* Z, J4 I0 K
  859. }
    , \, D. F; k0 [# `) m
  860. ( L' s  _. f' j% L; L$ b5 K
  861. /**1 K# b3 ^0 b* R
  862.   * @brief  Gets the LCD X size.( G$ f# @+ D2 K' a5 A& T
  863.   * @param  Instance  LCD Instance
      I5 Y6 k" o4 f; F
  864.   * @param  XSize     LCD width
      p# p% w8 h$ J. h* c
  865.   * @retval BSP status
    ) V  f! a' i2 y
  866.   */, D3 A" q' c* C' y+ C( R; o5 `
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)0 s; k4 Q( b9 ?' G$ U
  868. {: c' M% j6 h1 |1 b& o$ \; y
  869.   int32_t ret = BSP_ERROR_NONE;% q+ W$ `$ w& e# i. |" D% @% `

  870. ' R/ N6 o3 R+ s
  871.   if(Instance >= LCD_INSTANCES_NBR)
    , [: q( g8 b+ f; b
  872.   {
    + H* p! V+ y* t0 I# ?! Y& R
  873.     ret = BSP_ERROR_WRONG_PARAM;
    7 g4 U# y+ n- ^) W' U) _
  874.   }8 u6 D6 Q, _# Z
  875.   else" v, C/ Q4 q: B7 Q6 |; f
  876.   {0 N+ H) m# T# N! i9 c# i
  877.     *XSize = Lcd_Ctx[Instance].XSize;
    4 |) c( M" \$ _8 |
  878.   }/ ?0 _6 r- a6 U* M. M/ b& M
  879. 2 z* ^% x- l6 I# E8 {' E/ V% R! R) [
  880.   return ret;  B# F* a' H5 P/ N
  881. }2 l: F9 y3 m- b+ U" _% Q
  882. * f* a& D9 H6 `& W9 d' b
  883. /**$ O& |* v0 L; f9 a
  884.   * @brief  Gets the LCD Y size.' G; _. V( I0 q4 B" M! ]+ v+ G
  885.   * @param  Instance  LCD Instance
    ! c& g& }7 g2 D$ c
  886.   * @param  YSize     LCD Height/ |5 W+ W, H8 m: z, ]8 B( x2 k3 ]- \& G0 z1 j
  887.   * @retval BSP status
    + L- ?. e4 f5 Z" h8 g# U
  888.   */
    ) Y5 v* _3 b: v
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
    ) ?# R. b" c8 ^. V# c
  890. {0 y& A( |& Y6 q$ C- k5 v
  891.   int32_t ret = BSP_ERROR_NONE;
    6 Z/ O  M, Z! |5 P
  892. / T$ j- V: O3 B8 \9 L. r' T. k# [! I
  893.   if(Instance >= LCD_INSTANCES_NBR)
    / L$ _/ I- o9 |1 D' \
  894.   {( T6 a7 _  {& t. ~  e
  895.     ret = BSP_ERROR_WRONG_PARAM;" e4 y; ]& _' b- Q  V* z
  896.   }& T( f" C& U7 R# [6 Q& v
  897.   else
    % @' _  F1 ?2 u- R- a  l; B" C
  898.   {+ S+ p& L. j# \4 X
  899.     *YSize = Lcd_Ctx[Instance].YSize;2 @* \- ?" B1 ^! l. f0 R8 ^
  900.   }
    ' \9 m* z, r" R6 T* B
  901. # T# ?7 w& U9 l3 e# v; s. C; t
  902.   return ret;
    4 j$ q1 {" u2 W: |; v  ^
  903. }
    8 m% P7 @! ^4 S& J0 U, g  ]. J9 Q
  904. ; Y# |/ B7 J$ T" R
  905. /**$ \. G: h1 t6 [" c/ g/ J, S
  906.   * @brief  Switch On the display.
    $ N+ Q9 u% r) c4 x, P
  907.   * @param  Instance    LCD Instance
    8 b2 d5 |) {" E5 d+ t
  908.   * @retval BSP status- a. W! Q9 I, x* g: u
  909.   */
    ' P8 f2 l: I  h8 v7 u, O* D& N
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)
    . O* a4 d1 y; i4 P
  911. {
    - ?& y( ?9 ~. y% @* @3 N6 Z1 V4 r
  912.   int32_t ret = BSP_ERROR_NONE;5 A: ?! H2 O) Y2 H1 L6 w
  913.   GPIO_InitTypeDef gpio_init_structure = {0};+ r$ T6 g8 D7 }, q% O6 d
  914. + }; i# P# M% }( N( [' ~  \
  915.   if(Instance >= LCD_INSTANCES_NBR)) L! [7 u8 p1 {0 E- ~9 [! `; Z. k# W
  916.   {4 f" d- o/ N& G! w% a7 H4 i
  917.     ret = BSP_ERROR_WRONG_PARAM;3 I! Z/ z4 M0 L. d
  918.   }
    . @0 s, _1 T4 _8 C
  919.   else% Z; `, c3 h+ b# \( q  n& \- a
  920.   {; ?9 \* U' Z0 J; d+ y/ [. ^0 k
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);; o& R8 v; R& D6 B0 _9 g* e
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;: l, M7 P$ x( r" I! c
  923.     gpio_init_structure.Pull = GPIO_PULLUP;
    , D  J9 ]3 l. \0 v/ y$ `& J8 J: g
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;6 T4 r# e- V- }2 ]9 e: M! q
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    9 R( X2 c2 e/ S/ y& o  |
  926. 3 s6 H( }! R4 ^7 k* Y4 G" g" ^: C5 h
  927.     /* Assert LCD_DISP_EN pin */
    " I7 E/ w* B4 ?
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);
    % e/ f& g, `7 m6 Y
  929.   }7 j" M" C8 ^0 N: c

  930. $ X  q0 J3 q/ U" l
  931.   return ret;3 _6 L" p0 e& p9 A- I
  932. }' m- m0 ^- i) l7 Z# L" K

  933. ) E' |8 f! }# `+ ^1 a
  934. /**8 f$ d$ m1 y0 F- B; q3 q/ a2 Q
  935.   * @brief  Switch Off the display.
    * \, c5 ?  L* }/ G6 s3 _
  936.   * @param  Instance    LCD Instance, T3 i; U6 G& ], }
  937.   * @retval BSP status8 q( }9 v9 O( a
  938.   */) Z$ a% g) w  H5 h
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)
    1 p! b) u) N8 T1 F3 N3 n& d
  940. {# P" T& K* B$ L$ q. p1 b
  941.   int32_t ret = BSP_ERROR_NONE;
    5 f  \+ M6 U6 A2 f' p
  942.   GPIO_InitTypeDef gpio_init_structure = {0};3 l/ ^" [# m6 q1 Q
  943. # v! d" l7 q& N, X
  944.   if(Instance >= LCD_INSTANCES_NBR)+ ^' D7 r" K5 [0 O4 y$ t! ^
  945.   {/ J* K" C* ?; R! L0 r. q
  946.     ret = BSP_ERROR_WRONG_PARAM;. V( U/ W5 `5 m! m0 F' g6 A
  947.   }
    0 j7 b; m- P7 U/ K4 i$ d
  948.   else# }( A4 e  X& v) N
  949.   {/ w* P+ m0 L* f6 G: x: c$ B
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;! Y8 E' e# h8 y8 I2 H
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;5 M; ^7 {+ Q& V. ]  V
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;
    ! o$ j4 ^2 B* u9 }. x
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;
    8 F9 S8 D$ G9 \* }/ X# Q9 l- p0 |; ^
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);8 N+ s6 l/ P8 p* u5 l0 L; Q: Q
  955. : Y, H) R' j4 `" C. I) G- q! C8 g
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);( c0 w+ t; U/ d: W5 P; n9 ~

  957. ! Z: E8 e2 ]$ d7 q  D8 G* x# B
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);
    * H4 ?1 ~7 ~8 p: Z5 ]
  959. 6 d% X* n5 M, W: B* `
  960.   }) Y; h; b. h& x8 x9 t4 x

  961. : [0 e5 r; Z, |8 O/ d5 ?
  962.   return ret;) T% P5 T. |8 L& Z3 t4 e
  963. }
      P& z0 C; b6 j6 }; P- L8 q9 s

  964. # K4 G8 ^" t9 G; ~2 v2 K
  965. /**
    1 C: Y: _; m% Z1 T7 s' P/ }/ |  [
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.5 T' V6 O" n0 V8 j% M) a6 J
  967.   * @param  Instance LCD Instance
    # g! o- Y2 n! ~
  968.   * @param  Xpos Bmp X position in the LCD
    1 p- m3 N# G+ k9 _
  969.   * @param  Ypos Bmp Y position in the LCD8 a* F/ O4 i5 b5 c
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash." w) ?7 G4 U- D( b: ?
  971.   * @retval BSP status
    - b$ O/ n, a2 t! a1 I. e' y, X
  972.   */, R' C' W  d3 i: f5 L5 {7 q
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)/ ?$ Q! a: u$ l9 x
  974. {
      m: I2 w) P- S$ B
  975.   int32_t ret = BSP_ERROR_NONE;
    9 ?+ [4 f  S/ \2 _3 B7 C: a* J3 ]& T
  976.   uint32_t index;/ z: e1 U) B1 W1 u1 ?+ F
  977.   uint32_t width;0 H* u  N8 Q) z. Q  W7 ^
  978.   uint32_t height;
    + h: F8 ?: @9 M. w# a8 A
  979.   uint32_t bit_pixel;8 k3 l* {" q# y0 k( ~
  980.   uint32_t Address;
    , C, Q6 P0 K7 k% k) m
  981.   uint32_t input_color_mode;
    , [* z" S; j" B. H# U7 w: G
  982.   uint8_t *pbmp;7 x9 j2 `# c* l) f  G- j) _2 p

  983. ! y4 c# a: f: p$ X3 c. c) ~* i
  984.   /* Get bitmap data address offset */% @9 F4 `' Y5 v1 o4 N  i9 z
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);+ K, J# x, a* `, ~- ]+ r
  986. 1 E6 n0 |4 a) U2 f# ?
  987.   /* Read bitmap width */' `! d" T! ?+ L+ n. j
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);" h* B8 F; e3 S

  989. : |. s& |1 `( @4 O7 B3 z* h
  990.   /* Read bitmap height */
    5 O& S* {/ n  @& t. @
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);# i) G5 w- Y& e- b' h+ ~

  992. " E( X( t9 l- ]2 u' t3 d" I1 f
  993.   /* Read bit/pixel */
    % g3 w* V' [, }: I! e- U
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);
      |5 ]& \/ E" N" H, [6 I# A$ E7 {

  995. + O0 F4 B; L7 A
  996.   /* Set the address */* \1 O4 n* U( }' F8 w* @
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);: y% ~6 Y# g- a5 j, q& g$ C5 k0 A

  998. 9 [$ f  `1 O% X# q
  999.   /* Get the layer pixel format */
    4 t! G4 W2 |5 |7 \# k  Y% M& |6 O
  1000.   if ((bit_pixel/8U) == 4U)
    1 }; s. u- Y" n' U4 t3 r3 D
  1001.   {
    ( R' r6 ?( m3 y+ O$ U0 x
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;
    ) w' \1 P2 Y5 ?& s' \5 ]  t
  1003.   }+ ~7 L; O* i$ w5 @: q" s" J2 ?: A+ D! z
  1004.   else if ((bit_pixel/8U) == 2U)
    3 }9 n$ N+ U% v4 U" h2 `
  1005.   {4 ?% j5 p5 N5 n. |5 U
  1006.     input_color_mode = DMA2D_INPUT_RGB565;5 [; g; ^+ C# x
  1007.   }
    $ q6 B/ x3 ~) N* R' B- B
  1008.   else
    , |$ p( ?1 n% [# {' x2 U
  1009.   {
    2 [7 h: L. I8 f
  1010.     input_color_mode = DMA2D_INPUT_RGB888;" D. x; c5 C4 o+ m2 w
  1011.   }
    8 p+ ?# W# w1 e3 g" Q- {

  1012. , ~2 E/ t4 S5 |/ `
  1013.   /* Bypass the bitmap header */. _! E0 Y; P; m6 D0 E
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    ) B9 z2 l7 o- L

  1015. & d( ~: P7 m, H( T& N9 i  K
  1016.   /* Convert picture to ARGB8888 pixel format */
    # h- x6 c3 ?* Z* |* B* r2 u" ^5 r+ X
  1017.   for(index=0; index < height; index++)3 u8 i1 M! |! b( c2 \
  1018.   {1 N7 G, ?( m- |) h( F
  1019.     /* Pixel format conversion */
      v/ w! d2 Q' u
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);: H3 W. V5 s. C: n( l

  1021. , p1 P' K2 f+ N" B$ Z' `; m
  1022.     /* Increment the source and destination buffers */
    $ V2 \4 \# ]  k7 s9 _
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);2 C  b1 j, _. S" o) y' c/ j( }
  1024.     pbmp -= width*(bit_pixel/8U);6 M8 c0 ?6 ~/ |+ l  L- e* i9 \
  1025.   }
    0 c; u9 K2 ]8 x# l( o3 s

  1026. 9 ^( S; l0 _7 E; v) O# a
  1027.   return ret;9 U7 \1 T7 H  E2 R1 x6 p! {
  1028. }+ q9 X* p' Y. M) p; \9 O" b3 N

  1029. 6 n2 B+ R4 t+ Q9 I- z6 F
  1030. /**: U* d5 J1 _  |" m1 M9 T
  1031.   * @brief  Draw a horizontal line on LCD.1 H. c- Z& k. G' J1 N" M
  1032.   * @param  Instance LCD Instance.
    : d8 \/ m! z! u
  1033.   * @param  Xpos X position.% [! y( Y7 J- w6 L
  1034.   * @param  Ypos Y position.2 M! z! o- D8 J* h1 F: u; ~
  1035.   * @param  pData Pointer to RGB line data
    " E: Q, Q+ V$ `. h6 u" I- M, A
  1036.   * @param  Width Rectangle width.
    * f9 j) h4 \9 {8 q3 x3 k
  1037.   * @param  Height Rectangle Height.
    1 t% o2 h1 t  ^4 o: n5 y  L
  1038.   * @retval BSP status.+ d8 u+ \; g4 Y! @4 L  N
  1039.   */
    3 ^$ x6 J( F: C
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)( @9 W5 `$ y$ a& G# u
  1041. {! M; y$ D. W* L; p! n
  1042.   uint32_t i;2 A( H" l( _- u5 T5 ]! q) e
  1043.   uint8_t *pdata = pData;
    & f8 c2 M; C3 B  a1 w

  1044. ; [: O  g: [" m$ L/ z# e* [
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1)8 n& t9 ^8 G3 k; j
  1046.   uint32_t  Xaddress;
    2 Z) M1 K1 v" N: G' P: t
  1047.   for(i = 0; i < Height; i++)6 g1 U# k2 A6 Q. ^7 K+ Z! p! H
  1048.   {; V% R3 \- G2 o# H: R4 ~/ [
  1049.     /* Get the line address */$ }, v9 }$ a9 {# Y' S
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));
    - J& f" y5 d/ H0 o% L3 o7 b& n
  1051. ' `$ F" E# D# T+ E: p& e$ ?
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)
    # Q- F6 J+ U3 Z  ~. I" E" k0 b
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);
    : h' I9 X# s" a# x8 \* U
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */
    9 U5 P! n% A' A# o4 {: I) V

  1055. ( o; ]2 |9 o5 D8 L8 |: n
  1056.     /* Write line */
    0 I6 D' N0 E- Q! e6 U( n
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    ; @6 X( s; H4 }& s
  1058.     {
    " x; y: z6 Z( @6 d1 a9 Q
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);/ L, R) l) D' H/ c# m4 O
  1060.     }
    7 u. y2 `- k- k4 C$ B
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)" M9 m  P, g, G. W& Y9 {( g; C
  1062.     {8 ]( |$ b9 r7 H  Z9 P5 F
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);! S8 T; G- @% A, n' ^* j, C0 F
  1064.     }
    : S' o6 t6 L5 S! I
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)! |+ t* L1 g) [* @% K
  1066.     {& b0 @( J" t: [5 J6 G& j
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);6 {2 k5 @' R  W+ {
  1068.     }
    ) O, y' [( {# K4 A( ^
  1069.     else5 _0 x' D1 Z9 U
  1070.     {
    / `* g+ b; B; T
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);5 [6 `! g; P1 d3 u$ V9 ], x0 C0 M
  1072.     }7 _- \$ D7 d( ?: v
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;. ~4 Q8 a, ~1 ^0 o6 d8 }; \
  1074.   }, F& n1 D7 L1 l7 \
  1075. #else
    + X' M1 Z5 @9 M+ ]! @. V
  1076.   uint32_t color;
    6 v  n4 G; a  S* w" Q
  1077.   uint32_t j;
    & N8 L! f7 S$ z4 K' u
  1078.   for(i = 0; i < Height; i++)
    2 C3 a, `! L" C1 c2 t+ D
  1079.   {
    ) x8 u+ A2 s; R* E
  1080.     for(j = 0; j < Width; j++)
    7 ]& B4 x0 B" z4 a# {
  1081.     {, y0 b6 O# N& x( `
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));+ G# T* R$ o; i, ~% Y
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);
    9 u, n5 n9 t# q% y) E" M' B5 d
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;6 q2 H" E- I; Q& Q% h5 T
  1085.     }2 p4 L* l4 I. @
  1086.   }4 J$ }* }3 e# f+ K$ ?
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */& ^3 x: i( G0 h* x. ]  u. u9 A/ P
  1088.   f' ^' n% D1 z& e# J
  1089.   return BSP_ERROR_NONE;0 j. c! J  R4 Q7 k' ~
  1090. }
    . R0 L7 G6 k0 Q5 ]
  1091. & x: N8 n5 g  ~$ W5 c. T$ y& o
  1092. /**3 \& z  X: i. @2 p
  1093.   * @brief  Draws an horizontal line in currently active layer.; ~0 _2 a' `/ H& _* l
  1094.   * @param  Instance   LCD Instance3 Z8 @7 s5 x' j  L0 e5 @; j
  1095.   * @param  Xpos  X position
    ' _2 s) u. \( T8 q# D$ E/ D: T3 z; g
  1096.   * @param  Ypos  Y position
    2 F0 D1 J# ~: ^8 o: X9 c
  1097.   * @param  Length  Line length7 F+ `1 Z' t9 R7 T
  1098.   * @param  Color RGB color
    ; _! ~: Y3 L% T
  1099.   * @retval BSP status
    / A( X9 S' G- O. ~( w
  1100.   */; h. k+ \: E! x% s6 u
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)
    - a, W# F* B0 h, {" {
  1102. {
    % q4 Q6 P$ {) r9 b
  1103.   uint32_t  Xaddress;
    % w4 }  l1 n2 w. V4 N8 `
  1104. * U- X: C. P( Y$ X1 H
  1105.   /* Get the line address */
    4 Q! A( z& h$ U9 f% I) F! F" n
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));6 N4 }/ }' U" _+ J0 I
  1107. 2 T% r# k0 g. H" ^2 p6 z4 r* z
  1108.   /* Write line */2 i7 k# D8 I7 T$ ]# ?' F7 `) H
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);
    " T# ^0 B) i1 y, ~6 H
  1110. - e  }' c  q5 Q1 f, B% v1 ~
  1111.   return BSP_ERROR_NONE;
    9 v9 S$ Y) O: ^- Q3 P
  1112. }$ v3 q  l# p/ l, u
  1113. 5 C  C2 a" H( z% u, r% J5 Q' h
  1114. /**, v# r& q) V# L# o" C
  1115.   * @brief  Draws a vertical line in currently active layer.# c0 z3 Q3 v8 n4 A" ^
  1116.   * @param  Instance   LCD Instance% v0 ^  X1 _$ X6 T7 |4 o
  1117.   * @param  Xpos  X position2 H0 \2 l) T5 _
  1118.   * @param  Ypos  Y position& D4 o- G* n. ~& T1 D- e
  1119.   * @param  Length  Line length
    6 n4 }" _6 \) m0 u6 R
  1120.   * @param  Color RGB color
    ; Z. G+ z- j2 |/ ^% ?$ K
  1121.   * @retval BSP status
    2 k% g7 z+ }( [5 P& i
  1122.   */7 ?1 O7 H; x, n: J. W9 i% l
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)/ Z+ s3 K- J0 N# ?0 F. q
  1124. {' {4 i* r* d# P  n. v" B% {
  1125.   uint32_t  Xaddress;; a6 |$ I4 Y% d7 K; a" W8 L

  1126. + p) i% k7 A0 O9 T; v$ C: n
  1127.   /* Get the line address */
    / q3 O. Y0 a+ m) d! M4 j# x
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    7 M7 x$ @# l$ V* z5 U
  1129. 7 j% W$ ~+ o2 T% i! J, R- i0 |4 n
  1130.   /* Write line */  f' K1 X+ K$ b" b: @; Y
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);
    , L# b; E% @2 C6 z& s7 X  K

  1132. " A/ U! K8 z/ @3 q+ @+ V3 K
  1133.   return BSP_ERROR_NONE;, |3 [' H& x5 G) y- J- ?
  1134. }0 Y6 S% o. b3 u: W9 n: t, m# _3 p6 N
  1135. & L! H) n* ?" C
  1136. /**' o7 G/ {- z8 w
  1137.   * @brief  Draws a full rectangle in currently active layer.7 }4 l! k( X9 D; f* o6 m
  1138.   * @param  Instance   LCD Instance
    ) \0 e1 ?) [# u% c
  1139.   * @param  Xpos X position/ y3 u/ F' h8 P' N3 C$ Q
  1140.   * @param  Ypos Y position, e' Z" R  ^( e% `+ i
  1141.   * @param  Width Rectangle width+ V, A! j) Q6 y# o
  1142.   * @param  Height Rectangle height
    3 W) N* y  K% j! G
  1143.   * @param  Color RGB color
    3 {( P+ E" \8 ?7 }8 ?; E6 E: r% }
  1144.   * @retval BSP status
    6 F( F5 E  Z0 x3 \# f* _: g
  1145.   */
    $ T% P0 T6 _3 C% I% |; ~% o
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)8 ]+ ]! |  \' C7 w
  1147. {
    3 R' M3 Z( v+ ]; i
  1148.   uint32_t  Xaddress;
    ' p$ e& h: N) a/ L; \

  1149. 8 O) e" t5 p- T& J3 }3 a7 u
  1150.   /* Get the rectangle start address */4 d! ^" ^2 M9 ^+ G: \- ?( l
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));8 R9 ?8 {0 C. W0 y

  1152. 0 W. o* Z) L) Q6 ]
  1153.   /* Fill the rectangle */+ C4 X- t2 ^) K0 N* e; o3 H
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);5 ]! O8 Q1 E$ O) f5 w
  1155. 9 W2 {# a/ @& N9 u: H: G
  1156.   return BSP_ERROR_NONE;
    6 [' @% H  B9 O( U( W! q& p+ s) [
  1157. }) e5 W4 b+ w! }3 i; d5 f; p
  1158. 5 i  ?( z/ i# C1 Q9 l
  1159. /**' M! E  ]7 F2 `# Q' U! B( e
  1160.   * @brief  Reads a LCD pixel.- |6 w* A- V' Z
  1161.   * @param  Instance    LCD Instance. [! @; i( y4 z' z2 ^" n2 W  c
  1162.   * @param  Xpos X position/ p4 @3 H( F; g% s
  1163.   * @param  Ypos Y position& A( Z! ?- T6 ~
  1164.   * @param  Color RGB pixel color
    / ^& ~! ~5 [* K2 q/ l" Y
  1165.   * @retval BSP status
    # L& q( Y; u2 R' {! ]
  1166.   */- Y& g/ V" f9 d! o$ M
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
    2 x5 [$ H2 |% d9 a! s1 G. [3 h
  1168. {3 ^5 H9 D+ g" C  H4 W
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
      I1 d0 z! [# }& m: A
  1170.   {' R( k& ^, _* _. y
  1171.     /* Read data value from RAM memory */
    ! w3 o$ X2 {1 g# I2 b
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    1 I! h' {) A% u
  1173.   }
    : Y) f8 ^# @1 e" a5 V" _- W- I9 y  Z
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888); j4 l: ^6 t% [+ F
  1175.   {
    * |+ v4 j  P: ?: a0 f
  1176.     /* Read data value from RAM memory */3 S+ U3 Q$ M& W" {3 X
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));! U" b5 y% l3 e1 P, @6 j
  1178.     *Color = CONVERTARGB88882RGB888(*Color);$ |3 U% y# `/ i- u5 \7 Z
  1179.   }4 T8 y) u; F9 @& [% o1 B
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    9 I5 z' b, z) F+ t9 F
  1181.   {! |0 W7 c9 U5 K1 W
  1182.     /* Read data value from RAM memory */
    7 I" j, C5 S# G1 ~2 x1 ?4 M" }' C/ T
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    9 A% o9 E  J# E& K1 G" w8 ^0 g! z
  1184.   }4 ?" J" F# C1 y! `

  1185. , p' f* H* z+ [
  1186.   return BSP_ERROR_NONE;
    4 `! E) Y4 d# v) P( Y
  1187. }/ _* a) A/ q6 k+ P( {4 I

  1188. 3 X! A# E" L5 ?: t2 _5 D
  1189. /**
    7 r; L* \  I5 l) ?
  1190.   * @brief  Draws a pixel on LCD.
    8 i! Y0 K* p( a, d; k$ ]
  1191.   * @param  Instance    LCD Instance3 ]6 a- O6 M2 J: r0 j) V
  1192.   * @param  Xpos X position7 h' {% h4 G$ H; J7 Q0 A& w
  1193.   * @param  Ypos Y position
    7 O. M+ d) Q# G9 Y1 p6 Z
  1194.   * @param  Color Pixel color
    3 G' e! p8 g! I  H
  1195.   * @retval BSP status
    ; Q) @, [' g3 }3 F
  1196.   */
    ! S  k+ H# t2 q' J$ M1 O
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)4 R# k: A' q9 ?* s1 e- T6 t! ]
  1198. {6 @  X% |0 b: _; j5 x$ a8 Z
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)" ?' e% m* ?8 c, o& @! \/ x
  1200.   {
    * F: l7 M8 Y2 l8 l
  1201.     /* Write data value to RAM memory */
    3 }  M" z% D* a) D* I9 L
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;3 b& L4 u5 I8 P$ J+ [* L: R
  1203.   }$ X5 r5 R8 Z% x/ M
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)! N; t) S% s/ m7 b+ b3 D( z
  1205.   {
    ) K6 C1 B) ^; @9 }! n/ o
  1206.     /* Write data value to RAM memory */5 G1 V1 A* w# Z: ]) Z6 M- S
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);
    % s( \. R2 r7 `) r# I
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);
    . I/ e! w; ^6 Q* @$ j% s) c. k
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);% ~0 J* v( @. ~* ^
  1210.   }
    , `, j# s, U9 @& \, G# R9 Y
  1211.   else( z1 S' B  }9 v% z6 C
  1212.   {5 i" g0 z; R  M5 ?+ k- T0 K
  1213.     /* Write data value to RAM memory */+ r2 h8 C7 N" o; Q9 ^
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;; ]: U, h& ^+ c6 H
  1215.   }) h3 {5 F1 w1 |6 ^- O' V2 V8 n

  1216. # Q; h$ n! Q* B& W8 \0 S: D* I' Y# }3 Y
  1217.   return BSP_ERROR_NONE;
    : A4 ?4 i$ @- G& u* P
  1218. }$ s6 n2 G( b) v
  1219. 2 t1 O& y0 O/ P4 P. V1 J) s: `
  1220. /**/ z* X, F; G/ X. R9 @% g/ v1 c5 X
  1221.   * @}7 S" u# ?* j4 f
  1222.   */
    # ^/ C# l3 @- L* d4 E: T7 _( \

  1223. # n/ S/ Y3 `# O8 q+ j% N
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions1 ^3 ~! `( r0 F( m, t  Q
  1225.   * @{
    5 U: ~3 x, G- Q' b1 m9 b3 ~/ ^/ X
  1226.   */
    . O% @1 T/ b1 t( e: j4 F- w/ Q8 C
  1227. /**7 R+ o+ c! `3 [+ i4 n
  1228.   * @brief  Fills a buffer.
    # ]. x+ F/ E. ~- S  p( H
  1229.   * @param  Instance LCD Instance
    . v& H2 \* p$ ?1 z, `& H
  1230.   * @param  pDst Pointer to destination buffer: O+ }4 q' G* L# S, k- v
  1231.   * @param  xSize Buffer width2 \& v- m9 D) q' W: O% j1 L! h
  1232.   * @param  ySize Buffer height' D/ P$ a* V% O: u3 I1 S
  1233.   * @param  OffLine Offset
    ( m  f/ P2 k5 B
  1234.   * @param  Color RGB color
    % U/ m# m' B$ }/ ~
  1235.   */- U# d' i5 W' ]5 f
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    # Z; ]2 N& z+ N  P
  1237. {! p* i8 x) F4 ~- {
  1238.   uint32_t output_color_mode;
    0 ?  Y0 L5 j7 n; C( m# ]* t
  1239.   uint32_t input_color = Color;5 e+ r* M3 p7 e: @

  1240. : X" d6 P8 |* L, T* Y9 P% j
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)! `1 x: u! v! S) S% w
  1242.   {
    6 J* a( a0 d7 m* ?0 j) `+ b/ v* ~
  1243.   case LCD_PIXEL_FORMAT_RGB565:4 H$ U: ^8 P. ]
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    0 Z% j8 P( ^; [  B& @/ R  |7 A
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);7 k6 Q6 I& l, q* f9 n
  1246.     break;% g" D1 B9 C/ X' k: T
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:9 X' s( ~7 J# c2 @7 E4 H9 ^, D5 X
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */$ w$ Q9 R6 X9 Z. H  L! c0 ]
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);
    : I" g/ D3 T9 Q; X. Z
  1250.     break;0 q5 h! A% a* h" R
  1251.   case LCD_PIXEL_FORMAT_RGB888:) T. y* m. A1 J" l1 X7 p
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    ) _9 P( g8 w6 h3 }8 m' s% _9 e- a+ \) {
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);9 d6 M; Q; f& h7 V9 j
  1254.     break;
    3 b$ x7 h3 v/ v% N: |# o
  1255.   default:9 d9 W6 [0 I! F, P, d0 h  u
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    + p- }8 Z4 }. ]
  1257.     break;+ ]0 B, q( B: R8 F
  1258.   }0 i6 c9 R+ ]' R/ v5 i- m$ h

  1259. 1 ~. [/ j. J+ }. |8 E, F8 v# s
  1260.   /* Register to memory mode with ARGB8888 as color Mode */
    ( w, H5 `0 d/ k7 P4 D* `/ w* a
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;% D5 x3 Z- e; e4 M8 E/ {
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    ; B6 W2 d* r% B, |
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;
    . [7 O& v. b1 q8 j

  1264. ( h- O& |- m! y6 i7 E+ r( g
  1265.   hlcd_dma2d.Instance = DMA2D;
      t, b6 C: U* U$ i( J
  1266. # `8 j1 F+ g, B
  1267.   /* DMA2D Initialization */
    1 [6 y: l( \% _; G1 a" O
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    5 z) V' h: A+ c6 C) ?
  1269.   {2 S, _; z; E; m: f' ?" l! [
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)/ Q* R! e2 _# _! H6 K
  1271.     {
    9 V/ U4 t. _* Q/ I0 D
  1272.       /* Polling For DMA transfer */
    ( o" J& ?" Z# E; a% S+ l1 A
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    4 i, K) j' Z0 N4 D: a$ L
  1274.     }
    : d- ^/ L, _% m: p2 P/ B' o
  1275.   }
    0 S- M* K3 F& n8 P4 n
  1276. }
    / `6 l9 y; ]0 e8 s4 [. a9 ~
  1277. ; ^  f& M- O9 M, o
  1278. /**1 X* C! b5 Z2 d- t) A
  1279.   * @brief  Converts a line to an RGB pixel format.; c0 e% U- Z3 A+ i4 M) J
  1280.   * @param  Instance LCD Instance
    2 m9 V5 r2 B5 A; b6 v3 D
  1281.   * @param  pSrc Pointer to source buffer
    - U' Z, t. z4 ]/ ?
  1282.   * @param  pDst Output color. @" m8 Y, ?; q4 b$ U6 J3 c2 ~) P
  1283.   * @param  xSize Buffer width
    " K: w" a& q, P% S3 b7 e
  1284.   * @param  ColorMode Input color mode* S; Z2 x/ r# j
  1285.   */
    ; E: y' ~# d; X& f
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)5 K1 z* a+ r+ y4 I
  1287. {% n) t) W3 L0 I* T) ]
  1288.   uint32_t output_color_mode;. X8 [, T, j5 w2 Z/ n; k
  1289. . A! u! M5 h* \$ \4 }) e4 E- B( P+ s0 }
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)  I7 _, F; N- C3 t
  1291.   {
    3 I; _8 m/ B6 }
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    ( N) B( E  W" R+ l' j) V: k
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    - Q& Y' a# U  d# O; v3 f
  1294.     break;. t% N( u$ U3 k" Q2 _" I) H0 v
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:: ?/ P/ b5 W1 Y1 {
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */
    4 F: d1 {# X  q$ f% V  Q5 v  w2 V1 Z, g
  1297.     break;
    ! {$ S; k0 P4 g
  1298.   case LCD_PIXEL_FORMAT_RGB888:
    : T% S3 ^" r# Z8 O; o3 A
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
      o3 ?* e1 z. g  ], g
  1300.     break;
      _4 f  v: \' r" v' _# `3 g: A
  1301.   default:; l! n5 T; K: ]  l- r
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */: k5 x9 N  [" y0 p+ z
  1303.     break;9 d) B1 s( f4 W/ J) h
  1304.   }
    " M% I, K+ b4 f2 c' v

  1305. / P2 H/ J8 _7 t; R$ {
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */6 d) |0 s1 ?7 |8 I& V# o! i
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;" d7 r, v- e. ~
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;' `. ^5 S3 S$ V7 k1 L
  1309.   hlcd_dma2d.Init.OutputOffset = 0;. k' f; P9 l7 [$ G8 c$ s

  1310. 5 B, X% v" Q( `* ~/ r- W
  1311.   /* Foreground Configuration */
    # m0 _$ v# d) @7 E
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
    - Q8 G+ F, p; @1 `
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;: U' ^+ }$ h1 E6 Z# ?* _
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;8 D: |. g, y$ ]) P9 J
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;( p1 }# `) l: a5 t

  1316. 7 s- I( C1 W) e# K) ?7 V, T' p
  1317.   hlcd_dma2d.Instance = DMA2D;
    - M" j* H2 ~& I! f1 \

  1318. # L* p3 p6 T, x- @; ?$ _- f8 {7 {: M
  1319.   /* DMA2D Initialization */
    2 U/ \* l2 k3 J4 U3 G) i3 g8 C
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)- \; l) B1 j9 F2 q. k( N
  1321.   {
    ; C, V! h4 R  g
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)2 \  l6 T5 h5 H. ~" M. l
  1323.     {
    * i( F/ c6 c( O8 K& k
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)$ [5 p& _6 w# R& X0 T0 y
  1325.       {! ?! ~7 [+ l, u* U! v( M4 k2 O
  1326.         /* Polling For DMA transfer */# r  j5 W+ K; Q! B" S
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);1 o. K, X8 a' G6 o) b; l
  1328.       }0 E8 s3 P4 s! N1 g3 F5 x
  1329.     }
    7 w) B- C1 i; f) L9 r/ _& i5 q" S8 G: W
  1330.   }) ]: V6 s0 {! e0 L5 I- Z7 c
  1331. }
    5 _# o0 t9 j! E) q5 U$ T" F) A2 i& ?
  1332. 6 A" ~" q" {" W8 |
  1333. /**3 |4 @9 m2 y& E, J
  1334.   * @brief  Initialize the BSP LTDC Msp./ x! r- l& `: J: w% h
  1335.   * @param  hltdc  LTDC handle& z* B. N5 _# l( e  m6 t1 ^: `
  1336.   * @retval None7 n& o- ^( }- o. C2 G
  1337.   */
    ( N) \0 m& k/ E/ Z* m- c
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
    : R1 W3 j+ u0 h6 X% v
  1339. {6 p3 h9 `0 f& G
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};. |6 ~" M0 g+ K$ F& s
  1341. 6 @$ B, X0 u; V! B3 G- y1 E- z
  1342.   if (hltdc->Instance == LTDC)
    1 t5 [9 y% i3 t0 G3 R' z* D
  1343.   {/ a+ Y: x* r5 ]7 T. L! i" m( S' J
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();
    + o( I! e. ~0 I4 L" w! y4 Z" [
  1345. * a( X1 b* R. I5 s' _( M9 S) O
  1346.     __HAL_RCC_LTDC_FORCE_RESET();1 X8 {' N5 e  S2 H: G! ~$ [/ B
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();
    0 o6 b, _! M  Z
  1348. / {" B& y/ p  w, N5 `4 Q
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */: T7 c, M5 M, A& d' [1 r
  1350.     /* PG0  R0          */  D4 \/ l6 X' H
  1351.     /* PD9  R1          */
    $ g3 y) U7 h' t# v; B8 N  D/ A3 T- h
  1352.     /* PD15 R2          */6 k2 e, V0 @  m0 r9 W
  1353.     /* PB4  R3          */ // JTAG
    % P5 D% L1 t7 H1 s6 l: Z
  1354.     /* PH4  R4          */: G1 m3 j0 a' i2 y2 w  t
  1355.     /* PA15 R5          */ // JTAG JTDI
    , j: E- e: e  o$ `" B- @! P9 _/ p$ X
  1356.     /* PG11 R6          */. b+ K" z( w2 z2 p
  1357.     /* PD8  R7          */
    % {* ^0 E2 @2 \
  1358.     /* PG12 G0          */+ o, ], {  v+ \5 Z, k$ t/ }
  1359.     /* PG1  G1          */9 O$ f* Z: }6 `* ~* \
  1360.     /* PA1  G2          */1 p" F4 w( ~; t0 \. G
  1361.     /* PA0  G3          */( O( v4 t  B! i$ \- j; ~. {
  1362.     /* PB15 G4          */
    - u/ W4 t( h- k: f$ Y4 u
  1363.     /* PB12 G5          */
    6 y/ u# p% [) O% a6 ]7 d# l: B+ j2 O
  1364.     /* PB11 G6          */
      T0 T9 u( L; Z! k. ~% Y
  1365.     /* PG8  G7          */
    7 o! w" Q* p& L5 K( X7 P
  1366.     /* P15  B0          */' _6 h/ ]9 k7 q( e2 R* f
  1367.     /* PA7  B1          */
    ! |( j6 a5 J% l6 _/ x9 a
  1368.     /* PB2  B2          */
    + i  E* b8 R& t
  1369.     /* PG6  B3          */
    , `' ]7 M0 o6 I8 O% ]$ {" H6 }
  1370.     /* PH3  B4          */1 Y6 X2 z; t6 N7 G7 r$ K
  1371.     /* PH6  B5          */' s7 n. Y; O# L: e
  1372.     /* PA8  B6          */
    2 I2 E+ t2 e6 d5 q
  1373.     /* PA2  B7          */- Z% \9 O, h& ?9 a0 h
  1374.     /*                  */
    4 d; g) }% }5 G! `
  1375.     /* PG13 LCD_DE      */2 R, M- q- t" Z9 x, z8 e
  1376.     /* PQ3  LCD_ONOFF   */
    4 G. T1 e+ D8 K9 X  D* }& Q
  1377.     /* PB14 LCD_HSYNC   */
    ! c  o' D- t0 x: g1 Z. C
  1378.     /* PE11 PCD_VSYNC   */4 h& k7 N- |- A, k
  1379.     /* PB13 LCD_CLK     */
    6 h5 r4 ?2 Q# T1 q! z7 p
  1380.     /* PQ4  LCD_INT     */
    ( W7 M$ `6 u) h7 h
  1381.     /* PQ6  LCD_BL_CTRL */6 T  [$ x, y' m; |- _# E5 x1 y) C
  1382.     /* PE1  NRST        */- J% C$ C$ e' b6 P& O2 g5 I7 [( X

  1383. * [* z- O/ ~# w' b0 g" |  I
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();
    & n0 l1 ^; n) q9 u9 N; s
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();
    , G' J5 J: C! }: H
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();7 u6 [8 \" [3 m2 p) z" d; c
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();
    0 H' N3 Q6 G3 K7 i0 y2 \
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();
    1 m- e$ Q/ J( y& ^+ e  O
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();# C0 G, u8 l# o" N  I; r  W
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();6 c$ @) h1 o, c  }

  1391. . u' c* h3 t1 T
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
    # _: r% q9 B3 V
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;
    7 J1 t' e: _2 y6 k( l
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;" {7 P% B1 E) ]. w" g1 p% b: D
  1395. - ~" s; W# F# a2 @% z' C
  1396.     /* G3, G2, B7, B1, B6, R5 */
    0 Q2 R: ]0 l6 l9 r3 C
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;: [0 A4 m) ^- Y. [
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;$ I* u! P; q; J. y8 b) r3 ]1 h. q. z
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);% O9 d0 y8 J: Y) q
  1400. 6 W& _7 q5 V* k1 Y9 X+ m
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */4 ~: _) B4 s& N8 g+ p1 h/ {
  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;
    7 B5 q5 F+ h: \. H- D$ K. }! |
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    + Y' K7 Q4 x2 ?; k3 ~! H. j: B+ d
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);  v  U0 A, [- ~' h! ^
  1405. 5 [/ a* q* H4 C. O; K5 V
  1406.     /* R7, R1, R2 */7 b0 q+ T" N/ J+ b9 ~9 o% a1 P$ `
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;
    + f% c0 g, D  d
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    / t  W3 s$ w: T7 _6 V6 }4 S3 M
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);( N# C  f* H. ]- w) U

  1410. 2 e5 b( P* W) W8 ]* b) V
  1411.     /* LCD_VSYNC */" j  P; b& @, n; r) ^9 O6 R
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;
    * k& Q4 |6 S% |( T* `$ s
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;6 |4 m5 t+ a. }/ x' R
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);4 R" f0 n# H" n: H: I+ x) s
  1415. * a) o2 u* R! }1 _
  1416.     /* R0, G1, B3, G7, R6, G0 */
    7 D& L& i$ ~& m8 ~. ~
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;. u. ?, f3 W5 t4 ?3 o- F# y
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    + y: f0 @% y$ ^( A* Y1 v0 w
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    3 `/ z1 x4 n- i4 _

  1420. 8 T. P7 ~, @- o) k* }9 q, F
  1421.     /* B4, R4, B5 */- L# V" ~* k) S
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;
    $ O: _# w& q: h/ k; Y
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    2 W" O; v! `' h& M
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);8 I6 J8 ?* V' {3 r/ X& y/ i% v

  1425. 9 E7 f. |2 ?! }  M" t# n  D% y
  1426.     /* NRST */
    + a/ I' A& \7 U" x( z
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;: ?/ Z- E* R2 [9 g- n: M% _
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;& Y( w9 u6 x- G5 W3 n+ r; n1 \6 g+ g
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    4 \) G, ]' B& L

  1430. ; i0 k# C5 \, q# ?# n
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */
    + l/ ?, n9 V% K. N  B: ~0 C7 p
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;
    % f4 D7 U1 E; L, ~0 I
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;3 I& }) c* T& d- [- r
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);
    ; Z9 ^4 y7 a6 z6 O5 ~, c/ h

  1435. 8 M% Z0 [5 y; _# G" o; y
  1436.     /* LCD_DE */
    6 H) I% l# V; a; |
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;% a5 ?4 V- e% a1 O( b: i( n/ c2 A
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;  R0 Z1 X6 x% H/ I
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);1 {9 [, l: |$ J' n! D: p

  1440. ) }& j4 ^3 g- g) L# P
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */
    - T. T6 E+ B& ^9 Z! D
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */! a; p2 B- y" k5 X$ D* j8 y
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */6 u7 l2 E% K: P1 q/ @) M
  1444. ) l7 w, }  \( m7 W
  1445.   }' [1 h  ^' W- J3 j, q' n4 @
  1446. }2 s- ], E3 z3 d& s% ^. [
  1447. 8 c, n' x1 t/ p0 J- L
  1448. /**7 c- h- d" p+ U+ I; X0 B
  1449.   * @brief  De-Initializes the BSP LTDC Msp; o4 C$ h8 e0 E) V7 q0 N+ a
  1450.   * @param  hltdc  LTDC handle
    $ w. N% |4 i: m* E- s5 S
  1451.   * @retval None  X8 |1 @- J0 _2 U5 o
  1452.   */
    : z& O9 Y) Q; v; c) G4 G& e
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)
    6 g( i+ X# a: U& q
  1454. {2 i8 y5 D1 V* }9 B  p: Y
  1455.   GPIO_InitTypeDef  gpio_init_structure;
    4 n# |* r6 r' w/ H' a

  1456. 5 j1 x6 G5 b. J$ S9 ~
  1457.   if(hltdc->Instance == LTDC)- L. ~8 f2 B2 [: K
  1458.   {
    . S9 N$ D. {  \; S4 C2 g* O: Z
  1459.     /* LTDC Pins deactivation */
    ( Z: `  n7 r8 ]: i  f. o+ c
  1460.     /* GPIOA deactivation */7 y* D' q! l6 z7 u( l. }# b
  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;
    7 _' \8 c6 L& I. f5 b1 b& w- E
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);
    6 w3 L8 ?6 X: l1 a8 ^

  1463. 0 F, t( L: V( q1 [+ t) k
  1464.     /* GPIOB deactivation */
    : b- }' M' x( ^/ s! z& g
  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;) z4 a& r) Z# g3 T5 i, J
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);9 s+ m6 H) y  f" [' Z; E) E# D

  1467. ) X. s- C4 p* S0 u! @
  1468.     /* GPIOE deactivation */
    0 K  W  r# L! S( ?5 ^8 F. i
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;
    2 L, d5 G  A/ U9 n( l, L8 p% O# q
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);6 P$ m5 g/ o* K" l6 Y
  1471. ) a0 g% L$ u0 a6 ^
  1472.     /* GPIOF deactivation */( S* T  Y7 y8 C7 ]3 z3 Y
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;
    : ]( i! Y5 |7 x& R2 B+ e6 F( v
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);5 N" @& q$ k& |6 @3 ]+ @4 w' j

  1475. 4 X8 ]% |& a0 Y9 x9 h
  1476.     /* GPIOG deactivation */
    ( S4 O% f8 L& _, ]- h) V& T
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;2 e5 T. R0 T# v& J7 x, d' \
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);
    0 b* R, n: e6 U' j3 Z! v$ v: t

  1479. ' U: {# r# |. A5 W$ ]0 S4 S
  1480.     /** Force and let in reset state LTDC */
    # _- t& Z. m9 }
  1481.     __HAL_RCC_LTDC_FORCE_RESET();
    8 [: q7 i7 l/ ]5 F3 x" O  L
  1482. 9 W/ |& u1 e4 D) _2 y5 i9 h. F
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();5 _0 {* I: p1 M7 K$ \: [
  1484. 8 X7 \1 t' n+ W* |
  1485.     /** Disable the LTDC */, y1 C6 O& Y+ R! f6 m2 q
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();
    % L7 ]# V( S, q% l# V, v3 F8 y
  1487.   }8 k9 C; p7 G- D! A- n8 s0 l
  1488. }2 s6 t3 _" \1 H

  1489. 8 y7 g$ s, y( p( t6 P" M  k! f
  1490. /**: v" o9 X4 W8 _( R! g/ v) O! Z
  1491.   * @brief  Initialize the BSP DMA2D Msp.$ w+ `4 |1 g( Z8 b8 Y& \
  1492.   * @param  hdma2d  DMA2D handle) G2 A! t+ x. P3 A& z6 L
  1493.   * @retval None. {! l! z& e: v' J; N
  1494.   */
    3 i6 K& [' N1 n# ^; ?
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)6 v/ y- Z) m) u$ v% G5 U
  1496. {, D" i2 ]$ |7 y( l8 T
  1497.   if(hdma2d->Instance == DMA2D)$ Q2 J2 ^4 s+ T1 ~8 \
  1498.   {# }7 Q( l3 a  D' n
  1499.     /** Enable the DMA2D clock */
    4 ~7 |; h9 s* B: d
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();& W1 L7 D* U1 \) D, ]% x# I

  1501. * T! r. d) Y% o8 ], W
  1502.     /** Toggle Sw reset of DMA2D IP */
    ; z) C: y& H7 K  r1 W3 G% r# w& R
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();
    ' v" d# H  q  _9 G4 [, T( D$ @
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();2 g* b# d3 L/ m7 S, u
  1505.   }
    . h& j" X* }& C  u  |
  1506. }1 ~0 o) p, ?& @, I& s  c& R  V
  1507. / e1 G6 C- g# b. X# L
  1508. /**5 H% l* H  @; Y# z2 S+ R
  1509.   * @brief  De-Initializes the BSP DMA2D Msp, ~1 ?5 M" S# p
  1510.   * @param  hdma2d  DMA2D handle9 q9 ^1 |( Z, G0 C
  1511.   * @retval None
    5 o1 C7 K2 n. N/ ]/ N' e
  1512.   */) Z" }5 G" q6 G
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)6 W! v% f; M) }2 x6 l! c
  1514. {1 j2 ?( z, M( H( A+ ?/ w( N% J* K# Q
  1515.   if(hdma2d->Instance == DMA2D)
    8 h0 ~' `0 B+ L
  1516.   {! `  k0 ?& ^) E" g. y
  1517.     /** Disable IRQ of DMA2D IP */, y/ c8 n. T$ e. C9 H
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);0 [; a8 h/ Q$ f) I

  1519. % R% O  E. C! M7 N! u1 V9 E7 |% ?
  1520.     /** Force and let in reset state DMA2D */
    2 B$ K; k& k5 k$ y
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();
    1 L) x# @6 w9 v0 H3 @5 }* S
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();! C4 k# N4 x: P
  1523. 4 D2 ]/ ~" s: O" a  d/ g0 y
  1524.     /** Disable the DMA2D */
    1 a# O% n. D' H2 L, `. b
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();
    ' a: ]% E3 ^/ |
  1526.   }% h4 ]' I- [0 g, @" Z1 D9 _
  1527. }
    ; C- _6 E9 k7 R4 S/ C" K# B( x6 K( f+ z

  1528. 7 L+ M0 L5 N& N- v8 I" \
  1529. /**
    . y& i8 s7 n6 `# J2 C$ H0 X
  1530.   * @}6 u( W3 O# F+ D) b
  1531.   */
    & l; H) a& Z' r7 f+ f. Q
  1532. ) P/ J# X/ S' j: `
  1533. /**! m9 Z" k5 U( ?; U- G5 x" `% n3 C2 }
  1534.   * @}
    ) t  a0 a9 c1 x9 O' A5 g
  1535.   */5 X% f9 `2 i" l# Y/ a8 {

  1536. 4 H. S- ]) T# X# T0 E
  1537. /**& U" G& p- ^' C* ?9 z
  1538.   * @}
    / w9 Q  ^7 V" L* ~4 c
  1539.   */( u7 J+ i9 a$ d7 S

  1540. ' D6 a$ q! A* f
  1541. /**4 |5 ~- Y3 n) `! F2 ?
  1542.   * @}9 d( M* D0 ?7 x: T8 t5 n7 f
  1543.   */
    $ r2 W) Y/ c: H/ u) i  d$ D
  1544. - ^; x" a  q: T/ z
复制代码
0 T7 d8 J4 A. H8 A
0 Y6 M# ]. I) J2 z2 K
2.2、main.c
. S5 }" {' q* n1 c3 U
  1. int main(void)! }+ g# {: ]3 O2 ]# k: o
  2. {
    & B& q0 K/ s! d
  3.   uint32_t x_size;/ I. o! V' B/ N$ D
  4.   uint32_t y_size;6 O# f- Y2 p8 c( I. @. j
  5.   uint16_t i,j;# {6 p% t) k; U9 a; [! K/ T% \
  6. $ C# w( D; e" B+ n* N$ R
  7.   HAL_Init();
    - P! w: k' u" ^! p  z. }
  8.   SystemClock_Config();
    " e7 a. z) v* Z( a; R  l0 w
  9.   
    , C" c" M$ l; O8 v
  10.   /* Update the RIF config for the used peripherals */4 k- R# N2 p- ]8 t) h
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    . t- y0 X( @* ~# Y+ M$ ^7 k1 v
  12.   RIMC_master.MasterCID = RIF_CID_1;( K: ^- E, U% {9 A: B$ U
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;1 ~# c+ Y3 v+ w$ K" l
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);7 T  J2 u( b2 D, Z
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);
    5 ]0 q. O1 A( s, ]3 \  f
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);6 B. \9 z$ m3 E6 u
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);# [7 F  F3 f0 |; W8 }, z* P% G: _
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);4 L' C4 x4 W% m/ E/ ^0 w4 J1 h% o# O7 a
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
      e5 {$ w+ W/ e/ U) |; l* C' g
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);4 c( d/ ]3 b/ S: @/ z
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    ; q: G( F$ S# E9 f: z+ p
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);7 b3 W% p; i/ ^& o, r: M" @
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
      s3 ^  c& Y2 v) w
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);, `8 @$ M8 M) m5 @8 l4 M9 M

  25. " ^( N1 [: ~! K5 f5 y, k
  26.   BSP_LED_Init(LED_GREEN);
    5 q) }; a$ W$ v9 w
  27.   BSP_LED_Init(LED_RED);2 b7 H9 Q8 J2 p7 T
  28.   
    , g! S9 g( @" l
  29.   #if USE_COM_LOG8 j0 g" T$ b+ C1 H& O9 d$ r% t4 G6 Z
  30.   COM_InitTypeDef COM_Init;9 `' E; `. b9 V% T0 B; G( K
  31. 1 W( ^4 b6 p- A
  32.   /* Initialize COM init structure */
    3 U, Y  h3 Z" X/ s  G& j/ h* L
  33.   COM_Init.BaudRate   = 115200;
    * z6 U: ]9 V6 F, Q4 Z
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;
    * I& K8 m- P/ k1 ^* p! M, n
  35.   COM_Init.StopBits   = COM_STOPBITS_1;: [' M" V5 V* H! z% s
  36.   COM_Init.Parity     = COM_PARITY_NONE;! |( z( M6 ^* v; I8 X2 X! q
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;  v7 w( d" J7 v5 F/ ?9 T

  38. - d9 @* {; |  f& S* A# M: e+ q, F
  39.   BSP_COM_Init(COM1, &COM_Init);' @+ _" I; H) E' i
  40. . C0 v0 s4 j5 @: Q0 }5 R
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)
    + @4 U9 l! @8 M. P* x
  42.   {. h3 H# y# C' Q! J5 s; X" S3 W3 g
  43.     Error_Handler();% {8 A5 I2 Z; g: O0 `, W
  44.   }/ h- M+ }) }* ]+ C, D
  45. #endif
    & n6 C) q; I6 m- f+ C7 Q' c* ?
  46.   
    + K! V0 q# j. s2 u
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);' r! R+ ~7 _1 @
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);7 K( m$ ^  ~. f) j2 U
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    : R" Y3 v5 i3 z8 R# S
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);1 U8 f2 J; \4 e5 _1 E+ r7 U
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);! x% W! ~- b& g( m$ S. G
  52.   UTIL_LCD_SetFont(&Font24);0 O! @0 `3 m; ?0 C% v
  53.   ) C9 ?) l0 ?, m3 v$ g
  54.   while (1)
      ]. u0 ]" A) N/ z
  55.   {/ \! D# C% q- u* E
  56.     switch (i)2 k  s' Z- I, c3 u) i
  57.     {7 G1 M3 J- ?$ ?' A$ Y# t
  58.       case 0:1 t8 \" P8 l/ ]% N% N; g
  59.       {, }8 l6 N8 V. R
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);7 X; ?0 D) p3 p" J3 U' k
  61.           break;* f6 @5 G8 I) U. j6 A" ?* |
  62.       }5 B: l2 U: J/ g: e- l9 q
  63.       case 1:
    . J  y- U/ ~1 L" ~. F
  64.       {
    9 y  J7 `+ H6 p$ U: k" [: R- }4 K
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    ' p. ^- d9 @3 H( V3 W/ j# U. x
  66.           break;
    / ?, O5 ~( Z2 ], q* b
  67.       }
    / r; a3 K+ _5 J/ g, o
  68.       case 2:8 J, C. v- }/ d$ [! e  `- N% V# F
  69.       {4 r# h3 F5 T; i" B) g
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    % |5 j9 [! s0 g) B+ j! z
  71.           break;& a, V( Y7 L$ r
  72.       }
    ( {5 ]$ Y7 M* \0 F$ U# R+ F7 E
  73.       case 3:
    . g  S0 H  ^' j/ [7 O
  74.       {
    , ]4 P3 H4 F: u. b& z
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);  l  p6 u  g) n  {8 {1 o% D& F
  76.           break;
    ' F( _$ R/ y4 I0 r. ]) R- c" y
  77.       }9 J& v2 \$ p) T" L: J
  78.       case 4:$ v0 d6 R0 y2 b+ r* Q
  79.       {
    " p- ], `- d. z& L/ {; \
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);; O% e& |6 E1 H0 [
  81.           break;
    8 q) L: s+ L6 {! K  X
  82.       }
    * c9 \* s8 v( J" G* P
  83.       case 5:' j4 G' \& N0 T. Y. j# P" [
  84.       {0 j" ?" w; s3 J' l
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);  m- s4 D2 H; K6 c
  86.           break;
    . |% d. `- S5 g- m
  87.       }
    # e  h9 M* ^0 _# J2 @2 h/ ]- _
  88.     }0 c, t( M; F& R% A5 r7 N9 I1 z
  89.     0 H" o3 H" N, n1 a: K4 u# O5 c8 i, T
  90.     if(i==6)+ Q9 c0 ^1 p  `+ W4 F( B8 V1 [
  91.     {* m, ^: B) i6 {6 S3 d) ]
  92.       i=0;* Q, R# f' S. G2 T7 Y9 P
  93.     }; f) \- @3 U$ d: \2 n
  94.     else
    8 f3 s" v1 n8 m- b# x/ N
  95.     {1 M, Y$ H* g/ e3 D7 j3 g% h* @6 y
  96.       i++;; H2 o. j4 K7 j' M
  97.     }
    # Q1 Y8 X, E: ~3 L9 c& t, L& \
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);/ J" D% a  X+ T! V
  99.     BSP_LED_On(LED1);# P* R( f0 N3 C- `- [" a
  100.     HAL_Delay(500);
    ) p- s) e5 ~9 Z1 O$ [
  101.     BSP_LED_Off(LED1);
    ) {9 N  _8 [" G& C
  102.     HAL_Delay(500);
    ; V8 ]- j. {8 ~4 w
  103.   }2 C; y# u' H6 i) B1 y/ ^
  104. }
复制代码

& Y. J/ `- b- V2 E: m% O2 n& X( c- {5 A/ E3 a
" W$ Z% T0 c% U4 \2 ]
0 V7 H  W1 i% ?! F  g
三、结果' v. F* h, F3 t, C1 i/ J# |
2 s5 }* a$ c$ ?+ i8 t
- f; h( a5 q/ ]
下载程序到开发板,运行开发板屏幕显示如下:2 ?: ?( H" ~1 W8 n& {0 X
lcd.gif & x# n0 x: l0 t

7 `+ O& ]" Z: ^$ M* A
* }& S( @8 t$ Z9 T% W8 Z) \$ y

+ W% F% E% N# `1 G# X2 B, v3 R! \9 q2 \  l/ h4 G2 E" @
收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似分享

官网相关资源

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