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

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

[复制链接]
TLLED 发布时间:2025-2-18 15:02
4 @5 W& B& t; ^8 Y$ {2 z7 x
. ?7 l' ], [) r$ D4 h; n1 ~

" i" o2 u$ ^& ?5 u2 l一、硬件部分
: b+ u- S5 i* j) b. P. E( I; ]2 `  I1.1、LCD显示屏硬件接口部分电路4 {4 v2 W' d" u5 d6 m# ^* I0 k
lcd.png - p6 }2 [7 ]) K6 S, c" g
% B7 l2 |' y. b: A- t& |( s& ]
- [1 j4 y9 r. ?- d; c4 J2 e7 ^
1 t  M0 q. k- q

+ z" j, g& [, r: [
+ `' l  a/ u3 P" m9 {* [" u1.2、LTDC显示内部框图  z. f" o! m* _) [- k
LTDC可驱动24位的RGB显示屏,内部有两个显示层+ w' {3 ?2 J7 ]( Z5 I( H- S9 B
002.png
" Z) L& o2 t# M

4 i; b  O7 C: L3 e' W+ }, j
1 A$ h1 \$ s2 v# c9 o
% `  h% W$ d. S; v
二、配置LTDC8 ~# o# C' ^6 \3 X4 `3 ]
& u1 @9 I% m, T6 S8 _  K( [
2.1、屏幕的参数设置
- O5 [' f9 |- z2 g- I# X0 r8 L 003.png ! n0 z& o1 e; M* G) N" L
' v3 e+ e  b8 ~/ x. t+ ?

7 A/ q' o- q2 R5 ^2 M2 K, p( Z2.2、层参数设置
; \( t4 p* A2 [; p$ b% W- R, ~ 004.png
8 |. @( w7 |- t! r4 \' U" @) q

0 D# O' n' F# R$ O# c0 {, V4 M4 e; @1 r* f

: o' f7 N8 r' e" q, g2 m2 O. b3 q2.3、LTDC引脚设置
, w$ j: b; {# v$ D- Z( Q 005.png . a. v: [* ~) y8 j

2 R! V7 A& y9 p8 Y+ U4 r
0 p& b, B6 ]7 K) V
# h: Q2 O  ^, p5 N/ @' p- \* Y
三、程序部分
* T2 n+ ~3 |* j2 z: U: k3 K0 u! `4 |0 x$ q7 s
3.1、在项目中添加LCD驱动程序
; \; [0 h, L1 o& W4 a2 ~0 F  V% T使用官方BSP中的LCD驱动程序
8 ^7 h# U7 K" M+ `; Y) qstm32n6570_discovery_lcd.c& k. }6 ^# Y9 ?" t

! O. [% t( h# M1 c* W4 U
  1. /**
    # @3 K* T: I! i1 A3 A# S/ h# _( _
  2.   ******************************************************************************
    ! D, _( `  v) K4 v' X
  3.   * @file    stm32n6570_discovery_lcd.c
    2 X5 c2 |7 _4 Z% F) ~
  4.   * @author  MCD Application Team+ Q# T. K3 n  e. y% P3 B  _
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module
    ) v, x2 k; D9 a3 ^- N5 |
  6.   *          mounted on STM32N6570_DK board.6 l8 a+ y, }; B! T% y% z
  7.   ******************************************************************************
    ; s1 a" F" \  L  i6 @
  8.   * @attention
    : ]# p" Q+ |& S2 g5 q- p
  9.   *0 {. j( u& `3 d* b: l
  10.   * Copyright (c) 2022 STMicroelectronics.
    ) r' d* _$ G+ E
  11.   * All rights reserved.
      C7 C/ F# V4 l0 q( X6 G! W' ]
  12.   *
    : Q# d9 x5 _! Z$ b6 F: i
  13.   * This software is licensed under terms that can be found in the LICENSE file! u; ]  t9 [+ {$ y+ Q+ c6 t- q
  14.   * in the root directory of this software component.) O  Z1 w; a$ Q5 S" m7 j
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
    , j% Z8 K( H0 |( L
  16.   *
    6 w, j2 k0 v6 P8 g4 I( C
  17.   ******************************************************************************
    8 ^: D. J5 j) c4 R. g* K6 v
  18.   @verbatim
    & H1 W4 m0 t  U0 }. _9 H
  19.   How To use this driver:
    4 ~  F2 m. q% O/ R3 J' W4 S
  20.   --------------------------
    ' Q5 W( H6 n9 X( ~7 p3 M% i7 E4 Y
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.
    , q8 S. B7 H+ D2 r: [6 u
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component9 r4 r: i& Z1 e. E$ W) {" H/ ~
  23. + ]  h' @3 O* S1 h0 ?& T
  24.   Driver description:
    + |  ~: m. n( h' E+ U3 ~" x7 N' e
  25.   ---------------------4 C+ U7 {+ {! v: h4 E8 y
  26.    + Initialization steps:* |% l6 H6 I, g  c
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the, V* K7 V6 N5 L
  28.        following settings:
    . f+ @" S$ K2 Z- }0 e* D1 C
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888" T1 _8 E' ?7 n4 s) k
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.
    ' T9 y3 I& ^, l
  31.         - Width       : LCD_DEFAULT_WIDTH (800); p" d4 e6 k, A! y/ T+ f+ N
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)+ f' [" D4 @' Z! @! ]% x7 \
  33.        The default LTDC layer configured is layer 0.
    * w$ R* Y5 d, z4 w( \4 i3 b3 N
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:' A/ ~7 ?* B/ x$ q7 @0 Q
  35.         - MX_LTDC_ClockConfig()/ n; G/ `/ f) {. X5 d/ m
  36.         - MX_LTDC_Init()& I( k6 _/ @; }
  37.         - MX_LTDC_ConfigLayer()
    0 w! N0 z. }7 a3 O

  38. 7 n' `3 O  _( d9 A" x# N
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.
    2 h0 r# Q8 N# p' X
  40. % \& d1 x" n0 N; `0 V1 U
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.% A" Q1 s; n/ |) r# [' @
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.
    6 @4 ?" J; R% {- n+ z
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    # I) O" g- s  m
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.  K) m7 e) p4 e
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.
    2 r, u  B& [( e, E8 v
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.
      i/ C1 v" p+ P1 p
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.& c3 o: S* ?1 W
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.
    5 U: w- p* J. d2 X2 I' Z

  49. " ~1 Y6 Q: d9 H& i
  50.    + Options
    0 I3 W$ l( l/ \7 j# B2 R* H
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the
    & S: s0 N0 H; |, A+ e* d( x
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.$ U5 {/ i9 G5 L. _4 q. M+ \# g. B
  53.        To control the reload mode:2 I" @0 b6 M7 I) X6 ?
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE; h9 n- h. L4 z9 Z) ?: M
  55.          - Configure LTDC (color keying, transparency ..)
    5 e7 M3 r( J) T' H- x
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE
    # D6 t; `  E( ~" H9 ^7 w
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload
    & N5 X& p0 b4 P3 Z& y: ]' |
  58.            in the next vertical blanking3 P: I0 ~+ f2 c% L
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()4 P  H$ X( V0 }: Q
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()
    7 d. i7 R) _) ?0 O
  61.      o Configure and enable the color keying functionality using the1 e+ t( N; i2 Z' D8 Z
  62.        BSP_LCD_SetColorKeying() function.9 \- G; L# ]  Z+ C0 G7 d+ ]
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function." m* ]. U8 X7 Z5 I: U( ?
  64.      o Modify on the fly the transparency and/or the frame buffer address, {' x: o3 e& {) m2 _
  65.        using the following functions:2 M% u2 G. W- J4 Q$ I" F/ W
  66.        - BSP_LCD_SetTransparency()
    6 o0 K+ `" r! }$ i
  67.        - BSP_LCD_SetLayerAddress()' W- `, f, g8 J& M% C' M' j! t, n
  68. 3 D1 f6 a' V" D5 X1 Z8 S1 G9 V
  69.    + Display on LCD8 R! I1 ?" `9 X2 Y9 F4 K
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)1 {& O# s3 i! x* F9 ?
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,
    : l5 W; }2 T" v
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.
    - [' C- m# j4 j. O% s1 P
  73.        The basic gui services, defined in basic_gui utility, are ready for use.
    ; ~/ d4 A6 @3 {) b7 S. ]. A
  74. ! ]' t/ V' k, }3 L1 W1 ?
  75.   Note:9 I0 Q! u7 y9 K4 H! [7 u
  76.   --------
    $ z; U6 v# J0 Z+ `" k. K+ u$ N8 \* k
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select  _3 ~: j& D/ `8 y: y4 Y
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this
    : z' x5 F7 X6 R% p& W& L
  79.     parameter should be 0.+ j% L& I6 @* w. I& r

  80.   E. T7 C" w  i, \
  81.   @endverbatim2 _8 O0 N# Q. c, e3 z5 a
  82.   ******************************************************************************' F6 B  Q" C4 A( O. e
  83.   */
    : k+ Y/ {; k6 i) y' [

  84. 5 v! n0 t' c3 ]. C5 a( A! N8 W
  85. /* Includes ------------------------------------------------------------------*/
    8 h- c; _6 E' `) B& z* B
  86. #include "stm32n6570_discovery_lcd.h"
    # g' S& W# Y7 e; ?% g3 l, w

  87. - S1 k& d. t0 `6 J& I) U
  88. /** @addtogroup BSP
    $ V" ^3 F8 L3 P5 T  W
  89.   * @{; h- j0 @  \9 [# W+ _
  90.   */  g% D2 H/ H5 V9 w/ ~! u+ |# w* h

  91. " S% x6 ?/ H# ^
  92. /** @addtogroup STM32N6570_DK5 i7 a0 B8 D. P% r
  93.   * @{# z: p9 u8 y5 [3 `: }- C
  94.   */
    ( J& ^. I7 H/ |7 ]- E+ O2 P2 T

  95. , l, h7 f# G% a8 Y4 U' W7 Z3 c2 Z, q
  96. /** @defgroup STM32N6570_DK_LCD LCD) b0 C- z; W5 \$ Y' L$ \. t- L
  97.   * @{% U0 L0 \; }; D! T7 o* i
  98.   */; d+ X9 A- A! A+ e0 R

  99. & X% Q- Q1 C/ F5 D' H' H2 [! e* n* ^
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables
    * T- f* W6 E6 n2 T6 b; i; Q
  101.   * @{
    ; E% j; E+ z# A+ ]: x
  102.   */
    3 N0 R# \4 C$ Q# s9 x& x: j0 A! `

  103. , r+ |& n7 A: v0 o
  104. /**0 }5 k; L4 ^7 W1 H" @, D
  105.   * @}
    : e, _/ I* g5 B7 G# N" e
  106.   */3 ^2 g( M, M' e( g

  107. ! ]8 I5 u" O6 |, G: s0 e
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions
    4 h8 R: f% o& z. m: m2 f# e
  109.   * @{
    $ A" Q' r' n$ F. p( P$ c
  110.   */
    7 E6 y# Q1 ]( @: A: ]# w7 e
  111. const LCD_UTILS_Drv_t LCD_Driver =$ S$ s+ \3 F" `) O, S3 b
  112. {' [) W5 [" u6 Q9 S4 @8 k7 z: \! N
  113.   BSP_LCD_DrawBitmap,/ @' T# t8 \. A" n
  114.   BSP_LCD_FillRGBRect," x# @2 a3 W  n/ ?; x; K
  115.   BSP_LCD_DrawHLine,% w, Z, F3 _: I9 }
  116.   BSP_LCD_DrawVLine,: b- [- y& f" ~5 O0 p% f5 ?/ |
  117.   BSP_LCD_FillRect,  |! D. Y( \) x8 e8 Z6 f
  118.   BSP_LCD_ReadPixel,$ x$ I. c  ]9 T/ B0 o2 e  d
  119.   BSP_LCD_WritePixel,% {4 q" `. Y# \
  120.   BSP_LCD_GetXSize,
    ; I* B5 w2 J- {' {& [2 _& c
  121.   BSP_LCD_GetYSize,2 e& o6 {$ ~4 s7 m2 ]
  122.   BSP_LCD_SetActiveLayer,
    " U' F6 D4 N2 {9 L& m
  123.   BSP_LCD_GetPixelFormat
    ; i! M: Z8 ^" X
  124. };4 b# \9 @7 m; H3 d+ V8 B

  125. - r4 {  n: u, O/ j/ ~2 K
  126. /**
    / A- M& Z/ p7 G1 A1 V& H
  127.   * @}5 d! d1 V- ?9 V$ z
  128.   */) E2 Y0 |! y) V0 d' K
  129. 4 o9 z% F8 N+ d9 T/ `
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables+ \$ }- ], i2 T
  131.   * @{( J: s# {% z2 T+ r6 b" V
  132.   */
    % _% Q, f+ J% T  k# D% C1 u  [
  133. DMA2D_HandleTypeDef hlcd_dma2d;
    9 R, m+ h) t: @
  134. LTDC_HandleTypeDef  hlcd_ltdc;8 s+ P# F8 p' y& u: h
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];4 Y1 M) F) v- A$ Q2 ^8 {
  136. /**" U$ i$ s7 Q# a: C1 P
  137.   * @}
    5 l  x  L4 o* ^. |+ `
  138.   */
    / V2 G7 t4 G% W' a0 X
  139. % K, Q9 l$ O* D; `1 J; y; I! v4 J
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes
    , z0 J& w3 H- ]# p0 u  [9 o2 R
  141.   * @{
    ) ]* D- L9 B$ \$ @4 y1 S' r  e
  142.   */
    ! E  O$ |7 t% k3 i& A! u

  143. 7 q0 R( t1 x) F5 C, a" z
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
    , z) ]2 X: K6 d; W3 ]
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);
    8 ^) g, ^; g/ ^% Z1 ~( V% Z
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);
    0 y% I- ]( q# y8 W/ s) R( O
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);$ d" }- ^# a  }9 f, w* I& r
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);
    ( k0 u& i7 c$ v8 p& g8 g; G
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);5 e$ {$ ]! H+ L9 ^7 s, q# m
  150. /**
    1 D; R3 c" u% Y7 Y) Q3 ~* L- C
  151.   * @}
    ) b3 q+ O3 R2 O! {) M
  152.   */
    2 f8 y+ ?- A+ \) z9 V" R; M
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros2 v& D; D* d4 F
  154.   * @{6 a. z1 h; a' ]7 w; N; U; _
  155.   */
    0 X  [* \! {: v- N: r: n# m1 }
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\
    4 @$ I6 ?1 _" F: @$ I
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\
    % ]8 Z# `( W+ W  C: q' d- K! i
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))
    : C; j  q4 J' u7 l. X

  159. * o* G) Q$ p  T
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\
    * f9 p  k% n6 U' u
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\: q4 h6 }. F& [1 k: T
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\: i' k( n7 I; @' I" w/ P4 ?* F& F
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))4 ^! {! t) Q6 p; ?9 D/ h" A/ e1 |

  164. # B. J0 r, @8 v- v$ c; H& j7 m
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    ! r+ Z; @+ s. ?$ a# \

  166. : t4 D5 i, E5 r( I) N+ v+ p
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)$ {0 r5 v5 [0 Y  T
  168. ; @; L7 p- N$ S8 b; R% W
  169. /**
    6 S* L( S2 N! s4 `- y( e5 ?
  170.   * @}
    : D* G1 p" m* q) n7 J
  171.   */
    ; L9 H) s! I9 W0 O7 D/ y' J# w
  172. ( H4 h1 m& N( O; b# l  k) k) S1 j/ I. T
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions0 G8 v; f1 W$ L, @: r  }9 M! w6 K
  174.   * @{- T& g1 B8 e5 L5 o
  175.   */9 u! a" [9 H( r  E
  176. /**, u! T0 ^* p% Q1 q: c# V7 q7 E
  177.   * @brief  Initializes the LCD in default mode.8 S" v- j% R/ B
  178.   * @param  Instance    LCD Instance
    ) L3 K0 K, ^# |/ \% P( A, L7 I
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE6 u; }8 T& [: R/ }0 {0 l
  180.   * @retval BSP status
    ) f% b% k4 C) e" O" a' t8 d
  181.   */& f/ B" ]5 V# L, X, O
  182. , `4 [, `% N/ l: f
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)( r  |2 R( ~3 Y9 S( o+ G0 N5 G
  184. {" B0 x8 D  ~9 W5 B
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
    ' e) K1 O. W/ F( o' \- i7 m0 w- `
  186. }* [5 O  g& q. o& [9 [& w

  187. 7 |8 l/ P# w- ^. f2 n( M0 ~
  188. /**
    % D- x) I  h7 u1 T* n* m: ^# D) N
  189.   * @brief  Initializes the LCD.
    " `7 T4 j: w( t( ]9 ]; o7 M
  190.   * @param  Instance    LCD Instance; w3 `' W9 k) e" R: o9 {
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE4 X9 P* j# X# m- T, t* S( ]
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888
    8 {4 O+ _" y$ p+ ?5 C
  193.   *                     or LCD_PIXEL_FORMAT_RGB8888 m2 h+ I/ a+ H1 g- O2 Z& X" O
  194.   * @param  Width       Display width
    * z$ L- B! W: O" O' [
  195.   * @param  Height      Display height9 u/ c! z) i8 k0 \. j, b7 a8 u7 v
  196.   * @retval BSP status" k1 L8 m* ^/ o# h3 v
  197.   */
    , x0 @# E% B, z* n
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height). j. G; U* ]  _( V" \( t
  199. {, C8 o7 S* b3 |3 d! H
  200.   int32_t ret = BSP_ERROR_NONE;
    6 Z# w. c; J) H" V  l6 i8 f% B/ Y( u
  201.   uint32_t ltdc_pixel_format;1 S" q1 Q( c2 C+ j7 O* i
  202.   MX_LTDC_LayerConfig_t config = {0};% I# k. {: e% F! }
  203. . R8 u7 W* F4 o% Y( K0 @
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \5 W4 r1 E7 E# {4 \: ~
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \' i# y* A/ _1 D! z" C  O
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))
    , o% V' Z/ N3 t: M. \% T
  207.   {- f: M) g8 M' X+ L% V# F
  208.     ret = BSP_ERROR_WRONG_PARAM;! j6 I- b! d) u& x- X+ j
  209.   }
    " W* L2 a9 ~+ t
  210.   else% O& E) H: X; {
  211.   {
    0 g) h" V/ D1 [2 `! ?4 G
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)+ }- x9 D8 m: t6 c7 r5 \9 s
  213.     {
    6 {; l% q% i. u$ V( q1 y9 P
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;& D3 _3 I! H  }: D' Q2 d# m
  215.       Lcd_Ctx[Instance].BppFactor = 2U;: A9 J' {  P7 i4 w" \
  216.     }- n: ~3 v/ V4 Q9 R& D& l
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)" b% W5 ~9 A- F8 Z5 A+ a6 l" y
  218.     {
    ; x6 M  ^, u( x5 B8 x+ _. m
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;
    # j2 i8 v' A1 G, f
  220.       Lcd_Ctx[Instance].BppFactor = 3U;4 E/ n8 `) M# X3 i% @# z8 D3 }* n
  221.     }# V$ c% R) N$ P/ A& W7 G' Z. Q
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444): x/ P# \  a2 D7 Z
  223.     {7 Y- O6 m' P1 ~! _5 Y: y
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;9 W) Y3 P7 P7 C3 L
  225.       Lcd_Ctx[Instance].BppFactor = 2U;# ]1 q; {; g  n  b. C
  226.     }; b0 d+ o: Y/ n) \& I  ?2 X
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */  }" B) \6 d* Q( J9 {( n9 {
  228.     {- z. t# y6 ]/ Z  v: A
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;; ]- N0 l* y7 k; P
  230.       Lcd_Ctx[Instance].BppFactor = 4U;
    9 Y' E" O5 }2 L  C
  231.     }
    9 }1 f4 F3 G4 }8 A! c- @- f

  232. & a7 f' C, ?/ f( X4 e1 b
  233.     /* Store pixel format, xsize and ysize information */8 D# a5 \, `( C' t: z+ ]. }# c( u7 |
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;
    ) A- \1 k6 A. h  E; E) N$ O$ a
  235.     Lcd_Ctx[Instance].XSize  = Width;1 c' V" J' r2 V& r- q4 W) p
  236.     Lcd_Ctx[Instance].YSize  = Height;( Z: l8 A0 g  ], J
  237. 9 B  O  {9 l9 G" S* T
  238.     /* Initializes peripherals instance value */
      k& a% S( M7 P+ U8 C- n2 y5 X
  239.     hlcd_ltdc.Instance = LTDC;
    * j3 ]1 j* [. d* `4 K; |
  240.     hlcd_dma2d.Instance = DMA2D;
    ) Y1 d; G( T5 {/ F! I

  241. 1 H  X0 K0 o  f8 K% y! F' c: H, ~# q
  242.     /* MSP initialization */
    , O6 @7 y0 I% e1 s/ v; `
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)% y! P3 Q2 X. Z4 F8 {: z
  244.     /* Register the LTDC MSP Callbacks */0 f- g+ @' {' {- ]3 ?* f
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)
    5 Z( @. P) Z! a( [! K: l
  246.     {
    ) j. Z! a2 Y, b4 d( ^' y
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)
    % t" L5 S5 {4 `! `6 o/ Y7 i% ]! r
  248.       {8 X$ b3 W9 [! h+ w. I8 u& d
  249.         return BSP_ERROR_PERIPH_FAILURE;
      E" |  d, P9 A5 h1 q! h6 P5 H
  250.       }
    2 t+ Z" [9 {6 t9 L
  251.     }
    / \) L% H/ A5 p% x% U+ e4 u- K
  252. #else) c# u  S2 _  |
  253.     LTDC_MspInit(&hlcd_ltdc);
    " J9 ]+ `- T  _" _! G) I1 T1 q
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    " r6 M, c) z/ n! w

  255. ; W, t9 K9 Y: Q% C7 L4 r# r
  256.     DMA2D_MspInit(&hlcd_dma2d);
    / j& u! l3 \6 `  Y) K! U2 _

  257. + X/ D. r3 ^6 Q
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)3 S5 k, Y' c! r7 y5 u9 O$ C
  259.     {
    ' a% \) G3 u5 h/ r; A) A) W
  260.       ret = BSP_ERROR_PERIPH_FAILURE;5 l7 s& R8 e& Y8 k; z1 Z3 I
  261.     }4 L0 O4 H( r3 ]) m* _8 k' {3 w
  262.     else2 }8 P" I1 M( N/ H# ^
  263.     {
    8 j- o! E5 U4 ^  w
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)
    % d5 Y3 s2 f' X3 l  M
  265.       {/ u/ ~" q$ h2 S1 a! X: G
  266.         ret = BSP_ERROR_PERIPH_FAILURE;" `) g7 e' \: e  K" n
  267.       }# F: {9 J: U0 W, w3 a" n
  268.     }2 c7 m3 y6 X9 z/ w  M! m4 m
  269. 8 Y( U" a7 C$ T$ r5 o. D
  270.     if (ret == BSP_ERROR_NONE)6 n, C) C2 R0 g, Q
  271.     {7 `9 m" M. a4 o8 v
  272. #if defined(DATA_IN_ExtRAM)
    0 d7 _& \, j6 y$ ^- V
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */  H, v, Q, S, Q' g
  274.       /* Initialize the XSPI RAM */
    0 ?4 y* D, E8 {. M! j$ f( ]  C7 O! _
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)# C8 _6 j3 H+ s! Y
  276.       {
    5 x$ H1 q$ M5 q) r
  277.         ret = BSP_ERROR_NO_INIT;3 x9 K8 {9 D$ T
  278.       }
    . `+ T) g  g0 \
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)
    2 i  W  W. h3 y7 N6 ^
  280.       {
    8 p2 M4 w: u3 M4 E3 A+ [  @
  281.         ret = BSP_ERROR_PERIPH_FAILURE;
    . a6 ]) i0 V( y% p  y. P1 |5 _! ^
  282.       }
    * ^, b9 i1 X: Y+ \
  283.       else  u  g6 K& G+ ]* m  I
  284.       {1 B5 L9 e9 L# ^/ o1 S4 w; c2 d
  285. #endif /* DATA_IN_ExtRAM */
    ' e& L2 i- _" _, c) p/ o- Y3 y
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling' Y" s: A6 E/ O8 L9 q
  287.         BSP_LCD_ConfigLayer() at application level */$ M! R  F% A$ E8 Z  U
  288.         config.X0          = 0;
    $ I- K2 g0 J6 y" d' {2 K8 @( w
  289.         config.X1          = Width;
    - B; K1 |6 ^3 Z: z8 V# o+ o
  290.         config.Y0          = 0;1 d) b, B. t+ D4 B4 G) J. c; W
  291.         config.Y1          = Height;
    1 i. t0 c7 q8 f
  292.         config.PixelFormat = ltdc_pixel_format;
    $ T- G# J$ u4 s
  293.         config.Address     = LCD_LAYER_0_ADDRESS;
    1 d4 u! B$ x9 k( [& Z% o

  294. ( Q: d) T" @* g" O2 @: X
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)
    ; ]% D- Y0 L7 R4 X. I- _* {/ e+ ~! h9 D
  296.         {
    - J! [* r$ L9 ?, l! j( E( m
  297.           ret = BSP_ERROR_PERIPH_FAILURE;
      }' K; u' j1 K$ S  l6 }* g
  298.         }1 m3 f3 Q' a# @6 J: G8 J& b
  299. / ~' y7 e1 G" }1 Q3 C7 x$ r
  300.         /* By default the reload is activated and executed immediately */0 G3 n; j& D' u2 F) p7 k
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;
    1 _+ k0 a# a5 }3 p; |
  302. #if defined(DATA_IN_ExtRAM)
    . |3 a8 w3 x) @8 @5 D, S4 I
  303.       }
    + B7 z$ w  g9 H9 U
  304. #endif /* DATA_IN_ExtRAM */2 ?, q5 m3 x) \& F
  305.     }
    6 |) X) Z  A$ e- ~
  306.   }
    - H; T+ K2 Z$ f# h) \

  307. ( [) x1 I' Y$ C" i7 Q1 V
  308.   return ret;0 Q. D9 D* K, U+ q+ @
  309. }$ ]& V; O+ G4 q/ N; o9 h( D+ {
  310. * V- j) Z* Y5 o' W1 Y  L' ~+ Z
  311. /**3 U# `, z+ K$ _5 E, ]3 ?
  312.   * @brief  De-Initializes the LCD resources.( M4 G. D; }* T5 A# ]3 i3 q
  313.   * @param  Instance    LCD Instance( s$ ~1 w  l  Y, w" b* l& z6 W& b/ P
  314.   * @retval BSP status
    ) h7 s# x; E& E$ x' I; D6 _
  315.   */
      B) V2 j3 A5 J4 u
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)7 f" j  v) H7 ~6 [' R* N- ^
  317. {! O# W4 r2 p* h% j4 M; k: k
  318.   int32_t ret = BSP_ERROR_NONE;
    6 O- }& e7 g# u# X6 Y3 e
  319. * C: z* A0 ~6 b9 q: f5 D
  320.   if(Instance >= LCD_INSTANCES_NBR)+ Y" O8 C: D+ j/ D: e1 f; D! \
  321.   {
    6 T: T% V. z! {
  322.     ret = BSP_ERROR_WRONG_PARAM;
    ; {9 ~. N' {* P% I/ f& V7 P' J! [+ j
  323.   }! I5 L% n0 n+ t' v
  324.   else
    # b. M- B; B: D& a8 G
  325.   {
    7 j& V) ~7 D% F+ P
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)
    + l) U! ]1 p( O
  327.     LTDC_MspDeInit(&hlcd_ltdc);
    8 U, t# M$ L1 Y2 p, e0 U- i
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */
    8 W0 L: u- x- P- {
  329. & g7 F3 I: x0 G/ y$ Z: L" I" N- V6 g
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);' H1 z; J- M7 B8 V
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)) V& |0 A( F3 s
  332.     {- d. ^* c& i( A7 W# [2 O5 z
  333.       ret = BSP_ERROR_PERIPH_FAILURE;9 z6 y- ~! n  U$ _: v! m' R
  334.     }
    5 L% M( O! j: W+ O% d
  335.     else" B' ~3 s) F6 S* H. k
  336.     {
      E( E% q1 t$ z* V8 ^  H
  337.       DMA2D_MspDeInit(&hlcd_dma2d);7 W) t( y. I) V" l0 b: M
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;- M! b% B. N5 B2 d" ?: A" f; q! f
  339.     }
    0 o; y1 H% t0 L7 S2 m
  340.   }7 F& t: E- i1 H. O, y' w  X) Y; Y# u
  341. ; N6 n' `7 F* ^
  342.   return ret;
    5 N. F% p8 `# N$ C- K# E9 O% E
  343. }
    ) o. B9 }; T- b  ^" |" E$ R

  344. ( W/ ^2 Q$ D, c
  345. /**5 X* X9 \/ k+ Y7 i/ e# W
  346.   * @brief  Initializes the LTDC.' Y, n) N, Z* D/ J7 t
  347.   * @param  hltdc  LTDC handle" i! X6 @! r2 A: ]9 I5 e3 L
  348.   * @param  Width  LTDC width
    $ R3 m6 V- n! m$ e0 h9 T
  349.   * @param  Height LTDC height$ `% W% L+ _1 u/ n, b8 }
  350.   * @retval HAL status
    ( k0 o' A1 q7 ]3 x' p+ `& Q
  351.   */
    4 d, Y' A% E2 B4 }, k/ e
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)
    . k2 U7 g; Y1 J8 v! K2 P9 y- K
  353. {/ D7 k0 R5 q4 t/ @! A: @
  354.   hltdc->Instance = LTDC;
    $ F  u! p. Z) n
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;1 o* A" E* h( f! ~- O$ b
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;
    3 |) n& E& S- |
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;
    2 Y9 E/ H3 o: z6 u' n7 P8 l
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;
    7 x0 W. Y' N- n6 X! z7 J3 K7 z  u9 W
  359. ; L3 D8 u2 b" W4 k& S
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;
    ) D& q" `4 d5 T& L; H+ B
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;2 f: k# C1 D. c* e
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;
    % }  g1 O$ W/ v. k# u6 A- b
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;5 m! x, A3 ]  k+ o, j2 f
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;& H# l7 u) \+ L( d2 V" g9 s: H* {- Y
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;3 p0 u! `/ p/ x. R8 h
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;
    & k7 }- P. g% L; o. P
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;* U- _& p) h& x! `, C0 \

  368. ( [) S# z3 T) p: e( P) S" ~, f& }
  369.   hltdc->Init.Backcolor.Blue  = 0x0;7 ]; M" J: S1 q" S: g  r
  370.   hltdc->Init.Backcolor.Green = 0x0;" v- V3 S) q( V
  371.   hltdc->Init.Backcolor.Red   = 0x0;
    5 @* k2 a% J# y+ v' N9 m4 |
  372. - \7 o0 p0 n6 Z) S
  373.   return HAL_LTDC_Init(hltdc);9 b# v' y0 r4 E) B: I5 {
  374. }% A6 g, P: s, M# q& O( {
  375. " U! \5 {8 H* [% }
  376. /**  K/ x( S; ^; h' L% U) h
  377.   * @brief  MX LTDC layer configuration.9 ]% u2 O5 i! h' Y: X8 E* f! W
  378.   * @param  hltdc      LTDC handle0 f. Z8 h3 c; Z4 N3 B$ _5 H
  379.   * @param  LayerIndex Layer 0 or 1- I6 p4 M, E8 J) s* k- x
  380.   * @param  Config     Layer configuration
    9 p" [1 _7 r: N2 e% m( [+ T
  381.   * @retval HAL status
    : T! A/ n0 Q0 R& m6 ~3 p" R
  382.   */! Y2 S& E9 q) c! R! k$ u
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)
    " m  @( v) @; t2 _
  384. {
    & _) D, F* W3 c1 g
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};1 s5 v, z0 E5 H6 O) }: R% @
  386. 6 Y3 b8 `, E0 O+ p. w) ^4 u
  387.   pLayerCfg.WindowX0 = Config->X0;' t  R4 R3 F1 z: }
  388.   pLayerCfg.WindowX1 = Config->X1;
    & t, j: d* x9 m1 B& v9 s, \3 E) i
  389.   pLayerCfg.WindowY0 = Config->Y0;
    % H( p4 `- k( O6 R
  390.   pLayerCfg.WindowY1 = Config->Y1;- A+ u7 I* v2 s. E+ I
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;0 _% v9 @3 `5 G0 @8 M
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;: C& _4 S& k. F9 V4 W6 T* m8 H) G
  393.   pLayerCfg.Alpha0 = 0;3 J7 S, _$ a- N' F- h1 R) q. V
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;- ]& \' x: o, X5 I% ^$ B) \
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
    + m$ m: u) t/ S3 L
  396.   pLayerCfg.FBStartAdress = Config->Address;% y( B' K% f7 l" j) p5 u
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);1 b- H1 [' ]# [2 u4 y. B! B: ^  n+ G
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);% ]: n1 a8 X' D5 ~/ X+ d
  399.   pLayerCfg.Backcolor.Blue = 0;0 G+ Z# z9 x1 ]" _( i5 _
  400.   pLayerCfg.Backcolor.Green = 0;, N1 H: \0 h( v( T0 o5 s( g
  401.   pLayerCfg.Backcolor.Red = 0;  o% v% ?; ?1 l. o+ R1 {
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);9 F/ B1 {/ y. n$ G2 B6 U
  403. }" q- H: w7 C' R9 o. d
  404. $ z2 l8 T3 i/ `$ [
  405. /*** k& W" s; ], z
  406.   * @brief  LTDC Clock Config for LCD DPI display.
    0 x: o) Z1 ?# Z
  407.   * @param  hltdc  LTDC Handle4 U& M0 {! z/ x+ `
  408.   *         Being __weak it can be overwritten by the application
    & ~- m. }0 U' i' ]0 b3 j
  409.   * @retval HAL_status8 ^% K+ P- X( r: I! T
  410.   */4 e5 \- ^1 E+ ]0 S+ V4 I) C
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)' j4 W! e! U; C, V( ]4 Y/ L
  412. {
    : ~5 C$ @4 t/ @" H& Y& s. m
  413.   /* Prevent unused argument(s) compilation warning */
    , N( ?; ?; R. P* K' l
  414.   UNUSED(hltdc);" B2 j/ Z& t# V

  415. . e- H( m, ]1 E' \9 p
  416.   HAL_StatusTypeDef   status =  HAL_OK;
    - x/ H$ _$ o, b0 v3 _4 |
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};, L, u7 M0 F" U3 h! @( X
  418. + h# Z' O. W, s+ x
  419.   /* LCD clock configuration */% x0 T/ i( K, D; M
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    % z; V. I: `. f9 K
  421.   /* LTDC - PLL4 */
    + O7 p* \- w) t
  422.   /* Configure LTDC clock to IC16 with PLL4  */  `1 d  ^9 \  ~+ q; b. d3 x

  423. 7 q7 {9 K$ m' h" }. e& ?& v
  424.   /* LCD clock configuration */+ O  R  r0 e6 k5 @+ }6 h
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */# z/ X$ x& @6 N8 |& x8 S- }
  426.   /* LCD clock configuration */
    * c5 ?& `2 J! k9 a
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */$ i2 V, B0 b5 G" |/ @
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */+ ]& b5 }) K! K4 ?* M
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */
    . d8 j- y% K9 u: E4 E& J
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */
    # H) S/ S; l$ t5 h
  431. 9 M  B) t( O* G
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;2 S% |; _, _7 f" v
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;
    9 g& d4 p9 x/ m9 [" i
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;
    / `4 q! \& i- `: G1 d
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
    - f$ y- \7 y0 ?% i/ L  _
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    ! }. v3 T4 L$ m! H! a6 g
  437.   {
    ) Y3 z' \7 `! Z7 m0 A- D- ]7 Q
  438.     status = HAL_ERROR;  m0 u, w( v% ]# n. u
  439.   }
      ~9 d* ^- |0 }3 Q  i" I" a) W0 O
  440. / d4 P, e, ^9 l! X0 X+ ~
  441.   return status;
    6 U$ L% ?4 C  J- E& p  z$ r
  442. }
    $ Q4 l7 B; B' H+ _/ a
  443. ; m9 m0 L2 ~2 s5 R( R% F
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1). m3 P" d+ O$ j: h
  445. /**
    6 i1 T. p' m2 x5 y0 B
  446.   * @brief Default BSP LCD Msp Callbacks6 G! [' L0 O. u( d
  447.   * @param Instance BSP LCD Instance
    - T, S: ~) u. m
  448.   * @retval BSP status' H$ g% q& `5 A/ h
  449.   */
    3 U- [. l* Z4 L. ]  }3 w
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)9 {) \$ f" ^4 g# {
  451. {
    , P' p6 Y' _- J4 |, F1 u- Z& a
  452.   int32_t ret = BSP_ERROR_NONE;
    * D. M! o2 M- _2 N8 n: }

  453. ( c1 k1 V2 b/ w4 V  m% J  o# b
  454.   if(Instance >= LCD_INSTANCES_NBR)
    % S2 f; _7 o  I+ u
  455.   {
    " D! k/ B4 M3 k4 I8 y) @0 r) r
  456.     ret = BSP_ERROR_WRONG_PARAM;
    8 N; c" z* z; a& L! X/ W
  457.   }
    ; B# J! t" U5 {- s4 ~7 x. `
  458.   else
    & J7 m, v# S$ n" A& ~, y
  459.   {% ]* H& E0 N# O7 s0 Z9 v+ M/ J
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)
    " B0 a/ S, i) s! }3 s
  461.     {
    4 h& ^2 D: }9 i$ S$ u2 ?
  462.       ret = BSP_ERROR_PERIPH_FAILURE;; x* y1 ]* C$ T$ R: O
  463.     }& d5 `- u" s5 j$ ?( Q% h- F3 y5 [
  464.     else; g/ d: T  R* X& u, A6 c; _
  465.     {- M0 Z, ?0 f% N' t  V
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    4 g. q/ [9 m7 a2 O. |
  467.       {
    % e1 d; x6 W6 e4 N
  468.         ret = BSP_ERROR_PERIPH_FAILURE;
    ) C* k0 \( F" Q% W1 R9 J. z7 K* H6 m
  469.       }
    ' a. s, f0 [  D. k3 c3 c8 m5 u
  470.     }
    - b, f, B& R% l0 [) n

  471. 4 k7 z6 H3 K5 S' e7 ?
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    - t2 c5 Z9 T" X/ |% d
  473.   }; ^  H$ C( {0 a8 {( C: ]

  474. ) L  [9 c/ b) r+ X$ q. x
  475.   return ret;
    ; w! u4 k1 G- _
  476. }
    5 o" x0 U2 y8 B( `2 e1 ]4 m2 h, O
  477. + r! k  H$ T: J
  478. /**" J# f# N+ S- ?: u/ K0 a
  479.   * @brief BSP LCD Msp Callback registering9 t+ r' o' r2 y' h& s* z: S) W
  480.   * @param Instance    LCD Instance
    3 y( D2 Q# n9 `0 P5 V
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions+ L# X3 n* l4 C4 d( Y
  482.   * @retval BSP status
    . U; b* x4 l: q) c7 D: R, e+ b
  483.   */  n1 q7 `" J- b% z3 F$ b% `* }
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)0 ~9 T6 I2 f9 b: `! W9 C
  485. {8 |) ]) B4 i5 n- K5 l* x
  486.   int32_t ret = BSP_ERROR_NONE;
    7 a: U1 P, B% K3 l
  487. 3 r2 ?1 W. b# ^$ s6 t1 }
  488.   if(Instance >= LCD_INSTANCES_NBR)
    , A# B7 \' i- j* r0 {$ x% c
  489.   {
    ( I- N! c# `: @+ i$ j) x
  490.     ret = BSP_ERROR_WRONG_PARAM;
    / z% A( _# A, ^! ?1 U
  491.   }4 u* W* j' i; O+ n
  492.   else
    ! H/ D+ f7 Z4 ~9 e1 \5 e0 z% g
  493.   {
    9 V* z# r5 C8 s* h$ Z9 o9 Q
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)# |7 a* F2 ?* e# l: U
  495.     {* S, T0 ^6 q; u! M" P& l+ H7 e
  496.       ret = BSP_ERROR_PERIPH_FAILURE;
    $ t6 a: P* @1 `# s
  497.     }7 O) c$ t- o5 f$ \( X
  498.     else
    7 B8 l  S. o  K0 T
  499.     {( T0 ?2 M+ ]* ~3 n6 g
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)/ H2 C2 x9 U4 y$ H! f( \( S
  501.       {" z& F2 I* i- S2 n# @2 Q
  502.         ret = BSP_ERROR_PERIPH_FAILURE;2 q# Q- A5 h, A$ d/ d, T% ?8 Z. k
  503.       }
    9 `, z1 ~$ k5 H2 c" K9 |2 L
  504.     }
    . \1 T; H+ ?5 R3 ]" U
  505. 0 g9 y' [* ]$ C- _- g: w5 X' b9 J' ^* P2 `
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    $ K  x6 {( a7 ?  O& \  P! _; M) D, t
  507.   }8 x6 P; H7 F+ P5 x9 \  E

  508. % r& a4 ]: _) B$ Y, [( ~
  509.   return ret;
    & U. q& o0 z. s! E& c$ s( i
  510. }
    ' p' K0 m0 X2 S5 g$ ^
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */& e. |1 Z+ b# X' u7 _7 a+ d4 \

  512. , C& M! ], P4 R% j
  513. /**8 e- H# K) z9 u* r, s' }2 r
  514.   * @brief  LTDC layer configuration., V6 \8 ]* \. \3 Q  h
  515.   * @param  Instance   LCD instance% v+ n# Y( j* z
  516.   * @param  LayerIndex Layer 0 or 1, U3 z2 P. |! U  j$ a* f( K; R
  517.   * @param  Config     Layer configuration5 G, ?5 S3 F' i7 _+ X
  518.   * @retval HAL status
    ) K! b! u6 H, `( f2 y
  519.   */  h4 H% [2 [5 \. W: n  z
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)  j: K9 ^% y2 B1 O) x3 s6 b4 ]
  521. {% V% q' ?5 w0 w( ?1 d8 B
  522.   int32_t ret = BSP_ERROR_NONE;
    ; G1 ^' F# r! o. _$ P" u: G
  523.   if(Instance >= LCD_INSTANCES_NBR)6 ~. b3 \. p* k( s, b
  524.   {
    . O/ f$ \# N0 l2 u) S3 V
  525.     ret = BSP_ERROR_WRONG_PARAM;' @- O; W  h; }' b" b
  526.   }9 r' \% s5 o7 _6 D" {6 B2 J
  527.   else3 `. h: t( }  O' x) U. h
  528.   {. Z$ f0 L- |* Z8 p( I5 B
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)4 `. c: M5 O8 Z1 T$ w+ [
  530.     {
    ( i; _0 W1 v( }
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
    & h. D0 u  m, B; a$ W* R$ z
  532.     }+ @0 |; Y/ ^8 \" n: v. [8 p
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)& l8 X0 T+ i3 C7 J2 M2 Z
  534.     {3 N! W- |. T. _, I8 a2 ~
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;5 j7 d0 }) E6 p: w% j
  536.     }
    , D, a, |  B, S6 r, v
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)  b1 R1 w0 o; d- t# C
  538.     {+ }* d  b) j( o$ o! |" Z6 }8 X% _
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;$ K( I" C+ ?! F1 U; A! F
  540.     }! I; z3 O  K' s2 U  `
  541.     else
    3 J% a# ?# w! P- G4 a
  542.     {
    # R; @8 N; H2 T. b7 u
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
    ' n# q6 m. _% y% d
  544.     }* P2 @1 P/ H+ @' R9 y3 _
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)
    6 _; `0 T4 G# Z
  546.     {
    % Q( y. F4 x' ?8 u& _+ z
  547.       ret = BSP_ERROR_PERIPH_FAILURE;, ^7 j2 c/ e. D: P/ O; D) y+ f
  548.     }! H7 M# p/ y1 S4 M
  549.   }+ W% j* j4 ]% Q0 B
  550.   return ret;
    1 I2 X+ B! q8 M( n
  551. }
    / n. L% J% z/ o1 |6 H/ i
  552. / `7 g5 m* j# S) B5 m" J
  553. /**
    & q9 m4 \" @4 E
  554.   * @brief  Gets the LCD Active LCD Pixel Format.
    1 ~  y, P! d: ^7 f" o
  555.   * @param  Instance    LCD Instance8 d9 U0 n3 g4 F' U% H/ u+ E4 U
  556.   * @param  PixelFormat Active LCD Pixel Format3 A; ~& e2 d/ T5 V. M2 f
  557.   * @retval BSP status5 C/ Q+ U8 |9 d6 j& V
  558.   */
    , z* A! Z0 [4 A- \% Y
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)& ]( w: a* v; R* }2 \
  560. {
    - a' d7 ^" W' v8 B
  561.   int32_t ret = BSP_ERROR_NONE;
    ) j) g- d/ [3 @5 _) S5 M

  562. & o" B6 L$ r9 z% _. b( Q- n
  563.   if(Instance >= LCD_INSTANCES_NBR)% h5 J+ r+ g! ]  w
  564.   {
    ; ]7 J: v5 x6 y6 f  S/ w4 M" U/ v
  565.     ret = BSP_ERROR_WRONG_PARAM;: d, x$ ~# c8 A4 V& O4 w" X
  566.   }
    " l( E( W, f( m. o5 }5 ]  K6 R
  567.   else3 P4 f7 A( A& \. q% v* c/ t0 h. _
  568.   {
    1 X" p. J& H+ X. I4 z$ W
  569.     /* Only RGB565 format is supported */! R7 q. J2 z8 I1 \7 ^1 j( P
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;
    " t" B: ?1 |( ~9 G
  571.   }6 p8 v# E% [$ L& c, X0 d( ^

  572. - D' B2 y; a$ ~# E: H
  573.   return ret;7 d# A; q6 ]( D1 k
  574. }
    $ W4 u9 }0 d2 R" K: ?& r8 V& e
  575. . z: n" v' V1 r
  576. /**# o: r" G2 g/ ^2 r7 l- @
  577.   * @brief  Set the LCD Active Layer.) W. T4 A  u6 M, @6 m4 Z) ~
  578.   * @param  Instance    LCD Instance- m6 r4 ]; n: d* `: i; _
  579.   * @param  LayerIndex  LCD layer index
    - |4 q. f0 s, O& @
  580.   * @retval BSP status% Q6 b; I0 i# ~1 Y
  581.   */8 C1 @5 b4 ~, @8 L5 K; Q, k. @
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)
    . _1 [) g' z1 T0 f, A9 x* x3 a
  583. {
    9 e" Q. r( I9 q! w3 h
  584.   int32_t ret = BSP_ERROR_NONE;; {3 ]% d! g; u, W
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;
    / w; E9 U3 I8 S$ E2 X0 {( h3 m
  586. % q$ ?/ h5 g; H( F$ W$ t! D: [& v6 z
  587.   if(Instance >= LCD_INSTANCES_NBR)- o* V5 p. f* `) M, k; o) g
  588.   {
    0 I4 X0 A5 k, N7 i, H% O8 i" H1 w
  589.     ret = BSP_ERROR_WRONG_PARAM;3 b. v! `4 [6 a8 J1 r( J$ d
  590.   }
    ( P% S( q% d# d, K
  591.   else
    % P& N+ P  C2 G; {9 M& {
  592.   {  e' A2 `, B5 W
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];
    ; q9 s" E/ ?# o# @0 P6 {& E

  594. / \' c) E5 m9 S8 I
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;
    ; w1 O( U$ _% B/ X
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;$ q7 K* l9 C$ o( g  Y6 c- m# ^
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;
    2 T, D! V5 F2 ?8 }' G, P

  598. $ X4 O8 N6 G$ f1 b0 @
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
    " T" H, W) k( w) D" H6 k. T
  600.     {) {' c# M2 [/ E2 q0 r' B$ Z# j
  601.       Lcd_Ctx[Instance].BppFactor = 2;3 m7 y) \( q# ]5 T* }
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;# b+ P' L0 K1 i$ g
  603.     }
    - L- F) @# [1 r$ H: ^: b
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)* t( O# e, `- p9 H' I0 U
  605.     {, J: [* b6 Y$ E0 _6 T
  606.       Lcd_Ctx[Instance].BppFactor = 2;
    5 n# f0 ~, B, a0 e+ n
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;
    6 }' g" J0 C0 Q  W$ s
  608.     }
    6 V/ B, c; ]( l
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)
    3 G0 V6 W) V+ ]6 y
  610.     {! z- z9 g( s' D& L
  611.       Lcd_Ctx[Instance].BppFactor = 3;
    7 @9 h( z% x. h( U, |) P% M! a3 H8 D
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;
      f8 G- m& z3 |* b
  613.     }& T9 `" N( n$ F6 x! e3 V  r
  614.     else
    * N: S" Q- H4 I/ I
  615.     {( [# l$ x5 R8 @1 r
  616.       Lcd_Ctx[Instance].BppFactor = 4;. X, `% |8 B; J' w  w
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;: A6 `2 z) P: ]. a! w' D) U6 X# H
  618.     }# G' n/ X, x( t4 ^
  619.   }9 ~3 m( p9 ]5 O7 C. ?
  620. : w0 x% i. E% j' Q9 `" A; U9 B
  621.   return ret;
    , T( }' l. H: A" w
  622. }
    2 x; M+ m* V+ J$ h) C
  623. 1 o3 ~- g0 j" l: e
  624. /**& t4 x+ r& T9 }" p6 E
  625.   * @brief  Control the LTDC reload) e- h1 ?2 j9 K; U
  626.   * @param  Instance    LCD Instance9 {7 e( Z7 E" p) K( e2 H
  627.   * @param  ReloadType can be one of the following values
    7 I* i' }" j0 {
  628.   *         - BSP_LCD_RELOAD_NONE" n% ]$ k0 b7 Q6 w
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE
    # m3 a* ?8 D4 t2 V' j+ {8 f
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING
    8 s' o3 l! _" T1 t
  631.   * @retval BSP status
    6 u; N6 A. L* i  b- a& r
  632.   */7 K' p$ V# z! I, J8 S# Y+ ]$ T# i
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)0 O! D' \- Y; @+ _  n* F
  634. {
    : N0 P6 M8 z! g$ E, K) V% {
  635.   int32_t ret = BSP_ERROR_NONE;
    ) b4 D$ `& @* a, q7 W
  636. 9 r5 Z4 u# d+ E' ~# W0 C4 a
  637.   if(Instance >= LCD_INSTANCES_NBR)
    / V; L: B/ p, Q9 m' u
  638.   {! a3 Z- b2 x- p& M
  639.     ret = BSP_ERROR_WRONG_PARAM;3 p/ f: A! }4 X4 u$ W* l
  640.   }
    " D: ~1 ?: \3 K4 X* V% d, T
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)2 t! g0 r: ^& _  Y% x7 m1 m
  642.   {
    3 f+ A& Y/ _: Y  ~
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;
    + M3 ?: Z% l" P: n* i. _: s- j
  644.   }
    1 E& @  Y6 V  R/ v% F
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)
    8 `( W4 h' c4 x3 Q1 u
  646.   {' D: S8 a6 U( y, b# K# `% z7 a; O# o
  647.     ret = BSP_ERROR_PERIPH_FAILURE;4 }2 z% X3 k1 t1 A: S8 N
  648.   }
      `9 m3 \& d; Q& M+ c, n- Q
  649.   else
    5 t" m9 h  _  b/ E( M" J4 Z9 K
  650.   {
    2 f  c0 s3 o. t, H% a
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;  S; F9 w' e" x4 {$ w# K% D
  652.   }/ O2 t& t5 ]! K/ W* m, I5 `" X2 s

  653. . S1 R) I" J7 V0 N2 Y7 ^1 P
  654.   return ret;
    . l6 d! {. U; P3 U  V9 ?7 L# H
  655. }, w2 G2 T/ I! z, u" L  @& i" F
  656. % Q, R$ ^$ r& G2 ?  q4 M& }- P7 G$ c
  657. /**, R6 G' ]: e& N; P) P
  658.   * @brief  Sets an LCD Layer visible
    - n) y  I- W9 S( P$ d2 H; I
  659.   * @param  Instance    LCD Instance
    2 m+ P: L( C8 m, }) O6 d# d
  660.   * @param  LayerIndex  Visible Layer" r: j# {( L- Z: a. H
  661.   * @param  State  New state of the specified layer
    : ]! ~7 J4 ~6 D
  662.   *          This parameter can be one of the following values:" u/ G( i: s6 r" I
  663.   *            @arg  ENABLE/ s2 M; `3 q9 r9 {0 g2 s
  664.   *            @arg  DISABLE5 R) c' Q% I6 K6 P  l
  665.   * @retval BSP status
    8 V2 O, W+ M" j" |- V( d. e
  666.   */
    / P) `: |' P6 \
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)' Z! s- q, |! `
  668. {
    % h. x: ~+ L8 F* p  t
  669.   int32_t ret = BSP_ERROR_NONE;
    8 E2 s$ u  k& x

  670.   u$ o- j6 w7 U, U1 ^
  671.   if(Instance >= LCD_INSTANCES_NBR)* Z( @1 D2 v1 A: T
  672.   {* a4 |# ]$ b4 c: q% T  V& ^+ w' H, y- n
  673.     ret = BSP_ERROR_WRONG_PARAM;
    0 W+ X( x0 u: h% G
  674.   }
    / W7 \( ?$ s  z8 L$ }
  675.   else
    * ^8 T: I5 C+ l6 s* x7 J4 ~, L
  676.   {" N; @) T# O  T/ `
  677.     if(State == ENABLE)# U' G  J4 p. _
  678.     {
    % I! z' \; J; A7 w, ]
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);6 R8 a9 T! K6 b! j* o/ c) Y# u% E' w
  680.     }& o  ^1 @' N* r7 Z4 v  {6 X
  681.     else
    1 K: O' |' |! M" g* o$ |+ m0 K
  682.     {# q/ }; p+ Y8 U6 n
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);5 A, k4 U8 U- u7 @6 y
  684.     }1 B; p! p1 T. A' m; _! ?
  685.   f! s: q- ]) x5 z+ m
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    8 q/ X4 v( H! D# s$ K% j
  687.     {- C/ m7 s7 a1 }( j0 V- s, [  n, y0 N
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);
    * G/ g9 \. Q1 K; Z; H3 M* d
  689.     }% E0 k. m! f$ q3 s/ b
  690.   }
    4 Y  O8 y. I( E7 N$ T
  691. & D8 z1 C$ ~5 g6 T* h
  692.   return ret;
    " }: h: K* P( J- Y) t( w. ^$ _8 C
  693. }
    , U! j" i0 H" U& Z

  694. ( i6 d' `& |9 h2 p6 k! }
  695. /**" h7 u' R3 J8 U
  696.   * @brief  Configures the transparency.
    8 s/ u2 o& h3 p5 D/ \  k" F
  697.   * @param  Instance      LCD Instance
    5 o3 [7 |( B- u. s5 z1 Q
  698.   * @param  LayerIndex    Layer foreground or background.
    5 H7 M, p% O3 h# H
  699.   * @param  Transparency  Transparency$ V/ d3 F' N1 b$ I* `$ L. b  q% Z
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF) {8 j9 D5 @  y1 P% k! S3 t
  701.   * @retval BSP status
    , ~: T+ P! ^  m1 H9 c/ r
  702.   */
    $ U8 {' W# g3 H1 j2 [% x% V" ]
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)
    , t5 w8 z8 a. P) [3 o& l
  704. {* y6 [/ g5 [% r! i' ~
  705.   int32_t ret = BSP_ERROR_NONE;
      g: K1 O1 d# A
  706.   F: c8 |$ W  I- X
  707.   if(Instance >= LCD_INSTANCES_NBR)8 a2 n: U- z  M
  708.   {1 Q5 @* Q, S; Y0 ~! Q2 o* ~0 q9 V
  709.     ret = BSP_ERROR_WRONG_PARAM;
    " ?4 r' j* X; G/ S8 N: T
  710.   }
    $ p2 E7 N( l" D* \) Z' m, D
  711.   else( P( [7 M. e$ x, V9 x
  712.   {
    4 r; J2 i) u5 h4 F0 F% ]
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    " S% c, P4 F2 J/ f  H7 }! m7 W9 d
  714.     {
    $ c, ]0 e% K. G  u! v- g, [
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);
      m( V. P' G. z) _1 k+ y
  716.     }, Y) z- V9 R* t* B5 I
  717.     else
    . [8 o, K" E) ?; t. R6 K: h
  718.     {
    : q  Z2 P  I& M, `2 z: G4 L
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);
    + v3 E9 P% V$ n" i/ T1 ]. W
  720.     }* P0 P3 P4 U- T- R# _) O2 t6 n
  721.   }
    $ ^1 p' x7 _9 L& l) r' r
  722.   t3 }/ a4 D" T' r
  723.   return ret;
    9 d; J! k/ r- e5 [( `" `2 Z1 U/ k
  724. }/ [) h( K: o8 g, i9 `, H/ l- ~

  725. / t$ y9 ]: j  M6 M# S: h# F
  726. /**
    # \2 V+ z. ?$ ]8 B+ p& L
  727.   * @brief  Sets an LCD layer frame buffer address.& ^& x% \5 Q4 u0 r
  728.   * @param  Instance    LCD Instance
    / }+ I! I, V, m) N3 }& Q5 x
  729.   * @param  LayerIndex  Layer foreground or background, M: X6 t7 k' z. _
  730.   * @param  Address     New LCD frame buffer value- B4 {- f8 z  I" k
  731.   * @retval BSP status" w, t! G1 w& y$ n$ W, J( B
  732.   */
    $ c, O" g& E/ z
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)
    5 Z/ z( A' C9 T$ m# _
  734. {
    - q5 ~* U5 z9 G
  735.   int32_t ret = BSP_ERROR_NONE;
    6 K6 [4 H9 f1 r2 Q5 M& z+ r# [

  736. ! }$ S5 Y$ M4 n& t- p/ u  U3 y6 {
  737.   if(Instance >= LCD_INSTANCES_NBR)
    5 w" \- N/ R! b2 C6 E0 T7 `
  738.   {
    9 Q9 M* y/ C0 o( w
  739.     ret = BSP_ERROR_WRONG_PARAM;
    9 U6 ]; b8 i8 |5 H( p
  740.   }1 C3 Q/ k: n* N- I! k
  741.   else* ~* {) W- S5 p4 z% i. i! Y
  742.   {
    * v; U+ C, q# w
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    0 S" N- N/ e+ j+ f3 t/ ~9 I
  744.     {) D, G: V- y& s1 z: ?6 |2 L
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);
    / P) u2 \3 n: a0 r3 w
  746.     }
    2 o- |9 @) G; @" G- w& \, x
  747.     else
    ) u' k5 l5 _+ \5 `6 M. k, r
  748.     {
    ; J! x% a/ U4 R+ f, U& A% F8 l/ t
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);0 ]" P; e- |% R' Q0 @8 {3 O% \/ J
  750.     }
    9 ^$ \" ]' K* l3 z) `" G3 q2 K1 Z) H
  751.   }
    3 \$ W8 l% ^$ B8 I( N
  752. ) a& G& t: _- ^
  753.   return ret;5 x) g! U; G1 _/ s8 m0 V7 Q0 O; J
  754. }
    . z- N2 K/ F7 ^0 R1 O

  755. # Q' |; C  q) F- q/ L
  756. /**
    ! L/ X0 L* G" i& U  h
  757.   * @brief  Sets display window.
    8 e, I& Y0 d1 t/ F2 w
  758.   * @param  Instance    LCD Instance! ]: q: D, C' K5 ]4 G! b% M
  759.   * @param  LayerIndex  Layer index8 ^9 G) e+ Q+ g+ M5 w) d2 h
  760.   * @param  Xpos   LCD X position
    ! C6 U  f$ r7 J: U: N
  761.   * @param  Ypos   LCD Y position
    6 ^; a8 D) {) q/ l9 H7 v7 K
  762.   * @param  Width  LCD window width* A4 I" |4 q. f: P7 k% h; d7 y
  763.   * @param  Height LCD window height1 ^, B  B0 f: p
  764.   * @retval BSP status
    0 r# i4 U9 f! o% ?# P! t/ f( _
  765.   */) k7 G0 v0 Q) [
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
    ! ]" I4 R5 ?9 p! N6 i  s
  767. {
    ! [* X- k6 j$ V0 J( I
  768.   int32_t ret = BSP_ERROR_NONE;
    / H- J* E3 h% d
  769. & S* I# `( m5 ]  e* k8 G  m
  770.   if(Instance >= LCD_INSTANCES_NBR)
    5 u( c1 K& Q! O8 [% _2 ]5 t" `( W
  771.   {6 ]/ `0 t  ~8 u) p% z) F
  772.     ret = BSP_ERROR_WRONG_PARAM;
    ; \: [9 @! R; q
  773.   }
    1 K5 @0 r) z8 B# ?
  774.   else, c6 K7 `/ J2 A. y1 u6 e4 V% ?- t
  775.   {
    2 d- d6 K" n- E# Q
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U): {& f! ~" {2 h6 Y/ O
  777.     {4 T; D9 O9 o: R( e* R0 t/ p4 Q
  778.       /* Reconfigure the layer size  and position */" L: B3 c( A; x, n. X/ g1 G
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);* f  H! p2 U( a* m8 V
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);  \- n) D+ p. l
  781.     }
    " u, I& ~: a/ |1 H) V1 }& R8 k+ c) j) {
  782.     else
    ) V' r4 }7 \1 Z$ y  a; _
  783.     {, H8 n1 I( z- a4 ]
  784.       /* Reconfigure the layer size and position */2 y% S# U+ m# K1 u- Q
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);( B3 J/ \& f% c0 x
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    - q5 _% W5 O: a& Q$ w" d( X/ O
  787.     }
    ; V* W  }, [' {, ?8 K$ \
  788. ( f/ Y( y4 I5 l# u" S! P3 C
  789.     Lcd_Ctx[Instance].XSize = Width;
    " A, S2 Y6 I% ^' o" z9 a
  790.     Lcd_Ctx[Instance].YSize = Height;
    7 f4 v2 I) T( U" i
  791.   }0 e* I. ]) Q. k" W/ p7 G4 V0 X

  792. & H5 L: d3 x' @
  793.   return ret;0 a" c4 L4 }! C" B
  794. }5 G2 S7 F' z/ t7 j
  795. ( `4 s5 V" H# G- o7 h
  796. /**' P0 m% B- e9 r6 l3 h( ~
  797.   * @brief  Configures and sets the color keying.
    5 l# @0 o1 V7 _, K7 ]0 g
  798.   * @param  Instance    LCD Instance2 S- K% C- G9 j1 L
  799.   * @param  LayerIndex  Layer foreground or background
    # {+ F0 Y/ ^1 b5 ^" [8 b9 }
  800.   * @param  Color       Color reference7 k% M# ?/ }% `# X8 z& c
  801.   * @retval BSP status
    6 O/ C* V/ Y+ y, K" D0 T
  802.   */: D. n4 v5 u( @+ I
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color): U/ Q  n9 o4 O* C( ~: A! ~
  804. {3 a/ u8 s; Y; O: n: l
  805.   int32_t ret = BSP_ERROR_NONE;
    ! |3 L. _5 q/ d- f2 `0 C
  806. $ h( e0 {2 \2 ?& L1 D' G; U! Z8 W
  807.   if(Instance >= LCD_INSTANCES_NBR)
    % a6 `7 ~; Q# A# ^! \( Z6 H* K
  808.   {( y; Y& M; c7 z+ q- |
  809.     ret = BSP_ERROR_WRONG_PARAM;
    7 w5 g/ `' z# A4 |: f) g, ^5 @
  810.   }+ f+ U, j- P: |! _* ]) _% X
  811.   else2 G: W7 ]2 H/ [5 i! p
  812.   {
    3 R% K5 I! d9 \9 D* x% y, M
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);* x& w8 s( M) ?8 ~; O
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    1 W4 l) |$ d+ q' D8 N& i8 I9 P* T
  815.     {9 S) f  o4 i0 z2 ]
  816.       /* Configure and Enable the color Keying for LCD Layer */
    ) N7 ^' L9 b' l3 ]; A$ }. Y. \
  817. $ P+ b0 T" H, n+ s9 L  _, }
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);
    ) q" b5 P/ s0 d! g" `
  819.     }" H( M/ j* E- F: O' K- K
  820.     else
    7 b0 N$ T8 z6 G! h! s! p8 u
  821.     {
    4 i) L/ \6 v2 v& R
  822.       /* Configure and Enable the color Keying for LCD Layer */. w0 G: i; q. B  `/ r
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    ( p$ D- F7 M" Y1 t+ j$ [
  824.     }
    $ R+ i: E: f" s% M) `1 [% H! L
  825.   }
    ' W6 D. M  }  |! x/ `! ^
  826. $ x$ H% z" j7 Q4 ]- j8 |! U
  827.   return ret;7 u2 t1 w' |) \& c& M8 o
  828. }/ ]8 t" l% m2 e* r5 j
  829. 0 R, b7 s9 J6 _0 r" {3 w
  830. /**) h0 u5 K9 e$ _) B0 o' [) t: \/ _
  831.   * @brief  Disables the color keying.
    1 M: _5 ]. |! [$ ?# \
  832.   * @param  Instance    LCD Instance/ n) `' D9 Z/ [: G* `* c5 Y, B4 A. b
  833.   * @param  LayerIndex Layer foreground or background
    ; I8 S/ N/ j2 l8 N" n
  834.   * @retval BSP status# Q& E6 q% V7 z" v5 ]
  835.   *// g+ e. r; ~6 F: |% l5 r8 C! X' M
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)9 D6 l- E5 y# B7 T1 }4 G' P
  837. {
    ) ~' b; D7 p- J$ ]' }7 P
  838.   int32_t ret = BSP_ERROR_NONE;
    ( ~1 q( t4 H2 o7 P
  839. & b" a/ b8 K3 i* z, y
  840.   if(Instance >= LCD_INSTANCES_NBR)/ d  M5 o+ A4 V* A& }
  841.   {# e% {1 j6 X+ |
  842.     ret = BSP_ERROR_WRONG_PARAM;$ e+ y9 B: O# C0 m
  843.   }- r# E2 ?2 A3 \! G: k- v( s1 l- Y$ U- g
  844.   else
    1 U$ H! p2 _& h  D: e0 }
  845.   {
    / ?& f! Z8 v& O9 V
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    7 e* T  d8 F6 ~4 a7 X
  847.     {
    % a* J& D9 q, ^- _6 F
  848.       /* Disable the color Keying for LCD Layer */# x0 f4 [* z; t" X0 K, z3 j
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    . ^. \2 e, S6 K. E( {" e7 F
  850.     }
    : O) q( _; Z" O% m8 b& U& g8 b/ H
  851.     else
    3 A! R4 r, ~) E( A
  852.     {$ a5 g7 L2 |( R/ t1 Z7 U- B# L
  853.       /* Disable the color Keying for LCD Layer */
    9 p6 f5 I7 Y- Z+ g5 B) ?% e* D
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    / d! \/ c# v6 x* y8 k5 M
  855.     }0 k6 L2 N3 e. x2 {
  856.   }# Y! r$ d) p8 M4 F/ f1 D* U: G

  857. - ~+ [& [7 o7 R! y6 S/ R
  858.   return ret;
    4 x) U2 m. {: N; E( s! e2 x
  859. }, b) D# F4 W8 _* u# g$ F: s, |

  860. ' M  Q+ [' G+ O/ Q- H9 Z
  861. /**
    7 [$ B. v' V# ?) F% f
  862.   * @brief  Gets the LCD X size.
    $ D7 Q# x1 v1 f! V, z7 E5 h8 n/ Y" ], o
  863.   * @param  Instance  LCD Instance1 I9 T& R% a9 T; L5 z
  864.   * @param  XSize     LCD width$ r8 o2 M( f. u  @% W" L; x
  865.   * @retval BSP status
    , b2 \. w: b3 o+ _/ n1 U
  866.   */
    * m* C# C; y. o* w" v6 K
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)3 |. }& O' Z7 q: n, S
  868. {
    . F- w! Z# Y% U0 S( A* g: B# W
  869.   int32_t ret = BSP_ERROR_NONE;
    ' t- F: \/ {, ?; m$ W( `  A( B+ Q

  870. 8 N. i0 m1 ~% J2 p: v+ X2 A$ D
  871.   if(Instance >= LCD_INSTANCES_NBR)  {% q  m. P$ R" {3 R" e  r4 z
  872.   {
    , y2 z4 y9 S/ E' q
  873.     ret = BSP_ERROR_WRONG_PARAM;
    " m( ?: _) j0 E6 F' i
  874.   }
    $ S' y9 `% F- t$ i7 {* P
  875.   else
    3 d7 l% r7 v! [3 A
  876.   {+ W% y# S9 Z4 r4 t; k
  877.     *XSize = Lcd_Ctx[Instance].XSize;
    ! C* j7 b8 W8 U
  878.   }
    # I8 Z, t3 g1 N& r3 b

  879. ! J" i  G; z5 V& P% d; G
  880.   return ret;& E7 i+ N0 k3 I% A: r
  881. }
    & I: M; [5 o/ n- H, o& k
  882. 8 L4 P1 ?/ p! \7 n- u
  883. /**
    & Z; x+ [0 }$ V
  884.   * @brief  Gets the LCD Y size.$ N! ?3 [5 m  i* m% z- O
  885.   * @param  Instance  LCD Instance5 _" j$ R3 T, m+ ]& j6 E
  886.   * @param  YSize     LCD Height
    $ z# K. x$ z' y5 N- V
  887.   * @retval BSP status5 t: U6 ~! ~. f; h1 t
  888.   */
    4 v/ n9 ^4 R: M% O
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
    # K: o$ ?. ~. [( P
  890. {
    + t; L9 @8 L# N$ e$ _
  891.   int32_t ret = BSP_ERROR_NONE;
    , u- e! V( z9 i6 ?3 K5 t2 U
  892. 7 {* T1 M. D" m) `& p
  893.   if(Instance >= LCD_INSTANCES_NBR)1 z% L. g, w# K5 f5 j: s* l
  894.   {& [; g  ]5 z) |  Q% B
  895.     ret = BSP_ERROR_WRONG_PARAM;7 o7 C  W% I+ t( u$ ]$ L3 T
  896.   }
    ) @+ w4 Q5 Y% P) V' ^
  897.   else8 ~6 f, j# T$ i1 Z
  898.   {
    4 L0 ]! A5 j  @, T
  899.     *YSize = Lcd_Ctx[Instance].YSize;
    1 r6 J. l( _1 F( A* T) M
  900.   }! L# y6 o* V9 U- Y, X) X3 g

  901. + b8 y- w) [* @
  902.   return ret;
    ; L- z+ c9 J( W- g
  903. }
    ' K& `( i& p; |' Q- g% f( ]( ]

  904. - @5 l+ L( d; A" ]
  905. /**
      P3 g0 b/ w! X' {$ c9 c' }3 ?
  906.   * @brief  Switch On the display.% w4 e; L, M, D. q
  907.   * @param  Instance    LCD Instance8 g% ~' C( _8 ^! }( w2 C
  908.   * @retval BSP status. h# j3 e* T* i: q3 }- T7 @
  909.   */
    " ?2 ]5 H, G/ c; H/ O: U4 w
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)
      d5 C. B  [% T' ^8 ^
  911. {
    ; K* b8 y6 F0 n/ P( B! z
  912.   int32_t ret = BSP_ERROR_NONE;, a/ i) O5 ^. e( n
  913.   GPIO_InitTypeDef gpio_init_structure = {0};/ }5 Q3 K6 f& a% Q( h7 P/ z
  914. 9 A( P  c8 R- v* G) r) \' n- w
  915.   if(Instance >= LCD_INSTANCES_NBR)
    6 y2 @- b& J3 s' B3 l* i7 O2 ]6 P) k
  916.   {
    ! O3 I9 ]$ R: X$ z
  917.     ret = BSP_ERROR_WRONG_PARAM;2 k3 m' `% r5 ~+ j$ M. i" }
  918.   }
    # [! I: b( W. N' z
  919.   else1 q  W3 S( J. Z6 S6 n  {  I
  920.   {
    5 k+ l  a& ?: U) y) w2 L
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);7 H2 W) r9 R2 w8 F$ g
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
    & c* M% l$ c# N& g5 K! s, S
  923.     gpio_init_structure.Pull = GPIO_PULLUP;" O; B) o% [  n' D! `6 M- Z
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;+ b' ~  |' {5 I; u
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);! L' N" k  K9 c8 w0 w
  926. 9 @% c) z( b: z' i
  927.     /* Assert LCD_DISP_EN pin */) q6 T" S  i. m. J' _
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);  R0 _4 E7 G* F
  929.   }
    ) y7 }: q7 H; Z4 j" P- _

  930. 9 p0 h0 l; X4 B  u1 r
  931.   return ret;) e- N2 }" i! w$ F: d6 E
  932. }
    9 K) A3 F& p# g# r6 I8 J0 }

  933. , B0 r( v6 U8 _
  934. /**# Z/ @$ E& c3 q- d4 J
  935.   * @brief  Switch Off the display.
    $ }' d) i& k' H0 T- V3 t
  936.   * @param  Instance    LCD Instance4 I" j! M* ?  l
  937.   * @retval BSP status
    ; P4 ~7 N$ p* v0 x4 u$ V% v
  938.   */
    + l8 `. N( {- E- P- [) y& m
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)
    # a' l' C: z7 D8 @
  940. {5 j7 A  g4 a$ `: D" b# r: a$ A- Z9 L/ e
  941.   int32_t ret = BSP_ERROR_NONE;; c- E% h6 v8 `* h5 s
  942.   GPIO_InitTypeDef gpio_init_structure = {0};
    - o1 M7 E6 @5 [! V' ]9 R. M6 n% [

  943. 6 J1 D0 n: d3 U
  944.   if(Instance >= LCD_INSTANCES_NBR)
    " N# T- x0 ]( g. Y" R
  945.   {. g, n7 `# V* S3 |% p
  946.     ret = BSP_ERROR_WRONG_PARAM;! p! A0 ^; [9 m# r6 |
  947.   }" C7 q8 U: V9 E; f! c2 h
  948.   else
    % a( o* E: g. E" e- Y
  949.   {
    2 I' n! F- x: Z! R, w
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;  m  k( {. c# m$ r6 M
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;
    - r% i! C5 y/ S- v* J) h' G6 B& ?
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;, y: L1 f% B1 l% I5 Q9 _
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;
    # [& |. q  i4 x8 J# I
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);+ _7 A( L) B6 y  \
  955. . r3 ]5 Q) z% u: D* ^9 ~
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);
      b1 V! _. F) G3 w. p5 Z7 e1 N

  957. 3 G& r; \7 M" Z' U; e4 F
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);4 g$ O3 l/ |# j+ n; H0 ?+ ?2 ]/ u
  959. 0 O) t/ D- i- ~1 B7 w' b
  960.   }$ e, k5 n0 n, Y6 l8 U4 K; q* O
  961. 7 I0 q  V3 m6 J; n& U9 T+ S5 I. \9 g
  962.   return ret;
    ; L' q- ]: N5 K! V2 Z9 m
  963. }
    6 U* ~' u/ z. U: T7 D1 t2 @

  964. ' p1 n5 A9 b3 q( H) Z8 N3 e
  965. /**
    - U5 Q/ s/ h7 i0 Z
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.' T( _4 C- E/ x6 l4 Q
  967.   * @param  Instance LCD Instance* D" l% A! C3 o9 `# ~8 U
  968.   * @param  Xpos Bmp X position in the LCD
    / y! v8 R+ u4 |$ e# t5 {+ X
  969.   * @param  Ypos Bmp Y position in the LCD
    8 k* r' h* ^2 m- n
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.
    ' w& Q* z  _5 k4 e. k! P  v" x) Q
  971.   * @retval BSP status
    " F6 Q: T+ E+ s* }2 G) _9 M
  972.   */1 x8 P4 b" T" E: Y
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)
    9 b& @' D# Q* A* ^1 g
  974. {
    5 J1 Q  s7 n) P# s6 O$ _) n- h
  975.   int32_t ret = BSP_ERROR_NONE;+ j1 C" }) T; W1 B% J8 }8 m  z
  976.   uint32_t index;
    1 `0 t0 K0 v& x( A! ?8 C
  977.   uint32_t width;
    " w' Z' [) A/ p7 M4 Y( [0 |
  978.   uint32_t height;
    . h: g0 o- c( g% {6 A7 O! S
  979.   uint32_t bit_pixel;$ _' X; \. Q% c1 Z
  980.   uint32_t Address;
    8 Z1 e$ b9 a* k
  981.   uint32_t input_color_mode;
    ) s8 ]! q7 B# N; O' F8 \/ ^
  982.   uint8_t *pbmp;
    . w7 Z% o: j  W7 H, A! m) r
  983. : H/ }; d; H" Z& q: X8 ~
  984.   /* Get bitmap data address offset */" j& w+ q5 q  Y- `9 g! l
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);% T* p; _- F5 r  t/ f

  986. - e4 f6 p3 k+ L9 Y. Y6 J5 P) P
  987.   /* Read bitmap width */# S" e9 F. F7 a% a
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);0 G  I2 ]! \* u5 L5 J
  989. / o( S% i7 T2 }% F4 _
  990.   /* Read bitmap height */
    ( {* C8 u: `, M$ `9 X) ]& A
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);
    * D0 j6 g! o+ i# D) ^0 k9 _1 f# {

  992. 6 @6 |- l6 w! _8 F$ h
  993.   /* Read bit/pixel */
    0 d* f2 s0 T. b! f; e
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);
    ; B  O' T+ e1 B7 F* r- J7 U) r
  995. ) }' v7 L( X8 I) \# K
  996.   /* Set the address */
    * h5 t8 ]1 `- M' T8 f
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);- D6 C3 f" o  u  |- V2 u4 R

  998. 5 X& n# p, \* C; ~9 n3 R, w& \
  999.   /* Get the layer pixel format */
    3 u4 {( L, _0 J3 {- G
  1000.   if ((bit_pixel/8U) == 4U)0 e8 b( l  ?  }+ |/ L7 c- f
  1001.   {
    , v" N! N0 h2 X: W
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;
      T. V: @% l& l( N$ w8 g8 S
  1003.   }" D5 i  t  o9 J3 j9 l. j3 {6 ~% D
  1004.   else if ((bit_pixel/8U) == 2U)6 E& V: U% R1 P$ o/ c
  1005.   {
    , u1 s. |" u" O  t) `) A
  1006.     input_color_mode = DMA2D_INPUT_RGB565;; m4 e* d" l. Z; T, Q. @/ d4 Z
  1007.   }
    1 [: x+ `. T" S  _
  1008.   else) M; ]0 M+ Z, g( |/ ~* E, z
  1009.   {
    . [* L) f0 T( n+ ^% V
  1010.     input_color_mode = DMA2D_INPUT_RGB888;3 l) P. f( @+ d" i) r8 Y
  1011.   }+ k) q! ]8 X* o3 @+ m+ V
  1012. 5 H1 O+ E9 ~& J3 g. f. }
  1013.   /* Bypass the bitmap header */
    % C' |; i2 o1 `9 v
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    / P. G- M; ~9 j2 V

  1015. + S+ z, e4 F9 ^. i
  1016.   /* Convert picture to ARGB8888 pixel format */" ^6 w" W' u4 ]% L2 ]
  1017.   for(index=0; index < height; index++)
    : N/ K0 L0 _& j1 M1 {
  1018.   {
    5 l. y, d: x5 G8 }4 B+ p! S" r, z
  1019.     /* Pixel format conversion */5 N& W0 w5 \% a1 T/ V
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);/ z/ Y% t* d: M2 o- @7 M8 W

  1021. 3 Z" A% Y. E* m" L6 l6 O) B, m+ n
  1022.     /* Increment the source and destination buffers */
    / V% R2 C* G. z) B$ _) o
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);
    1 c: c1 h7 S; d3 |# E# ^/ ]2 N
  1024.     pbmp -= width*(bit_pixel/8U);* A4 o$ g4 M, `/ H  f
  1025.   }  W& k# P3 f7 }
  1026. 7 V2 z8 p! |: ?/ G4 F) L2 d* S6 h
  1027.   return ret;* d6 M0 q! A$ m( Z# i: X
  1028. }
    9 I) e7 w$ c( q, U4 G9 J

  1029. ! W) z5 G$ q5 Z, A! r
  1030. /**1 ~, ^) K- b. ~8 O1 C) m# [
  1031.   * @brief  Draw a horizontal line on LCD.
    . R. P" B6 N3 _" E2 O) t/ ]5 v4 D
  1032.   * @param  Instance LCD Instance./ K3 |* C7 l) J4 d: H$ H
  1033.   * @param  Xpos X position.
      H' ?* [( o: C8 p2 i. `
  1034.   * @param  Ypos Y position.- Z9 X2 J7 R* l
  1035.   * @param  pData Pointer to RGB line data0 U& {6 `. x+ _' T8 _: _4 H
  1036.   * @param  Width Rectangle width.* G6 F: i. v, u  `. ^
  1037.   * @param  Height Rectangle Height.* |& \* m! ]1 N; A+ N
  1038.   * @retval BSP status.( f2 X" a4 u% E/ n  W7 P) F
  1039.   */
    0 g) [. f" Q' ?$ i: T. X/ }
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)
    + |% N* M7 z+ m: p5 h
  1041. {
      q! T( H( z$ \, f" X# i7 u
  1042.   uint32_t i;
    " V. M" @8 |, L+ ~$ D& i* D' Y. j% L0 _
  1043.   uint8_t *pdata = pData;
      M  j# E! Z  P4 `4 g. Z9 B& M
  1044. & C7 H- M5 n8 j7 ?' C: }. C- i2 Q
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1)2 e7 l0 U7 Y" R, @0 M# `- D, |3 |/ e
  1046.   uint32_t  Xaddress;1 C2 P2 d2 ?# f
  1047.   for(i = 0; i < Height; i++)9 [1 L" v2 B. y5 ^9 p8 }
  1048.   {
    3 S% p3 @% z: I/ e2 f: H7 d
  1049.     /* Get the line address */4 B" y9 T, C% j  ~( w- w& e
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));) e- J: J  @! \: p6 K7 }  w

  1051. * u! @9 z8 w- p6 F% y/ c- q& x
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)
    1 y0 @5 n6 r1 R' F
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);
    : C- h/ ?, [* b9 |8 F% X8 C* G" D
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */* D, R3 A% m8 {$ [

  1055. ( t) E3 d( V6 a2 p' _
  1056.     /* Write line */) Y; f) m% Y; n0 i% a  b
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    3 _9 @9 q* V# e  W/ e- _
  1058.     {
    ' S- ?1 J+ S7 b5 V
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);) b$ w3 y, n3 U" o6 w
  1060.     }
    7 A/ q1 t8 A4 I& \3 ?" ]4 ]7 n+ E
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)5 E0 h4 o* Q# h& f  S2 Q1 X% b
  1062.     {! t2 M! L. J4 y3 w; P0 b
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);
    ( ?/ ~7 A) k; I6 U8 y# k( z
  1064.     }* ]: V8 t- `$ T; y& h" X
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)
    $ O; V6 o4 s" b# Y4 J
  1066.     {
    9 P0 k! ]8 N+ g$ k! K
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);# v/ I* U* j; B8 N, }! d
  1068.     }* @* a+ r* M/ K
  1069.     else
    : }; y9 V1 r: k
  1070.     {
    ; _4 G2 S- M2 g3 X* b& R7 @5 F, U3 M
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);
    + a8 O8 V$ Y3 r$ B1 ~4 ?# _
  1072.     }: F: R6 u9 U/ ^1 _0 i* j
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;8 ]* p9 U8 b. X+ I) z
  1074.   }3 n; |! f# [: J# p) d/ p+ w
  1075. #else. X5 O. p' G" \% a6 ]- R3 w3 k
  1076.   uint32_t color;) W4 B- Y0 ~: i. ^
  1077.   uint32_t j;* g/ r$ z6 {1 y$ M
  1078.   for(i = 0; i < Height; i++)! r: v+ t& u9 O% l/ k
  1079.   {1 j) P! P) [* f- a5 Q  V" r# ?
  1080.     for(j = 0; j < Width; j++)2 I( |2 v9 j, e8 f9 P/ B/ P- ^0 a
  1081.     {
    / y6 o& P" m- m+ {, \5 {2 ~/ T0 _
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));
      j' h% g5 [, B' x7 Y& T
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);2 @; M, j/ x8 `9 `. y& H* E
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    5 @3 _1 e( C% R$ C1 }, D, O8 d
  1085.     }
    " a6 i, X- ?6 }1 s7 u
  1086.   }7 r. h/ y4 {, U
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */
    4 G# O8 R/ v  i$ i, k* n

  1088. 8 D1 g% l2 W) i! ]
  1089.   return BSP_ERROR_NONE;. i/ v( t6 a' W* E, l/ q
  1090. }: A+ t7 J3 K9 Q$ ]' H8 z$ T. s' K7 B
  1091. / D% X8 A2 Z. C
  1092. /**
    # B7 t  X. S  ]( u4 t# \
  1093.   * @brief  Draws an horizontal line in currently active layer.6 O7 @! A* i/ B2 a
  1094.   * @param  Instance   LCD Instance
    - G8 j- z8 b4 i* h2 x
  1095.   * @param  Xpos  X position
    1 d9 N3 X, g" r' o8 u0 ]7 `
  1096.   * @param  Ypos  Y position1 }4 n7 q! ^0 w# l+ R
  1097.   * @param  Length  Line length$ f3 K4 Y) K. S5 J
  1098.   * @param  Color RGB color; C* l! E! o1 N! }8 C: H3 b. D
  1099.   * @retval BSP status
    / U7 s* _$ V! ?2 l
  1100.   */
    ; p. }" P) ^! _  n6 T% D  Y7 w
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)9 n( N$ v% {1 d! e0 A- X
  1102. {
    ( K, W& J2 N" `- I
  1103.   uint32_t  Xaddress;
    ) e( v( u2 P+ q" d$ U+ \
  1104. ; Q# I4 r8 G1 ]
  1105.   /* Get the line address */
    / z8 n  T0 |  `
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));% x; p" s3 V6 j& W" Q+ }9 x
  1107. , ^1 J2 R; D6 B. ^9 W
  1108.   /* Write line */0 F6 Y0 n! {- ]& _' i+ F2 C
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);) L  e) V9 p* b
  1110. * `, ~' ]  m( I! z/ f4 s
  1111.   return BSP_ERROR_NONE;$ u6 Y* Y$ q8 n& z0 q2 D$ K; X
  1112. }, O- R; N1 A9 ]

  1113. ; D) A8 b- q- V# F2 o
  1114. /**
    ) `2 G  f, {; b# T: a6 i
  1115.   * @brief  Draws a vertical line in currently active layer.
    5 z) |+ q, w& y3 M: X1 S9 b
  1116.   * @param  Instance   LCD Instance
    " M+ T) P6 i0 b8 j
  1117.   * @param  Xpos  X position
    0 g& g+ z7 t. K
  1118.   * @param  Ypos  Y position
    & K* H+ g3 C0 H4 \0 f) T8 e  ~% Q
  1119.   * @param  Length  Line length
    ; C9 i7 s3 m5 g4 g
  1120.   * @param  Color RGB color
    8 o/ i' g5 L! I% o  q
  1121.   * @retval BSP status3 ?( u) B0 X7 B$ s5 V# F7 c- i
  1122.   */
    1 C- K& a  S" k# _: X' j7 l. P
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)$ t( n3 S/ b( t
  1124. {) c5 l( T, @; Q9 S- k" H
  1125.   uint32_t  Xaddress;8 A0 A3 m$ o- W7 C
  1126. ) Q; z; q( e8 g6 U+ P8 T
  1127.   /* Get the line address */
    . Z, T- D% @) B1 a/ s2 |
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));. M+ Z; i! v0 O9 @! v; n, L( Q

  1129. * [+ Q2 ^& ~5 p8 y( W
  1130.   /* Write line */
    . {& q9 T6 J2 k
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);* j) a3 Z! m/ t( v% z
  1132. * A  p* p! p' F
  1133.   return BSP_ERROR_NONE;& Z! e7 G' N9 {8 J( T- }
  1134. }! Y; {' n: p" K
  1135. 3 q$ x* e! o" W$ F
  1136. /**/ h5 R/ Q9 o' A: \2 l/ v
  1137.   * @brief  Draws a full rectangle in currently active layer.
    ' s' Q% V( h" k* \2 M9 n
  1138.   * @param  Instance   LCD Instance
    ; O; Q/ N/ B6 C2 X$ ?# u: {
  1139.   * @param  Xpos X position' `# L% `2 s" x
  1140.   * @param  Ypos Y position! n/ h+ x* \; Y/ L
  1141.   * @param  Width Rectangle width/ G6 \4 D4 q  L- U0 @2 h. o
  1142.   * @param  Height Rectangle height
    ! h. F# o* g+ C" f
  1143.   * @param  Color RGB color
    9 B* s8 F7 }/ k1 ^# F! k7 x. k
  1144.   * @retval BSP status. G" y6 h" k: M
  1145.   */* u' n" L) u7 b. s0 i- l
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)
    ) f, w! P$ P/ @* R1 D  }
  1147. {
    " P' T; f% O) }) p9 N2 m8 w8 r! ~
  1148.   uint32_t  Xaddress;
    4 e+ r2 e0 J: z" i
  1149. 4 l1 w/ Y6 h% ?5 Y* e# m
  1150.   /* Get the rectangle start address */3 o7 m. i% U. R6 b% L8 r* ?
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));, P4 W( T: _/ `7 {

  1152. 0 ]" p! `8 m- f2 X+ T' Z
  1153.   /* Fill the rectangle */
    ' l  A$ @- t: C6 v" K' I
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);* H4 y# l4 f) u+ @. v: Y! O
  1155. : n  E( _5 U. S) S* Q" p
  1156.   return BSP_ERROR_NONE;5 k3 n' a/ p, q5 f7 U( |
  1157. }
    5 l/ J5 X+ y* e9 R5 h/ H2 k
  1158. 3 p: J% B1 x+ Y- |! I
  1159. /**; D' j: R% d+ w
  1160.   * @brief  Reads a LCD pixel.3 p' m0 ]0 i* q% C
  1161.   * @param  Instance    LCD Instance9 `  K& N. a) l$ l- q  S
  1162.   * @param  Xpos X position, f8 Z% a& B/ L3 u( W
  1163.   * @param  Ypos Y position
    " Y9 b1 ]/ G0 p" X6 |: d
  1164.   * @param  Color RGB pixel color1 o) @$ r6 p/ X* X: J* N* A9 m' ^
  1165.   * @retval BSP status
    7 d+ Q, J- p2 |: ?' o
  1166.   */
    . V$ A" M( U7 g0 L3 J- A, x# W
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
    3 F8 W. {8 T: A
  1168. {
    + R. Q; C0 M! p
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    ! R" z# @$ B, l/ u/ }* ^
  1170.   {0 q, N( P1 r" U' C& [
  1171.     /* Read data value from RAM memory */# T# J8 h8 r  }. ]5 S
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    4 }- [( x% R4 [! r7 c
  1173.   }, ~/ G4 E) j- f: R
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)( ]" m* P: i9 [7 [8 V$ O) m
  1175.   {) l" T, [0 A2 G& e, A( _7 j
  1176.     /* Read data value from RAM memory */. W! t: @7 _2 V/ l4 F$ `8 r' m* ?# o
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    / l. E) d) ~+ Q6 h, `
  1178.     *Color = CONVERTARGB88882RGB888(*Color);/ D' l: b1 g0 c% ~) s" x" k0 M8 V
  1179.   }
    0 }# R4 P" t9 O, i; B- ]
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    : l- H  U) z3 r+ x" h: b; `
  1181.   {
    ! _2 F, x+ p% O8 K7 u
  1182.     /* Read data value from RAM memory */$ Y/ G1 Y/ G9 A" E
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));" {% [2 h- T& u7 k1 m3 W
  1184.   }( f2 n% T9 L( U& x
  1185. 9 |8 _) e# j  p
  1186.   return BSP_ERROR_NONE;# z) _% E) ~& N) o( v$ e
  1187. }
    9 {( k' Y% e6 H% V$ N+ I  G' \
  1188. 8 |- V9 h5 I' E
  1189. /**
    2 S& \% g! b1 P3 i# P9 [
  1190.   * @brief  Draws a pixel on LCD.
    4 ?* A: F7 _8 E$ H2 r9 Q
  1191.   * @param  Instance    LCD Instance+ a5 _4 m7 r% u% b3 W1 I1 J* z6 s
  1192.   * @param  Xpos X position; l8 N; E  D; L$ k, o: U
  1193.   * @param  Ypos Y position% ^" P' R1 t* P% g  g) U
  1194.   * @param  Color Pixel color( f) F5 H/ ^! v& K
  1195.   * @retval BSP status! m' `: m, @5 Y- m4 T! m9 K+ J
  1196.   */
    6 H) V; T  w3 Y- @0 o
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)' n# d0 u3 {3 @& p, b6 T
  1198. {1 n9 P+ Q0 f! \' N  L( ~
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)4 H, u7 D7 ]+ n3 L$ s0 [& b! m1 V
  1200.   {" I9 m. S( m$ L
  1201.     /* Write data value to RAM memory */' n- H( e' v( U4 o! k0 ~3 q- o. }
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;
    9 G# x6 |: o5 X
  1203.   }: H+ v6 h, r  Q
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    : d' C6 {3 n: b1 F$ x
  1205.   {
    - z$ i; _. Z. n( p
  1206.     /* Write data value to RAM memory */2 I) f! i, G1 h' @: S+ b! ~
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);
    : g  X$ t/ r2 p" L
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);
    6 H- p2 E$ V* l7 n8 t% }# m
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);+ g+ Q3 P: L, \5 P# X2 z0 J
  1210.   }
    5 ~: A* ^* }4 }, q2 _  T
  1211.   else( q" G7 r0 K+ c9 S; [! N5 ]1 v
  1212.   {' c  P! \3 g! n# L3 r' N9 c
  1213.     /* Write data value to RAM memory */
    4 c# M6 {  ]* l0 Z4 V1 M
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;
    8 t( @) @9 N$ s& w% P1 B& C! s
  1215.   }
    % H+ h" L  x4 n, Z
  1216. ( N) ?9 V. ^2 j; D
  1217.   return BSP_ERROR_NONE;5 @- c' O+ j* A; ]
  1218. }6 S4 c! a* Y+ P" w0 J" D7 G4 k
  1219. ' z+ y- u; O4 r6 K8 c; L
  1220. /**
    ) T! z; T6 n+ G; `( o6 H
  1221.   * @}
    : \4 f4 d* _7 g$ \! }+ ?
  1222.   */0 X+ w5 t. O* T- p
  1223. ( |6 @! o$ z; P5 v7 _
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions/ q/ P6 {+ k# u/ B! J$ [
  1225.   * @{
    ! Q9 k: S* I" o% o. T, m
  1226.   */
    6 l  G2 o) n5 e. o  ~
  1227. /*** D1 t# o. w+ J+ m
  1228.   * @brief  Fills a buffer.
    4 t6 F5 P: {% g" ~
  1229.   * @param  Instance LCD Instance: X3 [4 w% @5 Z; U
  1230.   * @param  pDst Pointer to destination buffer' l  g* v8 W: w: D8 V% W5 A
  1231.   * @param  xSize Buffer width
    & P1 I  v& j# u) z
  1232.   * @param  ySize Buffer height
    9 c+ Z6 t: u7 Z" y3 N$ ^
  1233.   * @param  OffLine Offset) E9 }3 Y; j( j9 r8 Y. y" k
  1234.   * @param  Color RGB color: Y. o, y3 x$ |- |* Y7 |* _6 u
  1235.   */2 \  @& T! k4 D5 j% u/ F  z
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    ' A: i% _9 s/ j0 j3 }5 ~  W
  1237. {0 e8 ~5 Y$ K/ k/ U
  1238.   uint32_t output_color_mode;
    * A, _) V8 s1 p; f1 t
  1239.   uint32_t input_color = Color;
    # ^- z0 Y( f6 `, P, L

  1240. - H; w4 c" D6 Q6 v* B! y' Q" t
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)* E% a4 N9 [$ O8 O
  1242.   {
    ! w( a& D- w1 T4 B& Z. k, Y8 \
  1243.   case LCD_PIXEL_FORMAT_RGB565:
    ' v/ n. g5 T& Z$ ]2 P! k! ?
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    & I, [& l+ N) I) e
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);/ W) r/ u& L7 X+ D# E/ C+ c
  1246.     break;
    * c8 B0 H. K/ u7 ^* F
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:+ p- D- }" X: c0 r" o% W% t
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */  B5 k9 D4 o. s
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);6 t6 N. y% Y2 y, G1 Z
  1250.     break;2 b, X* b) N/ N/ j' Y7 j, P
  1251.   case LCD_PIXEL_FORMAT_RGB888:
    ; a2 S6 ^1 M6 [- X. O  Q6 \
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */* D4 @, o  Z" p
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);% U$ D$ I/ P& x6 Z, U
  1254.     break;: K0 J' O# @7 O$ C0 `4 |: m$ u
  1255.   default:
    ( h. S- e: F- b1 a9 ^  S; U
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    + W) H; x! h: `# b! g
  1257.     break;$ a# I  I6 N3 i0 z
  1258.   }
    3 w# Z) \( X* Y- K4 X, U
  1259. : [/ ?) ?4 l- B: R- r) s
  1260.   /* Register to memory mode with ARGB8888 as color Mode */, J9 {! r; ^. A9 k% H7 x) u
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;. |& R) |* p# V: v6 i5 ~* w
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    ! L& p. E2 s) @! n/ @7 T
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;
    , d$ ?( ~5 v, `0 \

  1264. 3 w5 A$ R; ^' ]9 u$ g; {
  1265.   hlcd_dma2d.Instance = DMA2D;7 v' s+ y; n% a4 r# ]5 o
  1266. $ y. C( g8 A, r" |
  1267.   /* DMA2D Initialization */
    ; ~% c! ^$ A! @
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)7 H; V: ~) W2 z8 i) Z3 U
  1269.   {
      F, X# ~! J) a/ x/ k; R2 f
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)  Z) g! e: j4 G9 H$ `  ?1 D
  1271.     {
    9 p  l3 T3 K3 q# {7 J
  1272.       /* Polling For DMA transfer */
    " ?$ W) D& }  k9 d. O- y% f. ^% w! y
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    : M6 n$ N7 O' g9 V: \
  1274.     }2 K+ d% [1 D6 \/ @
  1275.   }; D6 A. r% b- o) @% r. M
  1276. }. T" W0 t5 g8 _8 @; J7 N$ \0 l( ~
  1277. ' L- w0 B( e+ D
  1278. /**
    . E# k( t- l0 Q0 R
  1279.   * @brief  Converts a line to an RGB pixel format.# G* \2 V1 A1 z, Z' m! k
  1280.   * @param  Instance LCD Instance. y/ i* N9 F/ [/ K" Z8 S( J
  1281.   * @param  pSrc Pointer to source buffer: d7 q! P7 k  g
  1282.   * @param  pDst Output color
      A% m, ~! \( w& m0 b3 n
  1283.   * @param  xSize Buffer width* c- q+ y7 R; F6 s5 q
  1284.   * @param  ColorMode Input color mode
    + ], O# [. b9 @7 B* S; N9 r
  1285.   */! Z& ]1 |+ @8 @0 n+ p7 U
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)( u8 Z& k: E7 g' i* \
  1287. {0 B5 l3 Y- z: \4 z: X+ Q6 X" X  ^6 u
  1288.   uint32_t output_color_mode;* A3 u; F/ ]  s5 l% Q9 r1 m

  1289. * N% q) K# G  R% `& X& O
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)
      H& d8 W1 }: I, i! h7 x
  1291.   {" J' _! \' y1 T; Y# h! L2 H
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    5 _2 a0 x/ `- |, m9 @
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 *// P- E$ I2 ~3 x0 n9 Z! D
  1294.     break;
    4 W  S+ {+ J1 X5 K
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:
    ! S' }. Z( W8 N( P( a; W# a# C
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */0 o; }& v2 `! u  g
  1297.     break;
    7 @2 G1 ?* ~4 S4 |1 x5 Z8 l9 i
  1298.   case LCD_PIXEL_FORMAT_RGB888:( a( I! [% X* ~& f9 d
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */. m4 i# M2 E; \
  1300.     break;
    9 @$ \7 e1 v1 W6 I8 D) o* h% z
  1301.   default:  Z+ d9 X4 J7 h% b/ {
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    ) e$ e" `# X7 y  E) F
  1303.     break;
    " B  [- w* E: }7 L% [" A$ i
  1304.   }7 X+ a" C$ n0 c; m
  1305. 9 H. Z# z9 M: t; ~. K, O( L
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    . V+ P% ^6 @1 ^
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;
    + L+ g) D1 q( }. h7 a' l$ a; g
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;0 y) I& ], l4 K( G/ e
  1309.   hlcd_dma2d.Init.OutputOffset = 0;) p+ G7 q- D! Z4 s1 O5 Q9 ~$ K
  1310. 6 B) R! i% `  D- t0 u2 w
  1311.   /* Foreground Configuration */: G+ s* G7 f. ^9 `. _# [! f$ J7 ~
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;# x6 e' G1 [2 K" g6 m9 w& a8 g+ |
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;  ~8 q, @/ g/ r  J. }
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;5 c$ B: k4 r" `4 |! q
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;
    7 q+ |/ k  ]* s
  1316. 7 }2 S$ n" R# M9 e% }* L2 w$ V
  1317.   hlcd_dma2d.Instance = DMA2D;0 v7 V% L4 @" n1 m! ^, w: w

  1318. 9 C- r+ m) d3 M0 m( }. T
  1319.   /* DMA2D Initialization */
    1 f& W$ S. t! C0 e
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    ) D/ R% [  G/ \6 \3 @% i* D7 |
  1321.   {- n8 W' S0 q1 E4 z4 E
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)9 ?5 l  S, m# D' N0 d
  1323.     {9 h) Y) d' ~7 }
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    / x+ M' d9 D& y. N' g8 I4 D/ b) g
  1325.       {( L, |8 }( P3 i  C
  1326.         /* Polling For DMA transfer */5 k) R2 V* s2 F# k
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);1 y& |' H2 k* [7 }" p4 F
  1328.       }9 D5 l! s! y/ I' I" A6 {, L6 G
  1329.     }
    2 |5 l0 B: U) F- n: D7 z$ L0 P; h
  1330.   }7 Q9 H$ p: K) w& N
  1331. }
    . {) r! }5 N3 E2 j7 U. h  Q

  1332. / }4 v' d8 t+ b4 P0 o/ {+ n
  1333. /**2 a" p; c8 {4 e, g+ M- a
  1334.   * @brief  Initialize the BSP LTDC Msp.
    1 p+ H) G  h  E; d# V6 R
  1335.   * @param  hltdc  LTDC handle
    , J- V/ X# g# @3 E! |" r( U# k
  1336.   * @retval None2 q" u0 H; |9 P0 r
  1337.   */
    9 P/ h# o: y* @# n  ?
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
      t% h- S6 U3 ]$ ]6 R) A# l
  1339. {4 Y& L9 X0 q$ w6 C+ I6 F/ Q
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};' ?* Y0 U4 Q$ a: P

  1341. 1 \# f) c" _" p1 w6 U0 \
  1342.   if (hltdc->Instance == LTDC)* J6 K  ^$ {* r
  1343.   {
    1 [0 ^( B' a  V. q4 P
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();- }8 ~% _/ A, s
  1345. 1 A* [5 l6 ]0 `# u$ I/ [' Q
  1346.     __HAL_RCC_LTDC_FORCE_RESET();
    + a0 I( V' Q9 V! ^
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();+ j4 ~, D, ?8 ~9 s# C

  1348. 1 {$ L4 U' Z$ T
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */
      [* G: P! ^3 G# Y( P
  1350.     /* PG0  R0          */
    - \* I+ {0 n6 I* t/ h* S4 |
  1351.     /* PD9  R1          */- }+ ]$ a' h- V- I7 u) H8 J1 v1 u
  1352.     /* PD15 R2          */4 e9 ~# N# v& ?/ X% E) O5 I+ F  l) F
  1353.     /* PB4  R3          */ // JTAG
    7 d7 d5 h, `3 i5 |8 n% v* V1 A
  1354.     /* PH4  R4          */
    $ U  Z: x6 u: f5 ]! }1 o
  1355.     /* PA15 R5          */ // JTAG JTDI! S, i  t7 k, ?
  1356.     /* PG11 R6          */
    6 a8 R5 a  G% d$ K( D- a* v$ V
  1357.     /* PD8  R7          */
    - M7 b% q- w5 R
  1358.     /* PG12 G0          */
    8 u. q6 x) e6 b/ K- O+ ]" ?
  1359.     /* PG1  G1          */9 Q/ ~7 X1 b5 \8 [9 }% D
  1360.     /* PA1  G2          */  M. j/ Y  i) \% c  \# V
  1361.     /* PA0  G3          */
    1 l; X2 x6 t8 C8 m: U) n( ?
  1362.     /* PB15 G4          */" P8 ]+ o+ I- y: }  t7 t2 `  n
  1363.     /* PB12 G5          */
    ' n- Z( N* i; g( X9 Z; l
  1364.     /* PB11 G6          */
    + n8 T' T: K+ J% Q/ K
  1365.     /* PG8  G7          */. A2 C/ I1 _4 ]/ J
  1366.     /* P15  B0          */
    ! ?/ v" F/ G2 n, N
  1367.     /* PA7  B1          */" F3 ^6 z  x) F
  1368.     /* PB2  B2          */) N1 r6 o3 W+ f, Y
  1369.     /* PG6  B3          */* z4 f4 D* W* d+ w- R' U
  1370.     /* PH3  B4          */, v; c1 O8 y8 A) z/ E  w
  1371.     /* PH6  B5          */# `& j, x" N0 L8 b5 t
  1372.     /* PA8  B6          */; G* N7 B) S& T; a# [( w
  1373.     /* PA2  B7          */
    9 E8 @: J! f3 Y/ T
  1374.     /*                  */
    5 C. c3 B/ P9 Y! n; }; w
  1375.     /* PG13 LCD_DE      */
    3 C2 y. f- s6 [" W: X% @9 s
  1376.     /* PQ3  LCD_ONOFF   */
    ) f5 a  ~# U; _5 d
  1377.     /* PB14 LCD_HSYNC   */
    : Z3 a) \& X; c- v, H; t0 @5 [
  1378.     /* PE11 PCD_VSYNC   */
    ; Z- p! o4 `& B1 B8 l- p
  1379.     /* PB13 LCD_CLK     */
    0 n% S. k- D8 G6 r( _
  1380.     /* PQ4  LCD_INT     */! |% x& D5 M0 X& Q( y
  1381.     /* PQ6  LCD_BL_CTRL *// z: d. ^5 a9 s7 E1 i0 f7 o8 \
  1382.     /* PE1  NRST        */( T6 k. N/ S3 d3 Q* n& L* F

  1383. 3 i3 Z( T7 ]3 }7 y& f
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();
    - Q0 p, a% U+ B# b5 a
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();# Y& W& u' x1 m2 g$ O: g8 `
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();% \" m7 G8 e- Q
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();
    # j2 ~( R5 m  m
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();
    : L  N7 V" T) i* _- s
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();& v( m8 [: J3 |8 t; V
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();
    2 L5 C4 t& [; f, Q- R: w+ u
  1391. 5 T1 H4 D( D! O9 @1 r- W
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;6 u2 T* K2 ^1 E) [8 q8 |6 H
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;9 `8 M- G, y8 U8 {( P/ F' {
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;- V3 y- ]2 V3 o
  1395. 6 z# `4 ?* x) D% Y
  1396.     /* G3, G2, B7, B1, B6, R5 */. Q6 o+ `) a$ `
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;4 N* O# F4 z- {7 N* V3 g2 ~7 f' u1 [
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;) s3 }6 c4 Q( j2 E, Q# W
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);
    1 e6 d2 h8 {9 z
  1400. , B8 l& g6 f6 F" L7 E4 u3 D
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */
    9 H9 {4 p$ S4 M% e) Z  C$ a6 i9 O& P
  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;
      }4 N) v5 h. S  d( Z
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    ; i- J# w, p9 j
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);% j8 I# N0 h/ }6 S5 x8 k

  1405. 5 {/ h* k- B$ f, I) c
  1406.     /* R7, R1, R2 */
    % O+ T& }3 S$ G# W
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;
    1 r4 `! d3 u& y. p
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;4 Y; r4 t! h; d+ @& G( r
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);
    1 B" @  L. Q8 \" D

  1410. ; a* R/ o  D( q& O% ?
  1411.     /* LCD_VSYNC */3 z0 O' J' M; E' i
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;7 R  X3 t3 f! J% e- a9 z
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;; v4 H) F" I+ ?, L6 Z1 a. }) s  r) q# D
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    - q1 a1 ]+ J* {  \1 A5 [

  1415. - r1 n4 Q8 {/ m' P
  1416.     /* R0, G1, B3, G7, R6, G0 */
    . g+ Z0 H' e2 [( T/ Z& M
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;) h4 Z. A2 g+ _/ ~7 D% z7 Z6 p' S
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;: _1 W9 B6 @# e  P/ `7 k! W; S( ^
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);/ j6 l+ j  W+ \- E

  1420. $ u/ A) M0 }; z/ `- l: p% F# C: b# w
  1421.     /* B4, R4, B5 */; _3 D6 A7 p- {" C3 c, Q
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;$ `  J: m8 E3 B% t
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    ; B( C/ {  D/ d2 i) I
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);
    9 T! i. }; c4 ^3 H

  1425. * _# X5 v, s2 A; L4 W6 a
  1426.     /* NRST */) i. H: v2 U8 ]( I/ k$ _
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;
    $ K, i! f3 C3 T8 X/ n  W
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;2 ]8 W) t( b& `' K
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    0 M8 P0 v* \. k" u4 ]
  1430. - }9 U% s" P5 f+ x3 `5 n
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */
    ' Z( t7 `7 ~6 [7 ]' e8 ]
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;! I, P) n6 `% D
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    + d- f( k, C5 ], X- O4 K
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);
    0 H; a2 Q8 _2 w
  1435. 0 `: p2 v* l7 y5 a! B$ }2 a# H
  1436.     /* LCD_DE *// O. g/ f) [* C4 i5 y
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;
    & A' D5 W* e5 C1 I& p9 d
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;3 P$ D; e5 q/ j! g/ c
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    ! B% }8 T: K3 D) t. V# q5 N( L
  1440. / r" O  |1 _0 V, k. D2 J, F1 o3 R, R/ {
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */
    $ U: B  A0 w  N$ P/ ^
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */
    . Z, W) F2 P2 ?8 T
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */- _% O4 L3 q6 d% y7 {% x
  1444. 2 V" w' y; y4 L6 {* F" g
  1445.   }
    9 e& V/ n; u2 Y3 d/ V
  1446. }
    4 G. C; s1 P  y

  1447. 9 P" `: X: j: A+ d4 G
  1448. /**
    " f* T+ r2 K" M" p# }& a1 Z
  1449.   * @brief  De-Initializes the BSP LTDC Msp
    & K, ~! ?7 Z7 \) j" [
  1450.   * @param  hltdc  LTDC handle  X, ~; J  r  D* A; j
  1451.   * @retval None. D$ o. [. K) c' L
  1452.   */3 f6 }. K8 Z  [' V, M% ~
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)
    : m3 d3 d- Y. q7 ~) ]9 E
  1454. {
    & |# x$ G. z6 e/ H" x
  1455.   GPIO_InitTypeDef  gpio_init_structure;
      X. W2 n+ o6 k0 |( Y
  1456. $ d: n9 D6 O- }  ~4 f
  1457.   if(hltdc->Instance == LTDC)4 V: M1 h8 A+ Y3 j
  1458.   {8 `) d/ q7 [8 }! U+ ^
  1459.     /* LTDC Pins deactivation */" {/ F0 F  d7 C/ ^9 j( j- [9 E0 b' V
  1460.     /* GPIOA deactivation */
    7 W$ [6 Y0 i+ I1 M
  1461.     gpio_init_structure.Pin       = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_8|GPIO_PIN_11 |GPIO_PIN_12| GPIO_PIN_15 | GPIO_PIN_6 | GPIO_PIN_9|GPIO_PIN_10;
    $ k- l+ W( H$ b9 h# K! I3 B% N2 O
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);$ x/ N* T3 j% t' O+ _, v  e% C
  1463. 2 `  Z0 }0 `. ]- h# @  e
  1464.     /* GPIOB deactivation */
    ; d- t0 A& d2 Y1 S! }. R
  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;4 P9 t5 c8 {1 e
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);
    6 u6 }0 E" M2 P5 D  Q8 F- S, X

  1467. : R6 @5 D& ]/ ~: V7 t- \
  1468.     /* GPIOE deactivation */: Y9 P  b# b" U
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;
    - S( n9 Z2 p$ J6 ^0 r8 a
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);
    % Q% N( M" M# x6 u) M6 k1 V$ _
  1471. / J" d( ?; g" D" L6 r
  1472.     /* GPIOF deactivation */& G( |4 ~( B! U
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;# p0 @6 ]5 `" D0 x8 m) g
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);
    6 @3 B  U! @% l% u5 x
  1475. 4 n$ ^$ Y, d6 i: n  o0 v
  1476.     /* GPIOG deactivation */4 y' Z* ?5 l4 {0 a% ]0 U+ a7 |5 w
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;# K5 c( d  X5 U! H5 C; I" O4 `
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);+ k7 }) }% A  j/ X! f" b

  1479. ! O+ I% o0 ~( X5 v1 m
  1480.     /** Force and let in reset state LTDC */0 G5 f  {4 B2 s
  1481.     __HAL_RCC_LTDC_FORCE_RESET();" a+ J4 z# B1 I3 D: u* a* P

  1482. ( R. n+ K/ n" Q3 S
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();
    0 O, B  i  F# s/ M

  1484. ) {% v  ^! T5 M  E
  1485.     /** Disable the LTDC */
    + s) z  _" G" o& u
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();
    % J& w. \3 R# i2 h2 Q5 q8 S0 A
  1487.   }
    - i8 W( w/ G0 t1 _1 s2 o' |
  1488. }* G( T3 ^& c9 ~
  1489. * h* J% u5 Z, R
  1490. /**( n0 Y6 K* V+ a" M
  1491.   * @brief  Initialize the BSP DMA2D Msp.$ F) _+ j! V6 N3 P
  1492.   * @param  hdma2d  DMA2D handle: `& v. A- i% M9 K
  1493.   * @retval None$ F% F" P+ |2 ^* H
  1494.   */
    4 h3 Z1 f& ]; [& [: i
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)
    ! C/ ]+ {, M- _$ S3 O' G
  1496. {* T+ `% t, A* T" h- F
  1497.   if(hdma2d->Instance == DMA2D)  X! g% E) O0 v5 K
  1498.   {; l, `9 z3 f$ e0 {+ y- o5 S
  1499.     /** Enable the DMA2D clock */
    : h/ n  @2 a2 X8 x
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();
    ; q. q- H, L9 E; u1 \0 S

  1501.   F  K. w7 J. C! P: U
  1502.     /** Toggle Sw reset of DMA2D IP *// b: w" v, q7 g1 T! d% t0 L$ w
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();
    % P2 Z; @0 `9 W# x
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();
    ' F; L1 }, ^% G% s! T* }  T
  1505.   }
    / P. [$ g% p3 C' I5 b
  1506. }
      Y5 M4 e3 x  x0 z( q; N) y$ Q. R

  1507. % e" J* h% M5 p  d0 o
  1508. /**! p$ k) E0 V8 z" t/ i% G* n# S
  1509.   * @brief  De-Initializes the BSP DMA2D Msp. l% O/ S+ F6 {" X* ]2 \2 c
  1510.   * @param  hdma2d  DMA2D handle
    & Z( j; R: W+ \" j4 P$ u
  1511.   * @retval None
    2 g' ?7 A9 P4 f( |
  1512.   */
    ) Q2 G" u+ J2 W7 z3 h; K
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)
    0 c, v( i' ]9 `
  1514. {' j2 ~& _. f  S, s
  1515.   if(hdma2d->Instance == DMA2D)
    / b2 G* Y7 ^* ]/ @# @
  1516.   {
    6 W! ]0 H6 U" j+ E6 K* s
  1517.     /** Disable IRQ of DMA2D IP */
    ! S1 E1 \" {. Y& n6 M6 F, |1 s
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);5 W6 A( a; x( l- w

  1519. ; D' f) [0 S, W) ~
  1520.     /** Force and let in reset state DMA2D */- A. J- ?2 h. D+ _' b" {
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();
    5 F) c7 G8 n* ^  K
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();
    , \  D! q# F* K' b& G

  1523.   ^. K3 ~( M  R: ?* a
  1524.     /** Disable the DMA2D */! s# x. j" g2 w0 Q" P. X
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();# l9 }1 r, G, Q) e/ K6 h
  1526.   }0 `4 G) e+ A4 r& A$ B" o, P
  1527. }" K( ^+ m5 }' P3 i, u, t

  1528. % r7 P" [" `+ e8 Z* x7 |
  1529. /**, K2 V6 o6 |5 P9 G3 Z( I
  1530.   * @}
    7 D# v1 Q/ B6 X" Q+ j! F
  1531.   */
    1 H# F5 E0 C7 E/ i# ?8 }" r- k

  1532. * u* e2 j5 }6 Z) ]$ Q5 D1 s- E
  1533. /**
    + e' q( r& o4 j% r
  1534.   * @}; M' O, n5 b0 q/ J
  1535.   */5 Y& B8 A6 ?& W3 O& @  Y
  1536. + P% S% }, D6 P9 V
  1537. /**' {5 ^0 v% g; N6 ^3 u& ?5 h
  1538.   * @}
    , H- U' j% o5 w1 \! k- B2 j$ _- N' u
  1539.   */
    : A2 l8 J1 v; y5 X, X: [" a( @

  1540. + U  x) {- k% c% r5 G" T
  1541. /**
    1 [; e) y2 d# T
  1542.   * @}: ?1 ?& e' o/ T+ m7 X/ I1 }8 O& X
  1543.   */
    5 O/ N, W; {  \6 o1 j0 Z

  1544. - t0 j* J- d' f9 W9 f  N' ~7 ^6 p8 J
复制代码
. u/ q0 x$ M1 ^1 i
2 {- k4 N! _% P+ l2 c
2.2、main.c
  Q! m$ m) j' D5 _! ^3 X9 C
  1. int main(void)) i% o3 i, t0 E" S% Y5 d4 U
  2. {# B! ]+ p" ~/ t6 _
  3.   uint32_t x_size;
    , l% I* x& H- O" `
  4.   uint32_t y_size;
    - g! Q! S2 o# B0 t# F" l9 ?
  5.   uint16_t i,j;
    8 S1 \. P+ y2 k. d: O7 D  w

  6. 9 Y1 C3 k0 f/ I) K/ ?
  7.   HAL_Init();
    1 Z4 O7 H, i$ J/ _8 g3 K2 ^
  8.   SystemClock_Config();
    ' m, z3 Y9 x1 X  D4 S
  9.   
    ) p. O( R/ Q8 ~
  10.   /* Update the RIF config for the used peripherals */- @) N2 a7 A! B/ S8 g/ j' G7 J& o
  11.   RIMC_MasterConfig_t RIMC_master = {0};+ g+ ~4 Y6 R4 @
  12.   RIMC_master.MasterCID = RIF_CID_1;
    " Y* M3 j$ [; D2 {8 t2 C8 K3 [
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;
    " V+ @7 m/ v8 w. y
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);# C: l" H2 U3 D% B
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);1 i$ U( ~1 f4 b* b( x- `" d8 l
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);& P/ c  ^/ }% v. B
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);
    / I9 g. r/ z6 u1 q& {7 r! o0 b
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);" K5 G$ Y5 T+ j) r/ q  j
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    ( ^$ R( I, k3 g/ C. o; M; w+ u
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    8 ]: ?+ `+ X/ N. V3 G
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);( M* p$ q. N! b2 \' |6 X$ Y- @" L) l
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    3 c$ [- Z- W, M( l$ }2 E) g* ~
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);* g- b1 ~+ m# ^$ F+ I0 K3 q+ b* L
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);, G/ Z9 W# W' H: J
  25. , ^; C6 e$ f( I. z" M% B( T1 h/ a
  26.   BSP_LED_Init(LED_GREEN);) ]! Z9 s/ v& O  I- H: i9 p
  27.   BSP_LED_Init(LED_RED);
    3 B" j9 |- o1 q9 \7 ?
  28.   
    & c0 m# B- R8 ^- Z; \% q: g- s
  29.   #if USE_COM_LOG5 q% t" e( X2 b. t
  30.   COM_InitTypeDef COM_Init;4 @- ]( [% O, m4 n2 `( v. W" W5 j

  31. 2 a4 O4 E5 w# t. G0 N) F% A/ h
  32.   /* Initialize COM init structure */
    5 O' G$ w3 a1 D! A$ F
  33.   COM_Init.BaudRate   = 115200;
    ! y4 I7 Q3 J' Q5 X
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;5 p+ h  f$ o. }
  35.   COM_Init.StopBits   = COM_STOPBITS_1;
    2 R4 ^; v/ _8 G
  36.   COM_Init.Parity     = COM_PARITY_NONE;  e  f; {9 L) H
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;9 b! r) [' y8 s- m- G/ g

  38. : D0 P4 U: i' r" ]2 c
  39.   BSP_COM_Init(COM1, &COM_Init);/ y4 h! p; C4 |& H0 Y- Y1 h
  40. + E# b: F2 Y* w+ W+ ^
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)9 B# A3 J" c. `( \5 T( Y
  42.   {
    8 q4 u6 @+ Q# i
  43.     Error_Handler();: D  j( p2 w' ~6 s6 v
  44.   }
    & C6 ?! r- I$ A4 D* _. t6 o3 ^
  45. #endif
    7 [8 |; A1 Y: T# \1 |
  46.   
    7 x3 N- P' G7 ]8 d' L) m- t3 G; R
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
    $ |# {8 i/ _4 k, A7 {
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    % }% \  E4 {% d0 \( C
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    , K" c, f6 R+ G+ L  G/ l: x; F
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);$ z2 W7 ^" y/ J' r! \5 ?2 l
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);
      O3 _! g# {( J/ a) O; i6 Y
  52.   UTIL_LCD_SetFont(&Font24);3 ^! `( ?# u+ q0 B! j4 F% ?
  53.   3 K# w7 J' ?8 }5 e
  54.   while (1)
    1 f0 b; }- G' @* h& I  T8 A
  55.   {
    " j7 x' o' f# V  @8 l" B0 n
  56.     switch (i)
    * N( f' ?7 C; o4 e
  57.     {
    8 l1 l" [; D' b4 ^: r) F
  58.       case 0:, K- p0 {% {0 L: p
  59.       {7 T" Q; x# w7 \
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);; |# H; {2 j; h3 L9 [8 q+ }# y: r
  61.           break;6 E- r" \8 ]/ b( k# Y- @, @1 J
  62.       }
    & I. _5 M% z. W3 X7 s- z5 E1 K' A
  63.       case 1:2 l% ?" ]0 @' y" t/ B
  64.       {' E& ^8 M# i( B; J# P% U1 u
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);; U2 E5 `0 x: o3 }7 Z: p: N+ Y
  66.           break;6 |3 L: }) I' n2 D5 d
  67.       }& v! z; z6 n6 ^' f' |
  68.       case 2:
    4 c1 V1 |3 o% w3 M) D+ x+ c5 E
  69.       {
    : l; E0 W7 B8 y+ E
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    . Y/ }! L9 W* u
  71.           break;7 N5 a8 U, b' B0 C6 [
  72.       }" T: n& n/ m( Z8 J( \- o6 N7 a- ]
  73.       case 3:
    - i9 k" H9 w) e9 S' [/ Y) H
  74.       {
    6 P/ _6 S7 r5 ?$ _
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);  c6 L6 @& [4 Q) [+ h, I
  76.           break;
    2 j* G- x# X3 h
  77.       }' v( p5 @. N4 B( s  i4 F5 b- j2 G
  78.       case 4:
    , B) F: O' c7 b
  79.       {; r1 g; y2 y) G2 Q: A. D) J, w  `
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);
    + C0 z6 _; `2 y' q
  81.           break;
    # K( X$ B4 O# l# U/ ~6 l9 j8 J6 s
  82.       }
    , d7 R& e1 y4 `* ?! G
  83.       case 5:# W5 `+ j( H4 P0 E) C2 l
  84.       {
    : o) T" P+ f4 D' L, m
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);
    3 L/ E2 j! E, c0 ]% p0 b; o9 ^* \
  86.           break;' d% U/ B" {6 K- E8 r8 a
  87.       }
    . B" S$ j7 `$ _! z: v' D. q: ]
  88.     }
    7 e  c- B+ ^8 |: m: S9 V) r$ w
  89.       f# Q4 U' C  c: {8 v! \5 s, D  [
  90.     if(i==6)' N: v& A9 N& f5 y
  91.     {
    - w$ ?- X! O+ i8 ?' i+ Z2 l/ K
  92.       i=0;
    4 o0 e. z0 w9 {8 G3 P
  93.     }
    1 c! b  [8 `+ ^3 r8 X7 n
  94.     else
    6 d' U4 t- a4 H1 o8 b+ X* }
  95.     {
    ) x$ b) @5 I3 R% h/ `( h5 j. o
  96.       i++;! `( q8 f. w, z( b" T) c6 [, q, f) C
  97.     }
    " d7 J7 b, ]$ O# @8 y( r/ r+ V
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);
    - z* \" l: [+ A3 @
  99.     BSP_LED_On(LED1);
    7 i6 x6 N- T+ G7 U# g% ]! @
  100.     HAL_Delay(500);
    " ^9 u6 R+ ]# ]* E8 U( M* E+ x
  101.     BSP_LED_Off(LED1);* \+ ^+ @/ c' z4 [( u& F" ~9 I
  102.     HAL_Delay(500);
    , u* s: c( {. u: B
  103.   }6 a6 G' I) p4 Y) V# {9 G
  104. }
复制代码
1 u  `$ l# P) z" Z

8 G1 Y% O; Y/ R( ?6 p% c( z1 D" M8 ^* p% j1 ~9 N
* o! H) G( G. R$ G  \! ^  }  l
三、结果
) ~0 k1 N9 K0 v+ s! v: ]2 H4 p) x

9 w' b: e& D2 q/ ~下载程序到开发板,运行开发板屏幕显示如下:
' Q" K( w/ A6 S lcd.gif " Y( G# X8 h7 w) a/ }
0 F1 e; @$ N. x6 S0 F" f# U
- d, L. }$ F3 D  o* N
: V" b  s9 [' l- n. B

4 u; v5 N3 h& M/ d* j
赞 收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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