STM32L443xx HAL User Manual
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32l4xx_hal_dsi.c 00004 * @author MCD Application Team 00005 * @brief DSI HAL module driver. 00006 * This file provides firmware functions to manage the following 00007 * functionalities of the DSI peripheral: 00008 * + Initialization and de-initialization functions 00009 * + IO operation functions 00010 * + Peripheral Control functions 00011 * + Peripheral State and Errors functions 00012 ****************************************************************************** 00013 * @attention 00014 * 00015 * Copyright (c) 2017 STMicroelectronics. 00016 * All rights reserved. 00017 * 00018 * This software is licensed under terms that can be found in the LICENSE file 00019 * in the root directory of this software component. 00020 * If no LICENSE file comes with this software, it is provided AS-IS. 00021 * 00022 ****************************************************************************** 00023 @verbatim 00024 ============================================================================== 00025 ##### How to use this driver ##### 00026 ============================================================================== 00027 [..] 00028 The DSI HAL driver can be used as follows: 00029 00030 (#) Declare a DSI_HandleTypeDef handle structure, for example: DSI_HandleTypeDef hdsi; 00031 00032 (#) Initialize the DSI low level resources by implementing the HAL_DSI_MspInit() API: 00033 (##) Enable the DSI interface clock 00034 (##) NVIC configuration if you need to use interrupt process 00035 (+++) Configure the DSI interrupt priority 00036 (+++) Enable the NVIC DSI IRQ Channel 00037 00038 (#) Initialize the DSI Host peripheral, the required PLL parameters, number of lances and 00039 TX Escape clock divider by calling the HAL_DSI_Init() API which calls HAL_DSI_MspInit(). 00040 00041 *** Configuration *** 00042 ========================= 00043 [..] 00044 (#) Use HAL_DSI_ConfigAdaptedCommandMode() function to configure the DSI host in adapted 00045 command mode. 00046 00047 (#) When operating in video mode , use HAL_DSI_ConfigVideoMode() to configure the DSI host. 00048 00049 (#) Function HAL_DSI_ConfigCommand() is used to configure the DSI commands behavior in low power mode. 00050 00051 (#) To configure the DSI PHY timings parameters, use function HAL_DSI_ConfigPhyTimer(). 00052 00053 (#) The DSI Host can be started/stopped using respectively functions HAL_DSI_Start() and HAL_DSI_Stop(). 00054 Functions HAL_DSI_ShortWrite(), HAL_DSI_LongWrite() and HAL_DSI_Read() allows respectively 00055 to write DSI short packets, long packets and to read DSI packets. 00056 00057 (#) The DSI Host Offers two Low power modes : 00058 (++) Low Power Mode on data lanes only: Only DSI data lanes are shut down. 00059 It is possible to enter/exit from this mode using respectively functions HAL_DSI_EnterULPMData() 00060 and HAL_DSI_ExitULPMData() 00061 00062 (++) Low Power Mode on data and clock lanes : All DSI lanes are shut down including data and clock lanes. 00063 It is possible to enter/exit from this mode using respectively functions HAL_DSI_EnterULPM() 00064 and HAL_DSI_ExitULPM() 00065 00066 (#) To control DSI state you can use the following function: HAL_DSI_GetState() 00067 00068 *** Error management *** 00069 ======================== 00070 [..] 00071 (#) User can select the DSI errors to be reported/monitored using function HAL_DSI_ConfigErrorMonitor() 00072 When an error occurs, the callback HAL_DSI_ErrorCallback() is asserted and then user can retrieve 00073 the error code by calling function HAL_DSI_GetError() 00074 00075 *** DSI HAL driver macros list *** 00076 ============================================= 00077 [..] 00078 Below the list of most used macros in DSI HAL driver. 00079 00080 (+) __HAL_DSI_ENABLE: Enable the DSI Host. 00081 (+) __HAL_DSI_DISABLE: Disable the DSI Host. 00082 (+) __HAL_DSI_WRAPPER_ENABLE: Enables the DSI wrapper. 00083 (+) __HAL_DSI_WRAPPER_DISABLE: Disable the DSI wrapper. 00084 (+) __HAL_DSI_PLL_ENABLE: Enables the DSI PLL. 00085 (+) __HAL_DSI_PLL_DISABLE: Disables the DSI PLL. 00086 (+) __HAL_DSI_REG_ENABLE: Enables the DSI regulator. 00087 (+) __HAL_DSI_REG_DISABLE: Disables the DSI regulator. 00088 (+) __HAL_DSI_GET_FLAG: Get the DSI pending flags. 00089 (+) __HAL_DSI_CLEAR_FLAG: Clears the DSI pending flags. 00090 (+) __HAL_DSI_ENABLE_IT: Enables the specified DSI interrupts. 00091 (+) __HAL_DSI_DISABLE_IT: Disables the specified DSI interrupts. 00092 (+) __HAL_DSI_GET_IT_SOURCE: Checks whether the specified DSI interrupt source is enabled or not. 00093 00094 [..] 00095 (@) You can refer to the DSI HAL driver header file for more useful macros 00096 00097 *** Callback registration *** 00098 ============================================= 00099 [..] 00100 The compilation define USE_HAL_DSI_REGISTER_CALLBACKS when set to 1 00101 allows the user to configure dynamically the driver callbacks. 00102 Use Function HAL_DSI_RegisterCallback() to register a callback. 00103 00104 [..] 00105 Function HAL_DSI_RegisterCallback() allows to register following callbacks: 00106 (+) TearingEffectCallback : DSI Tearing Effect Callback. 00107 (+) EndOfRefreshCallback : DSI End Of Refresh Callback. 00108 (+) ErrorCallback : DSI Error Callback 00109 (+) MspInitCallback : DSI MspInit. 00110 (+) MspDeInitCallback : DSI MspDeInit. 00111 [..] 00112 This function takes as parameters the HAL peripheral handle, the callback ID 00113 and a pointer to the user callback function. 00114 00115 [..] 00116 Use function HAL_DSI_UnRegisterCallback() to reset a callback to the default 00117 weak function. 00118 HAL_DSI_UnRegisterCallback takes as parameters the HAL peripheral handle, 00119 and the callback ID. 00120 [..] 00121 This function allows to reset following callbacks: 00122 (+) TearingEffectCallback : DSI Tearing Effect Callback. 00123 (+) EndOfRefreshCallback : DSI End Of Refresh Callback. 00124 (+) ErrorCallback : DSI Error Callback 00125 (+) MspInitCallback : DSI MspInit. 00126 (+) MspDeInitCallback : DSI MspDeInit. 00127 00128 [..] 00129 By default, after the HAL_DSI_Init and when the state is HAL_DSI_STATE_RESET 00130 all callbacks are set to the corresponding weak functions: 00131 examples HAL_DSI_TearingEffectCallback(), HAL_DSI_EndOfRefreshCallback(). 00132 Exception done for MspInit and MspDeInit functions that are respectively 00133 reset to the legacy weak (surcharged) functions in the HAL_DSI_Init() 00134 and HAL_DSI_DeInit() only when these callbacks are null (not registered beforehand). 00135 If not, MspInit or MspDeInit are not null, the HAL_DSI_Init() and HAL_DSI_DeInit() 00136 keep and use the user MspInit/MspDeInit callbacks (registered beforehand). 00137 00138 [..] 00139 Callbacks can be registered/unregistered in HAL_DSI_STATE_READY state only. 00140 Exception done MspInit/MspDeInit that can be registered/unregistered 00141 in HAL_DSI_STATE_READY or HAL_DSI_STATE_RESET state, 00142 thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. 00143 In that case first register the MspInit/MspDeInit user callbacks 00144 using HAL_DSI_RegisterCallback() before calling HAL_DSI_DeInit() 00145 or HAL_DSI_Init() function. 00146 00147 [..] 00148 When The compilation define USE_HAL_DSI_REGISTER_CALLBACKS is set to 0 or 00149 not defined, the callback registration feature is not available and all callbacks 00150 are set to the corresponding weak functions. 00151 00152 @endverbatim 00153 ****************************************************************************** 00154 */ 00155 00156 /* Includes ------------------------------------------------------------------*/ 00157 #include "stm32l4xx_hal.h" 00158 00159 /** @addtogroup STM32L4xx_HAL_Driver 00160 * @{ 00161 */ 00162 00163 #ifdef HAL_DSI_MODULE_ENABLED 00164 00165 #if defined(DSI) 00166 00167 /** @addtogroup DSI 00168 * @{ 00169 */ 00170 00171 /* Private types -------------------------------------------------------------*/ 00172 /* Private defines -----------------------------------------------------------*/ 00173 /** @addtogroup DSI_Private_Constants 00174 * @{ 00175 */ 00176 #define DSI_TIMEOUT_VALUE ((uint32_t)100U) /* 100ms */ 00177 00178 #define DSI_ERROR_ACK_MASK (DSI_ISR0_AE0 | DSI_ISR0_AE1 | DSI_ISR0_AE2 | DSI_ISR0_AE3 | \ 00179 DSI_ISR0_AE4 | DSI_ISR0_AE5 | DSI_ISR0_AE6 | DSI_ISR0_AE7 | \ 00180 DSI_ISR0_AE8 | DSI_ISR0_AE9 | DSI_ISR0_AE10 | DSI_ISR0_AE11 | \ 00181 DSI_ISR0_AE12 | DSI_ISR0_AE13 | DSI_ISR0_AE14 | DSI_ISR0_AE15) 00182 #define DSI_ERROR_PHY_MASK (DSI_ISR0_PE0 | DSI_ISR0_PE1 | DSI_ISR0_PE2 | DSI_ISR0_PE3 | DSI_ISR0_PE4) 00183 #define DSI_ERROR_TX_MASK DSI_ISR1_TOHSTX 00184 #define DSI_ERROR_RX_MASK DSI_ISR1_TOLPRX 00185 #define DSI_ERROR_ECC_MASK (DSI_ISR1_ECCSE | DSI_ISR1_ECCME) 00186 #define DSI_ERROR_CRC_MASK DSI_ISR1_CRCE 00187 #define DSI_ERROR_PSE_MASK DSI_ISR1_PSE 00188 #define DSI_ERROR_EOT_MASK DSI_ISR1_EOTPE 00189 #define DSI_ERROR_OVF_MASK DSI_ISR1_LPWRE 00190 #define DSI_ERROR_GEN_MASK (DSI_ISR1_GCWRE | DSI_ISR1_GPWRE | DSI_ISR1_GPTXE | DSI_ISR1_GPRDE | DSI_ISR1_GPRXE) 00191 /** 00192 * @} 00193 */ 00194 00195 /* Private variables ---------------------------------------------------------*/ 00196 /* Private constants ---------------------------------------------------------*/ 00197 /* Private macros ------------------------------------------------------------*/ 00198 /* Private function prototypes -----------------------------------------------*/ 00199 static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx, uint32_t ChannelID, uint32_t DataType, uint32_t Data0, 00200 uint32_t Data1); 00201 00202 static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi, 00203 uint32_t ChannelID, 00204 uint32_t Mode, 00205 uint32_t Param1, 00206 uint32_t Param2); 00207 /* Private functions ---------------------------------------------------------*/ 00208 /** @defgroup DSI_Private_Functions DSI Private Functions 00209 * @{ 00210 */ 00211 /** 00212 * @brief Generic DSI packet header configuration 00213 * @param DSIx Pointer to DSI register base 00214 * @param ChannelID Virtual channel ID of the header packet 00215 * @param DataType Packet data type of the header packet 00216 * This parameter can be any value of : 00217 * @arg DSI_SHORT_WRITE_PKT_Data_Type 00218 * @arg DSI_LONG_WRITE_PKT_Data_Type 00219 * @arg DSI_SHORT_READ_PKT_Data_Type 00220 * @arg DSI_MAX_RETURN_PKT_SIZE 00221 * @param Data0 Word count LSB 00222 * @param Data1 Word count MSB 00223 * @retval None 00224 */ 00225 static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx, 00226 uint32_t ChannelID, 00227 uint32_t DataType, 00228 uint32_t Data0, 00229 uint32_t Data1) 00230 { 00231 /* Update the DSI packet header with new information */ 00232 DSIx->GHCR = (DataType | (ChannelID << 6U) | (Data0 << 8U) | (Data1 << 16U)); 00233 } 00234 00235 /** 00236 * @brief write short DCS or short Generic command 00237 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00238 * the configuration information for the DSI. 00239 * @param ChannelID Virtual channel ID. 00240 * @param Mode DSI short packet data type. 00241 * This parameter can be any value of @arg DSI_SHORT_WRITE_PKT_Data_Type. 00242 * @param Param1 DSC command or first generic parameter. 00243 * This parameter can be any value of @arg DSI_DCS_Command or a 00244 * generic command code. 00245 * @param Param2 DSC parameter or second generic parameter. 00246 * @retval HAL status 00247 */ 00248 static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi, 00249 uint32_t ChannelID, 00250 uint32_t Mode, 00251 uint32_t Param1, 00252 uint32_t Param2) 00253 { 00254 uint32_t tickstart; 00255 00256 /* Get tick */ 00257 tickstart = HAL_GetTick(); 00258 00259 /* Wait for Command FIFO Empty */ 00260 while ((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U) 00261 { 00262 /* Check for the Timeout */ 00263 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 00264 { 00265 return HAL_TIMEOUT; 00266 } 00267 } 00268 00269 /* Configure the packet to send a short DCS command with 0 or 1 parameter */ 00270 /* Update the DSI packet header with new information */ 00271 hdsi->Instance->GHCR = (Mode | (ChannelID << 6U) | (Param1 << 8U) | (Param2 << 16U)); 00272 00273 return HAL_OK; 00274 } 00275 00276 /** 00277 * @} 00278 */ 00279 00280 /* Exported functions --------------------------------------------------------*/ 00281 /** @addtogroup DSI_Exported_Functions 00282 * @{ 00283 */ 00284 00285 /** @defgroup DSI_Group1 Initialization and Configuration functions 00286 * @brief Initialization and Configuration functions 00287 * 00288 @verbatim 00289 =============================================================================== 00290 ##### Initialization and Configuration functions ##### 00291 =============================================================================== 00292 [..] This section provides functions allowing to: 00293 (+) Initialize and configure the DSI 00294 (+) De-initialize the DSI 00295 00296 @endverbatim 00297 * @{ 00298 */ 00299 00300 /** 00301 * @brief Initializes the DSI according to the specified 00302 * parameters in the DSI_InitTypeDef and create the associated handle. 00303 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00304 * the configuration information for the DSI. 00305 * @param PLLInit pointer to a DSI_PLLInitTypeDef structure that contains 00306 * the PLL Clock structure definition for the DSI. 00307 * @retval HAL status 00308 */ 00309 HAL_StatusTypeDef HAL_DSI_Init(DSI_HandleTypeDef *hdsi, DSI_PLLInitTypeDef *PLLInit) 00310 { 00311 uint32_t tickstart; 00312 uint32_t unitIntervalx4; 00313 uint32_t tempIDF; 00314 00315 /* Check the DSI handle allocation */ 00316 if (hdsi == NULL) 00317 { 00318 return HAL_ERROR; 00319 } 00320 00321 /* Check function parameters */ 00322 assert_param(IS_DSI_PLL_NDIV(PLLInit->PLLNDIV)); 00323 assert_param(IS_DSI_PLL_IDF(PLLInit->PLLIDF)); 00324 assert_param(IS_DSI_PLL_ODF(PLLInit->PLLODF)); 00325 assert_param(IS_DSI_AUTO_CLKLANE_CONTROL(hdsi->Init.AutomaticClockLaneControl)); 00326 assert_param(IS_DSI_NUMBER_OF_LANES(hdsi->Init.NumberOfLanes)); 00327 00328 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) 00329 if (hdsi->State == HAL_DSI_STATE_RESET) 00330 { 00331 /* Reset the DSI callback to the legacy weak callbacks */ 00332 hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback; /* Legacy weak TearingEffectCallback */ 00333 hdsi->EndOfRefreshCallback = HAL_DSI_EndOfRefreshCallback; /* Legacy weak EndOfRefreshCallback */ 00334 hdsi->ErrorCallback = HAL_DSI_ErrorCallback; /* Legacy weak ErrorCallback */ 00335 00336 if (hdsi->MspInitCallback == NULL) 00337 { 00338 hdsi->MspInitCallback = HAL_DSI_MspInit; 00339 } 00340 /* Initialize the low level hardware */ 00341 hdsi->MspInitCallback(hdsi); 00342 } 00343 #else 00344 if (hdsi->State == HAL_DSI_STATE_RESET) 00345 { 00346 /* Initialize the low level hardware */ 00347 HAL_DSI_MspInit(hdsi); 00348 } 00349 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ 00350 00351 /* Change DSI peripheral state */ 00352 hdsi->State = HAL_DSI_STATE_BUSY; 00353 00354 /**************** Turn on the regulator and enable the DSI PLL ****************/ 00355 00356 /* Enable the regulator */ 00357 __HAL_DSI_REG_ENABLE(hdsi); 00358 00359 /* Get tick */ 00360 tickstart = HAL_GetTick(); 00361 00362 /* Wait until the regulator is ready */ 00363 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_RRS) == 0U) 00364 { 00365 /* Check for the Timeout */ 00366 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 00367 { 00368 return HAL_TIMEOUT; 00369 } 00370 } 00371 00372 /* Set the PLL division factors */ 00373 hdsi->Instance->WRPCR &= ~(DSI_WRPCR_PLL_NDIV | DSI_WRPCR_PLL_IDF | DSI_WRPCR_PLL_ODF); 00374 hdsi->Instance->WRPCR |= (((PLLInit->PLLNDIV) << DSI_WRPCR_PLL_NDIV_Pos) | \ 00375 ((PLLInit->PLLIDF) << DSI_WRPCR_PLL_IDF_Pos) | \ 00376 ((PLLInit->PLLODF) << DSI_WRPCR_PLL_ODF_Pos)); 00377 00378 /* Enable the DSI PLL */ 00379 __HAL_DSI_PLL_ENABLE(hdsi); 00380 00381 /* Requires min of 400µs delay before reading the PLLLS flag */ 00382 /* 1ms delay is inserted that is the minimum HAL delay granularity */ 00383 HAL_Delay(1); 00384 00385 /* Get tick */ 00386 tickstart = HAL_GetTick(); 00387 00388 /* Wait for the lock of the PLL */ 00389 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U) 00390 { 00391 /* Check for the Timeout */ 00392 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 00393 { 00394 return HAL_TIMEOUT; 00395 } 00396 } 00397 00398 /*************************** Set the PHY parameters ***************************/ 00399 00400 /* D-PHY clock and digital enable*/ 00401 hdsi->Instance->PCTLR |= (DSI_PCTLR_CKE | DSI_PCTLR_DEN); 00402 00403 /* Clock lane configuration */ 00404 hdsi->Instance->CLCR &= ~(DSI_CLCR_DPCC | DSI_CLCR_ACR); 00405 hdsi->Instance->CLCR |= (DSI_CLCR_DPCC | hdsi->Init.AutomaticClockLaneControl); 00406 00407 /* Configure the number of active data lanes */ 00408 hdsi->Instance->PCONFR &= ~DSI_PCONFR_NL; 00409 hdsi->Instance->PCONFR |= hdsi->Init.NumberOfLanes; 00410 00411 /************************ Set the DSI clock parameters ************************/ 00412 00413 /* Set the TX escape clock division factor */ 00414 hdsi->Instance->CCR &= ~DSI_CCR_TXECKDIV; 00415 hdsi->Instance->CCR |= hdsi->Init.TXEscapeCkdiv; 00416 00417 /* Calculate the bit period in high-speed mode in unit of 0.25 ns (UIX4) */ 00418 /* The equation is : UIX4 = IntegerPart( (1000/F_PHY_Mhz) * 4 ) */ 00419 /* Where : F_PHY_Mhz = (NDIV * HSE_Mhz) / (IDF * ODF) */ 00420 tempIDF = (PLLInit->PLLIDF > 0U) ? PLLInit->PLLIDF : 1U; 00421 unitIntervalx4 = (4000000U * tempIDF * ((1UL << (0x3U & PLLInit->PLLODF)))) / ((HSE_VALUE / 1000U) * PLLInit->PLLNDIV); 00422 00423 /* Set the bit period in high-speed mode */ 00424 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_UIX4; 00425 hdsi->Instance->WPCR[0U] |= unitIntervalx4; 00426 00427 /****************************** Error management *****************************/ 00428 00429 /* Disable all error interrupts and reset the Error Mask */ 00430 hdsi->Instance->IER[0U] = 0U; 00431 hdsi->Instance->IER[1U] = 0U; 00432 hdsi->ErrorMsk = 0U; 00433 00434 /* Initialize the error code */ 00435 hdsi->ErrorCode = HAL_DSI_ERROR_NONE; 00436 00437 /* Initialize the DSI state*/ 00438 hdsi->State = HAL_DSI_STATE_READY; 00439 00440 return HAL_OK; 00441 } 00442 00443 /** 00444 * @brief De-initializes the DSI peripheral registers to their default reset 00445 * values. 00446 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00447 * the configuration information for the DSI. 00448 * @retval HAL status 00449 */ 00450 HAL_StatusTypeDef HAL_DSI_DeInit(DSI_HandleTypeDef *hdsi) 00451 { 00452 /* Check the DSI handle allocation */ 00453 if (hdsi == NULL) 00454 { 00455 return HAL_ERROR; 00456 } 00457 00458 /* Change DSI peripheral state */ 00459 hdsi->State = HAL_DSI_STATE_BUSY; 00460 00461 /* Disable the DSI wrapper */ 00462 __HAL_DSI_WRAPPER_DISABLE(hdsi); 00463 00464 /* Disable the DSI host */ 00465 __HAL_DSI_DISABLE(hdsi); 00466 00467 /* D-PHY clock and digital disable */ 00468 hdsi->Instance->PCTLR &= ~(DSI_PCTLR_CKE | DSI_PCTLR_DEN); 00469 00470 /* Turn off the DSI PLL */ 00471 __HAL_DSI_PLL_DISABLE(hdsi); 00472 00473 /* Disable the regulator */ 00474 __HAL_DSI_REG_DISABLE(hdsi); 00475 00476 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) 00477 if (hdsi->MspDeInitCallback == NULL) 00478 { 00479 hdsi->MspDeInitCallback = HAL_DSI_MspDeInit; 00480 } 00481 /* DeInit the low level hardware */ 00482 hdsi->MspDeInitCallback(hdsi); 00483 #else 00484 /* DeInit the low level hardware */ 00485 HAL_DSI_MspDeInit(hdsi); 00486 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ 00487 00488 /* Initialize the error code */ 00489 hdsi->ErrorCode = HAL_DSI_ERROR_NONE; 00490 00491 /* Initialize the DSI state*/ 00492 hdsi->State = HAL_DSI_STATE_RESET; 00493 00494 /* Release Lock */ 00495 __HAL_UNLOCK(hdsi); 00496 00497 return HAL_OK; 00498 } 00499 00500 /** 00501 * @brief Enable the error monitor flags 00502 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00503 * the configuration information for the DSI. 00504 * @param ActiveErrors indicates which error interrupts will be enabled. 00505 * This parameter can be any combination of @arg DSI_Error_Data_Type. 00506 * @retval HAL status 00507 */ 00508 HAL_StatusTypeDef HAL_DSI_ConfigErrorMonitor(DSI_HandleTypeDef *hdsi, uint32_t ActiveErrors) 00509 { 00510 /* Process locked */ 00511 __HAL_LOCK(hdsi); 00512 00513 hdsi->Instance->IER[0U] = 0U; 00514 hdsi->Instance->IER[1U] = 0U; 00515 00516 /* Store active errors to the handle */ 00517 hdsi->ErrorMsk = ActiveErrors; 00518 00519 if ((ActiveErrors & HAL_DSI_ERROR_ACK) != 0U) 00520 { 00521 /* Enable the interrupt generation on selected errors */ 00522 hdsi->Instance->IER[0U] |= DSI_ERROR_ACK_MASK; 00523 } 00524 00525 if ((ActiveErrors & HAL_DSI_ERROR_PHY) != 0U) 00526 { 00527 /* Enable the interrupt generation on selected errors */ 00528 hdsi->Instance->IER[0U] |= DSI_ERROR_PHY_MASK; 00529 } 00530 00531 if ((ActiveErrors & HAL_DSI_ERROR_TX) != 0U) 00532 { 00533 /* Enable the interrupt generation on selected errors */ 00534 hdsi->Instance->IER[1U] |= DSI_ERROR_TX_MASK; 00535 } 00536 00537 if ((ActiveErrors & HAL_DSI_ERROR_RX) != 0U) 00538 { 00539 /* Enable the interrupt generation on selected errors */ 00540 hdsi->Instance->IER[1U] |= DSI_ERROR_RX_MASK; 00541 } 00542 00543 if ((ActiveErrors & HAL_DSI_ERROR_ECC) != 0U) 00544 { 00545 /* Enable the interrupt generation on selected errors */ 00546 hdsi->Instance->IER[1U] |= DSI_ERROR_ECC_MASK; 00547 } 00548 00549 if ((ActiveErrors & HAL_DSI_ERROR_CRC) != 0U) 00550 { 00551 /* Enable the interrupt generation on selected errors */ 00552 hdsi->Instance->IER[1U] |= DSI_ERROR_CRC_MASK; 00553 } 00554 00555 if ((ActiveErrors & HAL_DSI_ERROR_PSE) != 0U) 00556 { 00557 /* Enable the interrupt generation on selected errors */ 00558 hdsi->Instance->IER[1U] |= DSI_ERROR_PSE_MASK; 00559 } 00560 00561 if ((ActiveErrors & HAL_DSI_ERROR_EOT) != 0U) 00562 { 00563 /* Enable the interrupt generation on selected errors */ 00564 hdsi->Instance->IER[1U] |= DSI_ERROR_EOT_MASK; 00565 } 00566 00567 if ((ActiveErrors & HAL_DSI_ERROR_OVF) != 0U) 00568 { 00569 /* Enable the interrupt generation on selected errors */ 00570 hdsi->Instance->IER[1U] |= DSI_ERROR_OVF_MASK; 00571 } 00572 00573 if ((ActiveErrors & HAL_DSI_ERROR_GEN) != 0U) 00574 { 00575 /* Enable the interrupt generation on selected errors */ 00576 hdsi->Instance->IER[1U] |= DSI_ERROR_GEN_MASK; 00577 } 00578 00579 /* Process Unlocked */ 00580 __HAL_UNLOCK(hdsi); 00581 00582 return HAL_OK; 00583 } 00584 00585 /** 00586 * @brief Initializes the DSI MSP. 00587 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00588 * the configuration information for the DSI. 00589 * @retval None 00590 */ 00591 __weak void HAL_DSI_MspInit(DSI_HandleTypeDef *hdsi) 00592 { 00593 /* Prevent unused argument(s) compilation warning */ 00594 UNUSED(hdsi); 00595 /* NOTE : This function Should not be modified, when the callback is needed, 00596 the HAL_DSI_MspInit could be implemented in the user file 00597 */ 00598 } 00599 00600 /** 00601 * @brief De-initializes the DSI MSP. 00602 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00603 * the configuration information for the DSI. 00604 * @retval None 00605 */ 00606 __weak void HAL_DSI_MspDeInit(DSI_HandleTypeDef *hdsi) 00607 { 00608 /* Prevent unused argument(s) compilation warning */ 00609 UNUSED(hdsi); 00610 /* NOTE : This function Should not be modified, when the callback is needed, 00611 the HAL_DSI_MspDeInit could be implemented in the user file 00612 */ 00613 } 00614 00615 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) 00616 /** 00617 * @brief Register a User DSI Callback 00618 * To be used instead of the weak predefined callback 00619 * @param hdsi dsi handle 00620 * @param CallbackID ID of the callback to be registered 00621 * This parameter can be one of the following values: 00622 * @arg HAL_DSI_TEARING_EFFECT_CB_ID Tearing Effect Callback ID 00623 * @arg HAL_DSI_ENDOF_REFRESH_CB_ID End Of Refresh Callback ID 00624 * @arg HAL_DSI_ERROR_CB_ID Error Callback ID 00625 * @arg HAL_DSI_MSPINIT_CB_ID MspInit callback ID 00626 * @arg HAL_DSI_MSPDEINIT_CB_ID MspDeInit callback ID 00627 * @param pCallback pointer to the Callback function 00628 * @retval status 00629 */ 00630 HAL_StatusTypeDef HAL_DSI_RegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID, 00631 pDSI_CallbackTypeDef pCallback) 00632 { 00633 HAL_StatusTypeDef status = HAL_OK; 00634 00635 if (pCallback == NULL) 00636 { 00637 /* Update the error code */ 00638 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; 00639 00640 return HAL_ERROR; 00641 } 00642 /* Process locked */ 00643 __HAL_LOCK(hdsi); 00644 00645 if (hdsi->State == HAL_DSI_STATE_READY) 00646 { 00647 switch (CallbackID) 00648 { 00649 case HAL_DSI_TEARING_EFFECT_CB_ID : 00650 hdsi->TearingEffectCallback = pCallback; 00651 break; 00652 00653 case HAL_DSI_ENDOF_REFRESH_CB_ID : 00654 hdsi->EndOfRefreshCallback = pCallback; 00655 break; 00656 00657 case HAL_DSI_ERROR_CB_ID : 00658 hdsi->ErrorCallback = pCallback; 00659 break; 00660 00661 case HAL_DSI_MSPINIT_CB_ID : 00662 hdsi->MspInitCallback = pCallback; 00663 break; 00664 00665 case HAL_DSI_MSPDEINIT_CB_ID : 00666 hdsi->MspDeInitCallback = pCallback; 00667 break; 00668 00669 default : 00670 /* Update the error code */ 00671 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; 00672 /* Return error status */ 00673 status = HAL_ERROR; 00674 break; 00675 } 00676 } 00677 else if (hdsi->State == HAL_DSI_STATE_RESET) 00678 { 00679 switch (CallbackID) 00680 { 00681 case HAL_DSI_MSPINIT_CB_ID : 00682 hdsi->MspInitCallback = pCallback; 00683 break; 00684 00685 case HAL_DSI_MSPDEINIT_CB_ID : 00686 hdsi->MspDeInitCallback = pCallback; 00687 break; 00688 00689 default : 00690 /* Update the error code */ 00691 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; 00692 /* Return error status */ 00693 status = HAL_ERROR; 00694 break; 00695 } 00696 } 00697 else 00698 { 00699 /* Update the error code */ 00700 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; 00701 /* Return error status */ 00702 status = HAL_ERROR; 00703 } 00704 00705 /* Release Lock */ 00706 __HAL_UNLOCK(hdsi); 00707 00708 return status; 00709 } 00710 00711 /** 00712 * @brief Unregister a DSI Callback 00713 * DSI callabck is redirected to the weak predefined callback 00714 * @param hdsi dsi handle 00715 * @param CallbackID ID of the callback to be unregistered 00716 * This parameter can be one of the following values: 00717 * @arg HAL_DSI_TEARING_EFFECT_CB_ID Tearing Effect Callback ID 00718 * @arg HAL_DSI_ENDOF_REFRESH_CB_ID End Of Refresh Callback ID 00719 * @arg HAL_DSI_ERROR_CB_ID Error Callback ID 00720 * @arg HAL_DSI_MSPINIT_CB_ID MspInit callback ID 00721 * @arg HAL_DSI_MSPDEINIT_CB_ID MspDeInit callback ID 00722 * @retval status 00723 */ 00724 HAL_StatusTypeDef HAL_DSI_UnRegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID) 00725 { 00726 HAL_StatusTypeDef status = HAL_OK; 00727 00728 /* Process locked */ 00729 __HAL_LOCK(hdsi); 00730 00731 if (hdsi->State == HAL_DSI_STATE_READY) 00732 { 00733 switch (CallbackID) 00734 { 00735 case HAL_DSI_TEARING_EFFECT_CB_ID : 00736 hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback; /* Legacy weak TearingEffectCallback */ 00737 break; 00738 00739 case HAL_DSI_ENDOF_REFRESH_CB_ID : 00740 hdsi->EndOfRefreshCallback = HAL_DSI_EndOfRefreshCallback; /* Legacy weak EndOfRefreshCallback */ 00741 break; 00742 00743 case HAL_DSI_ERROR_CB_ID : 00744 hdsi->ErrorCallback = HAL_DSI_ErrorCallback; /* Legacy weak ErrorCallback */ 00745 break; 00746 00747 case HAL_DSI_MSPINIT_CB_ID : 00748 hdsi->MspInitCallback = HAL_DSI_MspInit; /* Legacy weak MspInit Callback */ 00749 break; 00750 00751 case HAL_DSI_MSPDEINIT_CB_ID : 00752 hdsi->MspDeInitCallback = HAL_DSI_MspDeInit; /* Legacy weak MspDeInit Callback */ 00753 break; 00754 00755 default : 00756 /* Update the error code */ 00757 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; 00758 /* Return error status */ 00759 status = HAL_ERROR; 00760 break; 00761 } 00762 } 00763 else if (hdsi->State == HAL_DSI_STATE_RESET) 00764 { 00765 switch (CallbackID) 00766 { 00767 case HAL_DSI_MSPINIT_CB_ID : 00768 hdsi->MspInitCallback = HAL_DSI_MspInit; /* Legacy weak MspInit Callback */ 00769 break; 00770 00771 case HAL_DSI_MSPDEINIT_CB_ID : 00772 hdsi->MspDeInitCallback = HAL_DSI_MspDeInit; /* Legacy weak MspDeInit Callback */ 00773 break; 00774 00775 default : 00776 /* Update the error code */ 00777 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; 00778 /* Return error status */ 00779 status = HAL_ERROR; 00780 break; 00781 } 00782 } 00783 else 00784 { 00785 /* Update the error code */ 00786 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK; 00787 /* Return error status */ 00788 status = HAL_ERROR; 00789 } 00790 00791 /* Release Lock */ 00792 __HAL_UNLOCK(hdsi); 00793 00794 return status; 00795 } 00796 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ 00797 00798 /** 00799 * @} 00800 */ 00801 00802 /** @defgroup DSI_Group2 IO operation functions 00803 * @brief IO operation functions 00804 * 00805 @verbatim 00806 =============================================================================== 00807 ##### IO operation functions ##### 00808 =============================================================================== 00809 [..] This section provides function allowing to: 00810 (+) Handle DSI interrupt request 00811 00812 @endverbatim 00813 * @{ 00814 */ 00815 /** 00816 * @brief Handles DSI interrupt request. 00817 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00818 * the configuration information for the DSI. 00819 * @retval HAL status 00820 */ 00821 void HAL_DSI_IRQHandler(DSI_HandleTypeDef *hdsi) 00822 { 00823 uint32_t ErrorStatus0; 00824 uint32_t ErrorStatus1; 00825 00826 /* Tearing Effect Interrupt management ***************************************/ 00827 if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_TE) != 0U) 00828 { 00829 if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_TE) != 0U) 00830 { 00831 /* Clear the Tearing Effect Interrupt Flag */ 00832 __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_TE); 00833 00834 /* Tearing Effect Callback */ 00835 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) 00836 /*Call registered Tearing Effect callback */ 00837 hdsi->TearingEffectCallback(hdsi); 00838 #else 00839 /*Call legacy Tearing Effect callback*/ 00840 HAL_DSI_TearingEffectCallback(hdsi); 00841 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ 00842 } 00843 } 00844 00845 /* End of Refresh Interrupt management ***************************************/ 00846 if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_ER) != 0U) 00847 { 00848 if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_ER) != 0U) 00849 { 00850 /* Clear the End of Refresh Interrupt Flag */ 00851 __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_ER); 00852 00853 /* End of Refresh Callback */ 00854 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) 00855 /*Call registered End of refresh callback */ 00856 hdsi->EndOfRefreshCallback(hdsi); 00857 #else 00858 /*Call Legacy End of refresh callback */ 00859 HAL_DSI_EndOfRefreshCallback(hdsi); 00860 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ 00861 } 00862 } 00863 00864 /* Error Interrupts management ***********************************************/ 00865 if (hdsi->ErrorMsk != 0U) 00866 { 00867 ErrorStatus0 = hdsi->Instance->ISR[0U]; 00868 ErrorStatus0 &= hdsi->Instance->IER[0U]; 00869 ErrorStatus1 = hdsi->Instance->ISR[1U]; 00870 ErrorStatus1 &= hdsi->Instance->IER[1U]; 00871 00872 if ((ErrorStatus0 & DSI_ERROR_ACK_MASK) != 0U) 00873 { 00874 hdsi->ErrorCode |= HAL_DSI_ERROR_ACK; 00875 } 00876 00877 if ((ErrorStatus0 & DSI_ERROR_PHY_MASK) != 0U) 00878 { 00879 hdsi->ErrorCode |= HAL_DSI_ERROR_PHY; 00880 } 00881 00882 if ((ErrorStatus1 & DSI_ERROR_TX_MASK) != 0U) 00883 { 00884 hdsi->ErrorCode |= HAL_DSI_ERROR_TX; 00885 } 00886 00887 if ((ErrorStatus1 & DSI_ERROR_RX_MASK) != 0U) 00888 { 00889 hdsi->ErrorCode |= HAL_DSI_ERROR_RX; 00890 } 00891 00892 if ((ErrorStatus1 & DSI_ERROR_ECC_MASK) != 0U) 00893 { 00894 hdsi->ErrorCode |= HAL_DSI_ERROR_ECC; 00895 } 00896 00897 if ((ErrorStatus1 & DSI_ERROR_CRC_MASK) != 0U) 00898 { 00899 hdsi->ErrorCode |= HAL_DSI_ERROR_CRC; 00900 } 00901 00902 if ((ErrorStatus1 & DSI_ERROR_PSE_MASK) != 0U) 00903 { 00904 hdsi->ErrorCode |= HAL_DSI_ERROR_PSE; 00905 } 00906 00907 if ((ErrorStatus1 & DSI_ERROR_EOT_MASK) != 0U) 00908 { 00909 hdsi->ErrorCode |= HAL_DSI_ERROR_EOT; 00910 } 00911 00912 if ((ErrorStatus1 & DSI_ERROR_OVF_MASK) != 0U) 00913 { 00914 hdsi->ErrorCode |= HAL_DSI_ERROR_OVF; 00915 } 00916 00917 if ((ErrorStatus1 & DSI_ERROR_GEN_MASK) != 0U) 00918 { 00919 hdsi->ErrorCode |= HAL_DSI_ERROR_GEN; 00920 } 00921 00922 /* Check only selected errors */ 00923 if (hdsi->ErrorCode != HAL_DSI_ERROR_NONE) 00924 { 00925 /* DSI error interrupt callback */ 00926 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1) 00927 /*Call registered Error callback */ 00928 hdsi->ErrorCallback(hdsi); 00929 #else 00930 /*Call Legacy Error callback */ 00931 HAL_DSI_ErrorCallback(hdsi); 00932 #endif /* USE_HAL_DSI_REGISTER_CALLBACKS */ 00933 } 00934 } 00935 } 00936 00937 /** 00938 * @brief Tearing Effect DSI callback. 00939 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00940 * the configuration information for the DSI. 00941 * @retval None 00942 */ 00943 __weak void HAL_DSI_TearingEffectCallback(DSI_HandleTypeDef *hdsi) 00944 { 00945 /* Prevent unused argument(s) compilation warning */ 00946 UNUSED(hdsi); 00947 /* NOTE : This function Should not be modified, when the callback is needed, 00948 the HAL_DSI_TearingEffectCallback could be implemented in the user file 00949 */ 00950 } 00951 00952 /** 00953 * @brief End of Refresh DSI callback. 00954 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00955 * the configuration information for the DSI. 00956 * @retval None 00957 */ 00958 __weak void HAL_DSI_EndOfRefreshCallback(DSI_HandleTypeDef *hdsi) 00959 { 00960 /* Prevent unused argument(s) compilation warning */ 00961 UNUSED(hdsi); 00962 /* NOTE : This function Should not be modified, when the callback is needed, 00963 the HAL_DSI_EndOfRefreshCallback could be implemented in the user file 00964 */ 00965 } 00966 00967 /** 00968 * @brief Operation Error DSI callback. 00969 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 00970 * the configuration information for the DSI. 00971 * @retval None 00972 */ 00973 __weak void HAL_DSI_ErrorCallback(DSI_HandleTypeDef *hdsi) 00974 { 00975 /* Prevent unused argument(s) compilation warning */ 00976 UNUSED(hdsi); 00977 /* NOTE : This function Should not be modified, when the callback is needed, 00978 the HAL_DSI_ErrorCallback could be implemented in the user file 00979 */ 00980 } 00981 00982 /** 00983 * @} 00984 */ 00985 00986 /** @defgroup DSI_Group3 Peripheral Control functions 00987 * @brief Peripheral Control functions 00988 * 00989 @verbatim 00990 =============================================================================== 00991 ##### Peripheral Control functions ##### 00992 =============================================================================== 00993 [..] This section provides functions allowing to: 00994 (+) Configure the Generic interface read-back Virtual Channel ID 00995 (+) Select video mode and configure the corresponding parameters 00996 (+) Configure command transmission mode: High-speed or Low-power 00997 (+) Configure the flow control 00998 (+) Configure the DSI PHY timer 00999 (+) Configure the DSI HOST timeout 01000 (+) Configure the DSI HOST timeout 01001 (+) Start/Stop the DSI module 01002 (+) Refresh the display in command mode 01003 (+) Controls the display color mode in Video mode 01004 (+) Control the display shutdown in Video mode 01005 (+) write short DCS or short Generic command 01006 (+) write long DCS or long Generic command 01007 (+) Read command (DCS or generic) 01008 (+) Enter/Exit the Ultra Low Power Mode on data only (D-PHY PLL running) 01009 (+) Enter/Exit the Ultra Low Power Mode on data only and clock (D-PHY PLL turned off) 01010 (+) Start/Stop test pattern generation 01011 (+) Slew-Rate And Delay Tuning 01012 (+) Low-Power Reception Filter Tuning 01013 (+) Activate an additional current path on all lanes to meet the SDDTx parameter 01014 (+) Custom lane pins configuration 01015 (+) Set custom timing for the PHY 01016 (+) Force the Clock/Data Lane in TX Stop Mode 01017 (+) Force LP Receiver in Low-Power Mode 01018 (+) Force Data Lanes in RX Mode after a BTA 01019 (+) Enable a pull-down on the lanes to prevent from floating states when unused 01020 (+) Switch off the contention detection on data lanes 01021 01022 @endverbatim 01023 * @{ 01024 */ 01025 01026 /** 01027 * @brief Configure the Generic interface read-back Virtual Channel ID. 01028 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01029 * the configuration information for the DSI. 01030 * @param VirtualChannelID Virtual channel ID 01031 * @retval HAL status 01032 */ 01033 HAL_StatusTypeDef HAL_DSI_SetGenericVCID(DSI_HandleTypeDef *hdsi, uint32_t VirtualChannelID) 01034 { 01035 /* Process locked */ 01036 __HAL_LOCK(hdsi); 01037 01038 /* Update the GVCID register */ 01039 hdsi->Instance->GVCIDR &= ~DSI_GVCIDR_VCID; 01040 hdsi->Instance->GVCIDR |= VirtualChannelID; 01041 01042 /* Process unlocked */ 01043 __HAL_UNLOCK(hdsi); 01044 01045 return HAL_OK; 01046 } 01047 01048 /** 01049 * @brief Select video mode and configure the corresponding parameters 01050 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01051 * the configuration information for the DSI. 01052 * @param VidCfg pointer to a DSI_VidCfgTypeDef structure that contains 01053 * the DSI video mode configuration parameters 01054 * @retval HAL status 01055 */ 01056 HAL_StatusTypeDef HAL_DSI_ConfigVideoMode(DSI_HandleTypeDef *hdsi, DSI_VidCfgTypeDef *VidCfg) 01057 { 01058 /* Process locked */ 01059 __HAL_LOCK(hdsi); 01060 01061 /* Check the parameters */ 01062 assert_param(IS_DSI_COLOR_CODING(VidCfg->ColorCoding)); 01063 assert_param(IS_DSI_VIDEO_MODE_TYPE(VidCfg->Mode)); 01064 assert_param(IS_DSI_LP_COMMAND(VidCfg->LPCommandEnable)); 01065 assert_param(IS_DSI_LP_HFP(VidCfg->LPHorizontalFrontPorchEnable)); 01066 assert_param(IS_DSI_LP_HBP(VidCfg->LPHorizontalBackPorchEnable)); 01067 assert_param(IS_DSI_LP_VACTIVE(VidCfg->LPVerticalActiveEnable)); 01068 assert_param(IS_DSI_LP_VFP(VidCfg->LPVerticalFrontPorchEnable)); 01069 assert_param(IS_DSI_LP_VBP(VidCfg->LPVerticalBackPorchEnable)); 01070 assert_param(IS_DSI_LP_VSYNC(VidCfg->LPVerticalSyncActiveEnable)); 01071 assert_param(IS_DSI_FBTAA(VidCfg->FrameBTAAcknowledgeEnable)); 01072 assert_param(IS_DSI_DE_POLARITY(VidCfg->DEPolarity)); 01073 assert_param(IS_DSI_VSYNC_POLARITY(VidCfg->VSPolarity)); 01074 assert_param(IS_DSI_HSYNC_POLARITY(VidCfg->HSPolarity)); 01075 /* Check the LooselyPacked variant only in 18-bit mode */ 01076 if (VidCfg->ColorCoding == DSI_RGB666) 01077 { 01078 assert_param(IS_DSI_LOOSELY_PACKED(VidCfg->LooselyPacked)); 01079 } 01080 01081 /* Select video mode by resetting CMDM and DSIM bits */ 01082 hdsi->Instance->MCR &= ~DSI_MCR_CMDM; 01083 hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM; 01084 01085 /* Configure the video mode transmission type */ 01086 hdsi->Instance->VMCR &= ~DSI_VMCR_VMT; 01087 hdsi->Instance->VMCR |= VidCfg->Mode; 01088 01089 /* Configure the video packet size */ 01090 hdsi->Instance->VPCR &= ~DSI_VPCR_VPSIZE; 01091 hdsi->Instance->VPCR |= VidCfg->PacketSize; 01092 01093 /* Set the chunks number to be transmitted through the DSI link */ 01094 hdsi->Instance->VCCR &= ~DSI_VCCR_NUMC; 01095 hdsi->Instance->VCCR |= VidCfg->NumberOfChunks; 01096 01097 /* Set the size of the null packet */ 01098 hdsi->Instance->VNPCR &= ~DSI_VNPCR_NPSIZE; 01099 hdsi->Instance->VNPCR |= VidCfg->NullPacketSize; 01100 01101 /* Select the virtual channel for the LTDC interface traffic */ 01102 hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID; 01103 hdsi->Instance->LVCIDR |= VidCfg->VirtualChannelID; 01104 01105 /* Configure the polarity of control signals */ 01106 hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP); 01107 hdsi->Instance->LPCR |= (VidCfg->DEPolarity | VidCfg->VSPolarity | VidCfg->HSPolarity); 01108 01109 /* Select the color coding for the host */ 01110 hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC; 01111 hdsi->Instance->LCOLCR |= VidCfg->ColorCoding; 01112 01113 /* Select the color coding for the wrapper */ 01114 hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX; 01115 hdsi->Instance->WCFGR |= ((VidCfg->ColorCoding) << 1U); 01116 01117 /* Enable/disable the loosely packed variant to 18-bit configuration */ 01118 if (VidCfg->ColorCoding == DSI_RGB666) 01119 { 01120 hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_LPE; 01121 hdsi->Instance->LCOLCR |= VidCfg->LooselyPacked; 01122 } 01123 01124 /* Set the Horizontal Synchronization Active (HSA) in lane byte clock cycles */ 01125 hdsi->Instance->VHSACR &= ~DSI_VHSACR_HSA; 01126 hdsi->Instance->VHSACR |= VidCfg->HorizontalSyncActive; 01127 01128 /* Set the Horizontal Back Porch (HBP) in lane byte clock cycles */ 01129 hdsi->Instance->VHBPCR &= ~DSI_VHBPCR_HBP; 01130 hdsi->Instance->VHBPCR |= VidCfg->HorizontalBackPorch; 01131 01132 /* Set the total line time (HLINE=HSA+HBP+HACT+HFP) in lane byte clock cycles */ 01133 hdsi->Instance->VLCR &= ~DSI_VLCR_HLINE; 01134 hdsi->Instance->VLCR |= VidCfg->HorizontalLine; 01135 01136 /* Set the Vertical Synchronization Active (VSA) */ 01137 hdsi->Instance->VVSACR &= ~DSI_VVSACR_VSA; 01138 hdsi->Instance->VVSACR |= VidCfg->VerticalSyncActive; 01139 01140 /* Set the Vertical Back Porch (VBP)*/ 01141 hdsi->Instance->VVBPCR &= ~DSI_VVBPCR_VBP; 01142 hdsi->Instance->VVBPCR |= VidCfg->VerticalBackPorch; 01143 01144 /* Set the Vertical Front Porch (VFP)*/ 01145 hdsi->Instance->VVFPCR &= ~DSI_VVFPCR_VFP; 01146 hdsi->Instance->VVFPCR |= VidCfg->VerticalFrontPorch; 01147 01148 /* Set the Vertical Active period*/ 01149 hdsi->Instance->VVACR &= ~DSI_VVACR_VA; 01150 hdsi->Instance->VVACR |= VidCfg->VerticalActive; 01151 01152 /* Configure the command transmission mode */ 01153 hdsi->Instance->VMCR &= ~DSI_VMCR_LPCE; 01154 hdsi->Instance->VMCR |= VidCfg->LPCommandEnable; 01155 01156 /* Low power largest packet size */ 01157 hdsi->Instance->LPMCR &= ~DSI_LPMCR_LPSIZE; 01158 hdsi->Instance->LPMCR |= ((VidCfg->LPLargestPacketSize) << 16U); 01159 01160 /* Low power VACT largest packet size */ 01161 hdsi->Instance->LPMCR &= ~DSI_LPMCR_VLPSIZE; 01162 hdsi->Instance->LPMCR |= VidCfg->LPVACTLargestPacketSize; 01163 01164 /* Enable LP transition in HFP period */ 01165 hdsi->Instance->VMCR &= ~DSI_VMCR_LPHFPE; 01166 hdsi->Instance->VMCR |= VidCfg->LPHorizontalFrontPorchEnable; 01167 01168 /* Enable LP transition in HBP period */ 01169 hdsi->Instance->VMCR &= ~DSI_VMCR_LPHBPE; 01170 hdsi->Instance->VMCR |= VidCfg->LPHorizontalBackPorchEnable; 01171 01172 /* Enable LP transition in VACT period */ 01173 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVAE; 01174 hdsi->Instance->VMCR |= VidCfg->LPVerticalActiveEnable; 01175 01176 /* Enable LP transition in VFP period */ 01177 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVFPE; 01178 hdsi->Instance->VMCR |= VidCfg->LPVerticalFrontPorchEnable; 01179 01180 /* Enable LP transition in VBP period */ 01181 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVBPE; 01182 hdsi->Instance->VMCR |= VidCfg->LPVerticalBackPorchEnable; 01183 01184 /* Enable LP transition in vertical sync period */ 01185 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVSAE; 01186 hdsi->Instance->VMCR |= VidCfg->LPVerticalSyncActiveEnable; 01187 01188 /* Enable the request for an acknowledge response at the end of a frame */ 01189 hdsi->Instance->VMCR &= ~DSI_VMCR_FBTAAE; 01190 hdsi->Instance->VMCR |= VidCfg->FrameBTAAcknowledgeEnable; 01191 01192 /* Process unlocked */ 01193 __HAL_UNLOCK(hdsi); 01194 01195 return HAL_OK; 01196 } 01197 01198 /** 01199 * @brief Select adapted command mode and configure the corresponding parameters 01200 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01201 * the configuration information for the DSI. 01202 * @param CmdCfg pointer to a DSI_CmdCfgTypeDef structure that contains 01203 * the DSI command mode configuration parameters 01204 * @retval HAL status 01205 */ 01206 HAL_StatusTypeDef HAL_DSI_ConfigAdaptedCommandMode(DSI_HandleTypeDef *hdsi, DSI_CmdCfgTypeDef *CmdCfg) 01207 { 01208 /* Process locked */ 01209 __HAL_LOCK(hdsi); 01210 01211 /* Check the parameters */ 01212 assert_param(IS_DSI_COLOR_CODING(CmdCfg->ColorCoding)); 01213 assert_param(IS_DSI_TE_SOURCE(CmdCfg->TearingEffectSource)); 01214 assert_param(IS_DSI_TE_POLARITY(CmdCfg->TearingEffectPolarity)); 01215 assert_param(IS_DSI_AUTOMATIC_REFRESH(CmdCfg->AutomaticRefresh)); 01216 assert_param(IS_DSI_VS_POLARITY(CmdCfg->VSyncPol)); 01217 assert_param(IS_DSI_TE_ACK_REQUEST(CmdCfg->TEAcknowledgeRequest)); 01218 assert_param(IS_DSI_DE_POLARITY(CmdCfg->DEPolarity)); 01219 assert_param(IS_DSI_VSYNC_POLARITY(CmdCfg->VSPolarity)); 01220 assert_param(IS_DSI_HSYNC_POLARITY(CmdCfg->HSPolarity)); 01221 01222 /* Select command mode by setting CMDM and DSIM bits */ 01223 hdsi->Instance->MCR |= DSI_MCR_CMDM; 01224 hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM; 01225 hdsi->Instance->WCFGR |= DSI_WCFGR_DSIM; 01226 01227 /* Select the virtual channel for the LTDC interface traffic */ 01228 hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID; 01229 hdsi->Instance->LVCIDR |= CmdCfg->VirtualChannelID; 01230 01231 /* Configure the polarity of control signals */ 01232 hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP); 01233 hdsi->Instance->LPCR |= (CmdCfg->DEPolarity | CmdCfg->VSPolarity | CmdCfg->HSPolarity); 01234 01235 /* Select the color coding for the host */ 01236 hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC; 01237 hdsi->Instance->LCOLCR |= CmdCfg->ColorCoding; 01238 01239 /* Select the color coding for the wrapper */ 01240 hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX; 01241 hdsi->Instance->WCFGR |= ((CmdCfg->ColorCoding) << 1U); 01242 01243 /* Configure the maximum allowed size for write memory command */ 01244 hdsi->Instance->LCCR &= ~DSI_LCCR_CMDSIZE; 01245 hdsi->Instance->LCCR |= CmdCfg->CommandSize; 01246 01247 /* Configure the tearing effect source and polarity and select the refresh mode */ 01248 hdsi->Instance->WCFGR &= ~(DSI_WCFGR_TESRC | DSI_WCFGR_TEPOL | DSI_WCFGR_AR | DSI_WCFGR_VSPOL); 01249 hdsi->Instance->WCFGR |= (CmdCfg->TearingEffectSource | CmdCfg->TearingEffectPolarity | CmdCfg->AutomaticRefresh | 01250 CmdCfg->VSyncPol); 01251 01252 /* Configure the tearing effect acknowledge request */ 01253 hdsi->Instance->CMCR &= ~DSI_CMCR_TEARE; 01254 hdsi->Instance->CMCR |= CmdCfg->TEAcknowledgeRequest; 01255 01256 /* Enable the Tearing Effect interrupt */ 01257 __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_TE); 01258 01259 /* Enable the End of Refresh interrupt */ 01260 __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_ER); 01261 01262 /* Process unlocked */ 01263 __HAL_UNLOCK(hdsi); 01264 01265 return HAL_OK; 01266 } 01267 01268 /** 01269 * @brief Configure command transmission mode: High-speed or Low-power 01270 * and enable/disable acknowledge request after packet transmission 01271 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01272 * the configuration information for the DSI. 01273 * @param LPCmd pointer to a DSI_LPCmdTypeDef structure that contains 01274 * the DSI command transmission mode configuration parameters 01275 * @retval HAL status 01276 */ 01277 HAL_StatusTypeDef HAL_DSI_ConfigCommand(DSI_HandleTypeDef *hdsi, DSI_LPCmdTypeDef *LPCmd) 01278 { 01279 /* Process locked */ 01280 __HAL_LOCK(hdsi); 01281 01282 assert_param(IS_DSI_LP_GSW0P(LPCmd->LPGenShortWriteNoP)); 01283 assert_param(IS_DSI_LP_GSW1P(LPCmd->LPGenShortWriteOneP)); 01284 assert_param(IS_DSI_LP_GSW2P(LPCmd->LPGenShortWriteTwoP)); 01285 assert_param(IS_DSI_LP_GSR0P(LPCmd->LPGenShortReadNoP)); 01286 assert_param(IS_DSI_LP_GSR1P(LPCmd->LPGenShortReadOneP)); 01287 assert_param(IS_DSI_LP_GSR2P(LPCmd->LPGenShortReadTwoP)); 01288 assert_param(IS_DSI_LP_GLW(LPCmd->LPGenLongWrite)); 01289 assert_param(IS_DSI_LP_DSW0P(LPCmd->LPDcsShortWriteNoP)); 01290 assert_param(IS_DSI_LP_DSW1P(LPCmd->LPDcsShortWriteOneP)); 01291 assert_param(IS_DSI_LP_DSR0P(LPCmd->LPDcsShortReadNoP)); 01292 assert_param(IS_DSI_LP_DLW(LPCmd->LPDcsLongWrite)); 01293 assert_param(IS_DSI_LP_MRDP(LPCmd->LPMaxReadPacket)); 01294 assert_param(IS_DSI_ACK_REQUEST(LPCmd->AcknowledgeRequest)); 01295 01296 /* Select High-speed or Low-power for command transmission */ 01297 hdsi->Instance->CMCR &= ~(DSI_CMCR_GSW0TX | \ 01298 DSI_CMCR_GSW1TX | \ 01299 DSI_CMCR_GSW2TX | \ 01300 DSI_CMCR_GSR0TX | \ 01301 DSI_CMCR_GSR1TX | \ 01302 DSI_CMCR_GSR2TX | \ 01303 DSI_CMCR_GLWTX | \ 01304 DSI_CMCR_DSW0TX | \ 01305 DSI_CMCR_DSW1TX | \ 01306 DSI_CMCR_DSR0TX | \ 01307 DSI_CMCR_DLWTX | \ 01308 DSI_CMCR_MRDPS); 01309 hdsi->Instance->CMCR |= (LPCmd->LPGenShortWriteNoP | \ 01310 LPCmd->LPGenShortWriteOneP | \ 01311 LPCmd->LPGenShortWriteTwoP | \ 01312 LPCmd->LPGenShortReadNoP | \ 01313 LPCmd->LPGenShortReadOneP | \ 01314 LPCmd->LPGenShortReadTwoP | \ 01315 LPCmd->LPGenLongWrite | \ 01316 LPCmd->LPDcsShortWriteNoP | \ 01317 LPCmd->LPDcsShortWriteOneP | \ 01318 LPCmd->LPDcsShortReadNoP | \ 01319 LPCmd->LPDcsLongWrite | \ 01320 LPCmd->LPMaxReadPacket); 01321 01322 /* Configure the acknowledge request after each packet transmission */ 01323 hdsi->Instance->CMCR &= ~DSI_CMCR_ARE; 01324 hdsi->Instance->CMCR |= LPCmd->AcknowledgeRequest; 01325 01326 /* Process unlocked */ 01327 __HAL_UNLOCK(hdsi); 01328 01329 return HAL_OK; 01330 } 01331 01332 /** 01333 * @brief Configure the flow control parameters 01334 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01335 * the configuration information for the DSI. 01336 * @param FlowControl flow control feature(s) to be enabled. 01337 * This parameter can be any combination of @arg DSI_FlowControl. 01338 * @retval HAL status 01339 */ 01340 HAL_StatusTypeDef HAL_DSI_ConfigFlowControl(DSI_HandleTypeDef *hdsi, uint32_t FlowControl) 01341 { 01342 /* Process locked */ 01343 __HAL_LOCK(hdsi); 01344 01345 /* Check the parameters */ 01346 assert_param(IS_DSI_FLOW_CONTROL(FlowControl)); 01347 01348 /* Set the DSI Host Protocol Configuration Register */ 01349 hdsi->Instance->PCR &= ~DSI_FLOW_CONTROL_ALL; 01350 hdsi->Instance->PCR |= FlowControl; 01351 01352 /* Process unlocked */ 01353 __HAL_UNLOCK(hdsi); 01354 01355 return HAL_OK; 01356 } 01357 01358 /** 01359 * @brief Configure the DSI PHY timer parameters 01360 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01361 * the configuration information for the DSI. 01362 * @param PhyTimers DSI_PHY_TimerTypeDef structure that contains 01363 * the DSI PHY timing parameters 01364 * @retval HAL status 01365 */ 01366 HAL_StatusTypeDef HAL_DSI_ConfigPhyTimer(DSI_HandleTypeDef *hdsi, DSI_PHY_TimerTypeDef *PhyTimers) 01367 { 01368 uint32_t maxTime; 01369 /* Process locked */ 01370 __HAL_LOCK(hdsi); 01371 01372 maxTime = (PhyTimers->ClockLaneLP2HSTime > PhyTimers->ClockLaneHS2LPTime) ? PhyTimers->ClockLaneLP2HSTime : 01373 PhyTimers->ClockLaneHS2LPTime; 01374 01375 /* Clock lane timer configuration */ 01376 01377 /* In Automatic Clock Lane control mode, the DSI Host can turn off the clock lane between two 01378 High-Speed transmission. 01379 To do so, the DSI Host calculates the time required for the clock lane to change from HighSpeed 01380 to Low-Power and from Low-Power to High-Speed. 01381 This timings are configured by the HS2LP_TIME and LP2HS_TIME in the DSI Host Clock Lane Timer Configuration 01382 Register (DSI_CLTCR). 01383 But the DSI Host is not calculating LP2HS_TIME + HS2LP_TIME but 2 x HS2LP_TIME. 01384 01385 Workaround : Configure HS2LP_TIME and LP2HS_TIME with the same value being the max of HS2LP_TIME or LP2HS_TIME. 01386 */ 01387 hdsi->Instance->CLTCR &= ~(DSI_CLTCR_LP2HS_TIME | DSI_CLTCR_HS2LP_TIME); 01388 hdsi->Instance->CLTCR |= (maxTime | ((maxTime) << 16U)); 01389 01390 /* Data lane timer configuration */ 01391 hdsi->Instance->DLTCR &= ~(DSI_DLTCR_MRD_TIME | DSI_DLTCR_LP2HS_TIME | DSI_DLTCR_HS2LP_TIME); 01392 hdsi->Instance->DLTCR |= (PhyTimers->DataLaneMaxReadTime | ((PhyTimers->DataLaneLP2HSTime) << 16U) | (( 01393 PhyTimers->DataLaneHS2LPTime) << 24U)); 01394 01395 /* Configure the wait period to request HS transmission after a stop state */ 01396 hdsi->Instance->PCONFR &= ~DSI_PCONFR_SW_TIME; 01397 hdsi->Instance->PCONFR |= ((PhyTimers->StopWaitTime) << 8U); 01398 01399 /* Process unlocked */ 01400 __HAL_UNLOCK(hdsi); 01401 01402 return HAL_OK; 01403 } 01404 01405 /** 01406 * @brief Configure the DSI HOST timeout parameters 01407 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01408 * the configuration information for the DSI. 01409 * @param HostTimeouts DSI_HOST_TimeoutTypeDef structure that contains 01410 * the DSI host timeout parameters 01411 * @retval HAL status 01412 */ 01413 HAL_StatusTypeDef HAL_DSI_ConfigHostTimeouts(DSI_HandleTypeDef *hdsi, DSI_HOST_TimeoutTypeDef *HostTimeouts) 01414 { 01415 /* Process locked */ 01416 __HAL_LOCK(hdsi); 01417 01418 /* Set the timeout clock division factor */ 01419 hdsi->Instance->CCR &= ~DSI_CCR_TOCKDIV; 01420 hdsi->Instance->CCR |= ((HostTimeouts->TimeoutCkdiv) << 8U); 01421 01422 /* High-speed transmission timeout */ 01423 hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_HSTX_TOCNT; 01424 hdsi->Instance->TCCR[0U] |= ((HostTimeouts->HighSpeedTransmissionTimeout) << 16U); 01425 01426 /* Low-power reception timeout */ 01427 hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_LPRX_TOCNT; 01428 hdsi->Instance->TCCR[0U] |= HostTimeouts->LowPowerReceptionTimeout; 01429 01430 /* High-speed read timeout */ 01431 hdsi->Instance->TCCR[1U] &= ~DSI_TCCR1_HSRD_TOCNT; 01432 hdsi->Instance->TCCR[1U] |= HostTimeouts->HighSpeedReadTimeout; 01433 01434 /* Low-power read timeout */ 01435 hdsi->Instance->TCCR[2U] &= ~DSI_TCCR2_LPRD_TOCNT; 01436 hdsi->Instance->TCCR[2U] |= HostTimeouts->LowPowerReadTimeout; 01437 01438 /* High-speed write timeout */ 01439 hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_HSWR_TOCNT; 01440 hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWriteTimeout; 01441 01442 /* High-speed write presp mode */ 01443 hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_PM; 01444 hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWritePrespMode; 01445 01446 /* Low-speed write timeout */ 01447 hdsi->Instance->TCCR[4U] &= ~DSI_TCCR4_LPWR_TOCNT; 01448 hdsi->Instance->TCCR[4U] |= HostTimeouts->LowPowerWriteTimeout; 01449 01450 /* BTA timeout */ 01451 hdsi->Instance->TCCR[5U] &= ~DSI_TCCR5_BTA_TOCNT; 01452 hdsi->Instance->TCCR[5U] |= HostTimeouts->BTATimeout; 01453 01454 /* Process unlocked */ 01455 __HAL_UNLOCK(hdsi); 01456 01457 return HAL_OK; 01458 } 01459 01460 /** 01461 * @brief Start the DSI module 01462 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01463 * the configuration information for the DSI. 01464 * @retval HAL status 01465 */ 01466 HAL_StatusTypeDef HAL_DSI_Start(DSI_HandleTypeDef *hdsi) 01467 { 01468 /* Process locked */ 01469 __HAL_LOCK(hdsi); 01470 01471 /* Enable the DSI host */ 01472 __HAL_DSI_ENABLE(hdsi); 01473 01474 /* Enable the DSI wrapper */ 01475 __HAL_DSI_WRAPPER_ENABLE(hdsi); 01476 01477 /* Process unlocked */ 01478 __HAL_UNLOCK(hdsi); 01479 01480 return HAL_OK; 01481 } 01482 01483 /** 01484 * @brief Stop the DSI module 01485 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01486 * the configuration information for the DSI. 01487 * @retval HAL status 01488 */ 01489 HAL_StatusTypeDef HAL_DSI_Stop(DSI_HandleTypeDef *hdsi) 01490 { 01491 /* Process locked */ 01492 __HAL_LOCK(hdsi); 01493 01494 /* Disable the DSI host */ 01495 __HAL_DSI_DISABLE(hdsi); 01496 01497 /* Disable the DSI wrapper */ 01498 __HAL_DSI_WRAPPER_DISABLE(hdsi); 01499 01500 /* Process unlocked */ 01501 __HAL_UNLOCK(hdsi); 01502 01503 return HAL_OK; 01504 } 01505 01506 /** 01507 * @brief Refresh the display in command mode 01508 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01509 * the configuration information for the DSI. 01510 * @retval HAL status 01511 */ 01512 HAL_StatusTypeDef HAL_DSI_Refresh(DSI_HandleTypeDef *hdsi) 01513 { 01514 /* Process locked */ 01515 __HAL_LOCK(hdsi); 01516 01517 /* Update the display */ 01518 hdsi->Instance->WCR |= DSI_WCR_LTDCEN; 01519 01520 /* Process unlocked */ 01521 __HAL_UNLOCK(hdsi); 01522 01523 return HAL_OK; 01524 } 01525 01526 /** 01527 * @brief Controls the display color mode in Video mode 01528 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01529 * the configuration information for the DSI. 01530 * @param ColorMode Color mode (full or 8-colors). 01531 * This parameter can be any value of @arg DSI_Color_Mode 01532 * @retval HAL status 01533 */ 01534 HAL_StatusTypeDef HAL_DSI_ColorMode(DSI_HandleTypeDef *hdsi, uint32_t ColorMode) 01535 { 01536 /* Process locked */ 01537 __HAL_LOCK(hdsi); 01538 01539 /* Check the parameters */ 01540 assert_param(IS_DSI_COLOR_MODE(ColorMode)); 01541 01542 /* Update the display color mode */ 01543 hdsi->Instance->WCR &= ~DSI_WCR_COLM; 01544 hdsi->Instance->WCR |= ColorMode; 01545 01546 /* Process unlocked */ 01547 __HAL_UNLOCK(hdsi); 01548 01549 return HAL_OK; 01550 } 01551 01552 /** 01553 * @brief Control the display shutdown in Video mode 01554 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01555 * the configuration information for the DSI. 01556 * @param Shutdown Shut-down (Display-ON or Display-OFF). 01557 * This parameter can be any value of @arg DSI_ShutDown 01558 * @retval HAL status 01559 */ 01560 HAL_StatusTypeDef HAL_DSI_Shutdown(DSI_HandleTypeDef *hdsi, uint32_t Shutdown) 01561 { 01562 /* Process locked */ 01563 __HAL_LOCK(hdsi); 01564 01565 /* Check the parameters */ 01566 assert_param(IS_DSI_SHUT_DOWN(Shutdown)); 01567 01568 /* Update the display Shutdown */ 01569 hdsi->Instance->WCR &= ~DSI_WCR_SHTDN; 01570 hdsi->Instance->WCR |= Shutdown; 01571 01572 /* Process unlocked */ 01573 __HAL_UNLOCK(hdsi); 01574 01575 return HAL_OK; 01576 } 01577 01578 /** 01579 * @brief write short DCS or short Generic command 01580 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01581 * the configuration information for the DSI. 01582 * @param ChannelID Virtual channel ID. 01583 * @param Mode DSI short packet data type. 01584 * This parameter can be any value of @arg DSI_SHORT_WRITE_PKT_Data_Type. 01585 * @param Param1 DSC command or first generic parameter. 01586 * This parameter can be any value of @arg DSI_DCS_Command or a 01587 * generic command code. 01588 * @param Param2 DSC parameter or second generic parameter. 01589 * @retval HAL status 01590 */ 01591 HAL_StatusTypeDef HAL_DSI_ShortWrite(DSI_HandleTypeDef *hdsi, 01592 uint32_t ChannelID, 01593 uint32_t Mode, 01594 uint32_t Param1, 01595 uint32_t Param2) 01596 { 01597 HAL_StatusTypeDef status; 01598 /* Check the parameters */ 01599 assert_param(IS_DSI_SHORT_WRITE_PACKET_TYPE(Mode)); 01600 01601 /* Process locked */ 01602 __HAL_LOCK(hdsi); 01603 01604 status = DSI_ShortWrite(hdsi, ChannelID, Mode, Param1, Param2); 01605 01606 /* Process unlocked */ 01607 __HAL_UNLOCK(hdsi); 01608 01609 return status; 01610 } 01611 01612 /** 01613 * @brief write long DCS or long Generic command 01614 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01615 * the configuration information for the DSI. 01616 * @param ChannelID Virtual channel ID. 01617 * @param Mode DSI long packet data type. 01618 * This parameter can be any value of @arg DSI_LONG_WRITE_PKT_Data_Type. 01619 * @param NbParams Number of parameters. 01620 * @param Param1 DSC command or first generic parameter. 01621 * This parameter can be any value of @arg DSI_DCS_Command or a 01622 * generic command code 01623 * @param ParametersTable Pointer to parameter values table. 01624 * @retval HAL status 01625 */ 01626 HAL_StatusTypeDef HAL_DSI_LongWrite(DSI_HandleTypeDef *hdsi, 01627 uint32_t ChannelID, 01628 uint32_t Mode, 01629 uint32_t NbParams, 01630 uint32_t Param1, 01631 uint8_t *ParametersTable) 01632 { 01633 uint32_t uicounter; 01634 uint32_t nbBytes; 01635 uint32_t count; 01636 uint32_t tickstart; 01637 uint32_t fifoword; 01638 uint8_t *pparams = ParametersTable; 01639 01640 /* Process locked */ 01641 __HAL_LOCK(hdsi); 01642 01643 /* Check the parameters */ 01644 assert_param(IS_DSI_LONG_WRITE_PACKET_TYPE(Mode)); 01645 01646 /* Get tick */ 01647 tickstart = HAL_GetTick(); 01648 01649 /* Wait for Command FIFO Empty */ 01650 while ((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U) 01651 { 01652 /* Check for the Timeout */ 01653 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 01654 { 01655 /* Process Unlocked */ 01656 __HAL_UNLOCK(hdsi); 01657 01658 return HAL_TIMEOUT; 01659 } 01660 } 01661 01662 /* Set the DCS code on payload byte 1, and the other parameters on the write FIFO command*/ 01663 fifoword = Param1; 01664 nbBytes = (NbParams < 3U) ? NbParams : 3U; 01665 01666 for (count = 0U; count < nbBytes; count++) 01667 { 01668 fifoword |= (((uint32_t)(*(pparams + count))) << (8U + (8U * count))); 01669 } 01670 hdsi->Instance->GPDR = fifoword; 01671 01672 uicounter = NbParams - nbBytes; 01673 pparams += nbBytes; 01674 /* Set the Next parameters on the write FIFO command*/ 01675 while (uicounter != 0U) 01676 { 01677 nbBytes = (uicounter < 4U) ? uicounter : 4U; 01678 fifoword = 0U; 01679 for (count = 0U; count < nbBytes; count++) 01680 { 01681 fifoword |= (((uint32_t)(*(pparams + count))) << (8U * count)); 01682 } 01683 hdsi->Instance->GPDR = fifoword; 01684 01685 uicounter -= nbBytes; 01686 pparams += nbBytes; 01687 } 01688 01689 /* Configure the packet to send a long DCS command */ 01690 DSI_ConfigPacketHeader(hdsi->Instance, 01691 ChannelID, 01692 Mode, 01693 ((NbParams + 1U) & 0x00FFU), 01694 (((NbParams + 1U) & 0xFF00U) >> 8U)); 01695 01696 /* Process unlocked */ 01697 __HAL_UNLOCK(hdsi); 01698 01699 return HAL_OK; 01700 } 01701 01702 /** 01703 * @brief Read command (DCS or generic) 01704 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01705 * the configuration information for the DSI. 01706 * @param ChannelNbr Virtual channel ID 01707 * @param Array pointer to a buffer to store the payload of a read back operation. 01708 * @param Size Data size to be read (in byte). 01709 * @param Mode DSI read packet data type. 01710 * This parameter can be any value of @arg DSI_SHORT_READ_PKT_Data_Type. 01711 * @param DCSCmd DCS get/read command. 01712 * @param ParametersTable Pointer to parameter values table. 01713 * @retval HAL status 01714 */ 01715 HAL_StatusTypeDef HAL_DSI_Read(DSI_HandleTypeDef *hdsi, 01716 uint32_t ChannelNbr, 01717 uint8_t *Array, 01718 uint32_t Size, 01719 uint32_t Mode, 01720 uint32_t DCSCmd, 01721 uint8_t *ParametersTable) 01722 { 01723 uint32_t tickstart; 01724 uint8_t *pdata = Array; 01725 uint32_t datasize = Size; 01726 uint32_t fifoword; 01727 uint32_t nbbytes; 01728 uint32_t count; 01729 01730 /* Process locked */ 01731 __HAL_LOCK(hdsi); 01732 01733 /* Check the parameters */ 01734 assert_param(IS_DSI_READ_PACKET_TYPE(Mode)); 01735 01736 if (datasize > 2U) 01737 { 01738 /* set max return packet size */ 01739 if (DSI_ShortWrite(hdsi, ChannelNbr, DSI_MAX_RETURN_PKT_SIZE, ((datasize) & 0xFFU), 01740 (((datasize) >> 8U) & 0xFFU)) != HAL_OK) 01741 { 01742 /* Process Unlocked */ 01743 __HAL_UNLOCK(hdsi); 01744 01745 return HAL_ERROR; 01746 } 01747 } 01748 01749 /* Configure the packet to read command */ 01750 if (Mode == DSI_DCS_SHORT_PKT_READ) 01751 { 01752 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, DCSCmd, 0U); 01753 } 01754 else if (Mode == DSI_GEN_SHORT_PKT_READ_P0) 01755 { 01756 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, 0U, 0U); 01757 } 01758 else if (Mode == DSI_GEN_SHORT_PKT_READ_P1) 01759 { 01760 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], 0U); 01761 } 01762 else if (Mode == DSI_GEN_SHORT_PKT_READ_P2) 01763 { 01764 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], ParametersTable[1U]); 01765 } 01766 else 01767 { 01768 /* Process Unlocked */ 01769 __HAL_UNLOCK(hdsi); 01770 01771 return HAL_ERROR; 01772 } 01773 01774 /* Get tick */ 01775 tickstart = HAL_GetTick(); 01776 01777 /* If DSI fifo is not empty, read requested bytes */ 01778 while (((int32_t)(datasize)) > 0) 01779 { 01780 if ((hdsi->Instance->GPSR & DSI_GPSR_PRDFE) == 0U) 01781 { 01782 fifoword = hdsi->Instance->GPDR; 01783 nbbytes = (datasize < 4U) ? datasize : 4U; 01784 01785 for (count = 0U; count < nbbytes; count++) 01786 { 01787 *pdata = (uint8_t)(fifoword >> (8U * count)); 01788 pdata++; 01789 datasize--; 01790 } 01791 } 01792 01793 /* Check for the Timeout */ 01794 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 01795 { 01796 /* Process Unlocked */ 01797 __HAL_UNLOCK(hdsi); 01798 01799 return HAL_TIMEOUT; 01800 } 01801 01802 /* Software workaround to avoid HAL_TIMEOUT when a DSI read command is */ 01803 /* issued to the panel and the read data is not captured by the DSI Host */ 01804 /* which returns Packet Size Error. */ 01805 /* Need to ensure that the Read command has finished before checking PSE */ 01806 if ((hdsi->Instance->GPSR & DSI_GPSR_RCB) == 0U) 01807 { 01808 if ((hdsi->Instance->ISR[1U] & DSI_ISR1_PSE) == DSI_ISR1_PSE) 01809 { 01810 /* Process Unlocked */ 01811 __HAL_UNLOCK(hdsi); 01812 01813 return HAL_ERROR; 01814 } 01815 } 01816 } 01817 01818 /* Process unlocked */ 01819 __HAL_UNLOCK(hdsi); 01820 01821 return HAL_OK; 01822 } 01823 01824 /** 01825 * @brief Enter the ULPM (Ultra Low Power Mode) with the D-PHY PLL running 01826 * (only data lanes are in ULPM) 01827 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01828 * the configuration information for the DSI. 01829 * @retval HAL status 01830 */ 01831 HAL_StatusTypeDef HAL_DSI_EnterULPMData(DSI_HandleTypeDef *hdsi) 01832 { 01833 uint32_t tickstart; 01834 01835 /* Process locked */ 01836 __HAL_LOCK(hdsi); 01837 01838 /* ULPS Request on Data Lanes */ 01839 hdsi->Instance->PUCR |= DSI_PUCR_URDL; 01840 01841 /* Get tick */ 01842 tickstart = HAL_GetTick(); 01843 01844 /* Wait until the D-PHY active lanes enter into ULPM */ 01845 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) 01846 { 01847 while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != 0U) 01848 { 01849 /* Check for the Timeout */ 01850 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 01851 { 01852 /* Process Unlocked */ 01853 __HAL_UNLOCK(hdsi); 01854 01855 return HAL_TIMEOUT; 01856 } 01857 } 01858 } 01859 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) 01860 { 01861 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != 0U) 01862 { 01863 /* Check for the Timeout */ 01864 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 01865 { 01866 /* Process Unlocked */ 01867 __HAL_UNLOCK(hdsi); 01868 01869 return HAL_TIMEOUT; 01870 } 01871 } 01872 } 01873 else 01874 { 01875 /* Process unlocked */ 01876 __HAL_UNLOCK(hdsi); 01877 01878 return HAL_ERROR; 01879 } 01880 01881 /* Process unlocked */ 01882 __HAL_UNLOCK(hdsi); 01883 01884 return HAL_OK; 01885 } 01886 01887 /** 01888 * @brief Exit the ULPM (Ultra Low Power Mode) with the D-PHY PLL running 01889 * (only data lanes are in ULPM) 01890 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01891 * the configuration information for the DSI. 01892 * @retval HAL status 01893 */ 01894 HAL_StatusTypeDef HAL_DSI_ExitULPMData(DSI_HandleTypeDef *hdsi) 01895 { 01896 uint32_t tickstart; 01897 01898 /* Process locked */ 01899 __HAL_LOCK(hdsi); 01900 01901 /* Exit ULPS on Data Lanes */ 01902 hdsi->Instance->PUCR |= DSI_PUCR_UEDL; 01903 01904 /* Get tick */ 01905 tickstart = HAL_GetTick(); 01906 01907 /* Wait until all active lanes exit ULPM */ 01908 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) 01909 { 01910 while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0) 01911 { 01912 /* Check for the Timeout */ 01913 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 01914 { 01915 /* Process Unlocked */ 01916 __HAL_UNLOCK(hdsi); 01917 01918 return HAL_TIMEOUT; 01919 } 01920 } 01921 } 01922 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) 01923 { 01924 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1)) 01925 { 01926 /* Check for the Timeout */ 01927 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 01928 { 01929 /* Process Unlocked */ 01930 __HAL_UNLOCK(hdsi); 01931 01932 return HAL_TIMEOUT; 01933 } 01934 } 01935 } 01936 else 01937 { 01938 /* Process unlocked */ 01939 __HAL_UNLOCK(hdsi); 01940 01941 return HAL_ERROR; 01942 } 01943 01944 /* wait for 1 ms*/ 01945 HAL_Delay(1U); 01946 01947 /* De-assert the ULPM requests and the ULPM exit bits */ 01948 hdsi->Instance->PUCR = 0U; 01949 01950 /* Process unlocked */ 01951 __HAL_UNLOCK(hdsi); 01952 01953 return HAL_OK; 01954 } 01955 01956 /** 01957 * @brief Enter the ULPM (Ultra Low Power Mode) with the D-PHY PLL turned off 01958 * (both data and clock lanes are in ULPM) 01959 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 01960 * the configuration information for the DSI. 01961 * @retval HAL status 01962 */ 01963 HAL_StatusTypeDef HAL_DSI_EnterULPM(DSI_HandleTypeDef *hdsi) 01964 { 01965 uint32_t tickstart; 01966 01967 /* Process locked */ 01968 __HAL_LOCK(hdsi); 01969 01970 /* Clock lane configuration: no more HS request */ 01971 hdsi->Instance->CLCR &= ~DSI_CLCR_DPCC; 01972 01973 /* Use system PLL as byte lane clock source before stopping DSIPHY clock source */ 01974 __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_PLLSAI2); 01975 01976 /* ULPS Request on Clock and Data Lanes */ 01977 hdsi->Instance->PUCR |= (DSI_PUCR_URCL | DSI_PUCR_URDL); 01978 01979 /* Get tick */ 01980 tickstart = HAL_GetTick(); 01981 01982 /* Wait until all active lanes exit ULPM */ 01983 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) 01984 { 01985 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != 0U) 01986 { 01987 /* Check for the Timeout */ 01988 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 01989 { 01990 /* Process Unlocked */ 01991 __HAL_UNLOCK(hdsi); 01992 01993 return HAL_TIMEOUT; 01994 } 01995 } 01996 } 01997 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) 01998 { 01999 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != 0U) 02000 { 02001 /* Check for the Timeout */ 02002 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 02003 { 02004 /* Process Unlocked */ 02005 __HAL_UNLOCK(hdsi); 02006 02007 return HAL_TIMEOUT; 02008 } 02009 } 02010 } 02011 else 02012 { 02013 /* Process unlocked */ 02014 __HAL_UNLOCK(hdsi); 02015 02016 return HAL_ERROR; 02017 } 02018 02019 /* Turn off the DSI PLL */ 02020 __HAL_DSI_PLL_DISABLE(hdsi); 02021 02022 /* Process unlocked */ 02023 __HAL_UNLOCK(hdsi); 02024 02025 return HAL_OK; 02026 } 02027 02028 /** 02029 * @brief Exit the ULPM (Ultra Low Power Mode) with the D-PHY PLL turned off 02030 * (both data and clock lanes are in ULPM) 02031 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02032 * the configuration information for the DSI. 02033 * @retval HAL status 02034 */ 02035 HAL_StatusTypeDef HAL_DSI_ExitULPM(DSI_HandleTypeDef *hdsi) 02036 { 02037 uint32_t tickstart; 02038 02039 /* Process locked */ 02040 __HAL_LOCK(hdsi); 02041 02042 /* Turn on the DSI PLL */ 02043 __HAL_DSI_PLL_ENABLE(hdsi); 02044 02045 /* Get tick */ 02046 tickstart = HAL_GetTick(); 02047 02048 /* Wait for the lock of the PLL */ 02049 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U) 02050 { 02051 /* Check for the Timeout */ 02052 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 02053 { 02054 /* Process Unlocked */ 02055 __HAL_UNLOCK(hdsi); 02056 02057 return HAL_TIMEOUT; 02058 } 02059 } 02060 02061 /* Reset the digital section of the D-PHY */ 02062 CLEAR_BIT(hdsi->Instance->PCTLR, DSI_PCTLR_DEN); 02063 SET_BIT(hdsi->Instance->PCTLR, DSI_PCTLR_DEN); 02064 02065 /* Exit ULPS on Clock and Data Lanes */ 02066 hdsi->Instance->PUCR |= (DSI_PUCR_UECL | DSI_PUCR_UEDL); 02067 02068 /* Get tick */ 02069 tickstart = HAL_GetTick(); 02070 02071 /* Wait until all active lanes exit ULPM */ 02072 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE) 02073 { 02074 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UANC)) 02075 { 02076 /* Check for the Timeout */ 02077 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 02078 { 02079 /* Process Unlocked */ 02080 __HAL_UNLOCK(hdsi); 02081 02082 return HAL_TIMEOUT; 02083 } 02084 } 02085 } 02086 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES) 02087 { 02088 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1 | 02089 DSI_PSR_UANC)) 02090 { 02091 /* Check for the Timeout */ 02092 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE) 02093 { 02094 /* Process Unlocked */ 02095 __HAL_UNLOCK(hdsi); 02096 02097 return HAL_TIMEOUT; 02098 } 02099 } 02100 } 02101 else 02102 { 02103 /* Process unlocked */ 02104 __HAL_UNLOCK(hdsi); 02105 02106 return HAL_ERROR; 02107 } 02108 02109 /* wait for 1 ms */ 02110 HAL_Delay(1U); 02111 02112 /* De-assert the ULPM requests and the ULPM exit bits */ 02113 hdsi->Instance->PUCR = 0U; 02114 02115 /* Switch the lane byte clock source in the RCC from system PLL to D-PHY */ 02116 __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_DSIPHY); 02117 02118 /* Restore clock lane configuration to HS */ 02119 hdsi->Instance->CLCR |= DSI_CLCR_DPCC; 02120 02121 /* Process unlocked */ 02122 __HAL_UNLOCK(hdsi); 02123 02124 return HAL_OK; 02125 } 02126 02127 /** 02128 * @brief Start test pattern generation 02129 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02130 * the configuration information for the DSI. 02131 * @param Mode Pattern generator mode 02132 * This parameter can be one of the following values: 02133 * 0 : Color bars (horizontal or vertical) 02134 * 1 : BER pattern (vertical only) 02135 * @param Orientation Pattern generator orientation 02136 * This parameter can be one of the following values: 02137 * 0 : Vertical color bars 02138 * 1 : Horizontal color bars 02139 * @retval HAL status 02140 */ 02141 HAL_StatusTypeDef HAL_DSI_PatternGeneratorStart(DSI_HandleTypeDef *hdsi, uint32_t Mode, uint32_t Orientation) 02142 { 02143 /* Process locked */ 02144 __HAL_LOCK(hdsi); 02145 02146 /* Configure pattern generator mode and orientation */ 02147 hdsi->Instance->VMCR &= ~(DSI_VMCR_PGM | DSI_VMCR_PGO); 02148 hdsi->Instance->VMCR |= ((Mode << 20U) | (Orientation << 24U)); 02149 02150 /* Enable pattern generator by setting PGE bit */ 02151 hdsi->Instance->VMCR |= DSI_VMCR_PGE; 02152 02153 /* Process unlocked */ 02154 __HAL_UNLOCK(hdsi); 02155 02156 return HAL_OK; 02157 } 02158 02159 /** 02160 * @brief Stop test pattern generation 02161 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02162 * the configuration information for the DSI. 02163 * @retval HAL status 02164 */ 02165 HAL_StatusTypeDef HAL_DSI_PatternGeneratorStop(DSI_HandleTypeDef *hdsi) 02166 { 02167 /* Process locked */ 02168 __HAL_LOCK(hdsi); 02169 02170 /* Disable pattern generator by clearing PGE bit */ 02171 hdsi->Instance->VMCR &= ~DSI_VMCR_PGE; 02172 02173 /* Process unlocked */ 02174 __HAL_UNLOCK(hdsi); 02175 02176 return HAL_OK; 02177 } 02178 02179 /** 02180 * @brief Set Slew-Rate And Delay Tuning 02181 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02182 * the configuration information for the DSI. 02183 * @param CommDelay Communication delay to be adjusted. 02184 * This parameter can be any value of @arg DSI_Communication_Delay 02185 * @param Lane select between clock or data lanes. 02186 * This parameter can be any value of @arg DSI_Lane_Group 02187 * @param Value Custom value of the slew-rate or delay 02188 * @retval HAL status 02189 */ 02190 HAL_StatusTypeDef HAL_DSI_SetSlewRateAndDelayTuning(DSI_HandleTypeDef *hdsi, uint32_t CommDelay, uint32_t Lane, 02191 uint32_t Value) 02192 { 02193 /* Process locked */ 02194 __HAL_LOCK(hdsi); 02195 02196 /* Check function parameters */ 02197 assert_param(IS_DSI_COMMUNICATION_DELAY(CommDelay)); 02198 assert_param(IS_DSI_LANE_GROUP(Lane)); 02199 02200 switch (CommDelay) 02201 { 02202 case DSI_SLEW_RATE_HSTX: 02203 if (Lane == DSI_CLOCK_LANE) 02204 { 02205 /* High-Speed Transmission Slew Rate Control on Clock Lane */ 02206 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCCL; 02207 hdsi->Instance->WPCR[1U] |= Value << 16U; 02208 } 02209 else if (Lane == DSI_DATA_LANES) 02210 { 02211 /* High-Speed Transmission Slew Rate Control on Data Lanes */ 02212 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCDL; 02213 hdsi->Instance->WPCR[1U] |= Value << 18U; 02214 } 02215 else 02216 { 02217 /* Process unlocked */ 02218 __HAL_UNLOCK(hdsi); 02219 02220 return HAL_ERROR; 02221 } 02222 break; 02223 case DSI_SLEW_RATE_LPTX: 02224 if (Lane == DSI_CLOCK_LANE) 02225 { 02226 /* Low-Power transmission Slew Rate Compensation on Clock Lane */ 02227 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCCL; 02228 hdsi->Instance->WPCR[1U] |= Value << 6U; 02229 } 02230 else if (Lane == DSI_DATA_LANES) 02231 { 02232 /* Low-Power transmission Slew Rate Compensation on Data Lanes */ 02233 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCDL; 02234 hdsi->Instance->WPCR[1U] |= Value << 8U; 02235 } 02236 else 02237 { 02238 /* Process unlocked */ 02239 __HAL_UNLOCK(hdsi); 02240 02241 return HAL_ERROR; 02242 } 02243 break; 02244 case DSI_HS_DELAY: 02245 if (Lane == DSI_CLOCK_LANE) 02246 { 02247 /* High-Speed Transmission Delay on Clock Lane */ 02248 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDCL; 02249 hdsi->Instance->WPCR[1U] |= Value; 02250 } 02251 else if (Lane == DSI_DATA_LANES) 02252 { 02253 /* High-Speed Transmission Delay on Data Lanes */ 02254 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDDL; 02255 hdsi->Instance->WPCR[1U] |= Value << 2U; 02256 } 02257 else 02258 { 02259 /* Process unlocked */ 02260 __HAL_UNLOCK(hdsi); 02261 02262 return HAL_ERROR; 02263 } 02264 break; 02265 default: 02266 break; 02267 } 02268 02269 /* Process unlocked */ 02270 __HAL_UNLOCK(hdsi); 02271 02272 return HAL_OK; 02273 } 02274 02275 /** 02276 * @brief Low-Power Reception Filter Tuning 02277 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02278 * the configuration information for the DSI. 02279 * @param Frequency cutoff frequency of low-pass filter at the input of LPRX 02280 * @retval HAL status 02281 */ 02282 HAL_StatusTypeDef HAL_DSI_SetLowPowerRXFilter(DSI_HandleTypeDef *hdsi, uint32_t Frequency) 02283 { 02284 /* Process locked */ 02285 __HAL_LOCK(hdsi); 02286 02287 /* Low-Power RX low-pass Filtering Tuning */ 02288 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPRXFT; 02289 hdsi->Instance->WPCR[1U] |= Frequency << 25U; 02290 02291 /* Process unlocked */ 02292 __HAL_UNLOCK(hdsi); 02293 02294 return HAL_OK; 02295 } 02296 02297 /** 02298 * @brief Activate an additional current path on all lanes to meet the SDDTx parameter 02299 * defined in the MIPI D-PHY specification 02300 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02301 * the configuration information for the DSI. 02302 * @param State ENABLE or DISABLE 02303 * @retval HAL status 02304 */ 02305 HAL_StatusTypeDef HAL_DSI_SetSDD(DSI_HandleTypeDef *hdsi, FunctionalState State) 02306 { 02307 /* Process locked */ 02308 __HAL_LOCK(hdsi); 02309 02310 /* Check function parameters */ 02311 assert_param(IS_FUNCTIONAL_STATE(State)); 02312 02313 /* Activate/Disactivate additional current path on all lanes */ 02314 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_SDDC; 02315 hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 12U); 02316 02317 /* Process unlocked */ 02318 __HAL_UNLOCK(hdsi); 02319 02320 return HAL_OK; 02321 } 02322 02323 /** 02324 * @brief Custom lane pins configuration 02325 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02326 * the configuration information for the DSI. 02327 * @param CustomLane Function to be applied on selected lane. 02328 * This parameter can be any value of @arg DSI_CustomLane 02329 * @param Lane select between clock or data lane 0 or data lane 1. 02330 * This parameter can be any value of @arg DSI_Lane_Select 02331 * @param State ENABLE or DISABLE 02332 * @retval HAL status 02333 */ 02334 HAL_StatusTypeDef HAL_DSI_SetLanePinsConfiguration(DSI_HandleTypeDef *hdsi, uint32_t CustomLane, uint32_t Lane, 02335 FunctionalState State) 02336 { 02337 /* Process locked */ 02338 __HAL_LOCK(hdsi); 02339 02340 /* Check function parameters */ 02341 assert_param(IS_DSI_CUSTOM_LANE(CustomLane)); 02342 assert_param(IS_DSI_LANE(Lane)); 02343 assert_param(IS_FUNCTIONAL_STATE(State)); 02344 02345 switch (CustomLane) 02346 { 02347 case DSI_SWAP_LANE_PINS: 02348 if (Lane == DSI_CLK_LANE) 02349 { 02350 /* Swap pins on clock lane */ 02351 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWCL; 02352 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 6U); 02353 } 02354 else if (Lane == DSI_DATA_LANE0) 02355 { 02356 /* Swap pins on data lane 0 */ 02357 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL0; 02358 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 7U); 02359 } 02360 else if (Lane == DSI_DATA_LANE1) 02361 { 02362 /* Swap pins on data lane 1 */ 02363 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL1; 02364 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 8U); 02365 } 02366 else 02367 { 02368 /* Process unlocked */ 02369 __HAL_UNLOCK(hdsi); 02370 02371 return HAL_ERROR; 02372 } 02373 break; 02374 case DSI_INVERT_HS_SIGNAL: 02375 if (Lane == DSI_CLK_LANE) 02376 { 02377 /* Invert HS signal on clock lane */ 02378 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSICL; 02379 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 9U); 02380 } 02381 else if (Lane == DSI_DATA_LANE0) 02382 { 02383 /* Invert HS signal on data lane 0 */ 02384 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL0; 02385 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 10U); 02386 } 02387 else if (Lane == DSI_DATA_LANE1) 02388 { 02389 /* Invert HS signal on data lane 1 */ 02390 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL1; 02391 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 11U); 02392 } 02393 else 02394 { 02395 /* Process unlocked */ 02396 __HAL_UNLOCK(hdsi); 02397 02398 return HAL_ERROR; 02399 } 02400 break; 02401 default: 02402 break; 02403 } 02404 02405 /* Process unlocked */ 02406 __HAL_UNLOCK(hdsi); 02407 02408 return HAL_OK; 02409 } 02410 02411 /** 02412 * @brief Set custom timing for the PHY 02413 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02414 * the configuration information for the DSI. 02415 * @param Timing PHY timing to be adjusted. 02416 * This parameter can be any value of @arg DSI_PHY_Timing 02417 * @param State ENABLE or DISABLE 02418 * @param Value Custom value of the timing 02419 * @retval HAL status 02420 */ 02421 HAL_StatusTypeDef HAL_DSI_SetPHYTimings(DSI_HandleTypeDef *hdsi, uint32_t Timing, FunctionalState State, uint32_t Value) 02422 { 02423 /* Process locked */ 02424 __HAL_LOCK(hdsi); 02425 02426 /* Check function parameters */ 02427 assert_param(IS_DSI_PHY_TIMING(Timing)); 02428 assert_param(IS_FUNCTIONAL_STATE(State)); 02429 02430 switch (Timing) 02431 { 02432 case DSI_TCLK_POST: 02433 /* Enable/Disable custom timing setting */ 02434 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPOSTEN; 02435 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 27U); 02436 02437 if (State != DISABLE) 02438 { 02439 /* Set custom value */ 02440 hdsi->Instance->WPCR[4U] &= ~DSI_WPCR4_TCLKPOST; 02441 hdsi->Instance->WPCR[4U] |= Value & DSI_WPCR4_TCLKPOST; 02442 } 02443 02444 break; 02445 case DSI_TLPX_CLK: 02446 /* Enable/Disable custom timing setting */ 02447 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXCEN; 02448 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 26U); 02449 02450 if (State != DISABLE) 02451 { 02452 /* Set custom value */ 02453 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXC; 02454 hdsi->Instance->WPCR[3U] |= (Value << 24U) & DSI_WPCR3_TLPXC; 02455 } 02456 02457 break; 02458 case DSI_THS_EXIT: 02459 /* Enable/Disable custom timing setting */ 02460 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSEXITEN; 02461 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 25U); 02462 02463 if (State != DISABLE) 02464 { 02465 /* Set custom value */ 02466 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSEXIT; 02467 hdsi->Instance->WPCR[3U] |= (Value << 16U) & DSI_WPCR3_THSEXIT; 02468 } 02469 02470 break; 02471 case DSI_TLPX_DATA: 02472 /* Enable/Disable custom timing setting */ 02473 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXDEN; 02474 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 24U); 02475 02476 if (State != DISABLE) 02477 { 02478 /* Set custom value */ 02479 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXD; 02480 hdsi->Instance->WPCR[3U] |= (Value << 8U) & DSI_WPCR3_TLPXD; 02481 } 02482 02483 break; 02484 case DSI_THS_ZERO: 02485 /* Enable/Disable custom timing setting */ 02486 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSZEROEN; 02487 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 23U); 02488 02489 if (State != DISABLE) 02490 { 02491 /* Set custom value */ 02492 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSZERO; 02493 hdsi->Instance->WPCR[3U] |= Value & DSI_WPCR3_THSZERO; 02494 } 02495 02496 break; 02497 case DSI_THS_TRAIL: 02498 /* Enable/Disable custom timing setting */ 02499 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSTRAILEN; 02500 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 22U); 02501 02502 if (State != DISABLE) 02503 { 02504 /* Set custom value */ 02505 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSTRAIL; 02506 hdsi->Instance->WPCR[2U] |= (Value << 24U) & DSI_WPCR2_THSTRAIL; 02507 } 02508 02509 break; 02510 case DSI_THS_PREPARE: 02511 /* Enable/Disable custom timing setting */ 02512 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSPREPEN; 02513 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 21U); 02514 02515 if (State != DISABLE) 02516 { 02517 /* Set custom value */ 02518 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSPREP; 02519 hdsi->Instance->WPCR[2U] |= (Value << 16U) & DSI_WPCR2_THSPREP; 02520 } 02521 02522 break; 02523 case DSI_TCLK_ZERO: 02524 /* Enable/Disable custom timing setting */ 02525 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKZEROEN; 02526 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 20U); 02527 02528 if (State != DISABLE) 02529 { 02530 /* Set custom value */ 02531 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKZERO; 02532 hdsi->Instance->WPCR[2U] |= (Value << 8U) & DSI_WPCR2_TCLKZERO; 02533 } 02534 02535 break; 02536 case DSI_TCLK_PREPARE: 02537 /* Enable/Disable custom timing setting */ 02538 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPREPEN; 02539 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 19U); 02540 02541 if (State != DISABLE) 02542 { 02543 /* Set custom value */ 02544 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKPREP; 02545 hdsi->Instance->WPCR[2U] |= Value & DSI_WPCR2_TCLKPREP; 02546 } 02547 02548 break; 02549 default: 02550 break; 02551 } 02552 02553 /* Process unlocked */ 02554 __HAL_UNLOCK(hdsi); 02555 02556 return HAL_OK; 02557 } 02558 02559 /** 02560 * @brief Force the Clock/Data Lane in TX Stop Mode 02561 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02562 * the configuration information for the DSI. 02563 * @param Lane select between clock or data lanes. 02564 * This parameter can be any value of @arg DSI_Lane_Group 02565 * @param State ENABLE or DISABLE 02566 * @retval HAL status 02567 */ 02568 HAL_StatusTypeDef HAL_DSI_ForceTXStopMode(DSI_HandleTypeDef *hdsi, uint32_t Lane, FunctionalState State) 02569 { 02570 /* Process locked */ 02571 __HAL_LOCK(hdsi); 02572 02573 /* Check function parameters */ 02574 assert_param(IS_DSI_LANE_GROUP(Lane)); 02575 assert_param(IS_FUNCTIONAL_STATE(State)); 02576 02577 if (Lane == DSI_CLOCK_LANE) 02578 { 02579 /* Force/Unforce the Clock Lane in TX Stop Mode */ 02580 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMCL; 02581 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 12U); 02582 } 02583 else if (Lane == DSI_DATA_LANES) 02584 { 02585 /* Force/Unforce the Data Lanes in TX Stop Mode */ 02586 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMDL; 02587 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 13U); 02588 } 02589 else 02590 { 02591 /* Process unlocked */ 02592 __HAL_UNLOCK(hdsi); 02593 02594 return HAL_ERROR; 02595 } 02596 02597 /* Process unlocked */ 02598 __HAL_UNLOCK(hdsi); 02599 02600 return HAL_OK; 02601 } 02602 02603 /** 02604 * @brief Force LP Receiver in Low-Power Mode 02605 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02606 * the configuration information for the DSI. 02607 * @param State ENABLE or DISABLE 02608 * @retval HAL status 02609 */ 02610 HAL_StatusTypeDef HAL_DSI_ForceRXLowPower(DSI_HandleTypeDef *hdsi, FunctionalState State) 02611 { 02612 /* Process locked */ 02613 __HAL_LOCK(hdsi); 02614 02615 /* Check function parameters */ 02616 assert_param(IS_FUNCTIONAL_STATE(State)); 02617 02618 /* Force/Unforce LP Receiver in Low-Power Mode */ 02619 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_FLPRXLPM; 02620 hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 22U); 02621 02622 /* Process unlocked */ 02623 __HAL_UNLOCK(hdsi); 02624 02625 return HAL_OK; 02626 } 02627 02628 /** 02629 * @brief Force Data Lanes in RX Mode after a BTA 02630 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02631 * the configuration information for the DSI. 02632 * @param State ENABLE or DISABLE 02633 * @retval HAL status 02634 */ 02635 HAL_StatusTypeDef HAL_DSI_ForceDataLanesInRX(DSI_HandleTypeDef *hdsi, FunctionalState State) 02636 { 02637 /* Process locked */ 02638 __HAL_LOCK(hdsi); 02639 02640 /* Check function parameters */ 02641 assert_param(IS_FUNCTIONAL_STATE(State)); 02642 02643 /* Force Data Lanes in RX Mode */ 02644 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TDDL; 02645 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 16U); 02646 02647 /* Process unlocked */ 02648 __HAL_UNLOCK(hdsi); 02649 02650 return HAL_OK; 02651 } 02652 02653 /** 02654 * @brief Enable a pull-down on the lanes to prevent from floating states when unused 02655 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02656 * the configuration information for the DSI. 02657 * @param State ENABLE or DISABLE 02658 * @retval HAL status 02659 */ 02660 HAL_StatusTypeDef HAL_DSI_SetPullDown(DSI_HandleTypeDef *hdsi, FunctionalState State) 02661 { 02662 /* Process locked */ 02663 __HAL_LOCK(hdsi); 02664 02665 /* Check function parameters */ 02666 assert_param(IS_FUNCTIONAL_STATE(State)); 02667 02668 /* Enable/Disable pull-down on lanes */ 02669 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_PDEN; 02670 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 18U); 02671 02672 /* Process unlocked */ 02673 __HAL_UNLOCK(hdsi); 02674 02675 return HAL_OK; 02676 } 02677 02678 /** 02679 * @brief Switch off the contention detection on data lanes 02680 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02681 * the configuration information for the DSI. 02682 * @param State ENABLE or DISABLE 02683 * @retval HAL status 02684 */ 02685 HAL_StatusTypeDef HAL_DSI_SetContentionDetectionOff(DSI_HandleTypeDef *hdsi, FunctionalState State) 02686 { 02687 /* Process locked */ 02688 __HAL_LOCK(hdsi); 02689 02690 /* Check function parameters */ 02691 assert_param(IS_FUNCTIONAL_STATE(State)); 02692 02693 /* Contention Detection on Data Lanes OFF */ 02694 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_CDOFFDL; 02695 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 14U); 02696 02697 /* Process unlocked */ 02698 __HAL_UNLOCK(hdsi); 02699 02700 return HAL_OK; 02701 } 02702 02703 /** 02704 * @} 02705 */ 02706 02707 /** @defgroup DSI_Group4 Peripheral State and Errors functions 02708 * @brief Peripheral State and Errors functions 02709 * 02710 @verbatim 02711 =============================================================================== 02712 ##### Peripheral State and Errors functions ##### 02713 =============================================================================== 02714 [..] 02715 This subsection provides functions allowing to 02716 (+) Check the DSI state. 02717 (+) Get error code. 02718 02719 @endverbatim 02720 * @{ 02721 */ 02722 02723 /** 02724 * @brief Return the DSI state 02725 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02726 * the configuration information for the DSI. 02727 * @retval HAL state 02728 */ 02729 HAL_DSI_StateTypeDef HAL_DSI_GetState(DSI_HandleTypeDef *hdsi) 02730 { 02731 return hdsi->State; 02732 } 02733 02734 /** 02735 * @brief Return the DSI error code 02736 * @param hdsi pointer to a DSI_HandleTypeDef structure that contains 02737 * the configuration information for the DSI. 02738 * @retval DSI Error Code 02739 */ 02740 uint32_t HAL_DSI_GetError(DSI_HandleTypeDef *hdsi) 02741 { 02742 /* Get the error code */ 02743 return hdsi->ErrorCode; 02744 } 02745 02746 /** 02747 * @} 02748 */ 02749 02750 /** 02751 * @} 02752 */ 02753 02754 /** 02755 * @} 02756 */ 02757 02758 #endif /* DSI */ 02759 02760 #endif /* HAL_DSI_MODULE_ENABLED */ 02761 02762 /** 02763 * @} 02764 */