1 /**
2   ******************************************************************************
3   * @file    stm32l4xx_hal_dsi.c
4   * @author  MCD Application Team
5   * @brief   DSI HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the DSI peripheral:
8   *           + Initialization and de-initialization functions
9   *           + IO operation functions
10   *           + Peripheral Control functions
11   *           + Peripheral State and Errors functions
12   @verbatim
13   ==============================================================================
14                         ##### How to use this driver #####
15   ==============================================================================
16   [..]
17     The DSI HAL driver can be used as follows:
18 
19     (#) Declare a DSI_HandleTypeDef handle structure, for example: DSI_HandleTypeDef  hdsi;
20 
21     (#) Initialize the DSI low level resources by implementing the HAL_DSI_MspInit() API:
22         (##) Enable the DSI interface clock
23         (##) NVIC configuration if you need to use interrupt process
24             (+++) Configure the DSI interrupt priority
25             (+++) Enable the NVIC DSI IRQ Channel
26 
27     (#) Initialize the DSI Host peripheral, the required PLL parameters, number of lances and
28         TX Escape clock divider by calling the HAL_DSI_Init() API which calls HAL_DSI_MspInit().
29 
30     *** Configuration ***
31     =========================
32     [..]
33     (#) Use HAL_DSI_ConfigAdaptedCommandMode() function to configure the DSI host in adapted
34         command mode.
35 
36     (#) When operating in video mode , use HAL_DSI_ConfigVideoMode() to configure the DSI host.
37 
38     (#) Function HAL_DSI_ConfigCommand() is used to configure the DSI commands behavior in low power mode.
39 
40     (#) To configure the DSI PHY timings parameters, use function HAL_DSI_ConfigPhyTimer().
41 
42     (#) The DSI Host can be started/stopped using respectively functions HAL_DSI_Start() and HAL_DSI_Stop().
43         Functions HAL_DSI_ShortWrite(), HAL_DSI_LongWrite() and HAL_DSI_Read() allows respectively
44         to write DSI short packets, long packets and to read DSI packets.
45 
46     (#) The DSI Host Offers two Low power modes :
47         (++) Low Power Mode on data lanes only: Only DSI data lanes are shut down.
48             It is possible to enter/exit from this mode using respectively functions HAL_DSI_EnterULPMData()
49             and HAL_DSI_ExitULPMData()
50 
51         (++) Low Power Mode on data and clock lanes : All DSI lanes are shut down including data and clock lanes.
52             It is possible to enter/exit from this mode using respectively functions HAL_DSI_EnterULPM()
53             and HAL_DSI_ExitULPM()
54 
55     (#) To control DSI state you can use the following function: HAL_DSI_GetState()
56 
57     *** Error management ***
58     ========================
59     [..]
60     (#) User can select the DSI errors to be reported/monitored using function HAL_DSI_ConfigErrorMonitor()
61         When an error occurs, the callback HAL_DSI_ErrorCallback() is asserted and then user can retrieve
62         the error code by calling function HAL_DSI_GetError()
63 
64     *** DSI HAL driver macros list ***
65     =============================================
66     [..]
67        Below the list of most used macros in DSI HAL driver.
68 
69       (+) __HAL_DSI_ENABLE: Enable the DSI Host.
70       (+) __HAL_DSI_DISABLE: Disable the DSI Host.
71       (+) __HAL_DSI_WRAPPER_ENABLE: Enables the DSI wrapper.
72       (+) __HAL_DSI_WRAPPER_DISABLE: Disable the DSI wrapper.
73       (+) __HAL_DSI_PLL_ENABLE: Enables the DSI PLL.
74       (+) __HAL_DSI_PLL_DISABLE: Disables the DSI PLL.
75       (+) __HAL_DSI_REG_ENABLE: Enables the DSI regulator.
76       (+) __HAL_DSI_REG_DISABLE: Disables the DSI regulator.
77       (+) __HAL_DSI_GET_FLAG: Get the DSI pending flags.
78       (+) __HAL_DSI_CLEAR_FLAG: Clears the DSI pending flags.
79       (+) __HAL_DSI_ENABLE_IT: Enables the specified DSI interrupts.
80       (+) __HAL_DSI_DISABLE_IT: Disables the specified DSI interrupts.
81       (+) __HAL_DSI_GET_IT_SOURCE: Checks whether the specified DSI interrupt source is enabled or not.
82 
83     [..]
84       (@) You can refer to the DSI HAL driver header file for more useful macros
85 
86     *** Callback registration ***
87     =============================================
88     [..]
89     The compilation define  USE_HAL_DSI_REGISTER_CALLBACKS when set to 1
90     allows the user to configure dynamically the driver callbacks.
91     Use Function HAL_DSI_RegisterCallback() to register a callback.
92 
93     [..]
94     Function HAL_DSI_RegisterCallback() allows to register following callbacks:
95       (+) TearingEffectCallback : DSI Tearing Effect Callback.
96       (+) EndOfRefreshCallback  : DSI End Of Refresh Callback.
97       (+) ErrorCallback         : DSI Error Callback
98       (+) MspInitCallback       : DSI MspInit.
99       (+) MspDeInitCallback     : DSI MspDeInit.
100     [..]
101     This function takes as parameters the HAL peripheral handle, the callback ID
102     and a pointer to the user callback function.
103 
104     [..]
105     Use function HAL_DSI_UnRegisterCallback() to reset a callback to the default
106     weak function.
107     HAL_DSI_UnRegisterCallback takes as parameters the HAL peripheral handle,
108     and the callback ID.
109     [..]
110     This function allows to reset following callbacks:
111       (+) TearingEffectCallback : DSI Tearing Effect Callback.
112       (+) EndOfRefreshCallback  : DSI End Of Refresh Callback.
113       (+) ErrorCallback         : DSI Error Callback
114       (+) MspInitCallback       : DSI MspInit.
115       (+) MspDeInitCallback     : DSI MspDeInit.
116 
117     [..]
118     By default, after the HAL_DSI_Init and when the state is HAL_DSI_STATE_RESET
119     all callbacks are set to the corresponding weak functions:
120     examples HAL_DSI_TearingEffectCallback(), HAL_DSI_EndOfRefreshCallback().
121     Exception done for MspInit and MspDeInit functions that are respectively
122     reset to the legacy weak (surcharged) functions in the HAL_DSI_Init()
123     and HAL_DSI_DeInit() only when these callbacks are null (not registered beforehand).
124     If not, MspInit or MspDeInit are not null, the HAL_DSI_Init() and HAL_DSI_DeInit()
125     keep and use the user MspInit/MspDeInit callbacks (registered beforehand).
126 
127     [..]
128     Callbacks can be registered/unregistered in HAL_DSI_STATE_READY state only.
129     Exception done MspInit/MspDeInit that can be registered/unregistered
130     in HAL_DSI_STATE_READY or HAL_DSI_STATE_RESET state,
131     thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
132     In that case first register the MspInit/MspDeInit user callbacks
133     using HAL_DSI_RegisterCallback() before calling HAL_DSI_DeInit()
134     or HAL_DSI_Init() function.
135 
136     [..]
137     When The compilation define USE_HAL_DSI_REGISTER_CALLBACKS is set to 0 or
138     not defined, the callback registration feature is not available and all callbacks
139     are set to the corresponding weak functions.
140 
141   @endverbatim
142   ******************************************************************************
143   * @attention
144   *
145   * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.
146   * All rights reserved.</center></h2>
147   *
148   * This software component is licensed by ST under BSD 3-Clause license,
149   * the "License"; You may not use this file except in compliance with the
150   * License. You may obtain a copy of the License at:
151   *                        opensource.org/licenses/BSD-3-Clause
152   *
153   ******************************************************************************
154   */
155 
156 /* Includes ------------------------------------------------------------------*/
157 #include "stm32l4xx_hal.h"
158 
159 /** @addtogroup STM32L4xx_HAL_Driver
160   * @{
161   */
162 
163 #ifdef HAL_DSI_MODULE_ENABLED
164 
165 #if defined(DSI)
166 
167 /** @addtogroup DSI
168   * @{
169   */
170 
171 /* Private types -------------------------------------------------------------*/
172 /* Private defines -----------------------------------------------------------*/
173 /** @addtogroup DSI_Private_Constants
174   * @{
175   */
176 #define DSI_TIMEOUT_VALUE ((uint32_t)1000U)  /* 1s */
177 
178 #define DSI_ERROR_ACK_MASK (DSI_ISR0_AE0 | DSI_ISR0_AE1 | DSI_ISR0_AE2 | DSI_ISR0_AE3 | \
179                             DSI_ISR0_AE4 | DSI_ISR0_AE5 | DSI_ISR0_AE6 | DSI_ISR0_AE7 | \
180                             DSI_ISR0_AE8 | DSI_ISR0_AE9 | DSI_ISR0_AE10 | DSI_ISR0_AE11 | \
181                             DSI_ISR0_AE12 | DSI_ISR0_AE13 | DSI_ISR0_AE14 | DSI_ISR0_AE15)
182 #define DSI_ERROR_PHY_MASK (DSI_ISR0_PE0 | DSI_ISR0_PE1 | DSI_ISR0_PE2 | DSI_ISR0_PE3 | DSI_ISR0_PE4)
183 #define DSI_ERROR_TX_MASK  DSI_ISR1_TOHSTX
184 #define DSI_ERROR_RX_MASK  DSI_ISR1_TOLPRX
185 #define DSI_ERROR_ECC_MASK (DSI_ISR1_ECCSE | DSI_ISR1_ECCME)
186 #define DSI_ERROR_CRC_MASK DSI_ISR1_CRCE
187 #define DSI_ERROR_PSE_MASK DSI_ISR1_PSE
188 #define DSI_ERROR_EOT_MASK DSI_ISR1_EOTPE
189 #define DSI_ERROR_OVF_MASK DSI_ISR1_LPWRE
190 #define DSI_ERROR_GEN_MASK (DSI_ISR1_GCWRE | DSI_ISR1_GPWRE | DSI_ISR1_GPTXE | DSI_ISR1_GPRDE | DSI_ISR1_GPRXE)
191 /**
192   * @}
193   */
194 
195 /* Private variables ---------------------------------------------------------*/
196 /* Private constants ---------------------------------------------------------*/
197 /* Private macros ------------------------------------------------------------*/
198 /* Private function prototypes -----------------------------------------------*/
199 static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx, uint32_t ChannelID, uint32_t DataType, uint32_t Data0,
200                                    uint32_t Data1);
201 
202 static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi,
203                                      uint32_t ChannelID,
204                                      uint32_t Mode,
205                                      uint32_t Param1,
206                                      uint32_t Param2);
207 
208 /* Private functions ---------------------------------------------------------*/
209 /**
210   * @brief  Generic DSI packet header configuration
211   * @param  DSIx  Pointer to DSI register base
212   * @param  ChannelID Virtual channel ID of the header packet
213   * @param  DataType  Packet data type of the header packet
214   *                   This parameter can be any value of :
215   *                      @arg DSI_SHORT_WRITE_PKT_Data_Type
216   *                      @arg DSI_LONG_WRITE_PKT_Data_Type
217   *                      @arg DSI_SHORT_READ_PKT_Data_Type
218   *                      @arg DSI_MAX_RETURN_PKT_SIZE
219   * @param  Data0  Word count LSB
220   * @param  Data1  Word count MSB
221   * @retval None
222   */
DSI_ConfigPacketHeader(DSI_TypeDef * DSIx,uint32_t ChannelID,uint32_t DataType,uint32_t Data0,uint32_t Data1)223 static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx,
224                                    uint32_t ChannelID,
225                                    uint32_t DataType,
226                                    uint32_t Data0,
227                                    uint32_t Data1)
228 {
229   /* Update the DSI packet header with new information */
230   DSIx->GHCR = (DataType | (ChannelID << 6U) | (Data0 << 8U) | (Data1 << 16U));
231 }
232 
233 /**
234   * @brief  write short DCS or short Generic command
235   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
236   *               the configuration information for the DSI.
237   * @param  ChannelID  Virtual channel ID.
238   * @param  Mode  DSI short packet data type.
239   *               This parameter can be any value of @arg DSI_SHORT_WRITE_PKT_Data_Type.
240   * @param  Param1  DSC command or first generic parameter.
241   *                 This parameter can be any value of @arg DSI_DCS_Command or a
242   *                 generic command code.
243   * @param  Param2  DSC parameter or second generic parameter.
244   * @retval HAL status
245   */
DSI_ShortWrite(DSI_HandleTypeDef * hdsi,uint32_t ChannelID,uint32_t Mode,uint32_t Param1,uint32_t Param2)246 static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi,
247                                         uint32_t ChannelID,
248                                         uint32_t Mode,
249                                         uint32_t Param1,
250                                         uint32_t Param2)
251 {
252   uint32_t tickstart;
253 
254   /* Get tick */
255   tickstart = HAL_GetTick();
256 
257   /* Wait for Command FIFO Empty */
258   while((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U)
259   {
260     /* Check for the Timeout */
261     if((HAL_GetTick() - tickstart ) > DSI_TIMEOUT_VALUE)
262     {
263       return HAL_TIMEOUT;
264     }
265   }
266 
267   /* Configure the packet to send a short DCS command with 0 or 1 parameter */
268   /* Update the DSI packet header with new information */
269   hdsi->Instance->GHCR = (Mode | (ChannelID << 6U) | (Param1 << 8U) | (Param2 << 16U));
270 
271   return HAL_OK;
272 }
273 
274 /* Exported functions --------------------------------------------------------*/
275 /** @addtogroup DSI_Exported_Functions
276   * @{
277   */
278 
279 /** @defgroup DSI_Group1 Initialization and Configuration functions
280   *  @brief   Initialization and Configuration functions
281   *
282 @verbatim
283  ===============================================================================
284                 ##### Initialization and Configuration functions #####
285  ===============================================================================
286     [..]  This section provides functions allowing to:
287       (+) Initialize and configure the DSI
288       (+) De-initialize the DSI
289 
290 @endverbatim
291   * @{
292   */
293 
294 /**
295   * @brief  Initializes the DSI according to the specified
296   *         parameters in the DSI_InitTypeDef and create the associated handle.
297   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
298   *               the configuration information for the DSI.
299   * @param  PLLInit  pointer to a DSI_PLLInitTypeDef structure that contains
300   *                  the PLL Clock structure definition for the DSI.
301   * @retval HAL status
302   */
HAL_DSI_Init(DSI_HandleTypeDef * hdsi,DSI_PLLInitTypeDef * PLLInit)303 HAL_StatusTypeDef HAL_DSI_Init(DSI_HandleTypeDef *hdsi, DSI_PLLInitTypeDef *PLLInit)
304 {
305   uint32_t tickstart;
306   uint32_t unitIntervalx4;
307   uint32_t tempIDF;
308 
309   /* Check the DSI handle allocation */
310   if (hdsi == NULL)
311   {
312     return HAL_ERROR;
313   }
314 
315   /* Check function parameters */
316   assert_param(IS_DSI_PLL_NDIV(PLLInit->PLLNDIV));
317   assert_param(IS_DSI_PLL_IDF(PLLInit->PLLIDF));
318   assert_param(IS_DSI_PLL_ODF(PLLInit->PLLODF));
319   assert_param(IS_DSI_AUTO_CLKLANE_CONTROL(hdsi->Init.AutomaticClockLaneControl));
320   assert_param(IS_DSI_NUMBER_OF_LANES(hdsi->Init.NumberOfLanes));
321 
322 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
323   if (hdsi->State == HAL_DSI_STATE_RESET)
324   {
325     /* Reset the DSI callback to the legacy weak callbacks */
326     hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback; /* Legacy weak TearingEffectCallback */
327     hdsi->EndOfRefreshCallback  = HAL_DSI_EndOfRefreshCallback;  /* Legacy weak EndOfRefreshCallback  */
328     hdsi->ErrorCallback         = HAL_DSI_ErrorCallback;         /* Legacy weak ErrorCallback         */
329 
330     if (hdsi->MspInitCallback == NULL)
331     {
332       hdsi->MspInitCallback = HAL_DSI_MspInit;
333     }
334     /* Initialize the low level hardware */
335     hdsi->MspInitCallback(hdsi);
336   }
337 #else
338   if (hdsi->State == HAL_DSI_STATE_RESET)
339   {
340     /* Initialize the low level hardware */
341     HAL_DSI_MspInit(hdsi);
342   }
343 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */
344 
345   /* Change DSI peripheral state */
346   hdsi->State = HAL_DSI_STATE_BUSY;
347 
348   /**************** Turn on the regulator and enable the DSI PLL ****************/
349 
350   /* Enable the regulator */
351   __HAL_DSI_REG_ENABLE(hdsi);
352 
353   /* Get tick */
354   tickstart = HAL_GetTick();
355 
356   /* Wait until the regulator is ready */
357   while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_RRS) == 0U)
358   {
359     /* Check for the Timeout */
360     if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
361     {
362       return HAL_TIMEOUT;
363     }
364   }
365 
366   /* Set the PLL division factors */
367   hdsi->Instance->WRPCR &= ~(DSI_WRPCR_PLL_NDIV | DSI_WRPCR_PLL_IDF | DSI_WRPCR_PLL_ODF);
368   hdsi->Instance->WRPCR |= (((PLLInit->PLLNDIV) << 2U) | ((PLLInit->PLLIDF) << 11U) | ((PLLInit->PLLODF) << 16U));
369 
370   /* Enable the DSI PLL */
371   __HAL_DSI_PLL_ENABLE(hdsi);
372 
373   /* Get tick */
374   tickstart = HAL_GetTick();
375 
376   /* Wait for the lock of the PLL */
377   while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)
378   {
379     /* Check for the Timeout */
380     if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
381     {
382       return HAL_TIMEOUT;
383     }
384   }
385 
386   /*************************** Set the PHY parameters ***************************/
387 
388   /* D-PHY clock and digital enable*/
389   hdsi->Instance->PCTLR |= (DSI_PCTLR_CKE | DSI_PCTLR_DEN);
390 
391   /* Clock lane configuration */
392   hdsi->Instance->CLCR &= ~(DSI_CLCR_DPCC | DSI_CLCR_ACR);
393   hdsi->Instance->CLCR |= (DSI_CLCR_DPCC | hdsi->Init.AutomaticClockLaneControl);
394 
395   /* Configure the number of active data lanes */
396   hdsi->Instance->PCONFR &= ~DSI_PCONFR_NL;
397   hdsi->Instance->PCONFR |= hdsi->Init.NumberOfLanes;
398 
399   /************************ Set the DSI clock parameters ************************/
400 
401   /* Set the TX escape clock division factor */
402   hdsi->Instance->CCR &= ~DSI_CCR_TXECKDIV;
403   hdsi->Instance->CCR |= hdsi->Init.TXEscapeCkdiv;
404 
405   /* Calculate the bit period in high-speed mode in unit of 0.25 ns (UIX4) */
406   /* The equation is : UIX4 = IntegerPart( (1000/F_PHY_Mhz) * 4 )          */
407   /* Where : F_PHY_Mhz = (NDIV * HSE_Mhz) / (IDF * ODF)                    */
408   tempIDF = (PLLInit->PLLIDF > 0U) ? PLLInit->PLLIDF : 1U;
409   unitIntervalx4 = (4000000U * tempIDF * ((1UL << (0x3U & PLLInit->PLLODF)))) / ((HSE_VALUE / 1000U) * PLLInit->PLLNDIV);
410 
411   /* Set the bit period in high-speed mode */
412   hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_UIX4;
413   hdsi->Instance->WPCR[0U] |= unitIntervalx4;
414 
415   /****************************** Error management *****************************/
416 
417   /* Disable all error interrupts and reset the Error Mask */
418   hdsi->Instance->IER[0U] = 0U;
419   hdsi->Instance->IER[1U] = 0U;
420   hdsi->ErrorMsk = 0U;
421 
422   /* Initialise the error code */
423   hdsi->ErrorCode = HAL_DSI_ERROR_NONE;
424 
425   /* Initialize the DSI state*/
426   hdsi->State = HAL_DSI_STATE_READY;
427 
428   return HAL_OK;
429 }
430 
431 /**
432   * @brief  De-initializes the DSI peripheral registers to their default reset
433   *         values.
434   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
435   *               the configuration information for the DSI.
436   * @retval HAL status
437   */
HAL_DSI_DeInit(DSI_HandleTypeDef * hdsi)438 HAL_StatusTypeDef HAL_DSI_DeInit(DSI_HandleTypeDef *hdsi)
439 {
440   /* Check the DSI handle allocation */
441   if (hdsi == NULL)
442   {
443     return HAL_ERROR;
444   }
445 
446   /* Change DSI peripheral state */
447   hdsi->State = HAL_DSI_STATE_BUSY;
448 
449   /* Disable the DSI wrapper */
450   __HAL_DSI_WRAPPER_DISABLE(hdsi);
451 
452   /* Disable the DSI host */
453   __HAL_DSI_DISABLE(hdsi);
454 
455   /* D-PHY clock and digital disable */
456   hdsi->Instance->PCTLR &= ~(DSI_PCTLR_CKE | DSI_PCTLR_DEN);
457 
458   /* Turn off the DSI PLL */
459   __HAL_DSI_PLL_DISABLE(hdsi);
460 
461   /* Disable the regulator */
462   __HAL_DSI_REG_DISABLE(hdsi);
463 
464 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
465   if (hdsi->MspDeInitCallback == NULL)
466   {
467     hdsi->MspDeInitCallback = HAL_DSI_MspDeInit;
468   }
469   /* DeInit the low level hardware */
470   hdsi->MspDeInitCallback(hdsi);
471 #else
472   /* DeInit the low level hardware */
473   HAL_DSI_MspDeInit(hdsi);
474 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */
475 
476   /* Initialise the error code */
477   hdsi->ErrorCode = HAL_DSI_ERROR_NONE;
478 
479   /* Initialize the DSI state*/
480   hdsi->State = HAL_DSI_STATE_RESET;
481 
482   /* Release Lock */
483   __HAL_UNLOCK(hdsi);
484 
485   return HAL_OK;
486 }
487 
488 /**
489   * @brief  Enable the error monitor flags
490   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
491   *               the configuration information for the DSI.
492   * @param  ActiveErrors  indicates which error interrupts will be enabled.
493   *                      This parameter can be any combination of @arg DSI_Error_Data_Type.
494   * @retval HAL status
495   */
HAL_DSI_ConfigErrorMonitor(DSI_HandleTypeDef * hdsi,uint32_t ActiveErrors)496 HAL_StatusTypeDef HAL_DSI_ConfigErrorMonitor(DSI_HandleTypeDef *hdsi, uint32_t ActiveErrors)
497 {
498   /* Process locked */
499   __HAL_LOCK(hdsi);
500 
501   hdsi->Instance->IER[0U] = 0U;
502   hdsi->Instance->IER[1U] = 0U;
503 
504   /* Store active errors to the handle */
505   hdsi->ErrorMsk = ActiveErrors;
506 
507   if ((ActiveErrors & HAL_DSI_ERROR_ACK) != 0U)
508   {
509     /* Enable the interrupt generation on selected errors */
510     hdsi->Instance->IER[0U] |= DSI_ERROR_ACK_MASK;
511   }
512 
513   if ((ActiveErrors & HAL_DSI_ERROR_PHY) != 0U)
514   {
515     /* Enable the interrupt generation on selected errors */
516     hdsi->Instance->IER[0U] |= DSI_ERROR_PHY_MASK;
517   }
518 
519   if ((ActiveErrors & HAL_DSI_ERROR_TX) != 0U)
520   {
521     /* Enable the interrupt generation on selected errors */
522     hdsi->Instance->IER[1U] |= DSI_ERROR_TX_MASK;
523   }
524 
525   if ((ActiveErrors & HAL_DSI_ERROR_RX) != 0U)
526   {
527     /* Enable the interrupt generation on selected errors */
528     hdsi->Instance->IER[1U] |= DSI_ERROR_RX_MASK;
529   }
530 
531   if ((ActiveErrors & HAL_DSI_ERROR_ECC) != 0U)
532   {
533     /* Enable the interrupt generation on selected errors */
534     hdsi->Instance->IER[1U] |= DSI_ERROR_ECC_MASK;
535   }
536 
537   if ((ActiveErrors & HAL_DSI_ERROR_CRC) != 0U)
538   {
539     /* Enable the interrupt generation on selected errors */
540     hdsi->Instance->IER[1U] |= DSI_ERROR_CRC_MASK;
541   }
542 
543   if ((ActiveErrors & HAL_DSI_ERROR_PSE) != 0U)
544   {
545     /* Enable the interrupt generation on selected errors */
546     hdsi->Instance->IER[1U] |= DSI_ERROR_PSE_MASK;
547   }
548 
549   if ((ActiveErrors & HAL_DSI_ERROR_EOT) != 0U)
550   {
551     /* Enable the interrupt generation on selected errors */
552     hdsi->Instance->IER[1U] |= DSI_ERROR_EOT_MASK;
553   }
554 
555   if ((ActiveErrors & HAL_DSI_ERROR_OVF) != 0U)
556   {
557     /* Enable the interrupt generation on selected errors */
558     hdsi->Instance->IER[1U] |= DSI_ERROR_OVF_MASK;
559   }
560 
561   if ((ActiveErrors & HAL_DSI_ERROR_GEN) != 0U)
562   {
563     /* Enable the interrupt generation on selected errors */
564     hdsi->Instance->IER[1U] |= DSI_ERROR_GEN_MASK;
565   }
566 
567   /* Process Unlocked */
568   __HAL_UNLOCK(hdsi);
569 
570   return HAL_OK;
571 }
572 
573 /**
574   * @brief  Initializes the DSI MSP.
575   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
576   *               the configuration information for the DSI.
577   * @retval None
578   */
HAL_DSI_MspInit(DSI_HandleTypeDef * hdsi)579 __weak void HAL_DSI_MspInit(DSI_HandleTypeDef *hdsi)
580 {
581   /* Prevent unused argument(s) compilation warning */
582   UNUSED(hdsi);
583   /* NOTE : This function Should not be modified, when the callback is needed,
584             the HAL_DSI_MspInit could be implemented in the user file
585    */
586 }
587 
588 /**
589   * @brief  De-initializes the DSI MSP.
590   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
591   *               the configuration information for the DSI.
592   * @retval None
593   */
HAL_DSI_MspDeInit(DSI_HandleTypeDef * hdsi)594 __weak void HAL_DSI_MspDeInit(DSI_HandleTypeDef *hdsi)
595 {
596   /* Prevent unused argument(s) compilation warning */
597   UNUSED(hdsi);
598   /* NOTE : This function Should not be modified, when the callback is needed,
599             the HAL_DSI_MspDeInit could be implemented in the user file
600    */
601 }
602 
603 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
604 /**
605   * @brief  Register a User DSI Callback
606   *         To be used instead of the weak predefined callback
607   * @param hdsi dsi handle
608   * @param CallbackID ID of the callback to be registered
609   *        This parameter can be one of the following values:
610   *          @arg HAL_DSI_TEARING_EFFECT_CB_ID Tearing Effect Callback ID
611   *          @arg HAL_DSI_ENDOF_REFRESH_CB_ID End Of Refresh Callback ID
612   *          @arg HAL_DSI_ERROR_CB_ID Error Callback ID
613   *          @arg HAL_DSI_MSPINIT_CB_ID MspInit callback ID
614   *          @arg HAL_DSI_MSPDEINIT_CB_ID MspDeInit callback ID
615   * @param pCallback pointer to the Callback function
616   * @retval status
617   */
HAL_DSI_RegisterCallback(DSI_HandleTypeDef * hdsi,HAL_DSI_CallbackIDTypeDef CallbackID,pDSI_CallbackTypeDef pCallback)618 HAL_StatusTypeDef HAL_DSI_RegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID,
619                                            pDSI_CallbackTypeDef pCallback)
620 {
621   HAL_StatusTypeDef status = HAL_OK;
622 
623   if (pCallback == NULL)
624   {
625     /* Update the error code */
626     hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
627 
628     return HAL_ERROR;
629   }
630   /* Process locked */
631   __HAL_LOCK(hdsi);
632 
633   if (hdsi->State == HAL_DSI_STATE_READY)
634   {
635     switch (CallbackID)
636     {
637       case HAL_DSI_TEARING_EFFECT_CB_ID :
638         hdsi->TearingEffectCallback = pCallback;
639         break;
640 
641       case HAL_DSI_ENDOF_REFRESH_CB_ID :
642         hdsi->EndOfRefreshCallback = pCallback;
643         break;
644 
645       case HAL_DSI_ERROR_CB_ID :
646         hdsi->ErrorCallback = pCallback;
647         break;
648 
649       case HAL_DSI_MSPINIT_CB_ID :
650         hdsi->MspInitCallback = pCallback;
651         break;
652 
653       case HAL_DSI_MSPDEINIT_CB_ID :
654         hdsi->MspDeInitCallback = pCallback;
655         break;
656 
657       default :
658         /* Update the error code */
659         hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
660         /* Return error status */
661         status =  HAL_ERROR;
662         break;
663     }
664   }
665   else if (hdsi->State == HAL_DSI_STATE_RESET)
666   {
667     switch (CallbackID)
668     {
669       case HAL_DSI_MSPINIT_CB_ID :
670         hdsi->MspInitCallback = pCallback;
671         break;
672 
673       case HAL_DSI_MSPDEINIT_CB_ID :
674         hdsi->MspDeInitCallback = pCallback;
675         break;
676 
677       default :
678         /* Update the error code */
679         hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
680         /* Return error status */
681         status =  HAL_ERROR;
682         break;
683     }
684   }
685   else
686   {
687     /* Update the error code */
688     hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
689     /* Return error status */
690     status =  HAL_ERROR;
691   }
692 
693   /* Release Lock */
694   __HAL_UNLOCK(hdsi);
695 
696   return status;
697 }
698 
699 /**
700   * @brief  Unregister a DSI Callback
701   *         DSI callabck is redirected to the weak predefined callback
702   * @param hdsi dsi handle
703   * @param CallbackID ID of the callback to be unregistered
704   *        This parameter can be one of the following values:
705   *          @arg HAL_DSI_TEARING_EFFECT_CB_ID Tearing Effect Callback ID
706   *          @arg HAL_DSI_ENDOF_REFRESH_CB_ID End Of Refresh Callback ID
707   *          @arg HAL_DSI_ERROR_CB_ID Error Callback ID
708   *          @arg HAL_DSI_MSPINIT_CB_ID MspInit callback ID
709   *          @arg HAL_DSI_MSPDEINIT_CB_ID MspDeInit callback ID
710   * @retval status
711   */
HAL_DSI_UnRegisterCallback(DSI_HandleTypeDef * hdsi,HAL_DSI_CallbackIDTypeDef CallbackID)712 HAL_StatusTypeDef HAL_DSI_UnRegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID)
713 {
714   HAL_StatusTypeDef status = HAL_OK;
715 
716   /* Process locked */
717   __HAL_LOCK(hdsi);
718 
719   if (hdsi->State == HAL_DSI_STATE_READY)
720   {
721     switch (CallbackID)
722     {
723       case HAL_DSI_TEARING_EFFECT_CB_ID :
724         hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback; /* Legacy weak TearingEffectCallback */
725         break;
726 
727       case HAL_DSI_ENDOF_REFRESH_CB_ID :
728         hdsi->EndOfRefreshCallback = HAL_DSI_EndOfRefreshCallback;   /* Legacy weak EndOfRefreshCallback  */
729         break;
730 
731       case HAL_DSI_ERROR_CB_ID :
732         hdsi->ErrorCallback        = HAL_DSI_ErrorCallback;          /* Legacy weak ErrorCallback        */
733         break;
734 
735       case HAL_DSI_MSPINIT_CB_ID :
736         hdsi->MspInitCallback = HAL_DSI_MspInit;                     /* Legcay weak MspInit Callback     */
737         break;
738 
739       case HAL_DSI_MSPDEINIT_CB_ID :
740         hdsi->MspDeInitCallback = HAL_DSI_MspDeInit;                 /* Legcay weak MspDeInit Callback   */
741         break;
742 
743       default :
744         /* Update the error code */
745         hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
746         /* Return error status */
747         status =  HAL_ERROR;
748         break;
749     }
750   }
751   else if (hdsi->State == HAL_DSI_STATE_RESET)
752   {
753     switch (CallbackID)
754     {
755       case HAL_DSI_MSPINIT_CB_ID :
756         hdsi->MspInitCallback = HAL_DSI_MspInit;                  /* Legcay weak MspInit Callback   */
757         break;
758 
759       case HAL_DSI_MSPDEINIT_CB_ID :
760         hdsi->MspDeInitCallback = HAL_DSI_MspDeInit;              /* Legcay weak MspDeInit Callback */
761         break;
762 
763       default :
764         /* Update the error code */
765         hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
766         /* Return error status */
767         status =  HAL_ERROR;
768         break;
769     }
770   }
771   else
772   {
773     /* Update the error code */
774     hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
775     /* Return error status */
776     status =  HAL_ERROR;
777   }
778 
779   /* Release Lock */
780   __HAL_UNLOCK(hdsi);
781 
782   return status;
783 }
784 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */
785 
786 /**
787   * @}
788   */
789 
790 /** @defgroup DSI_Group2 IO operation functions
791   *  @brief    IO operation functions
792   *
793 @verbatim
794  ===============================================================================
795                       #####  IO operation functions  #####
796  ===============================================================================
797     [..]  This section provides function allowing to:
798       (+) Handle DSI interrupt request
799 
800 @endverbatim
801   * @{
802   */
803 /**
804   * @brief  Handles DSI interrupt request.
805   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
806   *               the configuration information for the DSI.
807   * @retval HAL status
808   */
HAL_DSI_IRQHandler(DSI_HandleTypeDef * hdsi)809 void HAL_DSI_IRQHandler(DSI_HandleTypeDef *hdsi)
810 {
811   uint32_t ErrorStatus0, ErrorStatus1;
812 
813   /* Tearing Effect Interrupt management ***************************************/
814   if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_TE) != 0U)
815   {
816     if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_TE) != 0U)
817     {
818       /* Clear the Tearing Effect Interrupt Flag */
819       __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_TE);
820 
821       /* Tearing Effect Callback */
822 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
823       /*Call registered Tearing Effect callback */
824       hdsi->TearingEffectCallback(hdsi);
825 #else
826       /*Call legacy Tearing Effect callback*/
827       HAL_DSI_TearingEffectCallback(hdsi);
828 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */
829     }
830   }
831 
832   /* End of Refresh Interrupt management ***************************************/
833   if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_ER) != 0U)
834   {
835     if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_ER) != 0U)
836     {
837       /* Clear the End of Refresh Interrupt Flag */
838       __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_ER);
839 
840       /* End of Refresh Callback */
841 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
842       /*Call registered End of refresh callback */
843       hdsi->EndOfRefreshCallback(hdsi);
844 #else
845       /*Call Legacy End of refresh callback */
846       HAL_DSI_EndOfRefreshCallback(hdsi);
847 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */
848     }
849   }
850 
851   /* Error Interrupts management ***********************************************/
852   if (hdsi->ErrorMsk != 0U)
853   {
854     ErrorStatus0 = hdsi->Instance->ISR[0U];
855     ErrorStatus0 &= hdsi->Instance->IER[0U];
856     ErrorStatus1 = hdsi->Instance->ISR[1U];
857     ErrorStatus1 &= hdsi->Instance->IER[1U];
858 
859     if ((ErrorStatus0 & DSI_ERROR_ACK_MASK) != 0U)
860     {
861       hdsi->ErrorCode |= HAL_DSI_ERROR_ACK;
862     }
863 
864     if ((ErrorStatus0 & DSI_ERROR_PHY_MASK) != 0U)
865     {
866       hdsi->ErrorCode |= HAL_DSI_ERROR_PHY;
867     }
868 
869     if ((ErrorStatus1 & DSI_ERROR_TX_MASK) != 0U)
870     {
871       hdsi->ErrorCode |= HAL_DSI_ERROR_TX;
872     }
873 
874     if ((ErrorStatus1 & DSI_ERROR_RX_MASK) != 0U)
875     {
876       hdsi->ErrorCode |= HAL_DSI_ERROR_RX;
877     }
878 
879     if ((ErrorStatus1 & DSI_ERROR_ECC_MASK) != 0U)
880     {
881       hdsi->ErrorCode |= HAL_DSI_ERROR_ECC;
882     }
883 
884     if ((ErrorStatus1 & DSI_ERROR_CRC_MASK) != 0U)
885     {
886       hdsi->ErrorCode |= HAL_DSI_ERROR_CRC;
887     }
888 
889     if ((ErrorStatus1 & DSI_ERROR_PSE_MASK) != 0U)
890     {
891       hdsi->ErrorCode |= HAL_DSI_ERROR_PSE;
892     }
893 
894     if ((ErrorStatus1 & DSI_ERROR_EOT_MASK) != 0U)
895     {
896       hdsi->ErrorCode |= HAL_DSI_ERROR_EOT;
897     }
898 
899     if ((ErrorStatus1 & DSI_ERROR_OVF_MASK) != 0U)
900     {
901       hdsi->ErrorCode |= HAL_DSI_ERROR_OVF;
902     }
903 
904     if ((ErrorStatus1 & DSI_ERROR_GEN_MASK) != 0U)
905     {
906       hdsi->ErrorCode |= HAL_DSI_ERROR_GEN;
907     }
908 
909     /* Check only selected errors */
910     if (hdsi->ErrorCode != HAL_DSI_ERROR_NONE)
911     {
912       /* DSI error interrupt callback */
913 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
914       /*Call registered Error callback */
915       hdsi->ErrorCallback(hdsi);
916 #else
917       /*Call Legacy Error callback */
918       HAL_DSI_ErrorCallback(hdsi);
919 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */
920     }
921   }
922 }
923 
924 /**
925   * @brief  Tearing Effect DSI callback.
926   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
927   *               the configuration information for the DSI.
928   * @retval None
929   */
HAL_DSI_TearingEffectCallback(DSI_HandleTypeDef * hdsi)930 __weak void HAL_DSI_TearingEffectCallback(DSI_HandleTypeDef *hdsi)
931 {
932   /* Prevent unused argument(s) compilation warning */
933   UNUSED(hdsi);
934   /* NOTE : This function Should not be modified, when the callback is needed,
935             the HAL_DSI_TearingEffectCallback could be implemented in the user file
936    */
937 }
938 
939 /**
940   * @brief  End of Refresh DSI callback.
941   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
942   *               the configuration information for the DSI.
943   * @retval None
944   */
HAL_DSI_EndOfRefreshCallback(DSI_HandleTypeDef * hdsi)945 __weak void HAL_DSI_EndOfRefreshCallback(DSI_HandleTypeDef *hdsi)
946 {
947   /* Prevent unused argument(s) compilation warning */
948   UNUSED(hdsi);
949   /* NOTE : This function Should not be modified, when the callback is needed,
950             the HAL_DSI_EndOfRefreshCallback could be implemented in the user file
951    */
952 }
953 
954 /**
955   * @brief  Operation Error DSI callback.
956   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
957   *               the configuration information for the DSI.
958   * @retval None
959   */
HAL_DSI_ErrorCallback(DSI_HandleTypeDef * hdsi)960 __weak void HAL_DSI_ErrorCallback(DSI_HandleTypeDef *hdsi)
961 {
962   /* Prevent unused argument(s) compilation warning */
963   UNUSED(hdsi);
964   /* NOTE : This function Should not be modified, when the callback is needed,
965             the HAL_DSI_ErrorCallback could be implemented in the user file
966    */
967 }
968 
969 /**
970   * @}
971   */
972 
973 /** @defgroup DSI_Group3 Peripheral Control functions
974   *  @brief    Peripheral Control functions
975   *
976 @verbatim
977  ===============================================================================
978                     ##### Peripheral Control functions #####
979  ===============================================================================
980     [..]  This section provides functions allowing to:
981       (+) Configure the Generic interface read-back Virtual Channel ID
982       (+) Select video mode and configure the corresponding parameters
983       (+) Configure command transmission mode: High-speed or Low-power
984       (+) Configure the flow control
985       (+) Configure the DSI PHY timer
986       (+) Configure the DSI HOST timeout
987       (+) Configure the DSI HOST timeout
988       (+) Start/Stop the DSI module
989       (+) Refresh the display in command mode
990       (+) Controls the display color mode in Video mode
991       (+) Control the display shutdown in Video mode
992       (+) write short DCS or short Generic command
993       (+) write long DCS or long Generic command
994       (+) Read command (DCS or generic)
995       (+) Enter/Exit the Ultra Low Power Mode on data only (D-PHY PLL running)
996       (+) Enter/Exit the Ultra Low Power Mode on data only and clock (D-PHY PLL turned off)
997       (+) Start/Stop test pattern generation
998       (+) Slew-Rate And Delay Tuning
999       (+) Low-Power Reception Filter Tuning
1000       (+) Activate an additional current path on all lanes to meet the SDDTx parameter
1001       (+) Custom lane pins configuration
1002       (+) Set custom timing for the PHY
1003       (+) Force the Clock/Data Lane in TX Stop Mode
1004       (+) Force LP Receiver in Low-Power Mode
1005       (+) Force Data Lanes in RX Mode after a BTA
1006       (+) Enable a pull-down on the lanes to prevent from floating states when unused
1007       (+) Switch off the contention detection on data lanes
1008 
1009 @endverbatim
1010   * @{
1011   */
1012 
1013 /**
1014   * @brief  Configure the Generic interface read-back Virtual Channel ID.
1015   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1016   *               the configuration information for the DSI.
1017   * @param  VirtualChannelID  Virtual channel ID
1018   * @retval HAL status
1019   */
HAL_DSI_SetGenericVCID(DSI_HandleTypeDef * hdsi,uint32_t VirtualChannelID)1020 HAL_StatusTypeDef HAL_DSI_SetGenericVCID(DSI_HandleTypeDef *hdsi, uint32_t VirtualChannelID)
1021 {
1022   /* Process locked */
1023   __HAL_LOCK(hdsi);
1024 
1025   /* Update the GVCID register */
1026   hdsi->Instance->GVCIDR &= ~DSI_GVCIDR_VCID;
1027   hdsi->Instance->GVCIDR |= VirtualChannelID;
1028 
1029   /* Process unlocked */
1030   __HAL_UNLOCK(hdsi);
1031 
1032   return HAL_OK;
1033 }
1034 
1035 /**
1036   * @brief  Select video mode and configure the corresponding parameters
1037   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1038   *               the configuration information for the DSI.
1039   * @param  VidCfg pointer to a DSI_VidCfgTypeDef structure that contains
1040   *                the DSI video mode configuration parameters
1041   * @retval HAL status
1042   */
HAL_DSI_ConfigVideoMode(DSI_HandleTypeDef * hdsi,DSI_VidCfgTypeDef * VidCfg)1043 HAL_StatusTypeDef HAL_DSI_ConfigVideoMode(DSI_HandleTypeDef *hdsi, DSI_VidCfgTypeDef *VidCfg)
1044 {
1045   /* Process locked */
1046   __HAL_LOCK(hdsi);
1047 
1048   /* Check the parameters */
1049   assert_param(IS_DSI_COLOR_CODING(VidCfg->ColorCoding));
1050   assert_param(IS_DSI_VIDEO_MODE_TYPE(VidCfg->Mode));
1051   assert_param(IS_DSI_LP_COMMAND(VidCfg->LPCommandEnable));
1052   assert_param(IS_DSI_LP_HFP(VidCfg->LPHorizontalFrontPorchEnable));
1053   assert_param(IS_DSI_LP_HBP(VidCfg->LPHorizontalBackPorchEnable));
1054   assert_param(IS_DSI_LP_VACTIVE(VidCfg->LPVerticalActiveEnable));
1055   assert_param(IS_DSI_LP_VFP(VidCfg->LPVerticalFrontPorchEnable));
1056   assert_param(IS_DSI_LP_VBP(VidCfg->LPVerticalBackPorchEnable));
1057   assert_param(IS_DSI_LP_VSYNC(VidCfg->LPVerticalSyncActiveEnable));
1058   assert_param(IS_DSI_FBTAA(VidCfg->FrameBTAAcknowledgeEnable));
1059   assert_param(IS_DSI_DE_POLARITY(VidCfg->DEPolarity));
1060   assert_param(IS_DSI_VSYNC_POLARITY(VidCfg->VSPolarity));
1061   assert_param(IS_DSI_HSYNC_POLARITY(VidCfg->HSPolarity));
1062   /* Check the LooselyPacked variant only in 18-bit mode */
1063   if (VidCfg->ColorCoding == DSI_RGB666)
1064   {
1065     assert_param(IS_DSI_LOOSELY_PACKED(VidCfg->LooselyPacked));
1066   }
1067 
1068   /* Select video mode by resetting CMDM and DSIM bits */
1069   hdsi->Instance->MCR &= ~DSI_MCR_CMDM;
1070   hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM;
1071 
1072   /* Configure the video mode transmission type */
1073   hdsi->Instance->VMCR &= ~DSI_VMCR_VMT;
1074   hdsi->Instance->VMCR |= VidCfg->Mode;
1075 
1076   /* Configure the video packet size */
1077   hdsi->Instance->VPCR &= ~DSI_VPCR_VPSIZE;
1078   hdsi->Instance->VPCR |= VidCfg->PacketSize;
1079 
1080   /* Set the chunks number to be transmitted through the DSI link */
1081   hdsi->Instance->VCCR &= ~DSI_VCCR_NUMC;
1082   hdsi->Instance->VCCR |= VidCfg->NumberOfChunks;
1083 
1084   /* Set the size of the null packet */
1085   hdsi->Instance->VNPCR &= ~DSI_VNPCR_NPSIZE;
1086   hdsi->Instance->VNPCR |= VidCfg->NullPacketSize;
1087 
1088   /* Select the virtual channel for the LTDC interface traffic */
1089   hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID;
1090   hdsi->Instance->LVCIDR |= VidCfg->VirtualChannelID;
1091 
1092   /* Configure the polarity of control signals */
1093   hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP);
1094   hdsi->Instance->LPCR |= (VidCfg->DEPolarity | VidCfg->VSPolarity | VidCfg->HSPolarity);
1095 
1096   /* Select the color coding for the host */
1097   hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC;
1098   hdsi->Instance->LCOLCR |= VidCfg->ColorCoding;
1099 
1100   /* Select the color coding for the wrapper */
1101   hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX;
1102   hdsi->Instance->WCFGR |= ((VidCfg->ColorCoding) << 1U);
1103 
1104   /* Enable/disable the loosely packed variant to 18-bit configuration */
1105   if (VidCfg->ColorCoding == DSI_RGB666)
1106   {
1107     hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_LPE;
1108     hdsi->Instance->LCOLCR |= VidCfg->LooselyPacked;
1109   }
1110 
1111   /* Set the Horizontal Synchronization Active (HSA) in lane byte clock cycles */
1112   hdsi->Instance->VHSACR &= ~DSI_VHSACR_HSA;
1113   hdsi->Instance->VHSACR |= VidCfg->HorizontalSyncActive;
1114 
1115   /* Set the Horizontal Back Porch (HBP) in lane byte clock cycles */
1116   hdsi->Instance->VHBPCR &= ~DSI_VHBPCR_HBP;
1117   hdsi->Instance->VHBPCR |= VidCfg->HorizontalBackPorch;
1118 
1119   /* Set the total line time (HLINE=HSA+HBP+HACT+HFP) in lane byte clock cycles */
1120   hdsi->Instance->VLCR &= ~DSI_VLCR_HLINE;
1121   hdsi->Instance->VLCR |= VidCfg->HorizontalLine;
1122 
1123   /* Set the Vertical Synchronization Active (VSA) */
1124   hdsi->Instance->VVSACR &= ~DSI_VVSACR_VSA;
1125   hdsi->Instance->VVSACR |= VidCfg->VerticalSyncActive;
1126 
1127   /* Set the Vertical Back Porch (VBP)*/
1128   hdsi->Instance->VVBPCR &= ~DSI_VVBPCR_VBP;
1129   hdsi->Instance->VVBPCR |= VidCfg->VerticalBackPorch;
1130 
1131   /* Set the Vertical Front Porch (VFP)*/
1132   hdsi->Instance->VVFPCR &= ~DSI_VVFPCR_VFP;
1133   hdsi->Instance->VVFPCR |= VidCfg->VerticalFrontPorch;
1134 
1135   /* Set the Vertical Active period*/
1136   hdsi->Instance->VVACR &= ~DSI_VVACR_VA;
1137   hdsi->Instance->VVACR |= VidCfg->VerticalActive;
1138 
1139   /* Configure the command transmission mode */
1140   hdsi->Instance->VMCR &= ~DSI_VMCR_LPCE;
1141   hdsi->Instance->VMCR |= VidCfg->LPCommandEnable;
1142 
1143   /* Low power largest packet size */
1144   hdsi->Instance->LPMCR &= ~DSI_LPMCR_LPSIZE;
1145   hdsi->Instance->LPMCR |= ((VidCfg->LPLargestPacketSize) << 16U);
1146 
1147   /* Low power VACT largest packet size */
1148   hdsi->Instance->LPMCR &= ~DSI_LPMCR_VLPSIZE;
1149   hdsi->Instance->LPMCR |= VidCfg->LPVACTLargestPacketSize;
1150 
1151   /* Enable LP transition in HFP period */
1152   hdsi->Instance->VMCR &= ~DSI_VMCR_LPHFPE;
1153   hdsi->Instance->VMCR |= VidCfg->LPHorizontalFrontPorchEnable;
1154 
1155   /* Enable LP transition in HBP period */
1156   hdsi->Instance->VMCR &= ~DSI_VMCR_LPHBPE;
1157   hdsi->Instance->VMCR |= VidCfg->LPHorizontalBackPorchEnable;
1158 
1159   /* Enable LP transition in VACT period */
1160   hdsi->Instance->VMCR &= ~DSI_VMCR_LPVAE;
1161   hdsi->Instance->VMCR |= VidCfg->LPVerticalActiveEnable;
1162 
1163   /* Enable LP transition in VFP period */
1164   hdsi->Instance->VMCR &= ~DSI_VMCR_LPVFPE;
1165   hdsi->Instance->VMCR |= VidCfg->LPVerticalFrontPorchEnable;
1166 
1167   /* Enable LP transition in VBP period */
1168   hdsi->Instance->VMCR &= ~DSI_VMCR_LPVBPE;
1169   hdsi->Instance->VMCR |= VidCfg->LPVerticalBackPorchEnable;
1170 
1171   /* Enable LP transition in vertical sync period */
1172   hdsi->Instance->VMCR &= ~DSI_VMCR_LPVSAE;
1173   hdsi->Instance->VMCR |= VidCfg->LPVerticalSyncActiveEnable;
1174 
1175   /* Enable the request for an acknowledge response at the end of a frame */
1176   hdsi->Instance->VMCR &= ~DSI_VMCR_FBTAAE;
1177   hdsi->Instance->VMCR |= VidCfg->FrameBTAAcknowledgeEnable;
1178 
1179   /* Process unlocked */
1180   __HAL_UNLOCK(hdsi);
1181 
1182   return HAL_OK;
1183 }
1184 
1185 /**
1186   * @brief  Select adapted command mode and configure the corresponding parameters
1187   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1188   *               the configuration information for the DSI.
1189   * @param  CmdCfg  pointer to a DSI_CmdCfgTypeDef structure that contains
1190   *                 the DSI command mode configuration parameters
1191   * @retval HAL status
1192   */
HAL_DSI_ConfigAdaptedCommandMode(DSI_HandleTypeDef * hdsi,DSI_CmdCfgTypeDef * CmdCfg)1193 HAL_StatusTypeDef HAL_DSI_ConfigAdaptedCommandMode(DSI_HandleTypeDef *hdsi, DSI_CmdCfgTypeDef *CmdCfg)
1194 {
1195   /* Process locked */
1196   __HAL_LOCK(hdsi);
1197 
1198   /* Check the parameters */
1199   assert_param(IS_DSI_COLOR_CODING(CmdCfg->ColorCoding));
1200   assert_param(IS_DSI_TE_SOURCE(CmdCfg->TearingEffectSource));
1201   assert_param(IS_DSI_TE_POLARITY(CmdCfg->TearingEffectPolarity));
1202   assert_param(IS_DSI_AUTOMATIC_REFRESH(CmdCfg->AutomaticRefresh));
1203   assert_param(IS_DSI_VS_POLARITY(CmdCfg->VSyncPol));
1204   assert_param(IS_DSI_TE_ACK_REQUEST(CmdCfg->TEAcknowledgeRequest));
1205   assert_param(IS_DSI_DE_POLARITY(CmdCfg->DEPolarity));
1206   assert_param(IS_DSI_VSYNC_POLARITY(CmdCfg->VSPolarity));
1207   assert_param(IS_DSI_HSYNC_POLARITY(CmdCfg->HSPolarity));
1208 
1209   /* Select command mode by setting CMDM and DSIM bits */
1210   hdsi->Instance->MCR |= DSI_MCR_CMDM;
1211   hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM;
1212   hdsi->Instance->WCFGR |= DSI_WCFGR_DSIM;
1213 
1214   /* Select the virtual channel for the LTDC interface traffic */
1215   hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID;
1216   hdsi->Instance->LVCIDR |= CmdCfg->VirtualChannelID;
1217 
1218   /* Configure the polarity of control signals */
1219   hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP);
1220   hdsi->Instance->LPCR |= (CmdCfg->DEPolarity | CmdCfg->VSPolarity | CmdCfg->HSPolarity);
1221 
1222   /* Select the color coding for the host */
1223   hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC;
1224   hdsi->Instance->LCOLCR |= CmdCfg->ColorCoding;
1225 
1226   /* Select the color coding for the wrapper */
1227   hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX;
1228   hdsi->Instance->WCFGR |= ((CmdCfg->ColorCoding) << 1U);
1229 
1230   /* Configure the maximum allowed size for write memory command */
1231   hdsi->Instance->LCCR &= ~DSI_LCCR_CMDSIZE;
1232   hdsi->Instance->LCCR |= CmdCfg->CommandSize;
1233 
1234   /* Configure the tearing effect source and polarity and select the refresh mode */
1235   hdsi->Instance->WCFGR &= ~(DSI_WCFGR_TESRC | DSI_WCFGR_TEPOL | DSI_WCFGR_AR | DSI_WCFGR_VSPOL);
1236   hdsi->Instance->WCFGR |= (CmdCfg->TearingEffectSource | CmdCfg->TearingEffectPolarity | CmdCfg->AutomaticRefresh |
1237                             CmdCfg->VSyncPol);
1238 
1239   /* Configure the tearing effect acknowledge request */
1240   hdsi->Instance->CMCR &= ~DSI_CMCR_TEARE;
1241   hdsi->Instance->CMCR |= CmdCfg->TEAcknowledgeRequest;
1242 
1243   /* Enable the Tearing Effect interrupt */
1244   __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_TE);
1245 
1246   /* Enable the End of Refresh interrupt */
1247   __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_ER);
1248 
1249   /* Process unlocked */
1250   __HAL_UNLOCK(hdsi);
1251 
1252   return HAL_OK;
1253 }
1254 
1255 /**
1256   * @brief  Configure command transmission mode: High-speed or Low-power
1257   *         and enable/disable acknowledge request after packet transmission
1258   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1259   *               the configuration information for the DSI.
1260   * @param  LPCmd  pointer to a DSI_LPCmdTypeDef structure that contains
1261   *                the DSI command transmission mode configuration parameters
1262   * @retval HAL status
1263   */
HAL_DSI_ConfigCommand(DSI_HandleTypeDef * hdsi,DSI_LPCmdTypeDef * LPCmd)1264 HAL_StatusTypeDef HAL_DSI_ConfigCommand(DSI_HandleTypeDef *hdsi, DSI_LPCmdTypeDef *LPCmd)
1265 {
1266   /* Process locked */
1267   __HAL_LOCK(hdsi);
1268 
1269   assert_param(IS_DSI_LP_GSW0P(LPCmd->LPGenShortWriteNoP));
1270   assert_param(IS_DSI_LP_GSW1P(LPCmd->LPGenShortWriteOneP));
1271   assert_param(IS_DSI_LP_GSW2P(LPCmd->LPGenShortWriteTwoP));
1272   assert_param(IS_DSI_LP_GSR0P(LPCmd->LPGenShortReadNoP));
1273   assert_param(IS_DSI_LP_GSR1P(LPCmd->LPGenShortReadOneP));
1274   assert_param(IS_DSI_LP_GSR2P(LPCmd->LPGenShortReadTwoP));
1275   assert_param(IS_DSI_LP_GLW(LPCmd->LPGenLongWrite));
1276   assert_param(IS_DSI_LP_DSW0P(LPCmd->LPDcsShortWriteNoP));
1277   assert_param(IS_DSI_LP_DSW1P(LPCmd->LPDcsShortWriteOneP));
1278   assert_param(IS_DSI_LP_DSR0P(LPCmd->LPDcsShortReadNoP));
1279   assert_param(IS_DSI_LP_DLW(LPCmd->LPDcsLongWrite));
1280   assert_param(IS_DSI_LP_MRDP(LPCmd->LPMaxReadPacket));
1281   assert_param(IS_DSI_ACK_REQUEST(LPCmd->AcknowledgeRequest));
1282 
1283   /* Select High-speed or Low-power for command transmission */
1284   hdsi->Instance->CMCR &= ~(DSI_CMCR_GSW0TX | \
1285                             DSI_CMCR_GSW1TX | \
1286                             DSI_CMCR_GSW2TX | \
1287                             DSI_CMCR_GSR0TX | \
1288                             DSI_CMCR_GSR1TX | \
1289                             DSI_CMCR_GSR2TX | \
1290                             DSI_CMCR_GLWTX  | \
1291                             DSI_CMCR_DSW0TX | \
1292                             DSI_CMCR_DSW1TX | \
1293                             DSI_CMCR_DSR0TX | \
1294                             DSI_CMCR_DLWTX  | \
1295                             DSI_CMCR_MRDPS);
1296   hdsi->Instance->CMCR |= (LPCmd->LPGenShortWriteNoP  | \
1297                            LPCmd->LPGenShortWriteOneP | \
1298                            LPCmd->LPGenShortWriteTwoP | \
1299                            LPCmd->LPGenShortReadNoP   | \
1300                            LPCmd->LPGenShortReadOneP  | \
1301                            LPCmd->LPGenShortReadTwoP  | \
1302                            LPCmd->LPGenLongWrite      | \
1303                            LPCmd->LPDcsShortWriteNoP  | \
1304                            LPCmd->LPDcsShortWriteOneP | \
1305                            LPCmd->LPDcsShortReadNoP   | \
1306                            LPCmd->LPDcsLongWrite      | \
1307                            LPCmd->LPMaxReadPacket);
1308 
1309   /* Configure the acknowledge request after each packet transmission */
1310   hdsi->Instance->CMCR &= ~DSI_CMCR_ARE;
1311   hdsi->Instance->CMCR |= LPCmd->AcknowledgeRequest;
1312 
1313   /* Process unlocked */
1314   __HAL_UNLOCK(hdsi);
1315 
1316   return HAL_OK;
1317 }
1318 
1319 /**
1320   * @brief  Configure the flow control parameters
1321   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1322   *               the configuration information for the DSI.
1323   * @param  FlowControl  flow control feature(s) to be enabled.
1324   *                      This parameter can be any combination of @arg DSI_FlowControl.
1325   * @retval HAL status
1326   */
HAL_DSI_ConfigFlowControl(DSI_HandleTypeDef * hdsi,uint32_t FlowControl)1327 HAL_StatusTypeDef HAL_DSI_ConfigFlowControl(DSI_HandleTypeDef *hdsi, uint32_t FlowControl)
1328 {
1329   /* Process locked */
1330   __HAL_LOCK(hdsi);
1331 
1332   /* Check the parameters */
1333   assert_param(IS_DSI_FLOW_CONTROL(FlowControl));
1334 
1335   /* Set the DSI Host Protocol Configuration Register */
1336   hdsi->Instance->PCR &= ~DSI_FLOW_CONTROL_ALL;
1337   hdsi->Instance->PCR |= FlowControl;
1338 
1339   /* Process unlocked */
1340   __HAL_UNLOCK(hdsi);
1341 
1342   return HAL_OK;
1343 }
1344 
1345 /**
1346   * @brief  Configure the DSI PHY timer parameters
1347   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1348   *               the configuration information for the DSI.
1349   * @param  PhyTimers  DSI_PHY_TimerTypeDef structure that contains
1350   *                    the DSI PHY timing parameters
1351   * @retval HAL status
1352   */
HAL_DSI_ConfigPhyTimer(DSI_HandleTypeDef * hdsi,DSI_PHY_TimerTypeDef * PhyTimers)1353 HAL_StatusTypeDef HAL_DSI_ConfigPhyTimer(DSI_HandleTypeDef *hdsi, DSI_PHY_TimerTypeDef *PhyTimers)
1354 {
1355   uint32_t maxTime;
1356   /* Process locked */
1357   __HAL_LOCK(hdsi);
1358 
1359   maxTime = (PhyTimers->ClockLaneLP2HSTime > PhyTimers->ClockLaneHS2LPTime) ? PhyTimers->ClockLaneLP2HSTime :
1360             PhyTimers->ClockLaneHS2LPTime;
1361 
1362   /* Clock lane timer configuration */
1363 
1364   /* In Automatic Clock Lane control mode, the DSI Host can turn off the clock lane between two
1365      High-Speed transmission.
1366      To do so, the DSI Host calculates the time required for the clock lane to change from HighSpeed
1367      to Low-Power and from Low-Power to High-Speed.
1368      This timings are configured by the HS2LP_TIME and LP2HS_TIME in the DSI Host Clock Lane Timer Configuration Register (DSI_CLTCR).
1369      But the DSI Host is not calculating LP2HS_TIME + HS2LP_TIME but 2 x HS2LP_TIME.
1370 
1371      Workaround : Configure HS2LP_TIME and LP2HS_TIME with the same value being the max of HS2LP_TIME or LP2HS_TIME.
1372     */
1373   hdsi->Instance->CLTCR &= ~(DSI_CLTCR_LP2HS_TIME | DSI_CLTCR_HS2LP_TIME);
1374   hdsi->Instance->CLTCR |= (maxTime | ((maxTime) << 16U));
1375 
1376   /* Data lane timer configuration */
1377   hdsi->Instance->DLTCR &= ~(DSI_DLTCR_MRD_TIME | DSI_DLTCR_LP2HS_TIME | DSI_DLTCR_HS2LP_TIME);
1378   hdsi->Instance->DLTCR |= (PhyTimers->DataLaneMaxReadTime | ((PhyTimers->DataLaneLP2HSTime) << 16U) | ((
1379                               PhyTimers->DataLaneHS2LPTime) << 24U));
1380 
1381   /* Configure the wait period to request HS transmission after a stop state */
1382   hdsi->Instance->PCONFR &= ~DSI_PCONFR_SW_TIME;
1383   hdsi->Instance->PCONFR |= ((PhyTimers->StopWaitTime) << 8U);
1384 
1385   /* Process unlocked */
1386   __HAL_UNLOCK(hdsi);
1387 
1388   return HAL_OK;
1389 }
1390 
1391 /**
1392   * @brief  Configure the DSI HOST timeout parameters
1393   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1394   *               the configuration information for the DSI.
1395   * @param  HostTimeouts  DSI_HOST_TimeoutTypeDef structure that contains
1396   *                       the DSI host timeout parameters
1397   * @retval HAL status
1398   */
HAL_DSI_ConfigHostTimeouts(DSI_HandleTypeDef * hdsi,DSI_HOST_TimeoutTypeDef * HostTimeouts)1399 HAL_StatusTypeDef HAL_DSI_ConfigHostTimeouts(DSI_HandleTypeDef *hdsi, DSI_HOST_TimeoutTypeDef *HostTimeouts)
1400 {
1401   /* Process locked */
1402   __HAL_LOCK(hdsi);
1403 
1404   /* Set the timeout clock division factor */
1405   hdsi->Instance->CCR &= ~DSI_CCR_TOCKDIV;
1406   hdsi->Instance->CCR |= ((HostTimeouts->TimeoutCkdiv) << 8U);
1407 
1408   /* High-speed transmission timeout */
1409   hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_HSTX_TOCNT;
1410   hdsi->Instance->TCCR[0U] |= ((HostTimeouts->HighSpeedTransmissionTimeout) << 16U);
1411 
1412   /* Low-power reception timeout */
1413   hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_LPRX_TOCNT;
1414   hdsi->Instance->TCCR[0U] |= HostTimeouts->LowPowerReceptionTimeout;
1415 
1416   /* High-speed read timeout */
1417   hdsi->Instance->TCCR[1U] &= ~DSI_TCCR1_HSRD_TOCNT;
1418   hdsi->Instance->TCCR[1U] |= HostTimeouts->HighSpeedReadTimeout;
1419 
1420   /* Low-power read timeout */
1421   hdsi->Instance->TCCR[2U] &= ~DSI_TCCR2_LPRD_TOCNT;
1422   hdsi->Instance->TCCR[2U] |= HostTimeouts->LowPowerReadTimeout;
1423 
1424   /* High-speed write timeout */
1425   hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_HSWR_TOCNT;
1426   hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWriteTimeout;
1427 
1428   /* High-speed write presp mode */
1429   hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_PM;
1430   hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWritePrespMode;
1431 
1432   /* Low-speed write timeout */
1433   hdsi->Instance->TCCR[4U] &= ~DSI_TCCR4_LPWR_TOCNT;
1434   hdsi->Instance->TCCR[4U] |= HostTimeouts->LowPowerWriteTimeout;
1435 
1436   /* BTA timeout */
1437   hdsi->Instance->TCCR[5U] &= ~DSI_TCCR5_BTA_TOCNT;
1438   hdsi->Instance->TCCR[5U] |= HostTimeouts->BTATimeout;
1439 
1440   /* Process unlocked */
1441   __HAL_UNLOCK(hdsi);
1442 
1443   return HAL_OK;
1444 }
1445 
1446 /**
1447   * @brief  Start the DSI module
1448   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1449   *               the configuration information for the DSI.
1450   * @retval HAL status
1451   */
HAL_DSI_Start(DSI_HandleTypeDef * hdsi)1452 HAL_StatusTypeDef HAL_DSI_Start(DSI_HandleTypeDef *hdsi)
1453 {
1454   /* Process locked */
1455   __HAL_LOCK(hdsi);
1456 
1457   /* Enable the DSI host */
1458   __HAL_DSI_ENABLE(hdsi);
1459 
1460   /* Enable the DSI wrapper */
1461   __HAL_DSI_WRAPPER_ENABLE(hdsi);
1462 
1463   /* Process unlocked */
1464   __HAL_UNLOCK(hdsi);
1465 
1466   return HAL_OK;
1467 }
1468 
1469 /**
1470   * @brief  Stop the DSI module
1471   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1472   *               the configuration information for the DSI.
1473   * @retval HAL status
1474   */
HAL_DSI_Stop(DSI_HandleTypeDef * hdsi)1475 HAL_StatusTypeDef HAL_DSI_Stop(DSI_HandleTypeDef *hdsi)
1476 {
1477   /* Process locked */
1478   __HAL_LOCK(hdsi);
1479 
1480   /* Disable the DSI host */
1481   __HAL_DSI_DISABLE(hdsi);
1482 
1483   /* Disable the DSI wrapper */
1484   __HAL_DSI_WRAPPER_DISABLE(hdsi);
1485 
1486   /* Process unlocked */
1487   __HAL_UNLOCK(hdsi);
1488 
1489   return HAL_OK;
1490 }
1491 
1492 /**
1493   * @brief  Refresh the display in command mode
1494   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1495   *               the configuration information for the DSI.
1496   * @retval HAL status
1497   */
HAL_DSI_Refresh(DSI_HandleTypeDef * hdsi)1498 HAL_StatusTypeDef HAL_DSI_Refresh(DSI_HandleTypeDef *hdsi)
1499 {
1500   /* Process locked */
1501   __HAL_LOCK(hdsi);
1502 
1503   /* Update the display */
1504   hdsi->Instance->WCR |= DSI_WCR_LTDCEN;
1505 
1506   /* Process unlocked */
1507   __HAL_UNLOCK(hdsi);
1508 
1509   return HAL_OK;
1510 }
1511 
1512 /**
1513   * @brief  Controls the display color mode in Video mode
1514   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1515   *               the configuration information for the DSI.
1516   * @param  ColorMode  Color mode (full or 8-colors).
1517   *                    This parameter can be any value of @arg DSI_Color_Mode
1518   * @retval HAL status
1519   */
HAL_DSI_ColorMode(DSI_HandleTypeDef * hdsi,uint32_t ColorMode)1520 HAL_StatusTypeDef HAL_DSI_ColorMode(DSI_HandleTypeDef *hdsi, uint32_t ColorMode)
1521 {
1522   /* Process locked */
1523   __HAL_LOCK(hdsi);
1524 
1525   /* Check the parameters */
1526   assert_param(IS_DSI_COLOR_MODE(ColorMode));
1527 
1528   /* Update the display color mode */
1529   hdsi->Instance->WCR &= ~DSI_WCR_COLM;
1530   hdsi->Instance->WCR |= ColorMode;
1531 
1532   /* Process unlocked */
1533   __HAL_UNLOCK(hdsi);
1534 
1535   return HAL_OK;
1536 }
1537 
1538 /**
1539   * @brief  Control the display shutdown in Video mode
1540   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1541   *               the configuration information for the DSI.
1542   * @param  Shutdown  Shut-down (Display-ON or Display-OFF).
1543   *                   This parameter can be any value of @arg DSI_ShutDown
1544   * @retval HAL status
1545   */
HAL_DSI_Shutdown(DSI_HandleTypeDef * hdsi,uint32_t Shutdown)1546 HAL_StatusTypeDef HAL_DSI_Shutdown(DSI_HandleTypeDef *hdsi, uint32_t Shutdown)
1547 {
1548   /* Process locked */
1549   __HAL_LOCK(hdsi);
1550 
1551   /* Check the parameters */
1552   assert_param(IS_DSI_SHUT_DOWN(Shutdown));
1553 
1554   /* Update the display Shutdown */
1555   hdsi->Instance->WCR &= ~DSI_WCR_SHTDN;
1556   hdsi->Instance->WCR |= Shutdown;
1557 
1558   /* Process unlocked */
1559   __HAL_UNLOCK(hdsi);
1560 
1561   return HAL_OK;
1562 }
1563 
1564 /**
1565   * @brief  write short DCS or short Generic command
1566   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1567   *               the configuration information for the DSI.
1568   * @param  ChannelID  Virtual channel ID.
1569   * @param  Mode  DSI short packet data type.
1570   *               This parameter can be any value of @arg DSI_SHORT_WRITE_PKT_Data_Type.
1571   * @param  Param1  DSC command or first generic parameter.
1572   *                 This parameter can be any value of @arg DSI_DCS_Command or a
1573   *                 generic command code.
1574   * @param  Param2  DSC parameter or second generic parameter.
1575   * @retval HAL status
1576   */
HAL_DSI_ShortWrite(DSI_HandleTypeDef * hdsi,uint32_t ChannelID,uint32_t Mode,uint32_t Param1,uint32_t Param2)1577 HAL_StatusTypeDef HAL_DSI_ShortWrite(DSI_HandleTypeDef *hdsi,
1578                                      uint32_t ChannelID,
1579                                      uint32_t Mode,
1580                                      uint32_t Param1,
1581                                      uint32_t Param2)
1582 {
1583   HAL_StatusTypeDef status;
1584   /* Check the parameters */
1585   assert_param(IS_DSI_SHORT_WRITE_PACKET_TYPE(Mode));
1586 
1587   /* Process locked */
1588   __HAL_LOCK(hdsi);
1589 
1590    status = DSI_ShortWrite(hdsi, ChannelID, Mode, Param1, Param2);
1591 
1592   /* Process unlocked */
1593   __HAL_UNLOCK(hdsi);
1594 
1595   return status;
1596 }
1597 
1598 /**
1599   * @brief  write long DCS or long Generic command
1600   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1601   *               the configuration information for the DSI.
1602   * @param  ChannelID  Virtual channel ID.
1603   * @param  Mode  DSI long packet data type.
1604   *               This parameter can be any value of @arg DSI_LONG_WRITE_PKT_Data_Type.
1605   * @param  NbParams  Number of parameters.
1606   * @param  Param1  DSC command or first generic parameter.
1607   *                 This parameter can be any value of @arg DSI_DCS_Command or a
1608   *                 generic command code
1609   * @param  ParametersTable  Pointer to parameter values table.
1610   * @retval HAL status
1611   */
HAL_DSI_LongWrite(DSI_HandleTypeDef * hdsi,uint32_t ChannelID,uint32_t Mode,uint32_t NbParams,uint32_t Param1,uint8_t * ParametersTable)1612 HAL_StatusTypeDef HAL_DSI_LongWrite(DSI_HandleTypeDef *hdsi,
1613                                     uint32_t ChannelID,
1614                                     uint32_t Mode,
1615                                     uint32_t NbParams,
1616                                     uint32_t Param1,
1617                                     uint8_t *ParametersTable)
1618 {
1619   uint32_t uicounter, nbBytes, count;
1620   uint32_t tickstart;
1621   uint32_t fifoword;
1622   uint8_t *pparams = ParametersTable;
1623 
1624   /* Process locked */
1625   __HAL_LOCK(hdsi);
1626 
1627   /* Check the parameters */
1628   assert_param(IS_DSI_LONG_WRITE_PACKET_TYPE(Mode));
1629 
1630   /* Get tick */
1631   tickstart = HAL_GetTick();
1632 
1633   /* Wait for Command FIFO Empty */
1634   while ((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U)
1635   {
1636     /* Check for the Timeout */
1637     if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1638     {
1639       /* Process Unlocked */
1640       __HAL_UNLOCK(hdsi);
1641 
1642       return HAL_TIMEOUT;
1643     }
1644   }
1645 
1646   /* Set the DCS code on payload byte 1, and the other parameters on the write FIFO command*/
1647   fifoword = Param1;
1648   nbBytes = (NbParams < 3U) ? NbParams : 3U;
1649 
1650   for (count = 0U; count < nbBytes; count++)
1651   {
1652     fifoword |= (((uint32_t)(*(pparams + count))) << (8U + (8U * count)));
1653   }
1654   hdsi->Instance->GPDR = fifoword;
1655 
1656   uicounter = NbParams - nbBytes;
1657   pparams += nbBytes;
1658   /* Set the Next parameters on the write FIFO command*/
1659   while (uicounter != 0U)
1660   {
1661     nbBytes = (uicounter < 4U) ? uicounter : 4U;
1662     fifoword = 0U;
1663     for (count = 0U; count < nbBytes; count++)
1664     {
1665       fifoword |= (((uint32_t)(*(pparams + count))) << (8U * count));
1666     }
1667     hdsi->Instance->GPDR = fifoword;
1668 
1669     uicounter -= nbBytes;
1670     pparams += nbBytes;
1671   }
1672 
1673   /* Configure the packet to send a long DCS command */
1674   DSI_ConfigPacketHeader(hdsi->Instance,
1675                          ChannelID,
1676                          Mode,
1677                          ((NbParams + 1U) & 0x00FFU),
1678                          (((NbParams + 1U) & 0xFF00U) >> 8U));
1679 
1680   /* Process unlocked */
1681   __HAL_UNLOCK(hdsi);
1682 
1683   return HAL_OK;
1684 }
1685 
1686 /**
1687   * @brief  Read command (DCS or generic)
1688   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1689   *               the configuration information for the DSI.
1690   * @param  ChannelNbr  Virtual channel ID
1691   * @param  Array pointer to a buffer to store the payload of a read back operation.
1692   * @param  Size  Data size to be read (in byte).
1693   * @param  Mode  DSI read packet data type.
1694   *               This parameter can be any value of @arg DSI_SHORT_READ_PKT_Data_Type.
1695   * @param  DCSCmd  DCS get/read command.
1696   * @param  ParametersTable  Pointer to parameter values table.
1697   * @retval HAL status
1698   */
HAL_DSI_Read(DSI_HandleTypeDef * hdsi,uint32_t ChannelNbr,uint8_t * Array,uint32_t Size,uint32_t Mode,uint32_t DCSCmd,uint8_t * ParametersTable)1699 HAL_StatusTypeDef HAL_DSI_Read(DSI_HandleTypeDef *hdsi,
1700                                uint32_t ChannelNbr,
1701                                uint8_t *Array,
1702                                uint32_t Size,
1703                                uint32_t Mode,
1704                                uint32_t DCSCmd,
1705                                uint8_t *ParametersTable)
1706 {
1707   uint32_t tickstart;
1708   uint8_t *pdata = Array;
1709   uint32_t datasize = Size;
1710   uint32_t fifoword;
1711   uint32_t nbbytes;
1712   uint32_t count;
1713 
1714   /* Process locked */
1715   __HAL_LOCK(hdsi);
1716 
1717   /* Check the parameters */
1718   assert_param(IS_DSI_READ_PACKET_TYPE(Mode));
1719 
1720   if (datasize > 2U)
1721   {
1722     /* set max return packet size */
1723     if (DSI_ShortWrite(hdsi, ChannelNbr, DSI_MAX_RETURN_PKT_SIZE, ((datasize) & 0xFFU),
1724                            (((datasize) >> 8U) & 0xFFU)) != HAL_OK)
1725     {
1726       /* Process Unlocked */
1727       __HAL_UNLOCK(hdsi);
1728 
1729       return HAL_ERROR;
1730     }
1731   }
1732 
1733   /* Configure the packet to read command */
1734   if (Mode == DSI_DCS_SHORT_PKT_READ)
1735   {
1736     DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, DCSCmd, 0U);
1737   }
1738   else if (Mode == DSI_GEN_SHORT_PKT_READ_P0)
1739   {
1740     DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, 0U, 0U);
1741   }
1742   else if (Mode == DSI_GEN_SHORT_PKT_READ_P1)
1743   {
1744     DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], 0U);
1745   }
1746   else if (Mode == DSI_GEN_SHORT_PKT_READ_P2)
1747   {
1748     DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], ParametersTable[1U]);
1749   }
1750   else
1751   {
1752     /* Process Unlocked */
1753     __HAL_UNLOCK(hdsi);
1754 
1755     return HAL_ERROR;
1756   }
1757 
1758   /* Get tick */
1759   tickstart = HAL_GetTick();
1760 
1761   /* If DSI fifo is not empty, read requested bytes */
1762   while (((int32_t)(datasize)) > 0)
1763   {
1764     if ((hdsi->Instance->GPSR & DSI_GPSR_PRDFE) == 0U)
1765     {
1766       fifoword = hdsi->Instance->GPDR;
1767       nbbytes = (datasize < 4U) ? datasize : 4U;
1768 
1769       for (count = 0U; count < nbbytes; count++)
1770       {
1771         *pdata = (uint8_t)(fifoword >> (8U * count));
1772         pdata++;
1773         datasize--;
1774       }
1775     }
1776 
1777     /* Check for the Timeout */
1778     if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1779     {
1780       /* Process Unlocked */
1781       __HAL_UNLOCK(hdsi);
1782 
1783       return HAL_TIMEOUT;
1784     }
1785   }
1786 
1787   /* Process unlocked */
1788   __HAL_UNLOCK(hdsi);
1789 
1790   return HAL_OK;
1791 }
1792 
1793 /**
1794   * @brief  Enter the ULPM (Ultra Low Power Mode) with the D-PHY PLL running
1795   *         (only data lanes are in ULPM)
1796   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1797   *               the configuration information for the DSI.
1798   * @retval HAL status
1799   */
HAL_DSI_EnterULPMData(DSI_HandleTypeDef * hdsi)1800 HAL_StatusTypeDef HAL_DSI_EnterULPMData(DSI_HandleTypeDef *hdsi)
1801 {
1802   uint32_t tickstart;
1803 
1804   /* Process locked */
1805   __HAL_LOCK(hdsi);
1806 
1807   /* ULPS Request on Data Lanes */
1808   hdsi->Instance->PUCR |= DSI_PUCR_URDL;
1809 
1810   /* Get tick */
1811   tickstart = HAL_GetTick();
1812 
1813   /* Wait until the D-PHY active lanes enter into ULPM */
1814   if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
1815   {
1816     while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != 0U)
1817     {
1818       /* Check for the Timeout */
1819       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1820       {
1821         /* Process Unlocked */
1822         __HAL_UNLOCK(hdsi);
1823 
1824         return HAL_TIMEOUT;
1825       }
1826     }
1827   }
1828   else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
1829   {
1830     while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != 0U)
1831     {
1832       /* Check for the Timeout */
1833       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1834       {
1835         /* Process Unlocked */
1836         __HAL_UNLOCK(hdsi);
1837 
1838         return HAL_TIMEOUT;
1839       }
1840     }
1841   }
1842   else
1843   {
1844     /* Process unlocked */
1845     __HAL_UNLOCK(hdsi);
1846 
1847     return HAL_ERROR;
1848   }
1849 
1850   /* Process unlocked */
1851   __HAL_UNLOCK(hdsi);
1852 
1853   return HAL_OK;
1854 }
1855 
1856 /**
1857   * @brief  Exit the ULPM (Ultra Low Power Mode) with the D-PHY PLL running
1858   *         (only data lanes are in ULPM)
1859   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1860   *               the configuration information for the DSI.
1861   * @retval HAL status
1862   */
HAL_DSI_ExitULPMData(DSI_HandleTypeDef * hdsi)1863 HAL_StatusTypeDef HAL_DSI_ExitULPMData(DSI_HandleTypeDef *hdsi)
1864 {
1865   uint32_t tickstart;
1866 
1867   /* Process locked */
1868   __HAL_LOCK(hdsi);
1869 
1870   /* Exit ULPS on Data Lanes */
1871   hdsi->Instance->PUCR |= DSI_PUCR_UEDL;
1872 
1873   /* Get tick */
1874   tickstart = HAL_GetTick();
1875 
1876   /* Wait until all active lanes exit ULPM */
1877   if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
1878   {
1879     while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0)
1880     {
1881       /* Check for the Timeout */
1882       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1883       {
1884         /* Process Unlocked */
1885         __HAL_UNLOCK(hdsi);
1886 
1887         return HAL_TIMEOUT;
1888       }
1889     }
1890   }
1891   else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
1892   {
1893     while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1))
1894     {
1895       /* Check for the Timeout */
1896       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1897       {
1898         /* Process Unlocked */
1899         __HAL_UNLOCK(hdsi);
1900 
1901         return HAL_TIMEOUT;
1902       }
1903     }
1904   }
1905   else
1906   {
1907     /* Process unlocked */
1908     __HAL_UNLOCK(hdsi);
1909 
1910     return HAL_ERROR;
1911   }
1912 
1913   /* wait for 1 ms*/
1914   HAL_Delay(1U);
1915 
1916   /* De-assert the ULPM requests and the ULPM exit bits */
1917   hdsi->Instance->PUCR = 0U;
1918 
1919   /* Process unlocked */
1920   __HAL_UNLOCK(hdsi);
1921 
1922   return HAL_OK;
1923 }
1924 
1925 /**
1926   * @brief  Enter the ULPM (Ultra Low Power Mode) with the D-PHY PLL turned off
1927   *         (both data and clock lanes are in ULPM)
1928   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
1929   *               the configuration information for the DSI.
1930   * @retval HAL status
1931   */
HAL_DSI_EnterULPM(DSI_HandleTypeDef * hdsi)1932 HAL_StatusTypeDef HAL_DSI_EnterULPM(DSI_HandleTypeDef *hdsi)
1933 {
1934   uint32_t tickstart;
1935 
1936   /* Process locked */
1937   __HAL_LOCK(hdsi);
1938 
1939   /* Clock lane configuration: no more HS request */
1940   hdsi->Instance->CLCR &= ~DSI_CLCR_DPCC;
1941 
1942   /* Use system PLL as byte lane clock source before stopping DSIPHY clock source */
1943   __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_PLLSAI2);
1944 
1945   /* ULPS Request on Clock and Data Lanes */
1946   hdsi->Instance->PUCR |= (DSI_PUCR_URCL | DSI_PUCR_URDL);
1947 
1948   /* Get tick */
1949   tickstart = HAL_GetTick();
1950 
1951   /* Wait until all active lanes exit ULPM */
1952   if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
1953   {
1954     while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != 0U)
1955     {
1956       /* Check for the Timeout */
1957       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1958       {
1959         /* Process Unlocked */
1960         __HAL_UNLOCK(hdsi);
1961 
1962         return HAL_TIMEOUT;
1963       }
1964     }
1965   }
1966   else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
1967   {
1968     while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != 0U)
1969     {
1970       /* Check for the Timeout */
1971       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1972       {
1973         /* Process Unlocked */
1974         __HAL_UNLOCK(hdsi);
1975 
1976         return HAL_TIMEOUT;
1977       }
1978     }
1979   }
1980   else
1981   {
1982     /* Process unlocked */
1983     __HAL_UNLOCK(hdsi);
1984 
1985     return HAL_ERROR;
1986   }
1987 
1988   /* Turn off the DSI PLL */
1989   __HAL_DSI_PLL_DISABLE(hdsi);
1990 
1991   /* Process unlocked */
1992   __HAL_UNLOCK(hdsi);
1993 
1994   return HAL_OK;
1995 }
1996 
1997 /**
1998   * @brief  Exit the ULPM (Ultra Low Power Mode) with the D-PHY PLL turned off
1999   *         (both data and clock lanes are in ULPM)
2000   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2001   *               the configuration information for the DSI.
2002   * @retval HAL status
2003   */
HAL_DSI_ExitULPM(DSI_HandleTypeDef * hdsi)2004 HAL_StatusTypeDef HAL_DSI_ExitULPM(DSI_HandleTypeDef *hdsi)
2005 {
2006   uint32_t tickstart;
2007 
2008   /* Process locked */
2009   __HAL_LOCK(hdsi);
2010 
2011   /* Turn on the DSI PLL */
2012   __HAL_DSI_PLL_ENABLE(hdsi);
2013 
2014   /* Get tick */
2015   tickstart = HAL_GetTick();
2016 
2017   /* Wait for the lock of the PLL */
2018   while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)
2019   {
2020     /* Check for the Timeout */
2021     if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2022     {
2023       /* Process Unlocked */
2024       __HAL_UNLOCK(hdsi);
2025 
2026       return HAL_TIMEOUT;
2027     }
2028   }
2029 
2030   /* Exit ULPS on Clock and Data Lanes */
2031   hdsi->Instance->PUCR |= (DSI_PUCR_UECL | DSI_PUCR_UEDL);
2032 
2033   /* Get tick */
2034   tickstart = HAL_GetTick();
2035 
2036   /* Wait until all active lanes exit ULPM */
2037   if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2038   {
2039     while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UANC))
2040     {
2041       /* Check for the Timeout */
2042       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2043       {
2044         /* Process Unlocked */
2045         __HAL_UNLOCK(hdsi);
2046 
2047         return HAL_TIMEOUT;
2048       }
2049     }
2050   }
2051   else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2052   {
2053     while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1 |
2054                                                                                     DSI_PSR_UANC))
2055     {
2056       /* Check for the Timeout */
2057       if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2058       {
2059         /* Process Unlocked */
2060         __HAL_UNLOCK(hdsi);
2061 
2062         return HAL_TIMEOUT;
2063       }
2064     }
2065   }
2066   else
2067   {
2068     /* Process unlocked */
2069     __HAL_UNLOCK(hdsi);
2070 
2071     return HAL_ERROR;
2072   }
2073 
2074   /* wait for 1 ms */
2075   HAL_Delay(1U);
2076 
2077   /* De-assert the ULPM requests and the ULPM exit bits */
2078   hdsi->Instance->PUCR = 0U;
2079 
2080   /* Switch the lanbyteclock source in the RCC from system PLL to D-PHY */
2081   __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_DSIPHY);
2082 
2083   /* Restore clock lane configuration to HS */
2084   hdsi->Instance->CLCR |= DSI_CLCR_DPCC;
2085 
2086   /* Process unlocked */
2087   __HAL_UNLOCK(hdsi);
2088 
2089   return HAL_OK;
2090 }
2091 
2092 /**
2093   * @brief  Start test pattern generation
2094   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2095   *               the configuration information for the DSI.
2096   * @param  Mode  Pattern generator mode
2097   *          This parameter can be one of the following values:
2098   *           0 : Color bars (horizontal or vertical)
2099   *           1 : BER pattern (vertical only)
2100   * @param  Orientation  Pattern generator orientation
2101   *          This parameter can be one of the following values:
2102   *           0 : Vertical color bars
2103   *           1 : Horizontal color bars
2104   * @retval HAL status
2105   */
HAL_DSI_PatternGeneratorStart(DSI_HandleTypeDef * hdsi,uint32_t Mode,uint32_t Orientation)2106 HAL_StatusTypeDef HAL_DSI_PatternGeneratorStart(DSI_HandleTypeDef *hdsi, uint32_t Mode, uint32_t Orientation)
2107 {
2108   /* Process locked */
2109   __HAL_LOCK(hdsi);
2110 
2111   /* Configure pattern generator mode and orientation */
2112   hdsi->Instance->VMCR &= ~(DSI_VMCR_PGM | DSI_VMCR_PGO);
2113   hdsi->Instance->VMCR |= ((Mode << 20U) | (Orientation << 24U));
2114 
2115   /* Enable pattern generator by setting PGE bit */
2116   hdsi->Instance->VMCR |= DSI_VMCR_PGE;
2117 
2118   /* Process unlocked */
2119   __HAL_UNLOCK(hdsi);
2120 
2121   return HAL_OK;
2122 }
2123 
2124 /**
2125   * @brief  Stop test pattern generation
2126   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2127   *               the configuration information for the DSI.
2128   * @retval HAL status
2129   */
HAL_DSI_PatternGeneratorStop(DSI_HandleTypeDef * hdsi)2130 HAL_StatusTypeDef HAL_DSI_PatternGeneratorStop(DSI_HandleTypeDef *hdsi)
2131 {
2132   /* Process locked */
2133   __HAL_LOCK(hdsi);
2134 
2135   /* Disable pattern generator by clearing PGE bit */
2136   hdsi->Instance->VMCR &= ~DSI_VMCR_PGE;
2137 
2138   /* Process unlocked */
2139   __HAL_UNLOCK(hdsi);
2140 
2141   return HAL_OK;
2142 }
2143 
2144 /**
2145   * @brief  Set Slew-Rate And Delay Tuning
2146   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2147   *               the configuration information for the DSI.
2148   * @param  CommDelay  Communication delay to be adjusted.
2149   *                    This parameter can be any value of @arg DSI_Communication_Delay
2150   * @param  Lane  select between clock or data lanes.
2151   *               This parameter can be any value of @arg DSI_Lane_Group
2152   * @param  Value  Custom value of the slew-rate or delay
2153   * @retval HAL status
2154   */
HAL_DSI_SetSlewRateAndDelayTuning(DSI_HandleTypeDef * hdsi,uint32_t CommDelay,uint32_t Lane,uint32_t Value)2155 HAL_StatusTypeDef HAL_DSI_SetSlewRateAndDelayTuning(DSI_HandleTypeDef *hdsi, uint32_t CommDelay, uint32_t Lane,
2156                                                     uint32_t Value)
2157 {
2158   /* Process locked */
2159   __HAL_LOCK(hdsi);
2160 
2161   /* Check function parameters */
2162   assert_param(IS_DSI_COMMUNICATION_DELAY(CommDelay));
2163   assert_param(IS_DSI_LANE_GROUP(Lane));
2164 
2165   switch (CommDelay)
2166   {
2167     case DSI_SLEW_RATE_HSTX:
2168       if (Lane == DSI_CLOCK_LANE)
2169       {
2170         /* High-Speed Transmission Slew Rate Control on Clock Lane */
2171         hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCCL;
2172         hdsi->Instance->WPCR[1U] |= Value << 16U;
2173       }
2174       else if (Lane == DSI_DATA_LANES)
2175       {
2176         /* High-Speed Transmission Slew Rate Control on Data Lanes */
2177         hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCDL;
2178         hdsi->Instance->WPCR[1U] |= Value << 18U;
2179       }
2180       else
2181       {
2182         /* Process unlocked */
2183         __HAL_UNLOCK(hdsi);
2184 
2185         return HAL_ERROR;
2186       }
2187       break;
2188     case DSI_SLEW_RATE_LPTX:
2189       if (Lane == DSI_CLOCK_LANE)
2190       {
2191         /* Low-Power transmission Slew Rate Compensation on Clock Lane */
2192         hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCCL;
2193         hdsi->Instance->WPCR[1U] |= Value << 6U;
2194       }
2195       else if (Lane == DSI_DATA_LANES)
2196       {
2197         /* Low-Power transmission Slew Rate Compensation on Data Lanes */
2198         hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCDL;
2199         hdsi->Instance->WPCR[1U] |= Value << 8U;
2200       }
2201       else
2202       {
2203         /* Process unlocked */
2204         __HAL_UNLOCK(hdsi);
2205 
2206         return HAL_ERROR;
2207       }
2208       break;
2209     case DSI_HS_DELAY:
2210       if (Lane == DSI_CLOCK_LANE)
2211       {
2212         /* High-Speed Transmission Delay on Clock Lane */
2213         hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDCL;
2214         hdsi->Instance->WPCR[1U] |= Value;
2215       }
2216       else if (Lane == DSI_DATA_LANES)
2217       {
2218         /* High-Speed Transmission Delay on Data Lanes */
2219         hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDDL;
2220         hdsi->Instance->WPCR[1U] |= Value << 2U;
2221       }
2222       else
2223       {
2224         /* Process unlocked */
2225         __HAL_UNLOCK(hdsi);
2226 
2227         return HAL_ERROR;
2228       }
2229       break;
2230     default:
2231       break;
2232   }
2233 
2234   /* Process unlocked */
2235   __HAL_UNLOCK(hdsi);
2236 
2237   return HAL_OK;
2238 }
2239 
2240 /**
2241   * @brief  Low-Power Reception Filter Tuning
2242   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2243   *               the configuration information for the DSI.
2244   * @param  Frequency  cutoff frequency of low-pass filter at the input of LPRX
2245   * @retval HAL status
2246   */
HAL_DSI_SetLowPowerRXFilter(DSI_HandleTypeDef * hdsi,uint32_t Frequency)2247 HAL_StatusTypeDef HAL_DSI_SetLowPowerRXFilter(DSI_HandleTypeDef *hdsi, uint32_t Frequency)
2248 {
2249   /* Process locked */
2250   __HAL_LOCK(hdsi);
2251 
2252   /* Low-Power RX low-pass Filtering Tuning */
2253   hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPRXFT;
2254   hdsi->Instance->WPCR[1U] |= Frequency << 25U;
2255 
2256   /* Process unlocked */
2257   __HAL_UNLOCK(hdsi);
2258 
2259   return HAL_OK;
2260 }
2261 
2262 /**
2263   * @brief  Activate an additional current path on all lanes to meet the SDDTx parameter
2264   *         defined in the MIPI D-PHY specification
2265   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2266   *               the configuration information for the DSI.
2267   * @param  State  ENABLE or DISABLE
2268   * @retval HAL status
2269   */
HAL_DSI_SetSDD(DSI_HandleTypeDef * hdsi,FunctionalState State)2270 HAL_StatusTypeDef HAL_DSI_SetSDD(DSI_HandleTypeDef *hdsi, FunctionalState State)
2271 {
2272   /* Process locked */
2273   __HAL_LOCK(hdsi);
2274 
2275   /* Check function parameters */
2276   assert_param(IS_FUNCTIONAL_STATE(State));
2277 
2278   /* Activate/Disactivate additional current path on all lanes */
2279   hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_SDDC;
2280   hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 12U);
2281 
2282   /* Process unlocked */
2283   __HAL_UNLOCK(hdsi);
2284 
2285   return HAL_OK;
2286 }
2287 
2288 /**
2289   * @brief  Custom lane pins configuration
2290   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2291   *               the configuration information for the DSI.
2292   * @param  CustomLane  Function to be applyed on selected lane.
2293   *                     This parameter can be any value of @arg DSI_CustomLane
2294   * @param  Lane  select between clock or data lane 0 or data lane 1.
2295   *               This parameter can be any value of @arg DSI_Lane_Select
2296   * @param  State  ENABLE or DISABLE
2297   * @retval HAL status
2298   */
HAL_DSI_SetLanePinsConfiguration(DSI_HandleTypeDef * hdsi,uint32_t CustomLane,uint32_t Lane,FunctionalState State)2299 HAL_StatusTypeDef HAL_DSI_SetLanePinsConfiguration(DSI_HandleTypeDef *hdsi, uint32_t CustomLane, uint32_t Lane,
2300                                                    FunctionalState State)
2301 {
2302   /* Process locked */
2303   __HAL_LOCK(hdsi);
2304 
2305   /* Check function parameters */
2306   assert_param(IS_DSI_CUSTOM_LANE(CustomLane));
2307   assert_param(IS_DSI_LANE(Lane));
2308   assert_param(IS_FUNCTIONAL_STATE(State));
2309 
2310   switch (CustomLane)
2311   {
2312     case DSI_SWAP_LANE_PINS:
2313       if (Lane == DSI_CLK_LANE)
2314       {
2315         /* Swap pins on clock lane */
2316         hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWCL;
2317         hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 6U);
2318       }
2319       else if (Lane == DSI_DATA_LANE0)
2320       {
2321         /* Swap pins on data lane 0 */
2322         hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL0;
2323         hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 7U);
2324       }
2325       else if (Lane == DSI_DATA_LANE1)
2326       {
2327         /* Swap pins on data lane 1 */
2328         hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL1;
2329         hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 8U);
2330       }
2331       else
2332       {
2333         /* Process unlocked */
2334         __HAL_UNLOCK(hdsi);
2335 
2336         return HAL_ERROR;
2337       }
2338       break;
2339     case DSI_INVERT_HS_SIGNAL:
2340       if (Lane == DSI_CLK_LANE)
2341       {
2342         /* Invert HS signal on clock lane */
2343         hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSICL;
2344         hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 9U);
2345       }
2346       else if (Lane == DSI_DATA_LANE0)
2347       {
2348         /* Invert HS signal on data lane 0 */
2349         hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL0;
2350         hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 10U);
2351       }
2352       else if (Lane == DSI_DATA_LANE1)
2353       {
2354         /* Invert HS signal on data lane 1 */
2355         hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL1;
2356         hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 11U);
2357       }
2358       else
2359       {
2360         /* Process unlocked */
2361         __HAL_UNLOCK(hdsi);
2362 
2363         return HAL_ERROR;
2364       }
2365       break;
2366     default:
2367       break;
2368   }
2369 
2370   /* Process unlocked */
2371   __HAL_UNLOCK(hdsi);
2372 
2373   return HAL_OK;
2374 }
2375 
2376 /**
2377   * @brief  Set custom timing for the PHY
2378   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2379   *               the configuration information for the DSI.
2380   * @param  Timing  PHY timing to be adjusted.
2381   *                 This parameter can be any value of @arg DSI_PHY_Timing
2382   * @param  State  ENABLE or DISABLE
2383   * @param  Value  Custom value of the timing
2384   * @retval HAL status
2385   */
HAL_DSI_SetPHYTimings(DSI_HandleTypeDef * hdsi,uint32_t Timing,FunctionalState State,uint32_t Value)2386 HAL_StatusTypeDef HAL_DSI_SetPHYTimings(DSI_HandleTypeDef *hdsi, uint32_t Timing, FunctionalState State, uint32_t Value)
2387 {
2388   /* Process locked */
2389   __HAL_LOCK(hdsi);
2390 
2391   /* Check function parameters */
2392   assert_param(IS_DSI_PHY_TIMING(Timing));
2393   assert_param(IS_FUNCTIONAL_STATE(State));
2394 
2395   switch (Timing)
2396   {
2397     case DSI_TCLK_POST:
2398       /* Enable/Disable custom timing setting */
2399       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPOSTEN;
2400       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 27U);
2401 
2402       if (State != DISABLE)
2403       {
2404         /* Set custom value */
2405         hdsi->Instance->WPCR[4U] &= ~DSI_WPCR4_TCLKPOST;
2406         hdsi->Instance->WPCR[4U] |= Value & DSI_WPCR4_TCLKPOST;
2407       }
2408 
2409       break;
2410     case DSI_TLPX_CLK:
2411       /* Enable/Disable custom timing setting */
2412       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXCEN;
2413       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 26U);
2414 
2415       if (State != DISABLE)
2416       {
2417         /* Set custom value */
2418         hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXC;
2419         hdsi->Instance->WPCR[3U] |= (Value << 24U) & DSI_WPCR3_TLPXC;
2420       }
2421 
2422       break;
2423     case DSI_THS_EXIT:
2424       /* Enable/Disable custom timing setting */
2425       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSEXITEN;
2426       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 25U);
2427 
2428       if (State != DISABLE)
2429       {
2430         /* Set custom value */
2431         hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSEXIT;
2432         hdsi->Instance->WPCR[3U] |= (Value << 16U) & DSI_WPCR3_THSEXIT;
2433       }
2434 
2435       break;
2436     case DSI_TLPX_DATA:
2437       /* Enable/Disable custom timing setting */
2438       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXDEN;
2439       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 24U);
2440 
2441       if (State != DISABLE)
2442       {
2443         /* Set custom value */
2444         hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXD;
2445         hdsi->Instance->WPCR[3U] |= (Value << 8U) & DSI_WPCR3_TLPXD;
2446       }
2447 
2448       break;
2449     case DSI_THS_ZERO:
2450       /* Enable/Disable custom timing setting */
2451       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSZEROEN;
2452       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 23U);
2453 
2454       if (State != DISABLE)
2455       {
2456         /* Set custom value */
2457         hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSZERO;
2458         hdsi->Instance->WPCR[3U] |= Value & DSI_WPCR3_THSZERO;
2459       }
2460 
2461       break;
2462     case DSI_THS_TRAIL:
2463       /* Enable/Disable custom timing setting */
2464       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSTRAILEN;
2465       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 22U);
2466 
2467       if (State != DISABLE)
2468       {
2469         /* Set custom value */
2470         hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSTRAIL;
2471         hdsi->Instance->WPCR[2U] |= (Value << 24U) & DSI_WPCR2_THSTRAIL;
2472       }
2473 
2474       break;
2475     case DSI_THS_PREPARE:
2476       /* Enable/Disable custom timing setting */
2477       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSPREPEN;
2478       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 21U);
2479 
2480       if (State != DISABLE)
2481       {
2482         /* Set custom value */
2483         hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSPREP;
2484         hdsi->Instance->WPCR[2U] |= (Value << 16U) & DSI_WPCR2_THSPREP;
2485       }
2486 
2487       break;
2488     case DSI_TCLK_ZERO:
2489       /* Enable/Disable custom timing setting */
2490       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKZEROEN;
2491       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 20U);
2492 
2493       if (State != DISABLE)
2494       {
2495         /* Set custom value */
2496         hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKZERO;
2497         hdsi->Instance->WPCR[2U] |= (Value << 8U) & DSI_WPCR2_TCLKZERO;
2498       }
2499 
2500       break;
2501     case DSI_TCLK_PREPARE:
2502       /* Enable/Disable custom timing setting */
2503       hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPREPEN;
2504       hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 19U);
2505 
2506       if (State != DISABLE)
2507       {
2508         /* Set custom value */
2509         hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKPREP;
2510         hdsi->Instance->WPCR[2U] |= Value & DSI_WPCR2_TCLKPREP;
2511       }
2512 
2513       break;
2514     default:
2515       break;
2516   }
2517 
2518   /* Process unlocked */
2519   __HAL_UNLOCK(hdsi);
2520 
2521   return HAL_OK;
2522 }
2523 
2524 /**
2525   * @brief  Force the Clock/Data Lane in TX Stop Mode
2526   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2527   *               the configuration information for the DSI.
2528   * @param  Lane  select between clock or data lanes.
2529   *               This parameter can be any value of @arg DSI_Lane_Group
2530   * @param  State  ENABLE or DISABLE
2531   * @retval HAL status
2532   */
HAL_DSI_ForceTXStopMode(DSI_HandleTypeDef * hdsi,uint32_t Lane,FunctionalState State)2533 HAL_StatusTypeDef HAL_DSI_ForceTXStopMode(DSI_HandleTypeDef *hdsi, uint32_t Lane, FunctionalState State)
2534 {
2535   /* Process locked */
2536   __HAL_LOCK(hdsi);
2537 
2538   /* Check function parameters */
2539   assert_param(IS_DSI_LANE_GROUP(Lane));
2540   assert_param(IS_FUNCTIONAL_STATE(State));
2541 
2542   if (Lane == DSI_CLOCK_LANE)
2543   {
2544     /* Force/Unforce the Clock Lane in TX Stop Mode */
2545     hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMCL;
2546     hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 12U);
2547   }
2548   else if (Lane == DSI_DATA_LANES)
2549   {
2550     /* Force/Unforce the Data Lanes in TX Stop Mode */
2551     hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMDL;
2552     hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 13U);
2553   }
2554   else
2555   {
2556     /* Process unlocked */
2557     __HAL_UNLOCK(hdsi);
2558 
2559     return HAL_ERROR;
2560   }
2561 
2562   /* Process unlocked */
2563   __HAL_UNLOCK(hdsi);
2564 
2565   return HAL_OK;
2566 }
2567 
2568 /**
2569   * @brief  Force LP Receiver in Low-Power Mode
2570   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2571   *               the configuration information for the DSI.
2572   * @param  State  ENABLE or DISABLE
2573   * @retval HAL status
2574   */
HAL_DSI_ForceRXLowPower(DSI_HandleTypeDef * hdsi,FunctionalState State)2575 HAL_StatusTypeDef HAL_DSI_ForceRXLowPower(DSI_HandleTypeDef *hdsi, FunctionalState State)
2576 {
2577   /* Process locked */
2578   __HAL_LOCK(hdsi);
2579 
2580   /* Check function parameters */
2581   assert_param(IS_FUNCTIONAL_STATE(State));
2582 
2583   /* Force/Unforce LP Receiver in Low-Power Mode */
2584   hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_FLPRXLPM;
2585   hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 22U);
2586 
2587   /* Process unlocked */
2588   __HAL_UNLOCK(hdsi);
2589 
2590   return HAL_OK;
2591 }
2592 
2593 /**
2594   * @brief  Force Data Lanes in RX Mode after a BTA
2595   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2596   *               the configuration information for the DSI.
2597   * @param  State  ENABLE or DISABLE
2598   * @retval HAL status
2599   */
HAL_DSI_ForceDataLanesInRX(DSI_HandleTypeDef * hdsi,FunctionalState State)2600 HAL_StatusTypeDef HAL_DSI_ForceDataLanesInRX(DSI_HandleTypeDef *hdsi, FunctionalState State)
2601 {
2602   /* Process locked */
2603   __HAL_LOCK(hdsi);
2604 
2605   /* Check function parameters */
2606   assert_param(IS_FUNCTIONAL_STATE(State));
2607 
2608   /* Force Data Lanes in RX Mode */
2609   hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TDDL;
2610   hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 16U);
2611 
2612   /* Process unlocked */
2613   __HAL_UNLOCK(hdsi);
2614 
2615   return HAL_OK;
2616 }
2617 
2618 /**
2619   * @brief  Enable a pull-down on the lanes to prevent from floating states when unused
2620   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2621   *               the configuration information for the DSI.
2622   * @param  State  ENABLE or DISABLE
2623   * @retval HAL status
2624   */
HAL_DSI_SetPullDown(DSI_HandleTypeDef * hdsi,FunctionalState State)2625 HAL_StatusTypeDef HAL_DSI_SetPullDown(DSI_HandleTypeDef *hdsi, FunctionalState State)
2626 {
2627   /* Process locked */
2628   __HAL_LOCK(hdsi);
2629 
2630   /* Check function parameters */
2631   assert_param(IS_FUNCTIONAL_STATE(State));
2632 
2633   /* Enable/Disable pull-down on lanes */
2634   hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_PDEN;
2635   hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 18U);
2636 
2637   /* Process unlocked */
2638   __HAL_UNLOCK(hdsi);
2639 
2640   return HAL_OK;
2641 }
2642 
2643 /**
2644   * @brief  Switch off the contention detection on data lanes
2645   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2646   *               the configuration information for the DSI.
2647   * @param  State  ENABLE or DISABLE
2648   * @retval HAL status
2649   */
HAL_DSI_SetContentionDetectionOff(DSI_HandleTypeDef * hdsi,FunctionalState State)2650 HAL_StatusTypeDef HAL_DSI_SetContentionDetectionOff(DSI_HandleTypeDef *hdsi, FunctionalState State)
2651 {
2652   /* Process locked */
2653   __HAL_LOCK(hdsi);
2654 
2655   /* Check function parameters */
2656   assert_param(IS_FUNCTIONAL_STATE(State));
2657 
2658   /* Contention Detection on Data Lanes OFF */
2659   hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_CDOFFDL;
2660   hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 14U);
2661 
2662   /* Process unlocked */
2663   __HAL_UNLOCK(hdsi);
2664 
2665   return HAL_OK;
2666 }
2667 
2668 /**
2669   * @}
2670   */
2671 
2672 /** @defgroup DSI_Group4 Peripheral State and Errors functions
2673   *  @brief    Peripheral State and Errors functions
2674   *
2675 @verbatim
2676  ===============================================================================
2677                   ##### Peripheral State and Errors functions #####
2678  ===============================================================================
2679     [..]
2680     This subsection provides functions allowing to
2681       (+) Check the DSI state.
2682       (+) Get error code.
2683 
2684 @endverbatim
2685   * @{
2686   */
2687 
2688 /**
2689   * @brief  Return the DSI state
2690   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2691   *               the configuration information for the DSI.
2692   * @retval HAL state
2693   */
HAL_DSI_GetState(DSI_HandleTypeDef * hdsi)2694 HAL_DSI_StateTypeDef HAL_DSI_GetState(DSI_HandleTypeDef *hdsi)
2695 {
2696   return hdsi->State;
2697 }
2698 
2699 /**
2700   * @brief  Return the DSI error code
2701   * @param  hdsi  pointer to a DSI_HandleTypeDef structure that contains
2702   *               the configuration information for the DSI.
2703   * @retval DSI Error Code
2704   */
HAL_DSI_GetError(DSI_HandleTypeDef * hdsi)2705 uint32_t HAL_DSI_GetError(DSI_HandleTypeDef *hdsi)
2706 {
2707   /* Get the error code */
2708   return hdsi->ErrorCode;
2709 }
2710 
2711 /**
2712   * @}
2713   */
2714 
2715 /**
2716   * @}
2717   */
2718 
2719 /**
2720   * @}
2721   */
2722 
2723 #endif /* DSI */
2724 
2725 #endif /* HAL_DSI_MODULE_ENABLED */
2726 
2727 /**
2728   * @}
2729   */
2730 
2731 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
2732