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

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

[复制链接]
TLLED 发布时间:2025-2-18 15:02
6 `0 _3 e  E" {, ]. C+ x

) Z. ^* [/ r& r  j

' H' J0 z7 |. y' L一、硬件部分, J7 {9 j3 U$ d. R. n
1.1、LCD显示屏硬件接口部分电路
/ w* j0 {! g7 T( E4 K6 f+ ~  e- a lcd.png
9 r. _) u5 o+ T: V1 T) S9 D0 {

9 `; v2 o6 `0 N7 `
$ u8 c# W+ S$ ~% p- L( M8 T" Z2 C0 M! [$ K7 J% i" i  `! Q

) v2 z# P# N9 h+ D1 i
4 J6 @, d) N$ p, C' p8 h1.2、LTDC显示内部框图
- l) t! P4 u& v, V6 X" uLTDC可驱动24位的RGB显示屏,内部有两个显示层
; g2 i' t" [2 P6 ?/ T6 e( U 002.png ' u. A9 w: x7 k- Y1 d
( j1 m# B; q- {+ S6 y3 M
! G) b/ z' R: j% P+ d8 X

1 m$ r/ t5 R# W* a& q二、配置LTDC
% P. }5 m% _& [+ E. r7 H: {0 T9 o, J- o2 t5 r
2.1、屏幕的参数设置7 g: {7 |9 O( h$ e% y3 p
003.png 9 ~6 V- t2 J9 F# b" p( d3 t
6 a3 |7 N' S* P! r) k. ?2 l
. u/ A5 D# v6 R- W
2.2、层参数设置
. L5 f7 U) x; I% Z* u 004.png " q7 ?2 z5 h% r* L  x' M- w

& M; R& k) U7 C/ k* U
  \7 ^. R. O2 S. \7 B1 J

  C$ V! J6 I& Y2.3、LTDC引脚设置" ?" V* T+ o1 J9 C/ J7 W) }
005.png
' f: p) c. b( B& A: U: k
; G# l. |/ q2 f9 n, G2 p

' P9 B" X7 D) v( e0 X

4 y( D9 d; @* Z三、程序部分
& f! x) b$ y! x. g9 i
* }# z( q! k& t. ^$ A6 O' M. b) a. O3.1、在项目中添加LCD驱动程序
& h( h, K* A; l使用官方BSP中的LCD驱动程序/ X" S9 T: Q! @8 @! \% ~% X5 f
stm32n6570_discovery_lcd.c* t. `2 H7 f# O: l7 z

5 v  p4 @, S4 Y0 U, u) d$ y
  1. /**& c1 S9 R4 \8 o% L
  2.   ******************************************************************************3 W, u) Y4 c& q* }( r' C# T
  3.   * @file    stm32n6570_discovery_lcd.c
    7 i6 d! f+ Y0 }% ~4 O6 F
  4.   * @author  MCD Application Team4 V* r% K2 n+ q/ K9 r0 x
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module( H, c0 o4 p$ D) J9 i
  6.   *          mounted on STM32N6570_DK board.4 x  y& _7 t# `' s% O, r
  7.   ******************************************************************************5 e5 d: b/ N4 l0 x5 K4 E% O- y
  8.   * @attention( H- `2 G2 _: M4 w
  9.   *
    1 f; P% K9 k% f  o) J
  10.   * Copyright (c) 2022 STMicroelectronics.
    % y. E+ [8 |* J% C6 e  ?
  11.   * All rights reserved.- M) C% G/ d! t9 E& K. |1 \( G
  12.   *# @5 k4 O! ]% I/ y4 ?1 n$ d- _1 D) B
  13.   * This software is licensed under terms that can be found in the LICENSE file
    ) F9 e& k9 B1 N) S
  14.   * in the root directory of this software component.. w- V1 i9 Q, P0 S  \) x" n3 c
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
    : _( A/ X, x  d3 o& m
  16.   *6 I/ z/ ]+ y, @  r4 ^4 @. [# v
  17.   ******************************************************************************8 h- J$ m! Z9 c3 T) N
  18.   @verbatim9 d  V6 Y- p1 c
  19.   How To use this driver:3 U4 h' U+ j, u; g  W
  20.   --------------------------/ j3 v6 H1 ^* V3 o- p! M4 y0 V+ \5 Z6 s
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.
    9 F- F4 f9 G1 }. c& v- N/ ^
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component* j0 b  K" j5 Z* q9 J  B+ W
  23. " Q; |& B3 v' L6 V( R2 z5 Y* D
  24.   Driver description:
    5 Y2 }  l9 G" C2 w: T
  25.   ---------------------
    ! J5 W7 N8 O& f" x. E* d6 x, C
  26.    + Initialization steps:
    * d  ~' G" R0 D# j
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the
    2 ?( r! |+ V+ O$ x
  28.        following settings:
    0 D8 Y9 Z2 D  v# s' R2 P; x  D0 w
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888
    3 ^9 W5 e/ O! `
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.% w' r; t, T% t: _* m  @+ ?
  31.         - Width       : LCD_DEFAULT_WIDTH (800)
    . D, w/ G. N: U9 h4 C5 y
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    * U2 r5 u) u) [( s9 e9 j% H# j
  33.        The default LTDC layer configured is layer 0.% j) `3 j$ Q1 @/ B3 s
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:% O7 y8 D, ~8 \& E
  35.         - MX_LTDC_ClockConfig()
    + p4 ^3 l* e$ m2 m1 N; I
  36.         - MX_LTDC_Init()( e; N/ I+ r1 K9 K
  37.         - MX_LTDC_ConfigLayer()
      t( ^! E9 b0 T$ y
  38. * l) c6 ?; D. N- q
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.1 j# ?( c  M/ s7 H7 m+ ?% P

  40. ) j. P% s. l# T+ J7 N4 D! h* O
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.4 O. b$ a9 [* g* H' d: e- L) J
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.5 O& U) [1 ~1 n* y2 L, O
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    0 w  l" k# @, A) k
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.
      @: C7 o7 s* s- H- o7 m
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.
    9 E+ V6 f% J* y3 G
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.2 B0 A5 |2 `  c) \/ D* T
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.
    / p+ d! O+ v; \* O0 P
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.
    ) ?( _9 p! A" Z% L* G7 h! ^) \

  49. 7 p0 }( D* |7 c& k% Z
  50.    + Options
    # d1 {0 W0 m* Y0 D
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the
    ) n1 q) D3 F: G. d6 `) F
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.
    7 f2 ~* m8 G$ V% M5 p" U
  53.        To control the reload mode:
    ! i2 d; x0 p7 |. I
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE
    ! F) x3 C$ B9 U$ A1 P. D
  55.          - Configure LTDC (color keying, transparency ..)9 g; _4 E& }6 D/ [$ R) I
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE
    , }5 \/ B) O, T* j  G
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload
    # N3 }% O3 P1 I' }3 r4 M% j5 g& i
  58.            in the next vertical blanking' {; b) G4 D3 ]# j  Y* E
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer(), H5 @& P5 w! a7 |7 q0 z6 o
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()! i8 n3 F6 F% Q& F7 A
  61.      o Configure and enable the color keying functionality using the( e" U- w! Q6 e% V5 F2 G
  62.        BSP_LCD_SetColorKeying() function.
    ) N6 x* e0 Z4 z$ j9 I0 T. D
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.7 Q( B6 e+ ?: [0 l6 j! f! z% V
  64.      o Modify on the fly the transparency and/or the frame buffer address
    ; K' B2 V5 M" [/ C8 ~8 i. @& S
  65.        using the following functions:
    ( R# M2 r. v  f* Y( i# P, d! Z4 Z/ M. `
  66.        - BSP_LCD_SetTransparency()/ [7 d' z, x* u. J* U
  67.        - BSP_LCD_SetLayerAddress()
    " R; t% ?2 h8 p  r( X! J8 C5 h
  68. ! D  I* e/ [; e+ J
  69.    + Display on LCD
    + b+ N3 a) F  v, Q; @
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)
    2 @: o$ U& Y( K+ f. [
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,0 a, t" J0 ?5 g
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.
    4 b2 O8 f$ n& l( N) {* C& ^+ ]- \
  73.        The basic gui services, defined in basic_gui utility, are ready for use.4 }5 }* Y6 Y6 J# V1 J* }

  74. 1 O9 n( v, Y( K4 o3 }8 b
  75.   Note:" a8 I/ ?: P9 j, o, i
  76.   --------
    $ y1 f0 E' A" m8 m) i2 i
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select
    / E3 k, l7 z# ]5 U3 b4 j
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this
    ( F7 s% U$ ^) W2 [
  79.     parameter should be 0.2 U, L7 C( \; P' n; S& p, V

  80. : k) ]; o' [! I/ ]) J; `1 \
  81.   @endverbatim9 q: T& n$ F; |8 L  d
  82.   ******************************************************************************
    ' x5 p1 S9 h) h" P
  83.   */( f! y' q5 ^; g1 [

  84. 2 R/ u' t. F) Q3 L
  85. /* Includes ------------------------------------------------------------------*/7 c, f5 ?; c* ]) q8 n5 s+ [% T
  86. #include "stm32n6570_discovery_lcd.h"
    5 z- h: O4 ]9 D$ H8 h
  87.   F, y3 U( b8 |% J. t, E5 w
  88. /** @addtogroup BSP$ R3 h. k3 U0 ~% L1 o- B
  89.   * @{
    # U8 I% o4 P: d+ B
  90.   */0 R3 I& W) d* B

  91. / d! ?7 n/ F2 W# _
  92. /** @addtogroup STM32N6570_DK
    & @0 h) X5 B5 F1 q1 p% q( G
  93.   * @{
    1 c- I! Z9 t( Z5 @% u' {
  94.   */
    1 P: J" |# U& `
  95. ! i1 [5 @/ X: p* U& [+ \
  96. /** @defgroup STM32N6570_DK_LCD LCD4 N7 [$ J- z. J4 ]
  97.   * @{) a# R, j" h3 r) T1 O
  98.   */
    " G9 C& [" u# B. {
  99. 1 t4 [+ l' z& c  s
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables
    ; N! s, C  p- y2 k& D# W5 r+ M; F
  101.   * @{
    9 y" }2 s5 P- t9 `
  102.   */
    * Q) a2 p6 a1 q* ]- ]( L

  103. # Q) R2 h# {2 \0 R: T. \/ H
  104. /**
    0 B+ O! F1 O9 D2 ^% t% x. g
  105.   * @}
    + i$ B: _. X: e  s3 W' I, K1 |
  106.   */
    8 S/ B  Y" F! g  u4 ]

  107. 7 B. |& t! e# F% [; s
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions
    ( V9 x0 y+ X# v7 s
  109.   * @{
    9 G/ a  p- W  I$ L9 X
  110.   */
    , d& G3 x* u* J$ E3 E
  111. const LCD_UTILS_Drv_t LCD_Driver =
    ; t$ G% u& W  l) C! Z7 n
  112. {
    * ?  n5 Y5 |+ l* }' a$ R! M
  113.   BSP_LCD_DrawBitmap,
    / n& W( ~0 s5 R( M- Z! ~
  114.   BSP_LCD_FillRGBRect,- P% x7 O9 B. |7 `
  115.   BSP_LCD_DrawHLine,: p: y- B. h0 y- k$ ?( ~
  116.   BSP_LCD_DrawVLine,& ~, q" Q9 u* Z! w
  117.   BSP_LCD_FillRect,4 h, C. {' S$ w# z% Q8 o
  118.   BSP_LCD_ReadPixel,; `# s. l* a. Q
  119.   BSP_LCD_WritePixel,
    " _" j3 E. Z4 Q) h! i5 s
  120.   BSP_LCD_GetXSize,
    6 O$ _, s. Q+ t/ X: y: X" h4 J0 h
  121.   BSP_LCD_GetYSize," |# \7 w' p2 k# i9 D
  122.   BSP_LCD_SetActiveLayer,2 C# F2 k% r' j+ c
  123.   BSP_LCD_GetPixelFormat) d& J. }$ f& D1 M$ p+ H& ]. b8 p
  124. };. _; y1 M, I: S; }; }" @; A
  125. ; D- M4 D2 w' B% W: H7 u
  126. /**1 p; m  ^. v5 e
  127.   * @}
    : C- [  S/ ^7 k4 Y: j  ^5 ]( [
  128.   */7 ^7 K  X% O, k/ _& a" ]+ I
  129. 4 I, X% t5 }5 c. ]
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables. \( `& i- g% X) r
  131.   * @{
    & x/ ~" C( K& @7 U2 N
  132.   */; a4 q& H# c, u! m$ ^+ O
  133. DMA2D_HandleTypeDef hlcd_dma2d;( g/ X/ G! T# E! E( ?' h' G
  134. LTDC_HandleTypeDef  hlcd_ltdc;
    ( e% ?( d' R( h; L6 K$ O
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];0 k3 ~5 H1 n  X
  136. /**
    # j$ y( d0 O2 y- P1 ]
  137.   * @}
    9 }) q/ v" U$ E( @; B  r
  138.   */
    % o! ?) e, n4 l" K

  139. 1 H- m* @4 E1 o1 w. I: ?
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes
    0 w  }2 S' j% V% F, T
  141.   * @{
      U( V+ C' R3 e
  142.   */
    - w* d+ E9 Y* T
  143. ' v" e2 V( b9 m6 a: U3 n8 d2 z: j
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);- d6 _/ h- F, b0 b2 m7 y5 v$ J8 s
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);
    $ C2 n5 l4 X2 O$ E' F7 F
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);* [- D, N6 S# j( I# Y
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);! M9 g" U8 c0 y
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);
      n1 w% Z, u4 v. O7 ]
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);+ g- {3 q9 k# `' e/ b9 w! d: ^+ V
  150. /**2 O6 s9 R% W) C5 T
  151.   * @}& h1 S" \, |! b9 q- v3 T
  152.   */! Y! m2 }) f4 A+ t0 J
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros+ g4 M: O' N8 {1 ~! v: q1 ?; U2 X1 ~
  154.   * @{
    ) h- ^9 w: k4 Q! |4 ]9 G1 Y
  155.   */
    ! \3 y- r, o! D
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\
    + x+ L5 Z7 ^) \9 Y& G- ^. [8 _  J
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\/ A5 E) U9 D$ M- L) w( ]7 i
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))$ x# {' E+ `$ g' |; ^& T- G

  159. ! h/ d/ E* l, S, ?) f
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\
    5 D( K5 E, i  L4 h  ~) k  p7 u' m" @
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\
    3 S4 U& W% u$ M& l+ _- {
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\
    2 ^4 k1 `. @$ G  F9 n; O
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))
    - N- ?8 \0 g; i2 r, _$ g
  164. + z' u$ l& [0 b5 ?0 K" q  D& z
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    / v0 Q2 l: V2 \+ W$ N# z6 Y, b' h
  166. 8 T# L2 `7 D4 h6 o5 S
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)
    2 ?% Q) y$ _: Y2 O" R4 A& c

  168. 1 z: S  d6 z/ }
  169. /**- k8 ?& h/ Z5 N% f' J# p6 @: m
  170.   * @}5 V! O+ Z7 X1 ~& c
  171.   */
    , V5 J0 Y" w" Z3 e: |* t6 e
  172. 1 w2 s' K2 m; F& l; v* W
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions6 l  w2 Q. \5 P6 q2 I; i) P' q
  174.   * @{2 f& r7 e! N  y1 g% n$ }$ ?* i3 K
  175.   */
    1 L" z0 p1 p9 d9 e% W# w
  176. /**
    % r: n* {; k: j+ [& h. R
  177.   * @brief  Initializes the LCD in default mode.
    $ o6 y2 ]. _7 X
  178.   * @param  Instance    LCD Instance' Z/ U, d4 r. ~- P$ b: `& n+ z7 F
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE/ x' d8 W  M/ ^7 @; @, y
  180.   * @retval BSP status9 ]7 O4 t7 c; I3 x- N* x
  181.   */! p4 ~  |% ~+ D: r

  182. # a' U; \) J) |9 @8 f/ i/ p3 r
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)
    / H- j; C0 I; ^( F; b: G
  184. {
    1 t* U& |# b' I( c* i) c" @$ S2 o3 C
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
    3 q0 r3 q: j- I1 ]: b  o
  186. }
    ' ]6 q) V- M3 B/ G

  187. - r# S" c2 U1 p7 d. L
  188. /**' e. ]$ g7 e# S) ~, J: a! `
  189.   * @brief  Initializes the LCD.
    % r. k9 p3 x$ v! w6 `4 V2 {, b$ [
  190.   * @param  Instance    LCD Instance
    - N4 _. g3 ]9 K6 Z6 X2 c( ?
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE1 W+ a1 z' i/ a! K# _$ P
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888, }0 c4 Y) B" W5 A$ h- V
  193.   *                     or LCD_PIXEL_FORMAT_RGB888
    " b/ c# d7 s4 n) o, S& O
  194.   * @param  Width       Display width4 E, Q" Z  d0 E  M) _% {. K  \/ R
  195.   * @param  Height      Display height! ?1 X+ N8 A8 [
  196.   * @retval BSP status
    ' t0 V3 \% N" w" N; d
  197.   */
    $ S3 `" t0 X* f% E1 C  j
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)6 g# U" A. E; _9 I: {7 L, n& Y' r' M
  199. {) j4 c- u% c( ~6 \5 k
  200.   int32_t ret = BSP_ERROR_NONE;% X0 {6 y# q7 A% v$ [4 l6 X  @( d
  201.   uint32_t ltdc_pixel_format;
    9 a/ P+ m% n# `5 n
  202.   MX_LTDC_LayerConfig_t config = {0};
    . ?4 q6 z# C3 ?; [7 }$ {9 j0 A0 W

  203. 5 ?3 p$ {& C, y8 A3 K3 H
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \
    1 Z1 U5 p2 ?% q+ y/ [% I9 r- \
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \/ ^  }: Q5 x2 |" V, H
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))
    1 Q9 p+ ~/ p( @: F$ n
  207.   {( m2 J  l9 |, w& Z+ C
  208.     ret = BSP_ERROR_WRONG_PARAM;
    ' v* I0 C! P  V6 B. w; p: f  E* L8 C
  209.   }0 Z* O. I, S4 b) H1 _
  210.   else
    % b& Q6 K2 @; u6 v
  211.   {: O6 s! S* D" O- u# v, z; O
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)# Y9 G9 G+ c) I) J! Y' o
  213.     {# [  D6 P5 d: `, G# i# r7 s' B& d
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;, m9 c: K6 j, h# x! @0 N+ u
  215.       Lcd_Ctx[Instance].BppFactor = 2U;- o; W; e* z8 Q. B' z8 u! e3 I' C7 Y
  216.     }$ T+ i2 z" O" `! r8 q5 Y
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)
      ^9 w& C1 t. c& ~& g
  218.     {
    & ?( M# X. j: W3 U! {. O, z
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;
    . z& \5 Y# X4 t; ?% q  W( _0 j# p
  220.       Lcd_Ctx[Instance].BppFactor = 3U;, }% F! Z4 `3 Z4 a
  221.     }" G" T4 }1 u0 o* G, x
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)
    ! z; c9 j3 W: j; i
  223.     {* \+ ~9 i8 \8 U# F
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;
    4 U1 Z7 F* ^' |0 \
  225.       Lcd_Ctx[Instance].BppFactor = 2U;
    % e& [7 [( k+ T4 r: t$ e
  226.     }
    4 G' O7 S! I$ k/ U* [
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */
    1 Y" S4 w- |, _7 d* {& I
  228.     {0 g0 [" C1 J5 {5 s- k
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;
    / s$ e9 d! }- K/ B) C' Z
  230.       Lcd_Ctx[Instance].BppFactor = 4U;3 _9 X5 ?4 H6 d! [- k7 ^; m
  231.     }, ?  ?' I0 A" O4 T! }

  232. : m+ ~- W: l5 Z+ e% ], r. H
  233.     /* Store pixel format, xsize and ysize information */
    , g  K2 x# ]% I2 `# Q
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;
    + D  ^4 T% b5 v
  235.     Lcd_Ctx[Instance].XSize  = Width;1 M3 x7 T- R5 @: [
  236.     Lcd_Ctx[Instance].YSize  = Height;* f1 c+ y7 n3 L% ]

  237.   M* c' g) ~1 X6 l; [+ Q2 O% j
  238.     /* Initializes peripherals instance value */$ U& X+ T, F0 d( Q
  239.     hlcd_ltdc.Instance = LTDC;$ G5 A6 g! T) o. p' f; t
  240.     hlcd_dma2d.Instance = DMA2D;
    1 S, u3 ]. [8 H$ M
  241. 3 Y$ p: Y5 i% ~0 W1 W
  242.     /* MSP initialization */
    + S& u$ \* i, I- [# r0 Q
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    , n! o7 L  N0 W4 T3 Y
  244.     /* Register the LTDC MSP Callbacks */3 W% P% l/ E0 T: C' q. L
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)
    ; f! f; S+ H) O& b
  246.     {
    & C2 K5 N9 e* L6 |
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)4 L% q4 U1 i: j% u& d
  248.       {
    $ n% g& a% l# E# P
  249.         return BSP_ERROR_PERIPH_FAILURE;
    $ x- p/ e  o6 Q) X1 r8 |
  250.       }
    # \( A$ |2 }% }- x4 f/ ?% \& y) Y9 r" A
  251.     }
    5 t- K% X! r: c  D9 J
  252. #else
    0 F. h  c; N5 a# c; ^0 k* q
  253.     LTDC_MspInit(&hlcd_ltdc);, r0 O$ j/ w; H+ g( r' {& H! L6 `
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    , i9 v* e4 i0 i4 {) j# ?/ K; t: k5 y

  255. 7 v. S1 d! l" c# o& l/ E
  256.     DMA2D_MspInit(&hlcd_dma2d);
    5 R. p: `0 L8 t0 l1 i
  257. & d3 e7 i2 O! M
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)( u9 Z+ F) N+ L% Z
  259.     {
    " g$ B+ o3 ~; J& G% r( y
  260.       ret = BSP_ERROR_PERIPH_FAILURE;! }/ \# ~/ P- q1 Q9 s
  261.     }* w  }8 @: R% A6 ]  K# x
  262.     else
    ) n3 X  R7 H3 o% m* W% L  u+ |
  263.     {# ^+ V; N& ?2 \# s
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)' J" V. V& [- `; F/ Y
  265.       {, m  G  ?+ v6 @, Y
  266.         ret = BSP_ERROR_PERIPH_FAILURE;
    ) A) C0 [! j+ w
  267.       }
    6 X3 A7 L4 k) J, x
  268.     }7 J- r+ {3 ~. H% X7 h, v
  269. 0 U8 R1 h* S" j
  270.     if (ret == BSP_ERROR_NONE)
    2 ^- R: U$ X$ ?- Z" v5 w" V8 Z
  271.     {
    9 L9 K9 \8 {! Y! n2 F2 I% ?7 _
  272. #if defined(DATA_IN_ExtRAM)
    6 G3 y% h- s( [% S" M( @
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */
    " R1 B, j4 F/ ~3 {
  274.       /* Initialize the XSPI RAM */
    / H$ _3 ]0 ]( u) I7 g+ x
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)
      x3 b% n! J# a- R3 b) l
  276.       {: b7 T! S4 r- I. |7 `
  277.         ret = BSP_ERROR_NO_INIT;7 R  h# H' A8 x4 H: m  r# L
  278.       }- w$ e7 p, E6 H/ K: o
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)
    5 ~" u2 `5 B& i2 u
  280.       {% l0 y/ |1 o# W) ~3 v. o
  281.         ret = BSP_ERROR_PERIPH_FAILURE;5 q7 f- g! R: g/ A7 V1 ~
  282.       }
    ! j: R* L& A% g+ P" S9 t2 x: l1 {
  283.       else! \  K9 H8 x# O+ Q1 Q$ n
  284.       {4 {5 j* l0 F# R" L7 ~
  285. #endif /* DATA_IN_ExtRAM */
    / u2 X; x3 m4 s$ @
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling
    - w" s: u3 x3 W1 P3 A
  287.         BSP_LCD_ConfigLayer() at application level */
    ! i) E% D' P% j0 T# Y
  288.         config.X0          = 0;! E% O7 E" @# T- u# g' t0 u9 h
  289.         config.X1          = Width;( Z$ K5 `* q0 t6 f
  290.         config.Y0          = 0;9 b. b- P0 L9 d9 q: M  w. |
  291.         config.Y1          = Height;0 Z. X9 l; G! b  m
  292.         config.PixelFormat = ltdc_pixel_format;! d$ B1 E/ w3 f0 E$ U' I. [0 A- r
  293.         config.Address     = LCD_LAYER_0_ADDRESS;& u! U! {& ?3 P

  294. : y9 i, n7 W& x# ^* c
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)
    ) b1 `  J' F: l5 F& Y2 y) A
  296.         {
    ! s9 |, E5 f+ X( F  C
  297.           ret = BSP_ERROR_PERIPH_FAILURE;  q, N/ W2 ~0 s- B  s
  298.         }
    6 [- f3 ]3 K! s! ]9 u9 T0 K

  299. 4 q% I  |- D0 V; g& l, x
  300.         /* By default the reload is activated and executed immediately */" l* r2 Q3 V1 M% Y
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;. c4 i- R/ y& M, ]' d$ l  {
  302. #if defined(DATA_IN_ExtRAM)
    * H9 U- M0 i8 z
  303.       }
    $ j! U/ }6 ?2 m( [; @' l7 j. c
  304. #endif /* DATA_IN_ExtRAM */
    * P3 Z: |0 X7 K% U8 Q
  305.     }
    7 a4 G/ Y7 m: {5 Z1 H
  306.   }! }9 a) J( P  P3 K
  307. , G: |" O* _. \- e
  308.   return ret;5 ]5 d( Y& Q' Q3 ~+ ^# c4 l3 b
  309. }
    + {' o7 R8 i" f( ^
  310. 5 u  ^3 ?& H; ?/ |
  311. /**
    1 D' a. T& e6 B: o8 s' g7 p9 A
  312.   * @brief  De-Initializes the LCD resources.
    ) N% O) i( z  a7 U
  313.   * @param  Instance    LCD Instance2 q& u" m' j, i; F5 _. Y, I9 I
  314.   * @retval BSP status
    % |! I" [4 n. S9 s
  315.   */0 R7 B# J8 e, @1 `- n$ w; Y
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)2 @3 u" i$ L2 f: j1 i- ^, o) p4 H
  317. {
    . h. x% S& S( g/ L1 C0 Y5 [9 |) `
  318.   int32_t ret = BSP_ERROR_NONE;5 I1 h% [$ l- }! n( J
  319. ! r7 |4 M) |# `. M$ h
  320.   if(Instance >= LCD_INSTANCES_NBR)& Q1 ?7 ^+ X2 j
  321.   {$ [/ e5 b4 X0 @6 @# C
  322.     ret = BSP_ERROR_WRONG_PARAM;! ], W  Y5 |6 C% U. U+ ]& D) S: \# B
  323.   }6 A* ]( x# A; r2 V3 b4 {! p! c
  324.   else
    8 _1 S1 {( U8 h, b* f6 r
  325.   {' L! H9 k6 K2 ~; `5 t9 B: _6 r. a
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)
    ; t: u# z% ?' b' v
  327.     LTDC_MspDeInit(&hlcd_ltdc);
    $ s$ m% ~1 a. {2 J/ I, X* w4 i6 p
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */
    ( ^* Z8 x7 s8 d1 U1 f7 Z

  329. % N3 y, \' y! B, b/ P/ Q. q: u
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);1 V  m/ r# k- }5 H/ C9 U
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)2 F( L1 Y+ m/ u. J) Z
  332.     {
    8 A/ i" o$ m, j! e6 V
  333.       ret = BSP_ERROR_PERIPH_FAILURE;
    7 Z* _5 I, R6 X
  334.     }- N* h1 D- [* }- t5 S1 P) ^% b1 v
  335.     else4 |& ]! n; P/ }; u5 [7 ^
  336.     {; R* F1 H9 k+ w4 s
  337.       DMA2D_MspDeInit(&hlcd_dma2d);
    3 q  |* P. O% A9 f
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;  R7 l" |# I; @" X
  339.     }$ K1 y6 W/ X; X1 X8 W. m
  340.   }6 i, S1 S: Z3 ~( f. L6 e
  341. : P2 ~' K* \; |: R
  342.   return ret;
    5 N% T$ f* l  h4 l# z
  343. }
    ! j' `4 ^  \; [- d7 {/ e5 O+ t
  344. / s8 d" x$ h. b$ X& Y* A! D
  345. /**1 }0 C( a/ Q$ c( ?& ?
  346.   * @brief  Initializes the LTDC.
    6 J# o7 C) |9 B9 S8 P% L# a
  347.   * @param  hltdc  LTDC handle$ C& g$ l2 G- L2 B3 B
  348.   * @param  Width  LTDC width1 g; t' i5 \  o5 a/ }* y
  349.   * @param  Height LTDC height8 P. d7 M7 r& c+ l$ A
  350.   * @retval HAL status
    ( W+ w% W8 K; V3 y5 L- j
  351.   */
    $ T" f$ A( C6 D  u
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height), U1 U/ Q7 f, t- n  |3 X4 B! L
  353. {
    " u) F% ^+ l. B4 v: W2 l
  354.   hltdc->Instance = LTDC;
    : P9 T/ m' O* H3 x0 S6 N
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;+ O. U/ g' x" u! X9 u1 C% x" N
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;( I9 v9 P# q0 R0 C! P2 o- d
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;. |3 @8 u: ~4 i+ x. |* B
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;; h) @3 @! B/ {8 F, R( |4 m

  359. & J1 ^3 ~' k& i
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;
    9 @  X- F& ?" j' r
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;# b- X/ g( f0 o4 f
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;4 V. H$ ?1 V5 K$ d( o
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;8 ?" g! M. I* w( K# @5 X& x
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;
    " ^3 ~9 H. f0 Q. q; o& q
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;# b( u) z- j; B5 `# y
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;3 b+ _- R- N2 _/ g" p
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;
    " ?" v9 O- T; Y
  368. 5 s+ c, [9 U- R" B8 r; I0 J
  369.   hltdc->Init.Backcolor.Blue  = 0x0;) Y! l5 u/ x/ F
  370.   hltdc->Init.Backcolor.Green = 0x0;
    ! K# G$ D; m" r3 S. J; q
  371.   hltdc->Init.Backcolor.Red   = 0x0;
    + {6 Z$ `: C4 E" E4 E1 e$ L; Z' X
  372. / `3 q9 L8 j+ m- B, I
  373.   return HAL_LTDC_Init(hltdc);" S; j' y! A8 ~3 G' ^
  374. }
    - D1 F: L6 H& h8 g$ A+ y

  375. ' @  H  Z. \/ P
  376. /**' N+ M9 B. E0 y( J3 w
  377.   * @brief  MX LTDC layer configuration.
    * R8 K. \' k: B5 U
  378.   * @param  hltdc      LTDC handle
    0 t' E1 W0 a1 ^/ N% N
  379.   * @param  LayerIndex Layer 0 or 1
    * U1 u; A2 x' x4 ?; x! T
  380.   * @param  Config     Layer configuration: {$ T5 P  u8 y+ b; m
  381.   * @retval HAL status
    $ V# l0 [! h- l% v
  382.   */
    * m- a2 ~! J: H: v, c0 m3 ?8 r
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)/ ?, S4 `" Z9 i! r
  384. {
    5 w7 D; f, F6 r* g
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};- F' ?& y. X: l1 S/ r

  386. 8 a5 _' b1 t7 y1 i
  387.   pLayerCfg.WindowX0 = Config->X0;
    7 D2 _% U1 Q2 @
  388.   pLayerCfg.WindowX1 = Config->X1;3 E) e+ J, J& i/ }) k1 M6 |: [
  389.   pLayerCfg.WindowY0 = Config->Y0;, {3 e4 m$ ]) |! h0 \" h  H
  390.   pLayerCfg.WindowY1 = Config->Y1;
    ' `" _; G" f( T' u3 W1 B) A
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;9 y/ j( }) X3 j
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;
    + I+ A/ N; L2 r  D+ q# _! x
  393.   pLayerCfg.Alpha0 = 0;5 ?7 l- @/ C& P) o% C
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
    # {2 O- w9 [) C0 M0 g: e* f8 K
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
    8 l: A. G# D/ a: h* W
  396.   pLayerCfg.FBStartAdress = Config->Address;; s7 k% m6 _+ d# _
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);' _+ C3 z  L% u7 X
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);5 X. s! K4 t, r8 O% A
  399.   pLayerCfg.Backcolor.Blue = 0;
    1 z+ o) B3 k$ M9 X( C! U
  400.   pLayerCfg.Backcolor.Green = 0;
    # S. N7 d+ b- w& X, h% j' ^2 \% n
  401.   pLayerCfg.Backcolor.Red = 0;, D" ]1 T4 O- T# C
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);
    9 d8 P4 \& W$ ]4 y/ [
  403. }
    # V8 n0 p: @  @! V" Z4 t' [6 Z2 [+ I9 f
  404. 7 i6 p' s# K3 \
  405. /**
    ( W5 p) @+ n) K
  406.   * @brief  LTDC Clock Config for LCD DPI display.8 m% n* Q) d! K6 }
  407.   * @param  hltdc  LTDC Handle7 L# n( U9 t$ b
  408.   *         Being __weak it can be overwritten by the application
    ! e. l# Y- Q/ }/ T# k. I/ C* A
  409.   * @retval HAL_status4 m. |1 c9 q8 [
  410.   */
    7 n! V9 d: x5 M: b  J
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)+ C1 l6 J9 \4 f" a# d
  412. {7 X1 A. l7 p1 v3 E* |
  413.   /* Prevent unused argument(s) compilation warning */9 D; W  c2 R% H5 R) a' t' L
  414.   UNUSED(hltdc);/ U$ F9 _: f$ f1 @4 I8 A, ^7 W0 t* a

  415. 8 @$ R2 u, Z# N2 o2 C% o9 |
  416.   HAL_StatusTypeDef   status =  HAL_OK;. f8 H# M/ V' O% N: k5 G% W
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};
    9 o. v9 u1 |# f& a; j% x/ n& j

  418. 4 p$ |$ v+ J- T  N" W4 n
  419.   /* LCD clock configuration */0 n6 C9 z, [0 H) e) s& Y
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */2 l: L, x+ E# b1 s/ [6 N* r) _
  421.   /* LTDC - PLL4 */
    3 m8 n3 P$ c5 P# M* T# e
  422.   /* Configure LTDC clock to IC16 with PLL4  */
      o( X# A# y, D2 I
  423. % g- ?" R. A( H) ^' i& C0 }
  424.   /* LCD clock configuration */! X7 w1 G4 o" H" h4 m  C
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    " ?  J0 X! O0 Y7 X, p5 }
  426.   /* LCD clock configuration */
    4 y3 o" Q+ n1 w2 O
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */
      a- v, ~6 F/ ?: C2 i. c  r1 }
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */
    : J' H  v, [( I' }& C" h
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */) h5 q7 u% E' d9 D
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */
      M' A9 `4 S) ]* u. \, A

  431. + E% m3 ^' Y, g4 B* l/ D+ G) C7 G
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;4 d2 G: H. d; k3 D$ g" B3 Q
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;$ u; n& Y+ K# b7 z
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;
    + \  _* {) O5 H( v, r: `" Z+ [( z' e
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
    ( k8 H$ M! ~# d. L
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)( s8 n& v6 Q3 @
  437.   {
    + ?$ c) ?& Z- K7 X# T
  438.     status = HAL_ERROR;$ {. x8 e4 H+ o6 T) k: S/ Q
  439.   }# V5 R; }6 {" w3 `0 j* R/ Z6 K. ~

  440. & ]5 l' f, y& r* m% _% h
  441.   return status;
    + E( Z' c/ W+ x( r, q7 f
  442. }9 H) G8 P6 m  \+ |
  443. * p% r( p% }1 w* i# l( d! g
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)% L& `3 {" o  v! ?% H; P4 z
  445. /**" I. N' E/ b5 m( y/ ~
  446.   * @brief Default BSP LCD Msp Callbacks
    " G, E  `& r8 {) f: N  F: _0 }
  447.   * @param Instance BSP LCD Instance" U& P% T2 y9 B! F' s
  448.   * @retval BSP status7 s3 F" x8 ~3 N" ^/ C7 }. \
  449.   */7 E, ^5 X' |0 I* j  ]: U$ t; h
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)
    : X) }) }1 g. M  Q; O* N. J
  451. {
    ' u+ ^! L5 i$ d& O" w, Y
  452.   int32_t ret = BSP_ERROR_NONE;
    . O, Q+ Y, N# ^2 [( p/ l" p6 m
  453. 9 ]; w3 a# a( x4 _  ]
  454.   if(Instance >= LCD_INSTANCES_NBR)
    5 G% C! g" `- q
  455.   {
    $ _$ T: h8 u# O  A
  456.     ret = BSP_ERROR_WRONG_PARAM;5 u# o  K( y+ W4 ^  E' H* v# {
  457.   }
    4 o+ E" h: I! ~3 p' @
  458.   else
    ( p4 W, k- C8 h. t" ~2 D# H6 @5 z$ ^
  459.   {7 U+ v& z, \7 z; H, O
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)
    + ~' R) X5 z7 X' |0 z
  461.     {( B6 {  Q4 \8 Y% l  B
  462.       ret = BSP_ERROR_PERIPH_FAILURE;& y( n: T# l' E  T( F% g6 h
  463.     }/ G7 y' C* W8 M/ u
  464.     else
    + S$ n/ R* T. ^
  465.     {
    8 V% D. p" S9 m+ W
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
      \1 n0 \& Z8 m7 ^; w! o9 p
  467.       {* [! \" Z, `' [7 z4 l
  468.         ret = BSP_ERROR_PERIPH_FAILURE;( |# o$ V( n7 y& ]
  469.       }% |: G! a4 ]( V" t4 m  K0 b4 i
  470.     }1 j+ g# j) {6 i9 b) Y8 p) n/ _
  471. / L( O$ o& Q; \; R) D
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    6 x. w! i8 d- G, u9 r
  473.   }; ^. r1 }4 L! `5 O* W& |
  474. + Q! Z0 T2 ~4 W. n! G" H  P) E
  475.   return ret;9 k' O! {% ?  j/ T4 d' x8 c
  476. }
    " e5 b, o4 p$ X9 s. ~0 l$ w
  477. % d$ Q" h! G7 F) z$ H
  478. /**2 M$ q3 z  `3 ^. S' l
  479.   * @brief BSP LCD Msp Callback registering+ a9 ?; N, ]" v) z/ ~
  480.   * @param Instance    LCD Instance7 `- k1 S7 M  M  K
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions
    4 T: v4 u2 f5 n% H1 G
  482.   * @retval BSP status: Z: V* a* l- t  f- E8 g
  483.   */& r. E. F$ P; }8 q
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)
    ) Z, s1 [1 W4 h' M5 Y8 O
  485. {; F6 g4 p/ Q, \. m# V: N
  486.   int32_t ret = BSP_ERROR_NONE;+ v' L( _" x5 r* d* Z* t. I0 O0 p1 B

  487. 3 u. x* p6 F) w  z" E" z$ \
  488.   if(Instance >= LCD_INSTANCES_NBR). }3 v6 h* N5 ]; I; C3 Z3 z1 _; F
  489.   {
    9 S2 M& I% U: J
  490.     ret = BSP_ERROR_WRONG_PARAM;: Z) k/ `( U# I& {9 p( y* R
  491.   }2 @7 Q# `9 }6 M* a8 r
  492.   else/ L* r3 y/ ~* g, U
  493.   {6 l8 p1 b2 G) T
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK). p8 X9 \7 `9 }
  495.     {( C: S" @; Q3 d7 o2 X
  496.       ret = BSP_ERROR_PERIPH_FAILURE;  X9 P9 R, \# J2 v
  497.     }& X4 @% R' m' R
  498.     else2 y6 J6 t' ^# W$ S8 \! `) a( _
  499.     {
    # r# z- b' h/ _5 @! A. {4 ]
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)$ z0 U' S$ X! R( w3 U% ~+ O
  501.       {
      d) ?$ J# Z6 M% K4 P* @2 I
  502.         ret = BSP_ERROR_PERIPH_FAILURE;
    ; M8 J8 t7 Z7 _; {* v$ ?
  503.       }
    - W/ a% [0 y; |. Y- S9 ]( \: J/ ]
  504.     }6 G, r4 J6 V$ k) F" A

  505. 4 ~3 \! r9 [& q
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    / _# [1 Z' ^8 a  j* G6 b% d+ u
  507.   }( D/ T- B3 R0 T# Z$ S4 B' m' B' T

  508. ! ^& t9 b! C+ t0 C: H/ X: w) L
  509.   return ret;
    % q+ l6 f1 R4 A  _$ A' _+ w% R  \
  510. }( f' n7 n# D3 Q" }, @
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */& ~+ r# t7 o* }, ~6 T' q( e

  512. . g- d+ \6 _: C2 M2 T
  513. /**
    ! p6 j, j/ i% X4 Y& X
  514.   * @brief  LTDC layer configuration.  w: F$ l6 E/ E0 p
  515.   * @param  Instance   LCD instance
    " A& L! a% c3 Q2 J1 S0 v: W, k
  516.   * @param  LayerIndex Layer 0 or 1
    4 [1 u% u5 y5 q0 g  I, @" |+ d
  517.   * @param  Config     Layer configuration4 A  P+ o' g6 C: G; r
  518.   * @retval HAL status
    ; \; r" I6 G' m" h+ U. ?
  519.   */3 A' [0 ?, b) j' u2 z. i
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config). `" Y  z* H: Z5 f2 ~
  521. {
    " n# }* h: I3 w6 z% Q8 d: _
  522.   int32_t ret = BSP_ERROR_NONE;1 j* ~1 H6 V8 E: F* M
  523.   if(Instance >= LCD_INSTANCES_NBR)
    & r  y& h2 t* g$ C# i* h9 }
  524.   {
    8 a1 c+ A8 J( D- X: j+ m
  525.     ret = BSP_ERROR_WRONG_PARAM;* T1 j5 a. |( v* }: E. O
  526.   }
    + @2 Q6 o1 W7 o- O
  527.   else& V8 m( |# X! D
  528.   {
    0 `: ^( o3 y" Y  p$ `# c. m" S
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)6 {; W, T& ]% X3 @* R/ o, I! A
  530.     {
    8 y) }5 `& [1 {2 W( H4 A
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
    ) |6 h; P5 ?6 D* K) C
  532.     }
    7 J( H/ w  J, f3 g7 R
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)
    : Q- f) w2 P2 q- C2 \
  534.     {% p  u1 j9 k' p( C" V- F
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;) C/ ?, L: M' W7 e4 A  {* b% f1 x& g
  536.     }; H- Q8 B$ U. D8 M; W
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)" L% V5 g) v# b) W$ l8 E- p* ?1 L
  538.     {
    1 G, s8 C* A- B
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
    6 a3 {0 }& o) ?7 z
  540.     }
    . @7 z. x% F, e+ @  N
  541.     else- j' U- B: S0 B/ i
  542.     {
    - G' n8 U5 B$ ]& F, L
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;$ `; G- ]5 v: Y# _) m  J2 X& Y! `
  544.     }
    " m2 }8 f3 F. _7 d$ ]* l
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)2 _2 H( h# Q5 }$ B" D
  546.     {
    & d1 V/ Z% P$ j' ~. D" Y
  547.       ret = BSP_ERROR_PERIPH_FAILURE;
    # o% m: n7 o5 P& P# l/ @4 y1 c! F
  548.     }+ @0 |3 c( ]; i+ o
  549.   }
    - B3 V! m1 T) [" j
  550.   return ret;
      r% l* c- ?/ X) @# u
  551. }
    2 }1 t6 ~* j$ L4 P/ Z

  552. " c" S; N% L5 p+ y
  553. /**
    3 C  l* R' @) r" q( Y$ n0 p
  554.   * @brief  Gets the LCD Active LCD Pixel Format.% Z0 `. X" I: U( `2 Y
  555.   * @param  Instance    LCD Instance
    ' t. A$ p9 n2 x( }
  556.   * @param  PixelFormat Active LCD Pixel Format
    % D$ b$ c" k  B3 Y; s; B
  557.   * @retval BSP status
    5 K) h6 y. g5 q7 ?% \' X
  558.   */' v- p  x- J) [. v5 L" g5 k& F3 P2 M
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)
    5 T: R4 y( D7 ^% J# g9 y; ~3 a
  560. {
    * K3 ]6 }4 s. l' N
  561.   int32_t ret = BSP_ERROR_NONE;8 z& w' @& B( O, f, o" P) z
  562. 8 c8 a& I5 e  S, l
  563.   if(Instance >= LCD_INSTANCES_NBR)
    8 u' K$ `) G. H9 z) ^
  564.   {
    4 G1 I# I) ~) w1 Q
  565.     ret = BSP_ERROR_WRONG_PARAM;
    ) Y; O2 A2 l9 J6 \$ [: U
  566.   }
    : ^+ Q- r$ R' v/ f
  567.   else
    + a5 \- a# V- @) U* Q5 w, E8 I
  568.   {
    % A; `  E5 }% ~7 _
  569.     /* Only RGB565 format is supported */* G8 F3 {" H7 a( k8 t& l4 u
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;/ P8 o7 N$ K0 F. N
  571.   }
    9 Q4 X/ F0 J% q2 D
  572. 6 L7 U- f- V5 D3 |2 y, v
  573.   return ret;* w% x/ I; R0 I9 ^
  574. }
    3 z  _. X3 C% R! l% }  r
  575. 3 k' x! ?+ |# T' b2 t5 X* C. g0 [- y
  576. /**
    % g, G# F, ?- N
  577.   * @brief  Set the LCD Active Layer.
    6 x2 V* u. C6 M& M/ ~2 d4 M0 b2 }
  578.   * @param  Instance    LCD Instance6 V3 Y3 Y/ d' q
  579.   * @param  LayerIndex  LCD layer index
    2 [7 C  p5 n$ Y5 o2 [) {- _
  580.   * @retval BSP status) l4 M8 B: x( f; `
  581.   */
    0 P7 y' E# B4 T9 \1 y! p; v
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)
    . s' |# K5 `/ l/ ~, F
  583. {% ]8 c$ j, H5 g, T1 L
  584.   int32_t ret = BSP_ERROR_NONE;7 _' K7 U0 N9 s/ T' M
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;1 n: o% T$ N0 A: c

  586. - m( L. [5 b" Y0 W- G& |
  587.   if(Instance >= LCD_INSTANCES_NBR)
    0 R. A( q9 H" |0 T3 q+ t
  588.   {0 {" K8 z7 A, G" \* l9 Y% U. a
  589.     ret = BSP_ERROR_WRONG_PARAM;
    2 _) ?5 @" e3 d2 @2 R: j
  590.   }
    8 [  C. N; W* W
  591.   else
    / t+ I  m) z- a1 y3 Z
  592.   {# L! D( E) w6 t% V, j5 k9 G2 T2 I' G
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];8 {7 S) x& U% ?7 {
  594. 2 ^1 x/ h5 n0 \6 S
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;8 S7 l. e& {' d  Q* @$ |
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;% H& q: l; |* e1 C" s
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;
    " ~; E: y$ {/ F5 b. N: k9 K) r8 p* r
  598. + r2 U+ u1 [- R7 [. B$ |( u
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
    1 D* F' |6 w# j3 F, X, K0 ~, O9 `
  600.     {: ?. Q' B  A% R* F- O
  601.       Lcd_Ctx[Instance].BppFactor = 2;
    4 o, v. x2 Z+ l9 Q# w- ^4 _6 Q
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;/ y2 p. A* a1 R/ i
  603.     }4 H6 r  |) M/ K! U' B
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)$ x% Z- ~1 X: r( U6 J
  605.     {6 d# s3 h; E/ x6 ]! M+ l8 X
  606.       Lcd_Ctx[Instance].BppFactor = 2;
    2 D- a/ ?# r; y$ m1 Z) q
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;
    ) S$ P) u2 _: @9 u7 @* ]
  608.     }
    * W; \! q2 p! \
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888); U7 K+ a; V# j3 h: W; J* r
  610.     {: f+ T; W. s$ Y: d2 X- t% ?" o; U9 k, t" G
  611.       Lcd_Ctx[Instance].BppFactor = 3;
    + F" E' L" T* d0 ?  y' g" [
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;
    1 T* _' C8 N7 U2 n" q# y
  613.     }
    $ J8 }7 z$ I9 X0 K
  614.     else
    % ]; b# T7 Z1 ^" c
  615.     {! A  c; I: n& }5 G' t+ X
  616.       Lcd_Ctx[Instance].BppFactor = 4;1 U0 w% D0 V" ?9 V
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;. E; N. A2 S6 ]) v5 k
  618.     }% h! k% a4 m) N% X
  619.   }, l5 m7 I1 x4 Q/ u/ h1 c! b

  620. 8 h- F# d  {2 a  L# J* j
  621.   return ret;% v( W' m- [: M9 W- w( W+ E* R
  622. }* @3 c( v/ O/ o5 r
  623. 6 K! ^8 B7 T0 d; u- U* `! R
  624. /**
    2 U" }6 ^) F6 C: b/ f( ~# S1 R  p6 H
  625.   * @brief  Control the LTDC reload
    4 W, y$ i5 p2 p3 }8 W! U5 \4 \
  626.   * @param  Instance    LCD Instance
    % A, g: Q- ?2 [: i( I/ Z5 h5 P
  627.   * @param  ReloadType can be one of the following values
    / S7 u) I& [  V1 \
  628.   *         - BSP_LCD_RELOAD_NONE
    : r/ t( `# R% d' s, x& O# L% v
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE8 D# w6 W0 h9 t
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING
    ' z) N9 v& E" _$ T( Q; ?
  631.   * @retval BSP status" ^$ t) w6 t* ^+ _  ~
  632.   */7 T. H3 r' g) j$ M/ M
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)7 K, u$ C) x: M3 @* @
  634. {- u* t( T1 b" ?& @  f4 e* x
  635.   int32_t ret = BSP_ERROR_NONE;( o3 x* v) p2 H% R/ w0 A* W" F7 s

  636. 9 C' N" Z: g) {) \3 L% P) Z
  637.   if(Instance >= LCD_INSTANCES_NBR)4 V+ B! M3 v( x5 M5 }# A
  638.   {
    : m$ o$ \$ o/ I& k
  639.     ret = BSP_ERROR_WRONG_PARAM;% |- S& e, d' `( D
  640.   }8 x7 L, t7 K- Z
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)/ {; A* ]8 P% W( r
  642.   {0 g8 Q( z) h, v( Q9 X0 A0 F
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;
    2 N! W: b% D" I. e( \
  644.   }6 Q1 \: V0 ~8 K
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)
    ) j, {' q7 H9 O( F) H5 C0 Z
  646.   {* [( S6 f, ~, b9 U9 Z7 A
  647.     ret = BSP_ERROR_PERIPH_FAILURE;
    9 `' Q, f3 J6 d" d- ?% l3 X2 G
  648.   }. y  u/ o( Y9 h( X& T
  649.   else
    / a2 J9 H! a. g
  650.   {
    ( n7 g/ a/ C2 L9 Q8 c
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;
    : Z3 a0 r8 X1 f8 J7 h2 X
  652.   }9 G2 ]. Q; }. V. j+ e
  653. - X+ o, P& V6 M! F1 Z# B. n/ e
  654.   return ret;' n. P* O: u" d& Q$ ~4 V. g: t* A
  655. }* I8 }( J) ?% i& l/ ]  H* V" M% [4 _

  656. 2 R; j) \! R& p% y" Y* \( ?
  657. /**
    - t9 A, z( g5 z! \: W4 s5 ^% b$ n
  658.   * @brief  Sets an LCD Layer visible& o  P3 A! i% G8 h
  659.   * @param  Instance    LCD Instance
    6 B! |5 F; ~2 W7 Y; z
  660.   * @param  LayerIndex  Visible Layer
    / W! K/ q* `6 ]' X+ u6 Z& b
  661.   * @param  State  New state of the specified layer# Y' \, }: h8 L6 y2 G
  662.   *          This parameter can be one of the following values:( ^) a& _! W/ V7 |8 K, I3 `
  663.   *            @arg  ENABLE, j- F. p- g. x/ I' o9 D
  664.   *            @arg  DISABLE
    - c1 q, k8 W* |7 g; g& [2 K
  665.   * @retval BSP status
    4 D2 J7 C4 ?% ~% V
  666.   */
    & k' M/ |% f) z% x4 F
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)
    : U. O9 V* S% e9 \' L. [
  668. {
    % i9 h9 u' L# T) L8 v
  669.   int32_t ret = BSP_ERROR_NONE;1 O1 c& K) _5 e1 V( Z, `4 o& y! N
  670. # w) I* e$ M$ R, u
  671.   if(Instance >= LCD_INSTANCES_NBR)# _, S% W# Y& O9 l- A8 q
  672.   {
    ! H% C- {7 G7 {
  673.     ret = BSP_ERROR_WRONG_PARAM;/ u% _' l! k! T. p
  674.   }' t3 ?4 t  g7 h) q
  675.   else+ W& e# P2 |5 f. w( x6 B5 l. H; t. b
  676.   {: K* F2 t8 @  w# Y- D5 Z0 W
  677.     if(State == ENABLE)
    / h2 K+ B. {  p1 o5 A' q
  678.     {
    9 H, V/ Y9 _  Z5 |& M7 H
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);  W/ R# b6 j8 K; |: H/ p
  680.     }
    2 v- j( A7 C6 w' k5 l3 D
  681.     else2 Z. ^4 J7 q% t+ S- R4 m  A  T
  682.     {
    2 `2 Y0 U7 }% L3 M3 h+ J7 G% r/ F
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);
    * [- U5 S3 D* t, ?
  684.     }
      Z  |; s4 B0 ~& v) \

  685. - F5 u. p* Y2 H
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)7 l' T1 Y& k. v* `
  687.     {, y  R- u$ [% T- p* Q) \) `
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);  W9 z2 D0 P1 S9 o$ I( w
  689.     }
    2 j7 k  v! i  D; Y- q6 Y
  690.   }
    4 z8 S$ O7 w; r/ }
  691. # l: t. m" u7 C2 ]" }; h) A
  692.   return ret;" b7 v2 e1 ]/ [' q, \' a$ c6 S2 n
  693. }% O/ y$ V# L2 P; g; h0 Q$ x

  694.   E! w; Z7 P9 W7 B/ H
  695. /**
    ) {" `$ P* j; O* v; W( F5 J$ C" b
  696.   * @brief  Configures the transparency.& n5 v7 S3 o3 l! k. T4 S! ]
  697.   * @param  Instance      LCD Instance. D# E% h, E( L) C" i8 v
  698.   * @param  LayerIndex    Layer foreground or background.% _) K" w, J7 o
  699.   * @param  Transparency  Transparency9 b6 ^# m5 m% N. ~  y
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF/ [7 g! ^8 v. w( w0 Y
  701.   * @retval BSP status
    - Q8 L. p; ~* o
  702.   */
    - u0 N) I3 |/ m6 Z1 e; a% K
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)
    4 N4 j- `1 k5 h  H- Q
  704. {1 Y# i+ B1 \0 j2 a
  705.   int32_t ret = BSP_ERROR_NONE;
    + C. q& q; L' x; r
  706. * v% b6 [2 x$ [3 c' u: C6 m7 w! V
  707.   if(Instance >= LCD_INSTANCES_NBR)
    1 }7 }* k0 n* b8 O# G0 w4 R
  708.   {: C2 K, U! n. Q
  709.     ret = BSP_ERROR_WRONG_PARAM;  r7 Y4 J6 q; t! ^7 |9 O
  710.   }5 \- e! @" I) |- `
  711.   else0 S& T  U1 A* I  i: G
  712.   {: S9 a# ]7 }8 \6 @( B- G
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    9 T' A9 r( a  k  Z2 P# \3 R$ u* g
  714.     {
    9 L, V+ M0 c$ k( ^9 R
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);
    ; e4 u9 w# \% Q: W) S5 g
  716.     }. K4 }7 }, Q. }/ L7 g6 ]
  717.     else
    * T8 _% K. {  {3 M- h8 X
  718.     {
    , Q, }! N7 O9 e5 E, |- b- G
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);6 ]3 M0 y3 J5 w7 u- `1 ^+ l
  720.     }
    5 j1 A+ i. ?; k( R: B  K
  721.   }
    - W3 s$ Z2 E6 ]% j& u

  722. : m" I$ O& }0 ?/ S5 v4 Q8 G- ?
  723.   return ret;
    2 l5 u' c, v  R% p7 E; ~
  724. }( p! S! ^( _% L6 I/ T: \

  725. ; P0 r4 [4 m5 K0 y6 G
  726. /**( |9 j: Z! C  t( m, y' _
  727.   * @brief  Sets an LCD layer frame buffer address.
    : i$ ]. D: T: W
  728.   * @param  Instance    LCD Instance
    2 g$ v, l6 A* l, W5 U% d0 j) g
  729.   * @param  LayerIndex  Layer foreground or background, e4 }# A' ~7 F& Z
  730.   * @param  Address     New LCD frame buffer value* [( X% `: w2 Y# f2 t" |5 G
  731.   * @retval BSP status
    " i. F/ ^2 [5 P% F+ m8 T7 [
  732.   */
    6 m4 z. i) |2 O) \9 I0 b' r4 R/ d- m
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)/ i$ l0 N. @/ S$ Q) g
  734. {
    ' j8 b3 ?7 ^6 V7 N; Y2 H
  735.   int32_t ret = BSP_ERROR_NONE;4 `4 x! a4 J# L9 g
  736. . @5 {' p2 Z' X  a6 E( f$ V
  737.   if(Instance >= LCD_INSTANCES_NBR); l5 `9 l$ W8 t: [" i
  738.   {9 N- J5 N& @* d, n- e4 i
  739.     ret = BSP_ERROR_WRONG_PARAM;
    7 E9 y7 D8 y9 r6 A
  740.   }
    $ |" T: L+ J6 P
  741.   else
    * H( W& L$ J2 Q9 G
  742.   {
    3 `3 o; t6 ~7 ?! W; T" Y5 @
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    0 w# }; R2 w7 p$ t( _, y
  744.     {
    * q4 Z" P* @$ R/ ^. d% r! a
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);
    & M$ \$ a* b) S. U0 R
  746.     }
    6 g* m0 c6 J- S
  747.     else
    3 \1 M; i- L- H, q3 k# j, K
  748.     {
    ) y. O2 B; l; O% v7 M3 {
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);5 H) v, [4 e- V9 F& x3 t. [& O
  750.     }
    . {9 w; k& p& F' e2 H5 G
  751.   }" O* }. x1 \/ E2 B) e" F( A

  752. ) p& h1 C1 q' A0 R* y, W
  753.   return ret;* X* P5 M! T1 K0 Z5 I' m
  754. }
    ' h8 r; m' q( ?/ g5 s4 b( Y
  755. ! z" {" G/ G9 A. c
  756. /**: b' E+ c6 r( A; h, A0 K" c
  757.   * @brief  Sets display window.6 O* x& z  _1 h. S4 a
  758.   * @param  Instance    LCD Instance) P5 y) O+ C& I; X
  759.   * @param  LayerIndex  Layer index/ V9 S( J% m( O: o4 X& u: b* s
  760.   * @param  Xpos   LCD X position+ G6 {" ]7 E$ n7 T* \$ [: F2 h
  761.   * @param  Ypos   LCD Y position
    8 u( f8 y7 B/ X0 \5 V8 ]0 G
  762.   * @param  Width  LCD window width/ r: V+ G0 l" m% m1 j2 q
  763.   * @param  Height LCD window height
    6 z  @3 K& }6 J& h; f7 V
  764.   * @retval BSP status
    & e4 P/ E5 u; Z+ p, z7 v# x( z  j
  765.   */: v3 ^9 S$ {% @3 J( ?5 X
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)/ Y. f& x# y7 V7 |% {
  767. {
    8 e3 J+ k+ L9 @/ f- h# S
  768.   int32_t ret = BSP_ERROR_NONE;4 V4 G' q: }* g7 _0 l' T: L  H/ \
  769. . o) i7 R2 P, _! x3 f/ T: U. D+ y
  770.   if(Instance >= LCD_INSTANCES_NBR)/ g  P. \$ ?9 s' W4 C
  771.   {
    $ E: w1 t, n; g" l/ o7 H% x1 t# u
  772.     ret = BSP_ERROR_WRONG_PARAM;; }3 j$ ^1 V! |# z; }6 C
  773.   }' h& |7 p6 y1 g1 w: R
  774.   else
    6 Q8 ]$ C* v& B1 p
  775.   {
    7 P3 q; y; Z2 J" X& E! l+ b
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ) v1 M& n  U9 V7 m8 C5 I) |
  777.     {
    . s9 H) {5 o+ b9 K6 o. _
  778.       /* Reconfigure the layer size  and position */
    ' B% W( |! u. a
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);6 I) h) c' @5 M7 ]9 X) {) X' ]! g
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    " s5 B) r5 D: d
  781.     }
    ; F1 O# ^; B- O/ g$ o
  782.     else5 R& A! F; t$ Q7 U0 w- Z# q/ ?- I
  783.     {
    ) [, S- F; x! ~: G# k4 {# a
  784.       /* Reconfigure the layer size and position */
    # H6 p6 R" f: L" ?* B
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);! x3 z. m3 M8 [2 P1 X6 ?" |2 _
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);- g+ v5 Y4 K. f; g) \9 v' p
  787.     }8 u7 L" w0 i& \3 q# u* A7 o/ t  Q3 m0 U) `
  788. ; m9 x+ O2 K0 Q
  789.     Lcd_Ctx[Instance].XSize = Width;$ O1 C9 C& ]% V' u& W5 P! y
  790.     Lcd_Ctx[Instance].YSize = Height;
    : p7 R/ A) j2 t/ f/ b
  791.   }
    1 m+ j" e* u% F4 i, U4 F) a
  792. 0 r  [6 g2 g6 c9 v; c0 L
  793.   return ret;5 ?1 L! }+ |# F) R" B
  794. }
    ! L# x, Y7 p+ O

  795. % y6 k5 r, Q% a  ^2 a3 _
  796. /**9 n6 P0 |. O1 V, l1 o2 a' `# ~, F9 }
  797.   * @brief  Configures and sets the color keying.
    , r+ j0 w; W' H. F6 O% `
  798.   * @param  Instance    LCD Instance7 h0 _' D; A. Z* d+ r) ?
  799.   * @param  LayerIndex  Layer foreground or background) C) |/ Q; u' X* ^+ o
  800.   * @param  Color       Color reference
    & \, i4 e, V& e# S9 W4 V
  801.   * @retval BSP status% \4 d7 ?1 L# Y& P: b& V
  802.   */6 R. f; m' F* S+ t2 a
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color)* X4 Y, ~6 c! h1 R5 @/ W* p/ T7 H
  804. {
    9 X9 h, x; g+ a) Q: `
  805.   int32_t ret = BSP_ERROR_NONE;9 ?1 L, F2 S# ?* I: i
  806. / W0 A0 B9 E- n6 Y8 [
  807.   if(Instance >= LCD_INSTANCES_NBR)) j' f4 Q! ~/ L& V% v, |* z5 j
  808.   {
    1 \: g/ u0 B7 F# H$ L
  809.     ret = BSP_ERROR_WRONG_PARAM;
    8 j& A4 a5 h# j- T6 [0 v
  810.   }5 E: H) r$ X5 z+ k- `% p+ g6 C
  811.   else
    8 [: ?) s3 Y+ T2 @
  812.   {/ ]* N1 N8 t, [+ J
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);
    ) x' L0 B' b6 @. J
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    $ Z$ \, l4 M& w! B# @# q% w
  815.     {
      t' y* ?# B1 Q2 W; E4 t% S9 }
  816.       /* Configure and Enable the color Keying for LCD Layer */
    9 C; K4 Y2 F( M' H5 [2 l8 t: |  W
  817. 2 a# P2 E! C! o; q) s! P8 w# W
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);
    & q% N9 r( _  q9 s8 ~# Y* t- a: I
  819.     }
    % z1 M, J( h4 C3 q% [: Q
  820.     else
    . B9 P/ j- E& _6 Z
  821.     {
    & }+ M3 C; U" S
  822.       /* Configure and Enable the color Keying for LCD Layer */3 p% w$ q" S8 F4 f* F3 Z3 F
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);# a5 R4 T; {; A2 A) z
  824.     }$ j% l- t- U0 L$ l
  825.   }' s( o4 j# |* a- D6 A

  826. ) A3 A9 [/ {+ M* P( j) C
  827.   return ret;
    % }2 q& P! b: q3 w
  828. }
    ; p8 w! S3 @! k- w3 ?, T1 ?' t0 x
  829. . v+ Q1 F+ g4 q. T! _; C9 F
  830. /**% }) E& N* Y+ ^+ n9 D9 U
  831.   * @brief  Disables the color keying.1 u+ b2 ~+ _0 T) q: M- U
  832.   * @param  Instance    LCD Instance
    2 i  @$ R( G, {7 Q, j
  833.   * @param  LayerIndex Layer foreground or background
    ( j1 w; O$ S& W( {* `$ |. {+ j& y
  834.   * @retval BSP status, _( c' C" ~* }
  835.   */
    " t. Q2 c  r" b' I
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)
    $ T6 @  G; c; Y. A
  837. {, A2 v! \7 s3 H/ X4 J" n. m' _
  838.   int32_t ret = BSP_ERROR_NONE;! W, v9 n/ q) n9 j

  839.   ], c1 ]( D! p
  840.   if(Instance >= LCD_INSTANCES_NBR)/ e) i; {7 T' u& z  y7 r! z
  841.   {- C% \/ ]7 i) {8 u+ z$ \* k9 s
  842.     ret = BSP_ERROR_WRONG_PARAM;
    " U5 ]& M+ p% a: K- O- s" o
  843.   }
    6 n. l- W; O- W
  844.   else1 L* Z" v& c! |
  845.   {6 W) L1 X7 K% B$ r2 y  [% J' K$ R
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)! W) G! X( Q3 B4 s2 K+ {6 k
  847.     {
    , k4 }! _: x( o8 P; x1 b
  848.       /* Disable the color Keying for LCD Layer */
    7 e/ [4 Z9 z0 V( o  ~9 {
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);4 d4 n2 d: i; H' F9 X
  850.     }3 w# C$ W( j- d( k: S
  851.     else# y4 f& t/ o! o! ^# f3 A9 ?; z
  852.     {
    $ b) Y: W, [+ z7 S
  853.       /* Disable the color Keying for LCD Layer */" q; Z# j; T% T- k7 E6 n& u
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    % R. p) t! O. i( {% m1 i
  855.     }& s2 o2 U( b3 m# z
  856.   }% K" d2 d1 p$ s
  857. 0 t5 y" O: h% i$ I" E
  858.   return ret;; N2 n0 o+ \4 z- N1 L
  859. }
    # F' V9 l0 u! Q) E; I9 u% g6 z
  860. ) w2 f/ A6 Q3 @! q( L* y" r
  861. /**
    . H+ ]0 q. i" T. @4 u+ V
  862.   * @brief  Gets the LCD X size.
    + C! C- ~/ l! t" m9 Y7 w4 i
  863.   * @param  Instance  LCD Instance
    ) w+ f( d9 @0 {% }. C) S9 J
  864.   * @param  XSize     LCD width" @. b& j/ w9 T9 Q; {3 v
  865.   * @retval BSP status
    2 e% ^  r% w  e& ^/ A
  866.   */3 E) B% M! ]' `& E- Q7 U
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)2 z$ {2 ^8 _) T* {8 j& b8 l
  868. {8 }: [, U1 A0 ?) {
  869.   int32_t ret = BSP_ERROR_NONE;. }6 J0 S$ m  W- r1 @: t4 T

  870. ( ~1 f' f5 f- k% L/ B
  871.   if(Instance >= LCD_INSTANCES_NBR)# z8 _4 Y  n7 R0 N, ]: D
  872.   {+ q) {7 Z6 S% e5 Y! m# Z1 v
  873.     ret = BSP_ERROR_WRONG_PARAM;9 w! m" D7 _6 J
  874.   }
    + h8 K1 d% A4 @
  875.   else/ S4 D/ D; ?( [
  876.   {
    5 U' l9 W! C  }$ \: Z
  877.     *XSize = Lcd_Ctx[Instance].XSize;
    1 p7 @) N( y# j0 h" d  u7 m, l* n
  878.   }0 R0 P+ G) w9 \& W

  879. - E# c, l; c6 }6 Y. g5 j5 l
  880.   return ret;
    ) S% ?" t) E! g. R0 a( p3 o' h3 f
  881. }! ]4 `7 X4 ^( y( U3 Q0 r! I$ i9 s

  882. , |; c4 W+ C6 E% i# c1 [% x$ I( g" d* G
  883. /**
    3 H  O* Y. W, U- p$ s9 I, b& v
  884.   * @brief  Gets the LCD Y size.7 r5 a2 s: \8 W7 P4 Q
  885.   * @param  Instance  LCD Instance
    + @6 n  L3 L  ?! ]9 {- ^. p1 s- A3 r
  886.   * @param  YSize     LCD Height+ N+ O6 g6 [' }) w$ q; {
  887.   * @retval BSP status
    * R$ U0 I- O* m5 L  }/ v% W
  888.   */
    , F# h9 C4 G5 j" F* G
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
    $ @9 E* s9 l9 P6 d7 h( o
  890. {! c4 P- U, m( a% R
  891.   int32_t ret = BSP_ERROR_NONE;
    - r; E# v+ t6 p4 Y& G0 W, [

  892. : O* U! }1 L0 z( G; @7 @
  893.   if(Instance >= LCD_INSTANCES_NBR)
    4 V& N7 a# b7 i5 {" G% t
  894.   {
    9 [5 i* u) _' @5 j) |
  895.     ret = BSP_ERROR_WRONG_PARAM;3 e2 z' S: z6 y: X% m9 P! ?! y
  896.   }6 L! [, h8 r( P, x5 ^! w' J
  897.   else
    8 b, Q+ r( i. ^. r5 m
  898.   {! S  C4 I4 O3 {1 C' J
  899.     *YSize = Lcd_Ctx[Instance].YSize;
    & H1 y: V  ~8 f
  900.   }
    ; \" ?1 u/ }( Z  d( \  r) \( z
  901. 3 B5 D6 j: a, n! k6 |" c. u9 d
  902.   return ret;$ o9 i8 F" I+ P- H/ l5 w
  903. }" a& E4 m7 q5 H9 t: W9 V" Y
  904. ; h: N; s* V+ w( ^
  905. /**
    % U! n& q6 Q& v- h* W' N
  906.   * @brief  Switch On the display.
    8 D2 a$ r0 f0 k+ t* V0 x$ y+ T& X
  907.   * @param  Instance    LCD Instance( p% X* S4 v1 J: {. G* Y
  908.   * @retval BSP status/ a6 Y# v# j/ K; l/ V/ T
  909.   */- N7 Y( n4 K: n6 p% S' T
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance), F/ n" o* z9 J- a. O0 u( I7 Y
  911. {0 Z0 V0 O1 l: F$ i4 O8 t4 u% u
  912.   int32_t ret = BSP_ERROR_NONE;- D% A' v3 l0 W" X0 j/ x
  913.   GPIO_InitTypeDef gpio_init_structure = {0};
    7 M0 L, J, J% h* U$ {, L# q7 e

  914. 1 E- |; Q5 e1 ?
  915.   if(Instance >= LCD_INSTANCES_NBR)
    + J& Q& v" T, Y: `
  916.   {
    . W' ~6 c! |7 C, j  ~' _6 C
  917.     ret = BSP_ERROR_WRONG_PARAM;
    6 p( J) T0 O8 l5 e( a9 }0 @- T, ^; W
  918.   }, p7 s3 D5 p0 c$ _
  919.   else
    5 x7 W7 T/ C5 P& m6 X
  920.   {
    5 g9 G" R, Z  R0 A  _$ @
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);
    , ^" l' a2 G! R- y& \( @# W# _- Q
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;+ L8 }" D) ?+ H; J, g
  923.     gpio_init_structure.Pull = GPIO_PULLUP;
    4 u& V2 N6 P+ ?$ p2 T! q
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;; V" C: n- h7 Y5 X- `  X& ?
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    $ s2 `& n0 x+ D$ _6 a
  926. ) R" B* m. p8 G  X4 ^
  927.     /* Assert LCD_DISP_EN pin */
    0 I0 [: `8 b7 c
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);: B# H  \1 p0 G* W
  929.   }
    * T5 ^$ q, h8 v

  930. " @/ l# p7 ~6 _
  931.   return ret;
    / n% Y% S! H/ Q/ `, B: P
  932. }! x. \2 c+ m7 W8 |

  933. . {$ m  C) O7 j; U/ C
  934. /**
    8 Q4 N4 ]  p! w$ h/ {! m4 w- K- |0 x
  935.   * @brief  Switch Off the display.% u* J2 A* d- O+ ?5 d
  936.   * @param  Instance    LCD Instance
    7 ~- V& m. @2 e, r1 Y
  937.   * @retval BSP status
    2 [9 ]& J" t* h, O2 G, {
  938.   */
    : k( F4 X- w4 ?
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)) C* }. c6 c7 T9 B0 l4 e' L
  940. {7 V" A1 q0 x& Y4 D( B
  941.   int32_t ret = BSP_ERROR_NONE;3 K9 Z1 L, P" v0 ]$ d9 Y1 j. ]
  942.   GPIO_InitTypeDef gpio_init_structure = {0};
    / ?  ?( V3 P  v; P  t: A& [: H

  943. " v  ]9 V; D3 D' f
  944.   if(Instance >= LCD_INSTANCES_NBR)& \8 ]: `0 X+ w" Z
  945.   {+ y$ f$ B, R$ g4 b$ o0 w7 C+ w
  946.     ret = BSP_ERROR_WRONG_PARAM;
    + Y; t' V( o6 R- d
  947.   }
    4 d1 Z; @; d- K4 f
  948.   else
    * X3 }" L4 x0 e! n+ @
  949.   {
    1 K0 G! W! L$ p( Y5 A
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;7 l4 q+ m0 d. u
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;
    & \, @9 U4 g* a" _* S  I9 x8 I1 a8 G
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;
    5 R5 a" x) N1 g0 |
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;  |1 W* c% l# P1 x! ]5 e& U
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);$ `: h6 d* w% S9 m* y+ I
  955. ' n" |8 L# g2 ~) L: L4 o
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);
    + k5 V3 Z: `) E$ Y, z

  957. 6 s. S; W+ M: g, W) ?
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);7 F- K6 K" l& ]# e  `0 [/ s$ |  Y
  959. ( a" }8 s/ L8 t9 B9 b
  960.   }
    * }7 X$ _2 g" o, x3 n+ J3 U

  961. ' M' g- d$ U: d# f9 ]0 d
  962.   return ret;; o1 N5 h4 u1 H# F7 `& M
  963. }
    6 h; n% t, C% u
  964. 9 ]- R) Y& }1 x6 f# }7 I8 q7 e# o0 t
  965. /**
    # y2 Y- H1 K" m* k& B; S5 Y/ C
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.
    * G, ^! P% b+ S3 K" D
  967.   * @param  Instance LCD Instance' N  h' s- B  q6 c; c/ R
  968.   * @param  Xpos Bmp X position in the LCD
    ; b" @8 F0 Z3 G) `
  969.   * @param  Ypos Bmp Y position in the LCD
    # I+ @* K1 f2 H) [& C! W
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.
    1 V1 }$ k$ s$ u# [3 l! U' p
  971.   * @retval BSP status4 x* s8 H$ P# Q4 c
  972.   */) C1 H1 J6 M8 p+ P
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)
    / f: s8 I% w) }
  974. {; C6 ~8 v) b) |! a, x! D
  975.   int32_t ret = BSP_ERROR_NONE;6 @  v" a* x/ V  w' l
  976.   uint32_t index;% Q/ X! p3 K' f4 a0 k1 D4 s
  977.   uint32_t width;) \9 z' u2 _4 p* z1 y
  978.   uint32_t height;
      C# S$ W" s  Y& C1 Z% A, b
  979.   uint32_t bit_pixel;
    . B7 X3 z# J! A( W  {
  980.   uint32_t Address;
    1 m" Y" V* U6 K+ I
  981.   uint32_t input_color_mode;0 V  |1 @4 v7 ^' d: |$ G1 J9 d
  982.   uint8_t *pbmp;
    3 Y2 T4 D5 x4 y2 J  {

  983. & ]4 F2 N# _3 @& ^' n7 M0 v
  984.   /* Get bitmap data address offset */8 h; P3 a; a/ ~- w7 Z; ?
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);4 h6 b" M) y5 O2 X8 o; T

  986. ) V3 D3 q2 J3 W
  987.   /* Read bitmap width */
    - Q2 d( T1 O8 A3 ~+ R7 }# g/ T
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);
    9 a: I; a, r' q$ I. }9 [

  989. / j; T- L% Z( R' B$ D% x
  990.   /* Read bitmap height */( ~+ q8 O, x4 o
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);2 L2 x( u3 K7 G* _& D8 c

  992. ! n4 Y) l( @0 A! l  N& f! r
  993.   /* Read bit/pixel *// R: `* i/ Q+ u6 D: d" f
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);2 E8 ~* E; ^. {

  995. ; m0 `, I0 N8 Y" e! ?
  996.   /* Set the address */) k4 T! {0 W$ R4 o7 k' A
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);
    5 ^# l% ^  x+ O; W0 l
  998. ; h, {9 p, z1 }1 P: c9 y
  999.   /* Get the layer pixel format */
    $ z7 ?- f" q$ m4 S7 p
  1000.   if ((bit_pixel/8U) == 4U)
    5 H% l) k- Z, c- C$ k
  1001.   {2 `; T  T1 w3 Z7 y' f. U
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;
    5 N' N' m/ x7 {& p) b
  1003.   }$ R3 R7 n9 ^* @2 ?' N% u% B
  1004.   else if ((bit_pixel/8U) == 2U)
    * O5 Z# _+ o) i9 i
  1005.   {
    & u, O% U: B0 y% n% u3 {" H
  1006.     input_color_mode = DMA2D_INPUT_RGB565;5 F0 A% U$ c/ @: M7 \( s' B
  1007.   }% U0 T$ G2 Z( v: l& R; K) ?
  1008.   else; D! F  b$ o2 T- B
  1009.   {
    ( m* t. z$ O, Z, J' j
  1010.     input_color_mode = DMA2D_INPUT_RGB888;
      [) T8 e1 z* D8 x8 I
  1011.   }4 ?* o/ M/ f+ V, e9 _0 q
  1012.   G+ q, ?6 v4 L9 L: Y: _9 V
  1013.   /* Bypass the bitmap header */5 l! B/ p  A# v3 [5 m5 ?
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    . P9 s- z- p( K
  1015. , b# N7 S* }9 N/ V& L
  1016.   /* Convert picture to ARGB8888 pixel format */" e; p- `  M7 i) w
  1017.   for(index=0; index < height; index++)9 z& l! {+ N/ g: _& F
  1018.   {
    5 f! ]8 r1 i9 e# W9 \
  1019.     /* Pixel format conversion */
    2 D! U$ m3 D. o/ p
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);
    + ?& }# y+ ~0 ?% Z8 @: J

  1021. + ~. b% ?) d: F: d4 H+ S+ U
  1022.     /* Increment the source and destination buffers */7 C' b2 D5 s0 \
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);9 s1 f; ]& [) N9 o7 g. u$ d3 q
  1024.     pbmp -= width*(bit_pixel/8U);6 v$ y5 }6 F9 g, h- d& Q
  1025.   }
    # w; u4 q5 q6 U; N* h

  1026. ( a/ L  i/ P& `* N. U) [' O
  1027.   return ret;
    % n3 g  @7 v) O# q- m, w8 @% w
  1028. }
    0 d# C0 `6 L" z3 L4 S1 R& W9 l

  1029. # H, _; `( V3 N- g# A/ k5 b
  1030. /**
    - U. Q. U. U$ O: n  F
  1031.   * @brief  Draw a horizontal line on LCD.
    . Q7 T4 s3 b  `2 ?8 _
  1032.   * @param  Instance LCD Instance.
    ; h! N  Z( O9 s& w: m
  1033.   * @param  Xpos X position.$ J. Y, ?. t; g) I  E4 x
  1034.   * @param  Ypos Y position./ `$ r* G" r7 U4 F- {* {# O7 O
  1035.   * @param  pData Pointer to RGB line data
    0 s. u* P" ~( S* q
  1036.   * @param  Width Rectangle width.
    7 r) N! [7 w& }# ]6 ~
  1037.   * @param  Height Rectangle Height.
    ; f5 ]. M; I4 b' X
  1038.   * @retval BSP status.
    / X( ^- I# d( I4 l3 a4 h
  1039.   */
    : x5 v* j& ^& F' ^
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)' \) }  {0 j3 `* ^* k: i+ O9 g
  1041. {
    : l, K* N$ k1 R
  1042.   uint32_t i;
    8 i7 D" A2 g4 L
  1043.   uint8_t *pdata = pData;7 S! j: x% D$ u0 S0 @( }7 Z
  1044. % m1 }& k% Q" P0 k2 S$ R
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1). c5 J) v, o2 L3 y1 [) q' K
  1046.   uint32_t  Xaddress;0 D: \+ e) i: C* A6 Q
  1047.   for(i = 0; i < Height; i++)
    8 A  G' p! ~2 T4 }" m
  1048.   {0 d8 g" w$ M6 A: V( I# ?
  1049.     /* Get the line address */+ S( _) S9 s5 ]! o& O( |& e
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));
    - w; {. z! I/ D% R

  1051.   q. x0 S& u7 f
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)2 q0 V3 ~: a' R; p+ ?, Y7 D+ T; A
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);
    9 Q8 M+ m& g( {  R* S
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */! ^. R8 Y$ U3 d3 N' J5 ?3 W; y; z
  1055. * k3 r7 i+ v6 D% d8 F" `& V
  1056.     /* Write line */
      q5 K( N- E7 `0 w; E" N6 C
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)+ t0 ~8 ^. R' ]' s0 T! |! ?
  1058.     {
    ' C, ~9 S8 q" D4 u1 V/ ^' o
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);
    & R% P/ Y) o9 C: f1 ^( {8 K+ c
  1060.     }& |8 K' ]) ^7 o
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444); k4 C% M* ~; S
  1062.     {$ ~2 I8 H, }. O; E* G
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);
    8 a2 u5 j6 L: J$ M
  1064.     }  I6 V+ s4 z1 [. O
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)
    : @- A: T7 d4 W# B7 m, m( h
  1066.     {( o& f2 W/ r: n* _8 {, n/ s
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);
    - c% {0 {9 y; P' \) o
  1068.     }$ G5 `9 y8 `7 ^8 M  Y# @# O
  1069.     else. ]! ^$ _% g+ ~
  1070.     {+ ]  q; D  A2 q9 ~" \8 r
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);# P' b5 v/ p3 v# B3 u
  1072.     }
      A( l# M* o: _% b. Q: R
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;
    . g% j! Q3 o7 Y; G5 C/ L4 ]) C
  1074.   }
    # N0 P  P; K6 G# X" ?$ H2 t% R
  1075. #else
    7 Z# p: r# F  Z' e$ w+ |8 h
  1076.   uint32_t color;# d* m/ X! T) s  |4 Y
  1077.   uint32_t j;
    ' J; @6 T8 s4 i% S
  1078.   for(i = 0; i < Height; i++)7 n9 \5 L  \5 F2 y5 a
  1079.   {
    ' ]' f% k# B  n; c0 y# F
  1080.     for(j = 0; j < Width; j++): @. m" d& I9 V; Z$ g" u
  1081.     {0 t! C' m  E8 s7 G/ V2 m; I& l
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));4 S9 f  }, n( }" x0 n
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);# R1 B- L% S! v0 s
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    & J  L$ o, Z; g. l( E, G; E
  1085.     }
    + M4 K  H  E! v3 q# _) \- o5 b0 f
  1086.   }" o/ ~4 h8 U, e
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */' m3 Z: @' h% U1 ^

  1088. ; o* u- v9 k* K0 P5 n
  1089.   return BSP_ERROR_NONE;
    # M) |$ f$ M# F
  1090. }8 x3 P0 d: M6 p' y# E& g
  1091. 4 _1 d3 A% o9 T' a9 V) Z
  1092. /**3 U. A+ F9 O% K
  1093.   * @brief  Draws an horizontal line in currently active layer.
    # K& F/ o( ]# u. j' ^  }
  1094.   * @param  Instance   LCD Instance
    4 b, y, k7 k  c/ X/ V; S
  1095.   * @param  Xpos  X position
    + r4 U  g9 V$ d# e2 b
  1096.   * @param  Ypos  Y position% u  P% `* _7 G; f8 W
  1097.   * @param  Length  Line length* R' D0 @# I: g( b- g5 t
  1098.   * @param  Color RGB color1 R' K5 h, A4 |3 i- \" G- p7 u
  1099.   * @retval BSP status6 t4 b! R4 f7 g& m
  1100.   */: e; F% O) o) W' Q9 C. y7 G( k4 \7 L
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)9 `( _6 T, s$ N
  1102. {% Z- G" K! C6 N3 n
  1103.   uint32_t  Xaddress;3 g) \& ~# ]2 ]* i+ o: v
  1104. ' K! L% t- g. a$ Z) V2 n
  1105.   /* Get the line address */
    1 v6 [* H3 o2 H+ E( k
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));: h! T# R# P0 e" k7 K
  1107. 5 _8 {3 L+ ^  c% A' A/ D2 ?
  1108.   /* Write line */& G( U& |4 Z1 L9 v& R5 U5 @
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);
    ' a0 {/ [4 o4 I4 A! j( v7 z3 v# _+ R
  1110. 0 F$ F* }8 o* I/ C$ T! q6 N! W
  1111.   return BSP_ERROR_NONE;
    : K. R8 ?' V8 h- a
  1112. }) x0 x( j% p& u. y' v( x+ _8 U, q. w
  1113. ( U6 v, z9 ]5 G8 g8 l
  1114. /*** `( T1 c# f; w; P  T% F  Y" m
  1115.   * @brief  Draws a vertical line in currently active layer.
    + B; g( ]+ c$ t1 t* B  V6 y8 l
  1116.   * @param  Instance   LCD Instance) a' s6 k, j6 ~8 x9 Z
  1117.   * @param  Xpos  X position
    $ ?1 j' ^0 S0 [4 ~1 ~$ q5 P
  1118.   * @param  Ypos  Y position- l6 t0 Q- k5 V: w
  1119.   * @param  Length  Line length% D& s* R. K7 e3 }  q
  1120.   * @param  Color RGB color
    ' l: c; g: `) {6 j7 S1 D+ {/ o4 y2 b% n
  1121.   * @retval BSP status
    6 x3 l. d7 U& q2 C8 n8 R: ^% e
  1122.   */
    ( \* ]! e9 A) I8 h! y
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)% z* L% F: K: Y. J9 v& c
  1124. {6 g5 e# y+ n" o( i8 x& M% ^9 \  }
  1125.   uint32_t  Xaddress;. O! G/ ^9 I( f  ]# N

  1126. 3 s. a4 A. M; U9 E7 N* ?
  1127.   /* Get the line address */
    % N+ U  o! d5 O2 c
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));' p: Q3 `9 k% u

  1129. 4 J" A3 m8 R: F8 s
  1130.   /* Write line */
    " N5 R' E* r3 B# f& h5 K
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);* R; S+ @- }$ N. r  ?
  1132. ; E1 ~* E  j/ G3 _
  1133.   return BSP_ERROR_NONE;2 P9 b/ `6 }* m: x+ A( V
  1134. }
    / G5 I5 T7 a; _, w1 V
  1135.   ]& J% W1 o- R6 x0 a
  1136. /**. ^3 q! {; f5 @# P2 k0 G- d9 Q' E
  1137.   * @brief  Draws a full rectangle in currently active layer.' D9 q7 m' G* K+ n& a
  1138.   * @param  Instance   LCD Instance
    , j: h' Q, Z8 U5 j' t2 f
  1139.   * @param  Xpos X position
    , i" ?) ]: _8 e7 |5 }5 |2 n) r9 x
  1140.   * @param  Ypos Y position
    ! q& b/ {, Z: W
  1141.   * @param  Width Rectangle width
      ~- H, p9 |  I( n* t6 f
  1142.   * @param  Height Rectangle height! u& t9 \# l; t+ P- P9 W* N
  1143.   * @param  Color RGB color
    2 E: G- I8 Q% W9 W: [& ~) Q
  1144.   * @retval BSP status
    " |6 y2 G9 h6 o% u! N
  1145.   */* [+ P2 D% S0 h! \+ C% H
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)
    0 {) w0 X$ ^# H- r# D* L. E: y
  1147. {
    ' Q! }& X9 ]6 Q+ Y
  1148.   uint32_t  Xaddress;/ _7 I7 C# s/ w. W( t

  1149.   E! b6 E3 o: b) B  l
  1150.   /* Get the rectangle start address */8 Y7 K$ ?& e) W. U+ s+ C
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));7 w6 f6 d7 Q. v. W1 r. U

  1152. ! u8 K' F- ^7 m# E$ v0 C
  1153.   /* Fill the rectangle */" U: J; v( r1 Z5 x* n
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);
    2 o, h8 U4 d$ A+ }) {% ?
  1155. % W9 H7 J% }6 K4 ^  b8 _
  1156.   return BSP_ERROR_NONE;
    9 K+ Q3 B' ?9 m8 q# r4 _
  1157. }& Z4 [' e  ~9 f( d  ]) F3 ~

  1158. + o5 v, ], Q' S! H# T5 U! l
  1159. /**4 d/ ]2 Z5 a, W+ X' P& \
  1160.   * @brief  Reads a LCD pixel.+ \* l9 a1 s- x/ V6 v
  1161.   * @param  Instance    LCD Instance9 H4 g. k" c% u% [' [* o, F
  1162.   * @param  Xpos X position
    8 `8 o3 L: R3 X3 m, ?
  1163.   * @param  Ypos Y position0 \" Y0 N5 j$ [" b* ]) V3 q2 g
  1164.   * @param  Color RGB pixel color
    - m! [' d3 W1 S# K/ Q' ]- S& ^, \
  1165.   * @retval BSP status+ @' R! G1 W- c: q. N/ D# D% t
  1166.   */
    2 @8 v1 y6 a. w
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
    1 @  m' c" L' `. z
  1168. {
    . M- C1 O) R5 D8 {4 M
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    & y( ]2 J8 l4 j4 O. c5 ^9 R
  1170.   {
    $ `2 u) s. W  f1 w" x% ^3 z
  1171.     /* Read data value from RAM memory */0 s9 a. e$ U) h: q% v
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    2 p# C& x- u4 ^" `
  1173.   }
    2 ]7 ^8 j; D5 L* _! V; E7 O
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)) k$ f8 `1 a/ s: `- A
  1175.   {
    9 S2 g" R* g* {0 V$ x
  1176.     /* Read data value from RAM memory */2 B+ G8 c( e+ B1 X$ d. I$ M
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    , ^2 G% Z2 D8 [3 B( P
  1178.     *Color = CONVERTARGB88882RGB888(*Color);
    . C' i6 f. }2 n8 W/ k4 ]/ z' u1 X1 t
  1179.   }: \, A: P7 M; a$ K) G$ M
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */# U. {* X- K+ T- i5 V1 Q
  1181.   {; c. ~& g/ Y8 |% q6 u2 i
  1182.     /* Read data value from RAM memory */6 T/ y( u( g7 o, k+ _) W5 D  U
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    2 S/ N0 J3 l: M4 s
  1184.   }, }" h- E# S* d7 I

  1185. 7 L" \1 v( I4 k% P5 K
  1186.   return BSP_ERROR_NONE;6 q( H# o+ t% p! q9 f' U; ~, {
  1187. }
    1 r; r  @' g: o, e

  1188. 0 C9 K  t8 s; `9 V/ v7 S+ \- j9 E
  1189. /**
    / s  C, u+ e4 ]2 z
  1190.   * @brief  Draws a pixel on LCD.
    % W0 @) D+ u/ Y0 |+ z
  1191.   * @param  Instance    LCD Instance
    + @( W. S) u' |4 s8 Q0 i( w/ Y
  1192.   * @param  Xpos X position
    $ t; x: v* u2 g' H* [% Y4 z
  1193.   * @param  Ypos Y position' n1 y! p3 D; v& k/ f0 ~
  1194.   * @param  Color Pixel color4 N8 [! U* X" w8 ~
  1195.   * @retval BSP status% d! W0 V6 u7 e# m: z
  1196.   */
      `$ y8 ]# ~( \+ N
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)
    . o% ^, Y4 N$ k/ w1 v* k- L% s
  1198. {
    , j$ m) p; U* a: M# i
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    ) d) E) r8 Q- ?* o
  1200.   {
    % l' s4 h9 Y8 d( S
  1201.     /* Write data value to RAM memory */
    " F% i/ M" R0 |) n, g
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;
    ' {1 T, `3 D; X; ^. z
  1203.   }
    % D( S- y% k5 |6 Q# ]0 x
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)- t+ Y7 a  _5 L( i! ~
  1205.   {
    & p$ ~9 C/ ~: Z+ h
  1206.     /* Write data value to RAM memory */0 N- E' ?4 b7 j3 {2 w) S6 v0 \# X) B
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);" b% \3 C9 o# }2 Y8 d
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);# S4 M% @( W4 N  w7 i/ B0 G8 W! s
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);
    : A4 i+ [' c; x
  1210.   }& ~7 r! k2 m# o
  1211.   else% j& a* o  L: a: j9 Z
  1212.   {
    7 T5 Q% f! ^& \% @' {$ _
  1213.     /* Write data value to RAM memory */
    - r$ {/ F$ _# Y- R. y5 x
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;# t0 O% ~: \. W6 G8 g7 O
  1215.   }) T9 @( ]* M2 s2 ?7 d

  1216. * c) \! K8 b+ {0 f3 Y
  1217.   return BSP_ERROR_NONE;( ~4 H5 _' G  u& o; t% l. N- n
  1218. }; Z: J5 i: B1 j

  1219. + d( Q- S0 C: Q% X
  1220. /**
    8 \' e- X$ X1 s2 x1 G
  1221.   * @}
    # v7 w  y( |, v4 J4 H2 r; V) Y
  1222.   */( r' Z- P2 D% F( f  ^
  1223. # N( j4 U9 P6 @3 g& `
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions
    7 @8 X, r2 W! v
  1225.   * @{
    / W* |1 F% i6 H" Q
  1226.   */& ~7 @' T5 F! o* }, K4 \) C5 P: f
  1227. /**
    & Y& S$ m% t9 X- r: T/ n! j
  1228.   * @brief  Fills a buffer.- G( n) D; p9 A$ Z( h! a1 L& Q
  1229.   * @param  Instance LCD Instance
    7 y' Y! Z/ s- L0 i7 v
  1230.   * @param  pDst Pointer to destination buffer
    + z; B2 d( j: Q- B! _
  1231.   * @param  xSize Buffer width
    ) j& M; r) ?1 O& L0 e: Y, K0 E- D7 C
  1232.   * @param  ySize Buffer height
    % f, H- y3 X8 S7 L: \% \, ~
  1233.   * @param  OffLine Offset$ u- Y3 c- y( Q! X' N9 p0 x
  1234.   * @param  Color RGB color
    ' d9 I' P: h, O2 [5 c
  1235.   */  I% P) U/ Y6 m5 p
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    0 T' F  z0 B* U8 W0 i5 y, L
  1237. {
    3 x* P6 [3 I" f: p+ ]
  1238.   uint32_t output_color_mode;8 V2 z+ R( v! p
  1239.   uint32_t input_color = Color;* v) S& h( z3 x, k- C* Y" P
  1240. 5 h9 }  w/ C' F( d
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)
    6 G  `; p, v. a# o
  1242.   {
    ) R; p0 Q# T: z- ^- l3 c6 P% H8 i1 E
  1243.   case LCD_PIXEL_FORMAT_RGB565:
    - l9 s) y9 {: J
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */; Q$ U3 m2 i' Q+ _2 d/ q- ~
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);( C% h( t$ l9 `0 h0 ?. r
  1246.     break;+ {* Z# f  j4 b1 c
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:: Y2 A8 m, w$ @7 z
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */) V- m  i# `, N2 H: S
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);6 Y: N2 S5 W! M! z5 k% A0 {
  1250.     break;
    ; l. A2 R* S# ]3 m. u, z
  1251.   case LCD_PIXEL_FORMAT_RGB888:: |3 Y0 x* g$ p7 r
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */: E+ W9 `5 l- Z! Y
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);. X3 v/ [: G& F& T9 d0 V, B
  1254.     break;
    0 s4 i/ D9 V* p- j* S" |! T4 K
  1255.   default:) o% r. `6 m7 ?2 z, k  g, ]
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */% b# ]2 K% I: C) n/ ]* ?- O
  1257.     break;
    . m1 \* o% w! }
  1258.   }- f) Q: S7 ^* C8 B8 s. J9 w
  1259. 9 L7 y$ U! a& G: T3 Q7 v; l
  1260.   /* Register to memory mode with ARGB8888 as color Mode */
    ! X' k! o; m% T9 X
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;" A6 J% j5 \8 h" g8 k3 a
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;, H( f+ T3 R& |; E1 |
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;4 [2 R4 i; F  a5 j$ u9 h

  1264.   ^3 w# f6 M# x0 o
  1265.   hlcd_dma2d.Instance = DMA2D;
    ; B6 M- W1 R1 ?

  1266. 9 x# ?% I4 }; n+ U
  1267.   /* DMA2D Initialization */% f6 G+ w$ G- \! H+ f
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)6 \( D) s4 p+ c) p" l+ O( N
  1269.   {
    ' F8 N+ F" N. r! W! N- v0 E/ J
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)
    $ r( ?8 o8 \( D4 E1 A1 S; t! x: x
  1271.     {
    - @2 Q" A6 P8 B. D
  1272.       /* Polling For DMA transfer */6 N# m5 m) h5 q8 @; P
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);1 n3 v, `  @% H: H3 @
  1274.     }3 w4 T5 P( W4 Z$ E& T& ?/ u
  1275.   }0 C, h9 k7 j, ^+ ~3 I, N9 x+ A
  1276. }2 s+ H+ ]( h+ _8 f3 M8 N6 @' a

  1277. ' p, }1 j' |8 ]( G0 M# [) o: m
  1278. /**% K0 F! p, U5 w. y0 ^
  1279.   * @brief  Converts a line to an RGB pixel format.
    , {1 m7 i9 }2 }$ Q' y/ c" b3 J
  1280.   * @param  Instance LCD Instance% W, P4 ]) F$ G% _
  1281.   * @param  pSrc Pointer to source buffer* P9 q1 K2 _" w9 H1 S
  1282.   * @param  pDst Output color3 W2 R4 @7 Z/ D. a2 J$ C% R, a
  1283.   * @param  xSize Buffer width6 F; e! b# {# M" y% r( ~& }1 D' \$ I
  1284.   * @param  ColorMode Input color mode
    # x  n4 I, A. \+ N, K
  1285.   */
    - }" f: F6 h( B* {; P- C' L! w
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)
    1 }: Y1 g3 _* u& ?8 V
  1287. {7 n$ j( d. Q( F. B  x- J5 A* m
  1288.   uint32_t output_color_mode;9 K: v7 |- v4 J5 ?* ^

  1289. + [* E1 J/ J$ v9 F
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)' q/ k1 ?" j( m$ H; z
  1291.   {
    ; B9 h( {& a# X4 f0 |8 m5 M! v8 _
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    3 z8 j; P# E9 ?2 N$ A$ F
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    3 }( \9 g, j! V  H6 E# P& S9 U  ~
  1294.     break;7 M% g. `' C4 @+ |1 c
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:
    ( n$ W7 d# {1 G4 }8 m
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */
    + G/ m( y( D3 B' k% `+ v6 O4 s
  1297.     break;: f+ _6 ~5 ~0 _: \
  1298.   case LCD_PIXEL_FORMAT_RGB888:
    ) z3 M- ^- q, T! }
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    1 r) C( q$ T; X, ^
  1300.     break;9 K3 @! v8 L+ d: M% }
  1301.   default:
      j4 x- a5 F, X
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    3 \  D/ M& y' C% Y( q; P
  1303.     break;
    2 @: S* N! M% Z/ r- [& y
  1304.   }
    , i# A! z8 B+ C
  1305. + U( a4 a5 R- \( H: |: Q
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */& U1 u2 s+ j+ |  O. ~
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;# T1 u/ O# b9 }. \2 S2 u2 h
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;( Y: L6 K# m4 Y& J
  1309.   hlcd_dma2d.Init.OutputOffset = 0;+ U" n5 s; s7 o: S7 k, ?9 d4 q

  1310. 7 J# j- }( M! E& H  l7 W
  1311.   /* Foreground Configuration */
    5 Y( W5 \9 H3 v$ C9 N+ K
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;# }" {5 ^' _9 c9 e3 ^" \$ Z
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;
    # ?! Z) J4 H9 H: N+ [
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;+ ?5 J0 q' t( J2 b1 C% u1 Q
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;
    3 A1 C, F/ @0 |* x( W
  1316. $ f( b9 g% ^4 w; Q& W
  1317.   hlcd_dma2d.Instance = DMA2D;
    $ V0 ~/ l3 h# o/ ^" x
  1318. 2 M5 r  k" Z6 l; p% k+ z5 h
  1319.   /* DMA2D Initialization */" n& Q" B  }' Y* F; v; o
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK): V5 t0 J' B' k& q
  1321.   {
    ( T8 W6 M1 ?. H* z
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)
      b/ O" M$ j6 ], E0 S3 ]3 X- K/ U
  1323.     {  u- W& R, g9 ]# b- ~6 l' N( g6 V
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    ' ~" m& [% Y, \5 V% A9 M! O
  1325.       {
    6 s0 I2 D9 Y4 r
  1326.         /* Polling For DMA transfer */. p. I+ W/ o& p3 H* P
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);- d& o1 b" s3 _6 R4 S7 s
  1328.       }% H2 D- c. M8 `$ B0 z- P$ z
  1329.     }
    . \, \4 [/ Q, N# M
  1330.   }  g  ~. N: R8 w) }% O% D' I
  1331. }' b% n6 E3 `4 ~" e- j
  1332. % o/ |2 H& F7 X5 R6 x3 ~
  1333. /**
    3 J8 c% l2 U8 S; m3 [
  1334.   * @brief  Initialize the BSP LTDC Msp.
    " X/ R+ m3 S: |( r* y# B5 o
  1335.   * @param  hltdc  LTDC handle
    5 ]) O; c4 \. W. h+ j
  1336.   * @retval None" [8 b( C' e( |; b  l
  1337.   */# h- T6 R* x7 G. M% V
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)- F( ~+ d* M+ n- p2 g- w* K
  1339. {
    4 H- _- l2 R* _
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};
    * X) G) ~' C- j/ N9 D" C

  1341. & x* R$ K# Y( P1 Q3 g- E
  1342.   if (hltdc->Instance == LTDC)
    4 x8 n8 r1 S# [0 ^; z/ p! N
  1343.   {
    $ c+ H; n. x# n& b6 O2 r
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();! C* F: ~" i7 t5 t4 D( Q: N) _# R
  1345. % B& r# @" I1 n4 R' U$ r
  1346.     __HAL_RCC_LTDC_FORCE_RESET();2 y. b4 n, \' ~- `. C  M8 @
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();
    9 o1 J$ Q* E0 l

  1348. . A* L& v- b' n% j5 f
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */4 N0 Y% v7 E. w7 u2 @' U( `
  1350.     /* PG0  R0          */$ \' G% S8 i7 o5 y& t2 @$ `9 S
  1351.     /* PD9  R1          *// v7 k7 S3 @% G$ K, Q
  1352.     /* PD15 R2          */
    * [: S8 b9 I1 U: k1 I3 \. y
  1353.     /* PB4  R3          */ // JTAG
    3 a" F0 L5 \3 H7 [$ h
  1354.     /* PH4  R4          */4 U* d6 G- N, ~- t
  1355.     /* PA15 R5          */ // JTAG JTDI
    $ U" U, P. b  g0 r/ m+ w
  1356.     /* PG11 R6          */  T6 E- E, W7 \4 ^& m  M0 }2 }! s
  1357.     /* PD8  R7          */
    6 @$ z' @: c) B
  1358.     /* PG12 G0          */
    * Z) v/ D$ z0 j5 o$ j$ b, `
  1359.     /* PG1  G1          */- O0 n# ?: o/ E2 w! ^& A
  1360.     /* PA1  G2          */
    7 |$ q# Z1 x, q* q- q' A
  1361.     /* PA0  G3          */; q0 y! ]1 ?# o' `* d: x6 k2 N
  1362.     /* PB15 G4          */
    6 s3 l- G; N8 C. W6 b  W
  1363.     /* PB12 G5          */( `% J" t# m7 H% l  J9 O
  1364.     /* PB11 G6          */) c- C6 D" p) K( i
  1365.     /* PG8  G7          */
    ; A; O. Y' e5 ]
  1366.     /* P15  B0          */
    & i# S7 Z' J, C; `
  1367.     /* PA7  B1          */
    8 r" W' I0 U1 N
  1368.     /* PB2  B2          */" b. w/ r& ?0 }6 Q
  1369.     /* PG6  B3          */
    . Q" ?: ]  o4 c
  1370.     /* PH3  B4          */
    - L8 p8 x6 h4 I. x9 e
  1371.     /* PH6  B5          */) U0 K3 L+ E3 Z
  1372.     /* PA8  B6          */. {& a- [8 ?; w; q
  1373.     /* PA2  B7          */
    3 ?, ?4 |7 O7 C' M+ J9 n& ?1 s7 X
  1374.     /*                  */7 C' {. e: }0 o/ c
  1375.     /* PG13 LCD_DE      */
    0 E( d' \3 H: D4 k2 D
  1376.     /* PQ3  LCD_ONOFF   */$ J1 Q9 T  S' k+ f: }+ @
  1377.     /* PB14 LCD_HSYNC   */
    5 p' R% |* O$ g' o9 m  P8 B
  1378.     /* PE11 PCD_VSYNC   */1 z* b  A4 A4 x$ l) W1 K* q
  1379.     /* PB13 LCD_CLK     */+ P. }9 {' J' H
  1380.     /* PQ4  LCD_INT     */
    + I; t: C/ n" \1 b- P; G. y& i
  1381.     /* PQ6  LCD_BL_CTRL */
    5 X" _" s; C; s- O! c1 m: H
  1382.     /* PE1  NRST        */( F4 _! E+ R5 u( b8 ~, r

  1383. & t6 G* m! ~: a; U/ I
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();
    6 G: S. ]- m$ e% ?5 Q+ @) I
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();
    - v% n6 P0 a* S% W- j
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();3 Y: Q% t0 E, u
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();
    ( T6 s) A# B* ]4 T3 p( W
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();6 W+ F) c1 S" P% A" ~
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();0 U2 L0 m! t4 Y9 Q( a/ A; O
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();2 `2 N& b! V4 g3 h+ L4 F) n/ k
  1391. - s/ t5 i$ v# @2 H% v/ O0 ~' a8 x
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;7 G7 Z7 N8 H. H+ A& |/ P# {6 c! H
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;
    . m" x9 z& @& O
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;1 @' r0 J2 j" y/ f1 e
  1395. ) L" d/ q. L) o( R5 u+ j
  1396.     /* G3, G2, B7, B1, B6, R5 */- b- ?6 d# o6 F+ r* r- N
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;  O6 Q: n) T: |- N
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;' w2 I" R+ N! D# d) |3 D1 u
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);- I- ?; X; L, t! |
  1400. * m* T4 K/ `$ N; m& S- C
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */. C- U' r; ?9 A$ O& 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;
    8 |0 v$ d$ j. F# E' W" G
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    " q' N+ F% \# j
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);
    " ]: D$ W* [- O/ |, B0 ^
  1405. 6 I* W4 j* X, q% M, J8 r* n
  1406.     /* R7, R1, R2 */! Y; E1 G: h9 R7 V2 c" \/ U
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;6 _" F4 _  A; G% M5 Q8 v
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;  n) R9 }( P2 z/ V% m/ m0 V& F2 R# U4 H
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);
    " R4 F% N; [! k5 p* @
  1410. : ?( h0 S. @2 u. O
  1411.     /* LCD_VSYNC */5 }5 j; D3 X, G- z0 W& [
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;7 n1 |3 ]; I' c$ d$ D
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;5 d: {( i& R6 S6 _
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);- l! q3 F: C1 e$ H

  1415. $ @1 U9 x. ?+ q6 c* h% C$ w$ B$ c
  1416.     /* R0, G1, B3, G7, R6, G0 */( O1 Z; T$ Y* O% ]+ j8 [) B' `" c
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;: ^, l$ \6 B+ [/ x
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    / n; _, T0 k7 Y( P- W5 B9 p
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    % d2 l4 o! M: \* O

  1420. / ]* O8 A6 X/ ?+ x2 P! f" }4 a5 V+ K
  1421.     /* B4, R4, B5 */
    0 p, d; G! G. ]" O4 Z
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;/ f# ^3 E- ]9 t" T+ i0 c- ?
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;6 c* c4 D! T0 h" q% d0 K
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);) h* i5 N/ |0 \

  1425. ' x! F3 o1 U' y: j! G1 x: g$ Q
  1426.     /* NRST */
    ! |7 m" H  I* K" G; s/ H4 @5 a
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;
    # O4 T* u: L4 a! `+ \7 o
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;( j, _+ R; R6 G% z
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);' v, q  \7 q* V2 t5 `

  1430. 8 U8 E# s) K3 r
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */
    % D! {- |! V$ H
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;
    . }/ X1 \3 T9 R
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    ! T' u1 o% K! U/ A! {- c( v% V
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);' e7 ~2 P% w4 `, Q( J
  1435. " x9 a" d1 G- C$ t
  1436.     /* LCD_DE */4 f4 X2 p. T: N2 S4 C  p
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;
    . W! r0 c2 z4 I$ S3 f1 ]
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    ! }. u2 \8 Z( _8 {2 J1 M5 P4 K
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);+ k  H  I% v$ U' Z3 F
  1440. & i) L; B/ W1 O9 t* r
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */
    1 j! r3 P* D+ c# D! Y3 Y' ]6 t
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */  C2 P: e* y7 I5 j8 g: k8 p4 v
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */
    3 F: w( I/ b% y+ p8 }' q) [

  1444. 9 H5 R! u1 Z( P: u: E; Q2 O  J) p
  1445.   }# G# L4 W6 V8 f0 E
  1446. }
    % J0 z- u" \3 E. R; f) g

  1447. . J5 m( e- \2 l% U; ?& N* a
  1448. /**
    / G6 V8 J3 m  `& q) s) _4 x( J% ~* k
  1449.   * @brief  De-Initializes the BSP LTDC Msp
    # ?8 ?& q2 r5 n. S
  1450.   * @param  hltdc  LTDC handle$ U0 |6 K4 Q9 V- h
  1451.   * @retval None
    ( W1 i. {! B2 q! Z8 U
  1452.   */- \6 w( j0 q2 [- r8 I9 J
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)+ \* i& R- ~* g) c$ {
  1454. {
    9 z; U: {; C8 W1 ^. [8 Q$ u7 W
  1455.   GPIO_InitTypeDef  gpio_init_structure;
    / e1 X7 ]# Z6 W

  1456. 5 r, e; {$ @1 e. ]
  1457.   if(hltdc->Instance == LTDC); j* v2 o6 g& t+ L6 ?+ y
  1458.   {' @( A  s0 X0 Q! y$ k
  1459.     /* LTDC Pins deactivation */0 }) x- |0 U+ x9 X: y/ R
  1460.     /* GPIOA deactivation */) D4 |. ^( F3 ^
  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;( R, d/ j& S1 `& l) X) W9 j' u
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);; W0 l' t: `0 ]
  1463. ' T/ S* R& M+ W* |+ Q- o
  1464.     /* GPIOB deactivation */
    & q5 g5 ~; W, c! H0 \6 F9 H
  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;
      M& a% ?$ l* y
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);9 |  o7 O& [( u* q) P

  1467. & T, W- L  u1 J
  1468.     /* GPIOE deactivation */
    5 f* n* q0 r- T
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;5 f9 B7 a( M% a- q6 N9 d, E
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);
    ' ?7 g0 D8 k2 B" [) S+ u+ i

  1471. : M: j3 c- U: E3 Y; W8 p) V
  1472.     /* GPIOF deactivation */
    ; O: A' M: e8 D9 u( d: v7 O3 A0 g
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;7 ^+ c# D# [" Y+ G6 C9 \6 `- K
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);
    $ d7 `! @8 }/ A& p; L
  1475. ) J$ k& k* ]0 e- Y
  1476.     /* GPIOG deactivation */. J3 b1 A# k6 U+ ~7 g
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;2 S' a% _& w( X( @5 \, e: F" C
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);2 Y- @9 X* b+ A  }
  1479.   y; V* W8 M+ ?9 ^& `* j, [4 ~
  1480.     /** Force and let in reset state LTDC */
    : S8 Q- n' J" W8 T
  1481.     __HAL_RCC_LTDC_FORCE_RESET();
    0 X( w0 F5 T8 e! ~( m5 F1 }' j: f
  1482. 1 X  b2 i, ^% T- q
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();. u* V7 S2 j4 v
  1484. $ M5 W$ p( N  _  U9 |/ g# I
  1485.     /** Disable the LTDC */3 ?8 V# {1 e: m/ r9 v# M: B
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();4 C0 e+ B, c" A# H) A6 S
  1487.   }, `7 Z% p' A. g( [
  1488. }
    , d2 u6 Z! _3 A* l/ x9 X- T

  1489. : v$ m" n% _( V! h
  1490. /**, d4 S/ v, ]" H* z5 x- a& q
  1491.   * @brief  Initialize the BSP DMA2D Msp.3 M7 k3 A6 }0 b" Z4 O  p
  1492.   * @param  hdma2d  DMA2D handle
    ! ]( d( Y, j5 n6 c  N! F
  1493.   * @retval None
    6 Z3 ?$ _3 S# ~( [4 G& _- s. j3 G
  1494.   */; [8 U) ^- W1 f9 ^/ c) G5 e
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)& V) t3 r: F; ~9 l
  1496. {+ G( Y2 N" \0 A7 [* R+ @( M
  1497.   if(hdma2d->Instance == DMA2D)2 n' @) p5 @9 U9 n4 w
  1498.   {: n" ?9 R0 F1 l% q% ~
  1499.     /** Enable the DMA2D clock */+ \: ]) f5 q+ Q# t
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();
    4 i+ e1 f6 ~: w. n4 ]

  1501. & O0 U' f* k2 P  i  z7 F3 y
  1502.     /** Toggle Sw reset of DMA2D IP */
    + A9 g, w$ U" X5 }2 L2 n# [
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();
    ( x0 S9 j) C  ^- X6 _2 |, J
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();
    3 j4 [1 C4 b. Z* C# S
  1505.   }4 l' ]5 t! K6 L! t3 Z4 i- R
  1506. }
    " |, u" C. e% A: L8 u( L

  1507. 6 `) I4 {/ ~. C; ~
  1508. /**2 ^7 @1 q4 H4 x* B$ o9 N  m/ N
  1509.   * @brief  De-Initializes the BSP DMA2D Msp
    * j; J) \2 T, I, K) O
  1510.   * @param  hdma2d  DMA2D handle
    " S  w- B( a9 v% s. F6 g
  1511.   * @retval None
    0 e. ]- ~! z7 M$ j2 v% O5 b  ]% [" c
  1512.   */% K/ f- _. e0 k1 \) j+ n- p1 O3 E; l
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)
    ; ?5 t% C" u- F- s* G
  1514. {
    : l& V' K7 i" B% }/ D5 y) E
  1515.   if(hdma2d->Instance == DMA2D)
    9 _, M. X  k( i* F3 b) |' h
  1516.   {* Q3 T- D$ S- M" D/ {
  1517.     /** Disable IRQ of DMA2D IP */
    + _" i* b" P* w- ^0 D
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);- ]0 A, {; R6 a& x* c
  1519. - ?, V- ~. H9 R3 D2 S
  1520.     /** Force and let in reset state DMA2D */
    0 h# p& z# {/ f2 V
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();5 t8 g4 Z% O! ]8 {; N
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();
    : U# Q  y( E. O1 R" Q

  1523. . e% Y- ^% m: l7 ~: P1 ]2 W$ V
  1524.     /** Disable the DMA2D */
      V$ s9 V5 Z7 M/ `* S, s' }
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();; q/ V; }( o4 c
  1526.   }, O6 n  ^/ p" E8 k2 K' F
  1527. }7 Z6 W: A' }& x3 D- @7 x

  1528. $ H. P9 U9 A+ ]& P( b# r# _1 w- P
  1529. /**7 n9 G9 v  a2 p( s4 s& l! g
  1530.   * @}
    + s4 W4 @* A1 s
  1531.   */
    3 j: V+ \8 [* E! {2 M5 W

  1532. - u8 W' J3 `, {! M+ h: F
  1533. /**8 n" @- L* d. ^  l5 V
  1534.   * @}
    : w9 A2 K, H  U! D$ v
  1535.   */
    6 l0 _' T7 Z2 }. E4 c+ S1 {
  1536. 1 p6 ^4 w9 m: y+ N9 g# G' J& G
  1537. /**" t6 M* L8 c6 ]
  1538.   * @}+ L; s2 A- @9 C$ S! K2 f
  1539.   */* k) B4 i) D( {1 x7 M0 _
  1540. . J$ Z4 S' s2 x/ J
  1541. /**3 T/ n1 _/ [9 u/ W! q1 L
  1542.   * @}
    9 r% Z" Z/ j( E4 ^9 Q+ A
  1543.   */
    % y* f, n4 O' Z4 f0 y0 o, p

  1544. . @/ \( ?6 D5 g
复制代码
* j1 ?* d/ T5 y) h
/ y4 t) o5 m  p& p$ u/ a
2.2、main.c
! S  u2 B! O: Q- a) t" B; O
  1. int main(void)5 f4 f6 Q, z! K6 k
  2. {" q" \& h$ t4 i  k( u# z* ?  c
  3.   uint32_t x_size;
      A" ^$ F/ B! t+ s
  4.   uint32_t y_size;
    3 I/ Z) h  c+ F0 T+ S
  5.   uint16_t i,j;# S# Z( m0 w8 [" }% d
  6. / _* }- h! L! w8 G$ V5 ~
  7.   HAL_Init();- H" E' h8 P2 a  ~  I/ M
  8.   SystemClock_Config();
    1 e7 S9 {! {8 h& @/ p5 k
  9.   
    8 _, a3 w+ K2 U/ I& C5 B
  10.   /* Update the RIF config for the used peripherals */
    ) \$ ^6 r' C  q& D2 S& [
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    ! X4 d  G* G) M5 A7 C7 v6 D
  12.   RIMC_master.MasterCID = RIF_CID_1;
    8 A$ @8 A) v/ Z* E
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;; D% R& l% ~7 r9 t& j  z
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);. x) F9 z( D; E, E( \" a
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);
    4 o/ _+ P8 X+ z& g3 \
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);3 o: C: a" X5 J
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);
    6 x% \" j5 X2 v+ ~6 l
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);
    ( E1 n4 R' o0 }: R2 m
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);. I& u5 `! k' a
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);# R# o) \/ W3 C* C& m
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    : U$ R! @% X; }7 {6 \
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);. V% p4 k) M6 c0 b, T
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    1 o- u& g. Y& C0 x  ~7 i1 _% J
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    * a) x) G' K) m2 I! U

  25. 6 m9 m9 w# x5 k( w, [# Z8 G  {: j$ R
  26.   BSP_LED_Init(LED_GREEN);7 {: v! g# L: R9 Y9 Y  P3 S0 u. w2 M
  27.   BSP_LED_Init(LED_RED);  T, C; V+ m* ?
  28.   2 [" N, w$ L, |# r. C9 e
  29.   #if USE_COM_LOG
    , H" w1 }. K, R
  30.   COM_InitTypeDef COM_Init;
    : t) ~, i3 c' b0 S5 V" t

  31. 6 E% ?, K' u1 Z  D
  32.   /* Initialize COM init structure */
    - P6 {+ B  @$ H1 ~4 X* D. B
  33.   COM_Init.BaudRate   = 115200;
    7 B$ u4 S4 e6 D; ^9 N; t. z
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;
    1 c3 p$ g' x6 W! R! j
  35.   COM_Init.StopBits   = COM_STOPBITS_1;4 f8 j' [& i$ d' r" _; r8 ^
  36.   COM_Init.Parity     = COM_PARITY_NONE;2 }; l; J* i! L3 r1 `& f
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;
    ; R8 j7 w7 e5 J% U8 C$ c! q& V( e
  38. . v8 ?: r! J# I1 n# s! P
  39.   BSP_COM_Init(COM1, &COM_Init);
    7 O+ R6 ?) l, m" d2 w# ?

  40. ( o5 h$ o5 N) s. z* M
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)
    ; R: ?+ ^) C4 ^0 k
  42.   {: q! U6 r, U' i$ L
  43.     Error_Handler();
    6 Z/ M- P6 x, F6 n. Y
  44.   }9 e0 F( J3 \5 y+ n0 i( m0 b
  45. #endif1 ~$ a$ b+ b" {( ^* ?
  46.   . I9 R/ x1 s7 d2 q1 N! `" x
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);0 q' }, {' R( U
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    + H2 Z% n1 Q; c& v
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);9 O; ~5 t# b! J
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
    5 \! i( d+ V( Z. j
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);/ R! |8 y4 r( d* M: G2 q
  52.   UTIL_LCD_SetFont(&Font24);
    5 r0 x4 W: B! r! ]$ E
  53.   
    ! y. c, }% ?/ g+ Q9 u  w1 p' f# w
  54.   while (1)7 L$ x  v# G8 a$ U, Z: I
  55.   {% ^" P4 Q$ ~0 K0 [
  56.     switch (i)
    7 j  {! Q5 N6 _$ e% F& z2 w
  57.     {
    7 D! M9 _5 G( G2 l! P& L
  58.       case 0:: t$ a, {5 x7 `( S4 S+ u
  59.       {
    : }$ B! S' _% }1 f7 M) p
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
    - D6 W% z8 U  H4 S  p! ?7 C+ A. v0 z! W
  61.           break;% }# s' ^# |8 |8 L
  62.       }
      n% b' z0 b' ]% ^& A
  63.       case 1:
    & T" b, }: \9 d, Y0 X9 i% A( d2 s
  64.       {
    ; K, X, F. ?0 D3 s6 e
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);4 `. T+ @+ x% U# A
  66.           break;1 U7 z; O1 g9 z" v4 H: k- Q0 Z
  67.       }* u& o; H( e% p$ y
  68.       case 2:
    & W8 f4 r+ ^5 |; B2 J
  69.       {3 ~6 ?% [. n: Z( @2 ^4 s; d) y
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    3 k% j( A0 O5 ?
  71.           break;
    ) X" ~  O) U& t
  72.       }/ l* Q% [1 l1 N6 o; [4 y8 `# C
  73.       case 3:
    1 h9 e' G* d9 F) Z
  74.       {" f7 i7 o# F# D3 v9 r2 H
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);
    0 N: X' a4 Y* Y& S! F
  76.           break;
    1 m+ a- Y1 R1 E5 U! ^) M
  77.       }$ ^7 ?8 o% d' b# ^- ^
  78.       case 4:
    $ {& M3 P0 q: w0 F
  79.       {/ l3 v2 X5 q2 B6 B  r6 ?. p
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);
    " `. X, }# R. R! l5 a* j
  81.           break;
    ! ^+ S9 L. Q4 H* l' W9 b) |; I' l! a
  82.       }! F# Y" y5 T7 v% a* s
  83.       case 5:% x3 z  ]6 A( Z
  84.       {* J  y- B9 Q5 L. w1 C) R5 z
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);# \: P& x. `8 T# d( E
  86.           break;" t" q! p" Q3 b" ^8 B6 x1 X6 o2 p
  87.       }
    / k- u$ v, e# B6 y, N4 Y
  88.     }
    # G0 I" k. L7 D+ @; L
  89.    
    6 Z% z, Z- c0 O# v3 i/ n9 u9 B& c
  90.     if(i==6)# I( S. |- S8 D& Z7 v' ^
  91.     {
    ) v/ K  U) Q3 ]" w. |- a
  92.       i=0;2 s) J# e6 V5 P% ]
  93.     }
    . \+ t- H$ a" s! Q8 x$ J
  94.     else, L+ b3 v6 H3 r: u, \
  95.     {
    2 J; e: n+ K" X0 x9 \
  96.       i++;8 H  b' ~6 ]/ l# C
  97.     }
    ) y4 y) Z; O' q+ A
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);( p* g9 u/ @* T; d' y" Z
  99.     BSP_LED_On(LED1);0 V: O# M0 I2 t$ p# f
  100.     HAL_Delay(500);8 E# B4 s6 f: v& B/ q- a7 A
  101.     BSP_LED_Off(LED1);
    2 v: _; l7 M! p2 r2 }  L
  102.     HAL_Delay(500);4 i* s5 E: w9 a5 M$ P# n
  103.   }
    ) V+ a- e+ ?! k; [! h. N
  104. }
复制代码
- H* h8 @7 ^, g$ Z

  ?! R. n" t2 S# C  M5 }  c9 }' x9 D% c, o, M5 \# N3 F2 U
$ u) q- G+ Z1 v9 c4 N5 q
三、结果' G9 B+ t2 t. i9 h6 C% i

. N% }; j3 q: t! b
- j  v( V% i# _+ s; u/ r
下载程序到开发板,运行开发板屏幕显示如下:
3 k; N+ u# Z# ]- u lcd.gif
" g( z: j. N9 O. K! b
, f2 y) e* E* |  \' D

' I! o4 [: ~# v! u

3 N& x( e# x) m( {; c1 \" s
3 Q. I4 g4 m! W( Z' Y
赞 收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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