File indexing completed on 2025-05-11 08:23:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 #include "stm32h7xx_hal.h"
0158
0159
0160
0161
0162
0163 #ifdef HAL_DSI_MODULE_ENABLED
0164
0165 #if defined(DSI)
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176 #define DSI_TIMEOUT_VALUE ((uint32_t)1000U)
0177
0178 #define DSI_ERROR_ACK_MASK (DSI_ISR0_AE0 | DSI_ISR0_AE1 | DSI_ISR0_AE2 | DSI_ISR0_AE3 | \
0179 DSI_ISR0_AE4 | DSI_ISR0_AE5 | DSI_ISR0_AE6 | DSI_ISR0_AE7 | \
0180 DSI_ISR0_AE8 | DSI_ISR0_AE9 | DSI_ISR0_AE10 | DSI_ISR0_AE11 | \
0181 DSI_ISR0_AE12 | DSI_ISR0_AE13 | DSI_ISR0_AE14 | DSI_ISR0_AE15)
0182 #define DSI_ERROR_PHY_MASK (DSI_ISR0_PE0 | DSI_ISR0_PE1 | DSI_ISR0_PE2 | DSI_ISR0_PE3 | DSI_ISR0_PE4)
0183 #define DSI_ERROR_TX_MASK DSI_ISR1_TOHSTX
0184 #define DSI_ERROR_RX_MASK DSI_ISR1_TOLPRX
0185 #define DSI_ERROR_ECC_MASK (DSI_ISR1_ECCSE | DSI_ISR1_ECCME)
0186 #define DSI_ERROR_CRC_MASK DSI_ISR1_CRCE
0187 #define DSI_ERROR_PSE_MASK DSI_ISR1_PSE
0188 #define DSI_ERROR_EOT_MASK DSI_ISR1_EOTPE
0189 #define DSI_ERROR_OVF_MASK DSI_ISR1_LPWRE
0190 #define DSI_ERROR_GEN_MASK (DSI_ISR1_GCWRE | DSI_ISR1_GPWRE | DSI_ISR1_GPTXE | DSI_ISR1_GPRDE | DSI_ISR1_GPRXE)
0191
0192
0193
0194
0195
0196
0197
0198
0199 static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx, uint32_t ChannelID, uint32_t DataType, uint32_t Data0,
0200 uint32_t Data1);
0201
0202 static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi,
0203 uint32_t ChannelID,
0204 uint32_t Mode,
0205 uint32_t Param1,
0206 uint32_t Param2);
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226 static void DSI_ConfigPacketHeader(DSI_TypeDef *DSIx,
0227 uint32_t ChannelID,
0228 uint32_t DataType,
0229 uint32_t Data0,
0230 uint32_t Data1)
0231 {
0232
0233 DSIx->GHCR = (DataType | (ChannelID << 6U) | (Data0 << 8U) | (Data1 << 16U));
0234 }
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249 static HAL_StatusTypeDef DSI_ShortWrite(DSI_HandleTypeDef *hdsi,
0250 uint32_t ChannelID,
0251 uint32_t Mode,
0252 uint32_t Param1,
0253 uint32_t Param2)
0254 {
0255 uint32_t tickstart;
0256
0257
0258 tickstart = HAL_GetTick();
0259
0260
0261 while ((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U)
0262 {
0263
0264 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
0265 {
0266 return HAL_TIMEOUT;
0267 }
0268 }
0269
0270
0271
0272 hdsi->Instance->GHCR = (Mode | (ChannelID << 6U) | (Param1 << 8U) | (Param2 << 16U));
0273
0274 return HAL_OK;
0275 }
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311 HAL_StatusTypeDef HAL_DSI_Init(DSI_HandleTypeDef *hdsi, DSI_PLLInitTypeDef *PLLInit)
0312 {
0313 uint32_t tickstart;
0314 uint32_t unitIntervalx4;
0315 uint32_t tempIDF;
0316
0317
0318 if (hdsi == NULL)
0319 {
0320 return HAL_ERROR;
0321 }
0322
0323
0324 assert_param(IS_DSI_PLL_NDIV(PLLInit->PLLNDIV));
0325 assert_param(IS_DSI_PLL_IDF(PLLInit->PLLIDF));
0326 assert_param(IS_DSI_PLL_ODF(PLLInit->PLLODF));
0327 assert_param(IS_DSI_AUTO_CLKLANE_CONTROL(hdsi->Init.AutomaticClockLaneControl));
0328 assert_param(IS_DSI_NUMBER_OF_LANES(hdsi->Init.NumberOfLanes));
0329
0330 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
0331 if (hdsi->State == HAL_DSI_STATE_RESET)
0332 {
0333
0334 hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback;
0335 hdsi->EndOfRefreshCallback = HAL_DSI_EndOfRefreshCallback;
0336 hdsi->ErrorCallback = HAL_DSI_ErrorCallback;
0337
0338 if (hdsi->MspInitCallback == NULL)
0339 {
0340 hdsi->MspInitCallback = HAL_DSI_MspInit;
0341 }
0342
0343 hdsi->MspInitCallback(hdsi);
0344 }
0345 #else
0346 if (hdsi->State == HAL_DSI_STATE_RESET)
0347 {
0348
0349 HAL_DSI_MspInit(hdsi);
0350 }
0351 #endif
0352
0353
0354 hdsi->State = HAL_DSI_STATE_BUSY;
0355
0356
0357
0358
0359 __HAL_DSI_REG_ENABLE(hdsi);
0360
0361
0362 tickstart = HAL_GetTick();
0363
0364
0365 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_RRS) == 0U)
0366 {
0367
0368 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
0369 {
0370 return HAL_TIMEOUT;
0371 }
0372 }
0373
0374
0375 hdsi->Instance->WRPCR &= ~(DSI_WRPCR_PLL_NDIV | DSI_WRPCR_PLL_IDF | DSI_WRPCR_PLL_ODF);
0376 hdsi->Instance->WRPCR |= (((PLLInit->PLLNDIV) << DSI_WRPCR_PLL_NDIV_Pos) | \
0377 ((PLLInit->PLLIDF) << DSI_WRPCR_PLL_IDF_Pos) | \
0378 ((PLLInit->PLLODF) << DSI_WRPCR_PLL_ODF_Pos));
0379
0380
0381 __HAL_DSI_PLL_ENABLE(hdsi);
0382
0383
0384
0385 HAL_Delay(1);
0386
0387
0388 tickstart = HAL_GetTick();
0389
0390
0391 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)
0392 {
0393
0394 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
0395 {
0396 return HAL_TIMEOUT;
0397 }
0398 }
0399
0400 __HAL_DSI_ENABLE(hdsi);
0401
0402
0403
0404 hdsi->Instance->CCR &= ~DSI_CCR_TXECKDIV;
0405 hdsi->Instance->CCR |= hdsi->Init.TXEscapeCkdiv;
0406
0407
0408
0409 hdsi->Instance->PCTLR |= DSI_PCTLR_DEN;
0410
0411 hdsi->Instance->PCTLR |= DSI_PCTLR_CKE;
0412
0413
0414
0415 hdsi->Instance->PCONFR &= ~DSI_PCONFR_NL;
0416 hdsi->Instance->PCONFR |= hdsi->Init.NumberOfLanes;
0417
0418
0419 tickstart = HAL_GetTick();
0420 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
0421 {
0422 while ((hdsi->Instance->PSR & (DSI_PSR_PSS0 | DSI_PSR_PSSC)) != (DSI_PSR_PSS0 | DSI_PSR_PSSC))
0423 {
0424 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
0425 {
0426
0427 __HAL_UNLOCK(hdsi);
0428
0429 return HAL_TIMEOUT;
0430 }
0431 }
0432 }
0433 else
0434 {
0435 while ((hdsi->Instance->PSR & (DSI_PSR_PSS0 | DSI_PSR_PSS1 | DSI_PSR_PSSC)) != (DSI_PSR_PSS0 | \
0436 DSI_PSR_PSS1 | DSI_PSR_PSSC))
0437 {
0438 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
0439 {
0440
0441 __HAL_UNLOCK(hdsi);
0442
0443 return HAL_TIMEOUT;
0444 }
0445 }
0446 }
0447
0448
0449
0450
0451 tempIDF = (PLLInit->PLLIDF > 0U) ? PLLInit->PLLIDF : 1U;
0452 unitIntervalx4 = (4000000U * tempIDF * ((1UL << (0x3U & PLLInit->PLLODF)))) / ((HSE_VALUE / 1000U) * PLLInit->PLLNDIV);
0453
0454
0455 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_UIX4;
0456 hdsi->Instance->WPCR[0U] |= unitIntervalx4;
0457
0458
0459
0460
0461 hdsi->Instance->IER[0U] = 0U;
0462 hdsi->Instance->IER[1U] = 0U;
0463 hdsi->ErrorMsk = 0U;
0464
0465 __HAL_DSI_DISABLE(hdsi);
0466
0467
0468 hdsi->Instance->CLCR &= ~(DSI_CLCR_DPCC | DSI_CLCR_ACR);
0469 hdsi->Instance->CLCR |= (DSI_CLCR_DPCC | hdsi->Init.AutomaticClockLaneControl);
0470
0471
0472 hdsi->ErrorCode = HAL_DSI_ERROR_NONE;
0473
0474
0475 hdsi->State = HAL_DSI_STATE_READY;
0476
0477 return HAL_OK;
0478 }
0479
0480
0481
0482
0483
0484
0485
0486
0487 HAL_StatusTypeDef HAL_DSI_DeInit(DSI_HandleTypeDef *hdsi)
0488 {
0489
0490 if (hdsi == NULL)
0491 {
0492 return HAL_ERROR;
0493 }
0494
0495
0496 hdsi->State = HAL_DSI_STATE_BUSY;
0497
0498
0499 __HAL_DSI_WRAPPER_DISABLE(hdsi);
0500
0501
0502 __HAL_DSI_DISABLE(hdsi);
0503
0504
0505 hdsi->Instance->PCTLR &= ~(DSI_PCTLR_CKE | DSI_PCTLR_DEN);
0506
0507
0508 __HAL_DSI_PLL_DISABLE(hdsi);
0509
0510
0511 __HAL_DSI_REG_DISABLE(hdsi);
0512
0513 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
0514 if (hdsi->MspDeInitCallback == NULL)
0515 {
0516 hdsi->MspDeInitCallback = HAL_DSI_MspDeInit;
0517 }
0518
0519 hdsi->MspDeInitCallback(hdsi);
0520 #else
0521
0522 HAL_DSI_MspDeInit(hdsi);
0523 #endif
0524
0525
0526 hdsi->ErrorCode = HAL_DSI_ERROR_NONE;
0527
0528
0529 hdsi->State = HAL_DSI_STATE_RESET;
0530
0531
0532 __HAL_UNLOCK(hdsi);
0533
0534 return HAL_OK;
0535 }
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545 HAL_StatusTypeDef HAL_DSI_ConfigErrorMonitor(DSI_HandleTypeDef *hdsi, uint32_t ActiveErrors)
0546 {
0547
0548 __HAL_LOCK(hdsi);
0549
0550 hdsi->Instance->IER[0U] = 0U;
0551 hdsi->Instance->IER[1U] = 0U;
0552
0553
0554 hdsi->ErrorMsk = ActiveErrors;
0555
0556 if ((ActiveErrors & HAL_DSI_ERROR_ACK) != 0U)
0557 {
0558
0559 hdsi->Instance->IER[0U] |= DSI_ERROR_ACK_MASK;
0560 }
0561
0562 if ((ActiveErrors & HAL_DSI_ERROR_PHY) != 0U)
0563 {
0564
0565 hdsi->Instance->IER[0U] |= DSI_ERROR_PHY_MASK;
0566 }
0567
0568 if ((ActiveErrors & HAL_DSI_ERROR_TX) != 0U)
0569 {
0570
0571 hdsi->Instance->IER[1U] |= DSI_ERROR_TX_MASK;
0572 }
0573
0574 if ((ActiveErrors & HAL_DSI_ERROR_RX) != 0U)
0575 {
0576
0577 hdsi->Instance->IER[1U] |= DSI_ERROR_RX_MASK;
0578 }
0579
0580 if ((ActiveErrors & HAL_DSI_ERROR_ECC) != 0U)
0581 {
0582
0583 hdsi->Instance->IER[1U] |= DSI_ERROR_ECC_MASK;
0584 }
0585
0586 if ((ActiveErrors & HAL_DSI_ERROR_CRC) != 0U)
0587 {
0588
0589 hdsi->Instance->IER[1U] |= DSI_ERROR_CRC_MASK;
0590 }
0591
0592 if ((ActiveErrors & HAL_DSI_ERROR_PSE) != 0U)
0593 {
0594
0595 hdsi->Instance->IER[1U] |= DSI_ERROR_PSE_MASK;
0596 }
0597
0598 if ((ActiveErrors & HAL_DSI_ERROR_EOT) != 0U)
0599 {
0600
0601 hdsi->Instance->IER[1U] |= DSI_ERROR_EOT_MASK;
0602 }
0603
0604 if ((ActiveErrors & HAL_DSI_ERROR_OVF) != 0U)
0605 {
0606
0607 hdsi->Instance->IER[1U] |= DSI_ERROR_OVF_MASK;
0608 }
0609
0610 if ((ActiveErrors & HAL_DSI_ERROR_GEN) != 0U)
0611 {
0612
0613 hdsi->Instance->IER[1U] |= DSI_ERROR_GEN_MASK;
0614 }
0615
0616
0617 __HAL_UNLOCK(hdsi);
0618
0619 return HAL_OK;
0620 }
0621
0622
0623
0624
0625
0626
0627
0628 __weak void HAL_DSI_MspInit(DSI_HandleTypeDef *hdsi)
0629 {
0630
0631 UNUSED(hdsi);
0632
0633
0634
0635 }
0636
0637
0638
0639
0640
0641
0642
0643 __weak void HAL_DSI_MspDeInit(DSI_HandleTypeDef *hdsi)
0644 {
0645
0646 UNUSED(hdsi);
0647
0648
0649
0650 }
0651
0652 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667 HAL_StatusTypeDef HAL_DSI_RegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID,
0668 pDSI_CallbackTypeDef pCallback)
0669 {
0670 HAL_StatusTypeDef status = HAL_OK;
0671
0672 if (pCallback == NULL)
0673 {
0674
0675 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
0676
0677 return HAL_ERROR;
0678 }
0679
0680 __HAL_LOCK(hdsi);
0681
0682 if (hdsi->State == HAL_DSI_STATE_READY)
0683 {
0684 switch (CallbackID)
0685 {
0686 case HAL_DSI_TEARING_EFFECT_CB_ID :
0687 hdsi->TearingEffectCallback = pCallback;
0688 break;
0689
0690 case HAL_DSI_ENDOF_REFRESH_CB_ID :
0691 hdsi->EndOfRefreshCallback = pCallback;
0692 break;
0693
0694 case HAL_DSI_ERROR_CB_ID :
0695 hdsi->ErrorCallback = pCallback;
0696 break;
0697
0698 case HAL_DSI_MSPINIT_CB_ID :
0699 hdsi->MspInitCallback = pCallback;
0700 break;
0701
0702 case HAL_DSI_MSPDEINIT_CB_ID :
0703 hdsi->MspDeInitCallback = pCallback;
0704 break;
0705
0706 default :
0707
0708 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
0709
0710 status = HAL_ERROR;
0711 break;
0712 }
0713 }
0714 else if (hdsi->State == HAL_DSI_STATE_RESET)
0715 {
0716 switch (CallbackID)
0717 {
0718 case HAL_DSI_MSPINIT_CB_ID :
0719 hdsi->MspInitCallback = pCallback;
0720 break;
0721
0722 case HAL_DSI_MSPDEINIT_CB_ID :
0723 hdsi->MspDeInitCallback = pCallback;
0724 break;
0725
0726 default :
0727
0728 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
0729
0730 status = HAL_ERROR;
0731 break;
0732 }
0733 }
0734 else
0735 {
0736
0737 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
0738
0739 status = HAL_ERROR;
0740 }
0741
0742
0743 __HAL_UNLOCK(hdsi);
0744
0745 return status;
0746 }
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761 HAL_StatusTypeDef HAL_DSI_UnRegisterCallback(DSI_HandleTypeDef *hdsi, HAL_DSI_CallbackIDTypeDef CallbackID)
0762 {
0763 HAL_StatusTypeDef status = HAL_OK;
0764
0765
0766 __HAL_LOCK(hdsi);
0767
0768 if (hdsi->State == HAL_DSI_STATE_READY)
0769 {
0770 switch (CallbackID)
0771 {
0772 case HAL_DSI_TEARING_EFFECT_CB_ID :
0773 hdsi->TearingEffectCallback = HAL_DSI_TearingEffectCallback;
0774 break;
0775
0776 case HAL_DSI_ENDOF_REFRESH_CB_ID :
0777 hdsi->EndOfRefreshCallback = HAL_DSI_EndOfRefreshCallback;
0778 break;
0779
0780 case HAL_DSI_ERROR_CB_ID :
0781 hdsi->ErrorCallback = HAL_DSI_ErrorCallback;
0782 break;
0783
0784 case HAL_DSI_MSPINIT_CB_ID :
0785 hdsi->MspInitCallback = HAL_DSI_MspInit;
0786 break;
0787
0788 case HAL_DSI_MSPDEINIT_CB_ID :
0789 hdsi->MspDeInitCallback = HAL_DSI_MspDeInit;
0790 break;
0791
0792 default :
0793
0794 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
0795
0796 status = HAL_ERROR;
0797 break;
0798 }
0799 }
0800 else if (hdsi->State == HAL_DSI_STATE_RESET)
0801 {
0802 switch (CallbackID)
0803 {
0804 case HAL_DSI_MSPINIT_CB_ID :
0805 hdsi->MspInitCallback = HAL_DSI_MspInit;
0806 break;
0807
0808 case HAL_DSI_MSPDEINIT_CB_ID :
0809 hdsi->MspDeInitCallback = HAL_DSI_MspDeInit;
0810 break;
0811
0812 default :
0813
0814 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
0815
0816 status = HAL_ERROR;
0817 break;
0818 }
0819 }
0820 else
0821 {
0822
0823 hdsi->ErrorCode |= HAL_DSI_ERROR_INVALID_CALLBACK;
0824
0825 status = HAL_ERROR;
0826 }
0827
0828
0829 __HAL_UNLOCK(hdsi);
0830
0831 return status;
0832 }
0833 #endif
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859 void HAL_DSI_IRQHandler(DSI_HandleTypeDef *hdsi)
0860 {
0861 uint32_t ErrorStatus0;
0862 uint32_t ErrorStatus1;
0863
0864
0865 if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_TE) != 0U)
0866 {
0867 if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_TE) != 0U)
0868 {
0869
0870 __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_TE);
0871
0872
0873 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
0874
0875 hdsi->TearingEffectCallback(hdsi);
0876 #else
0877
0878 HAL_DSI_TearingEffectCallback(hdsi);
0879 #endif
0880 }
0881 }
0882
0883
0884 if (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_ER) != 0U)
0885 {
0886 if (__HAL_DSI_GET_IT_SOURCE(hdsi, DSI_IT_ER) != 0U)
0887 {
0888
0889 __HAL_DSI_CLEAR_FLAG(hdsi, DSI_FLAG_ER);
0890
0891
0892 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
0893
0894 hdsi->EndOfRefreshCallback(hdsi);
0895 #else
0896
0897 HAL_DSI_EndOfRefreshCallback(hdsi);
0898 #endif
0899 }
0900 }
0901
0902
0903 if (hdsi->ErrorMsk != 0U)
0904 {
0905 ErrorStatus0 = hdsi->Instance->ISR[0U];
0906 ErrorStatus0 &= hdsi->Instance->IER[0U];
0907 ErrorStatus1 = hdsi->Instance->ISR[1U];
0908 ErrorStatus1 &= hdsi->Instance->IER[1U];
0909
0910 if ((ErrorStatus0 & DSI_ERROR_ACK_MASK) != 0U)
0911 {
0912 hdsi->ErrorCode |= HAL_DSI_ERROR_ACK;
0913 }
0914
0915 if ((ErrorStatus0 & DSI_ERROR_PHY_MASK) != 0U)
0916 {
0917 hdsi->ErrorCode |= HAL_DSI_ERROR_PHY;
0918 }
0919
0920 if ((ErrorStatus1 & DSI_ERROR_TX_MASK) != 0U)
0921 {
0922 hdsi->ErrorCode |= HAL_DSI_ERROR_TX;
0923 }
0924
0925 if ((ErrorStatus1 & DSI_ERROR_RX_MASK) != 0U)
0926 {
0927 hdsi->ErrorCode |= HAL_DSI_ERROR_RX;
0928 }
0929
0930 if ((ErrorStatus1 & DSI_ERROR_ECC_MASK) != 0U)
0931 {
0932 hdsi->ErrorCode |= HAL_DSI_ERROR_ECC;
0933 }
0934
0935 if ((ErrorStatus1 & DSI_ERROR_CRC_MASK) != 0U)
0936 {
0937 hdsi->ErrorCode |= HAL_DSI_ERROR_CRC;
0938 }
0939
0940 if ((ErrorStatus1 & DSI_ERROR_PSE_MASK) != 0U)
0941 {
0942 hdsi->ErrorCode |= HAL_DSI_ERROR_PSE;
0943 }
0944
0945 if ((ErrorStatus1 & DSI_ERROR_EOT_MASK) != 0U)
0946 {
0947 hdsi->ErrorCode |= HAL_DSI_ERROR_EOT;
0948 }
0949
0950 if ((ErrorStatus1 & DSI_ERROR_OVF_MASK) != 0U)
0951 {
0952 hdsi->ErrorCode |= HAL_DSI_ERROR_OVF;
0953 }
0954
0955 if ((ErrorStatus1 & DSI_ERROR_GEN_MASK) != 0U)
0956 {
0957 hdsi->ErrorCode |= HAL_DSI_ERROR_GEN;
0958 }
0959
0960
0961 if (hdsi->ErrorCode != HAL_DSI_ERROR_NONE)
0962 {
0963
0964 #if (USE_HAL_DSI_REGISTER_CALLBACKS == 1)
0965
0966 hdsi->ErrorCallback(hdsi);
0967 #else
0968
0969 HAL_DSI_ErrorCallback(hdsi);
0970 #endif
0971 }
0972 }
0973 }
0974
0975
0976
0977
0978
0979
0980
0981 __weak void HAL_DSI_TearingEffectCallback(DSI_HandleTypeDef *hdsi)
0982 {
0983
0984 UNUSED(hdsi);
0985
0986
0987
0988 }
0989
0990
0991
0992
0993
0994
0995
0996 __weak void HAL_DSI_EndOfRefreshCallback(DSI_HandleTypeDef *hdsi)
0997 {
0998
0999 UNUSED(hdsi);
1000
1001
1002
1003 }
1004
1005
1006
1007
1008
1009
1010
1011 __weak void HAL_DSI_ErrorCallback(DSI_HandleTypeDef *hdsi)
1012 {
1013
1014 UNUSED(hdsi);
1015
1016
1017
1018 }
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072 HAL_StatusTypeDef HAL_DSI_SetGenericVCID(DSI_HandleTypeDef *hdsi, uint32_t VirtualChannelID)
1073 {
1074
1075 __HAL_LOCK(hdsi);
1076
1077
1078 hdsi->Instance->GVCIDR &= ~DSI_GVCIDR_VCID;
1079 hdsi->Instance->GVCIDR |= VirtualChannelID;
1080
1081
1082 __HAL_UNLOCK(hdsi);
1083
1084 return HAL_OK;
1085 }
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095 HAL_StatusTypeDef HAL_DSI_ConfigVideoMode(DSI_HandleTypeDef *hdsi, DSI_VidCfgTypeDef *VidCfg)
1096 {
1097
1098 __HAL_LOCK(hdsi);
1099
1100
1101 assert_param(IS_DSI_COLOR_CODING(VidCfg->ColorCoding));
1102 assert_param(IS_DSI_VIDEO_MODE_TYPE(VidCfg->Mode));
1103 assert_param(IS_DSI_LP_COMMAND(VidCfg->LPCommandEnable));
1104 assert_param(IS_DSI_LP_HFP(VidCfg->LPHorizontalFrontPorchEnable));
1105 assert_param(IS_DSI_LP_HBP(VidCfg->LPHorizontalBackPorchEnable));
1106 assert_param(IS_DSI_LP_VACTIVE(VidCfg->LPVerticalActiveEnable));
1107 assert_param(IS_DSI_LP_VFP(VidCfg->LPVerticalFrontPorchEnable));
1108 assert_param(IS_DSI_LP_VBP(VidCfg->LPVerticalBackPorchEnable));
1109 assert_param(IS_DSI_LP_VSYNC(VidCfg->LPVerticalSyncActiveEnable));
1110 assert_param(IS_DSI_FBTAA(VidCfg->FrameBTAAcknowledgeEnable));
1111 assert_param(IS_DSI_DE_POLARITY(VidCfg->DEPolarity));
1112 assert_param(IS_DSI_VSYNC_POLARITY(VidCfg->VSPolarity));
1113 assert_param(IS_DSI_HSYNC_POLARITY(VidCfg->HSPolarity));
1114
1115 if (VidCfg->ColorCoding == DSI_RGB666)
1116 {
1117 assert_param(IS_DSI_LOOSELY_PACKED(VidCfg->LooselyPacked));
1118 }
1119
1120
1121 hdsi->Instance->MCR &= ~DSI_MCR_CMDM;
1122 hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM;
1123
1124
1125 hdsi->Instance->VMCR &= ~DSI_VMCR_VMT;
1126 hdsi->Instance->VMCR |= VidCfg->Mode;
1127
1128
1129 hdsi->Instance->VPCR &= ~DSI_VPCR_VPSIZE;
1130 hdsi->Instance->VPCR |= VidCfg->PacketSize;
1131
1132
1133 hdsi->Instance->VCCR &= ~DSI_VCCR_NUMC;
1134 hdsi->Instance->VCCR |= VidCfg->NumberOfChunks;
1135
1136
1137 hdsi->Instance->VNPCR &= ~DSI_VNPCR_NPSIZE;
1138 hdsi->Instance->VNPCR |= VidCfg->NullPacketSize;
1139
1140
1141 hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID;
1142 hdsi->Instance->LVCIDR |= VidCfg->VirtualChannelID;
1143
1144
1145 hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP);
1146 hdsi->Instance->LPCR |= (VidCfg->DEPolarity | VidCfg->VSPolarity | VidCfg->HSPolarity);
1147
1148
1149 hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC;
1150 hdsi->Instance->LCOLCR |= VidCfg->ColorCoding;
1151
1152
1153 hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX;
1154 hdsi->Instance->WCFGR |= ((VidCfg->ColorCoding) << 1U);
1155
1156
1157 if (VidCfg->ColorCoding == DSI_RGB666)
1158 {
1159 hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_LPE;
1160 hdsi->Instance->LCOLCR |= VidCfg->LooselyPacked;
1161 }
1162
1163
1164 hdsi->Instance->VHSACR &= ~DSI_VHSACR_HSA;
1165 hdsi->Instance->VHSACR |= VidCfg->HorizontalSyncActive;
1166
1167
1168 hdsi->Instance->VHBPCR &= ~DSI_VHBPCR_HBP;
1169 hdsi->Instance->VHBPCR |= VidCfg->HorizontalBackPorch;
1170
1171
1172 hdsi->Instance->VLCR &= ~DSI_VLCR_HLINE;
1173 hdsi->Instance->VLCR |= VidCfg->HorizontalLine;
1174
1175
1176 hdsi->Instance->VVSACR &= ~DSI_VVSACR_VSA;
1177 hdsi->Instance->VVSACR |= VidCfg->VerticalSyncActive;
1178
1179
1180 hdsi->Instance->VVBPCR &= ~DSI_VVBPCR_VBP;
1181 hdsi->Instance->VVBPCR |= VidCfg->VerticalBackPorch;
1182
1183
1184 hdsi->Instance->VVFPCR &= ~DSI_VVFPCR_VFP;
1185 hdsi->Instance->VVFPCR |= VidCfg->VerticalFrontPorch;
1186
1187
1188 hdsi->Instance->VVACR &= ~DSI_VVACR_VA;
1189 hdsi->Instance->VVACR |= VidCfg->VerticalActive;
1190
1191
1192 hdsi->Instance->VMCR &= ~DSI_VMCR_LPCE;
1193 hdsi->Instance->VMCR |= VidCfg->LPCommandEnable;
1194
1195
1196 hdsi->Instance->LPMCR &= ~DSI_LPMCR_LPSIZE;
1197 hdsi->Instance->LPMCR |= ((VidCfg->LPLargestPacketSize) << 16U);
1198
1199
1200 hdsi->Instance->LPMCR &= ~DSI_LPMCR_VLPSIZE;
1201 hdsi->Instance->LPMCR |= VidCfg->LPVACTLargestPacketSize;
1202
1203
1204 hdsi->Instance->VMCR &= ~DSI_VMCR_LPHFPE;
1205 hdsi->Instance->VMCR |= VidCfg->LPHorizontalFrontPorchEnable;
1206
1207
1208 hdsi->Instance->VMCR &= ~DSI_VMCR_LPHBPE;
1209 hdsi->Instance->VMCR |= VidCfg->LPHorizontalBackPorchEnable;
1210
1211
1212 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVAE;
1213 hdsi->Instance->VMCR |= VidCfg->LPVerticalActiveEnable;
1214
1215
1216 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVFPE;
1217 hdsi->Instance->VMCR |= VidCfg->LPVerticalFrontPorchEnable;
1218
1219
1220 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVBPE;
1221 hdsi->Instance->VMCR |= VidCfg->LPVerticalBackPorchEnable;
1222
1223
1224 hdsi->Instance->VMCR &= ~DSI_VMCR_LPVSAE;
1225 hdsi->Instance->VMCR |= VidCfg->LPVerticalSyncActiveEnable;
1226
1227
1228 hdsi->Instance->VMCR &= ~DSI_VMCR_FBTAAE;
1229 hdsi->Instance->VMCR |= VidCfg->FrameBTAAcknowledgeEnable;
1230
1231
1232 __HAL_UNLOCK(hdsi);
1233
1234 return HAL_OK;
1235 }
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245 HAL_StatusTypeDef HAL_DSI_ConfigAdaptedCommandMode(DSI_HandleTypeDef *hdsi, DSI_CmdCfgTypeDef *CmdCfg)
1246 {
1247
1248 __HAL_LOCK(hdsi);
1249
1250
1251 assert_param(IS_DSI_COLOR_CODING(CmdCfg->ColorCoding));
1252 assert_param(IS_DSI_TE_SOURCE(CmdCfg->TearingEffectSource));
1253 assert_param(IS_DSI_TE_POLARITY(CmdCfg->TearingEffectPolarity));
1254 assert_param(IS_DSI_AUTOMATIC_REFRESH(CmdCfg->AutomaticRefresh));
1255 assert_param(IS_DSI_VS_POLARITY(CmdCfg->VSyncPol));
1256 assert_param(IS_DSI_TE_ACK_REQUEST(CmdCfg->TEAcknowledgeRequest));
1257 assert_param(IS_DSI_DE_POLARITY(CmdCfg->DEPolarity));
1258 assert_param(IS_DSI_VSYNC_POLARITY(CmdCfg->VSPolarity));
1259 assert_param(IS_DSI_HSYNC_POLARITY(CmdCfg->HSPolarity));
1260
1261
1262 hdsi->Instance->MCR |= DSI_MCR_CMDM;
1263 hdsi->Instance->WCFGR &= ~DSI_WCFGR_DSIM;
1264 hdsi->Instance->WCFGR |= DSI_WCFGR_DSIM;
1265
1266
1267 hdsi->Instance->LVCIDR &= ~DSI_LVCIDR_VCID;
1268 hdsi->Instance->LVCIDR |= CmdCfg->VirtualChannelID;
1269
1270
1271 hdsi->Instance->LPCR &= ~(DSI_LPCR_DEP | DSI_LPCR_VSP | DSI_LPCR_HSP);
1272 hdsi->Instance->LPCR |= (CmdCfg->DEPolarity | CmdCfg->VSPolarity | CmdCfg->HSPolarity);
1273
1274
1275 hdsi->Instance->LCOLCR &= ~DSI_LCOLCR_COLC;
1276 hdsi->Instance->LCOLCR |= CmdCfg->ColorCoding;
1277
1278
1279 hdsi->Instance->WCFGR &= ~DSI_WCFGR_COLMUX;
1280 hdsi->Instance->WCFGR |= ((CmdCfg->ColorCoding) << 1U);
1281
1282
1283 hdsi->Instance->LCCR &= ~DSI_LCCR_CMDSIZE;
1284 hdsi->Instance->LCCR |= CmdCfg->CommandSize;
1285
1286
1287 hdsi->Instance->WCFGR &= ~(DSI_WCFGR_TESRC | DSI_WCFGR_TEPOL | DSI_WCFGR_AR | DSI_WCFGR_VSPOL);
1288 hdsi->Instance->WCFGR |= (CmdCfg->TearingEffectSource | CmdCfg->TearingEffectPolarity | CmdCfg->AutomaticRefresh |
1289 CmdCfg->VSyncPol);
1290
1291
1292 hdsi->Instance->CMCR &= ~DSI_CMCR_TEARE;
1293 hdsi->Instance->CMCR |= CmdCfg->TEAcknowledgeRequest;
1294
1295
1296 __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_TE);
1297
1298
1299 __HAL_DSI_ENABLE_IT(hdsi, DSI_IT_ER);
1300
1301
1302 __HAL_UNLOCK(hdsi);
1303
1304 return HAL_OK;
1305 }
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316 HAL_StatusTypeDef HAL_DSI_ConfigCommand(DSI_HandleTypeDef *hdsi, DSI_LPCmdTypeDef *LPCmd)
1317 {
1318
1319 __HAL_LOCK(hdsi);
1320
1321 assert_param(IS_DSI_LP_GSW0P(LPCmd->LPGenShortWriteNoP));
1322 assert_param(IS_DSI_LP_GSW1P(LPCmd->LPGenShortWriteOneP));
1323 assert_param(IS_DSI_LP_GSW2P(LPCmd->LPGenShortWriteTwoP));
1324 assert_param(IS_DSI_LP_GSR0P(LPCmd->LPGenShortReadNoP));
1325 assert_param(IS_DSI_LP_GSR1P(LPCmd->LPGenShortReadOneP));
1326 assert_param(IS_DSI_LP_GSR2P(LPCmd->LPGenShortReadTwoP));
1327 assert_param(IS_DSI_LP_GLW(LPCmd->LPGenLongWrite));
1328 assert_param(IS_DSI_LP_DSW0P(LPCmd->LPDcsShortWriteNoP));
1329 assert_param(IS_DSI_LP_DSW1P(LPCmd->LPDcsShortWriteOneP));
1330 assert_param(IS_DSI_LP_DSR0P(LPCmd->LPDcsShortReadNoP));
1331 assert_param(IS_DSI_LP_DLW(LPCmd->LPDcsLongWrite));
1332 assert_param(IS_DSI_LP_MRDP(LPCmd->LPMaxReadPacket));
1333 assert_param(IS_DSI_ACK_REQUEST(LPCmd->AcknowledgeRequest));
1334
1335
1336 hdsi->Instance->CMCR &= ~(DSI_CMCR_GSW0TX | \
1337 DSI_CMCR_GSW1TX | \
1338 DSI_CMCR_GSW2TX | \
1339 DSI_CMCR_GSR0TX | \
1340 DSI_CMCR_GSR1TX | \
1341 DSI_CMCR_GSR2TX | \
1342 DSI_CMCR_GLWTX | \
1343 DSI_CMCR_DSW0TX | \
1344 DSI_CMCR_DSW1TX | \
1345 DSI_CMCR_DSR0TX | \
1346 DSI_CMCR_DLWTX | \
1347 DSI_CMCR_MRDPS);
1348 hdsi->Instance->CMCR |= (LPCmd->LPGenShortWriteNoP | \
1349 LPCmd->LPGenShortWriteOneP | \
1350 LPCmd->LPGenShortWriteTwoP | \
1351 LPCmd->LPGenShortReadNoP | \
1352 LPCmd->LPGenShortReadOneP | \
1353 LPCmd->LPGenShortReadTwoP | \
1354 LPCmd->LPGenLongWrite | \
1355 LPCmd->LPDcsShortWriteNoP | \
1356 LPCmd->LPDcsShortWriteOneP | \
1357 LPCmd->LPDcsShortReadNoP | \
1358 LPCmd->LPDcsLongWrite | \
1359 LPCmd->LPMaxReadPacket);
1360
1361
1362 hdsi->Instance->CMCR &= ~DSI_CMCR_ARE;
1363 hdsi->Instance->CMCR |= LPCmd->AcknowledgeRequest;
1364
1365
1366 __HAL_UNLOCK(hdsi);
1367
1368 return HAL_OK;
1369 }
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379 HAL_StatusTypeDef HAL_DSI_ConfigFlowControl(DSI_HandleTypeDef *hdsi, uint32_t FlowControl)
1380 {
1381
1382 __HAL_LOCK(hdsi);
1383
1384
1385 assert_param(IS_DSI_FLOW_CONTROL(FlowControl));
1386
1387
1388 hdsi->Instance->PCR &= ~DSI_FLOW_CONTROL_ALL;
1389 hdsi->Instance->PCR |= FlowControl;
1390
1391
1392 __HAL_UNLOCK(hdsi);
1393
1394 return HAL_OK;
1395 }
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405 HAL_StatusTypeDef HAL_DSI_ConfigPhyTimer(DSI_HandleTypeDef *hdsi, DSI_PHY_TimerTypeDef *PhyTimers)
1406 {
1407 uint32_t maxTime;
1408
1409 __HAL_LOCK(hdsi);
1410
1411 maxTime = (PhyTimers->ClockLaneLP2HSTime > PhyTimers->ClockLaneHS2LPTime) ? PhyTimers->ClockLaneLP2HSTime :
1412 PhyTimers->ClockLaneHS2LPTime;
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426 hdsi->Instance->CLTCR &= ~(DSI_CLTCR_LP2HS_TIME | DSI_CLTCR_HS2LP_TIME);
1427 hdsi->Instance->CLTCR |= (maxTime | ((maxTime) << 16U));
1428
1429
1430 hdsi->Instance->DLTCR &= ~(DSI_DLTCR_MRD_TIME | DSI_DLTCR_LP2HS_TIME | DSI_DLTCR_HS2LP_TIME);
1431 hdsi->Instance->DLTCR |= (PhyTimers->DataLaneMaxReadTime | ((PhyTimers->DataLaneLP2HSTime) << 16U) | ((
1432 PhyTimers->DataLaneHS2LPTime) << 24U));
1433
1434
1435 hdsi->Instance->PCONFR &= ~DSI_PCONFR_SW_TIME;
1436 hdsi->Instance->PCONFR |= ((PhyTimers->StopWaitTime) << 8U);
1437
1438
1439 __HAL_UNLOCK(hdsi);
1440
1441 return HAL_OK;
1442 }
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452 HAL_StatusTypeDef HAL_DSI_ConfigHostTimeouts(DSI_HandleTypeDef *hdsi, DSI_HOST_TimeoutTypeDef *HostTimeouts)
1453 {
1454
1455 __HAL_LOCK(hdsi);
1456
1457
1458 hdsi->Instance->CCR &= ~DSI_CCR_TOCKDIV;
1459 hdsi->Instance->CCR |= ((HostTimeouts->TimeoutCkdiv) << 8U);
1460
1461
1462 hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_HSTX_TOCNT;
1463 hdsi->Instance->TCCR[0U] |= ((HostTimeouts->HighSpeedTransmissionTimeout) << 16U);
1464
1465
1466 hdsi->Instance->TCCR[0U] &= ~DSI_TCCR0_LPRX_TOCNT;
1467 hdsi->Instance->TCCR[0U] |= HostTimeouts->LowPowerReceptionTimeout;
1468
1469
1470 hdsi->Instance->TCCR[1U] &= ~DSI_TCCR1_HSRD_TOCNT;
1471 hdsi->Instance->TCCR[1U] |= HostTimeouts->HighSpeedReadTimeout;
1472
1473
1474 hdsi->Instance->TCCR[2U] &= ~DSI_TCCR2_LPRD_TOCNT;
1475 hdsi->Instance->TCCR[2U] |= HostTimeouts->LowPowerReadTimeout;
1476
1477
1478 hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_HSWR_TOCNT;
1479 hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWriteTimeout;
1480
1481
1482 hdsi->Instance->TCCR[3U] &= ~DSI_TCCR3_PM;
1483 hdsi->Instance->TCCR[3U] |= HostTimeouts->HighSpeedWritePrespMode;
1484
1485
1486 hdsi->Instance->TCCR[4U] &= ~DSI_TCCR4_LPWR_TOCNT;
1487 hdsi->Instance->TCCR[4U] |= HostTimeouts->LowPowerWriteTimeout;
1488
1489
1490 hdsi->Instance->TCCR[5U] &= ~DSI_TCCR5_BTA_TOCNT;
1491 hdsi->Instance->TCCR[5U] |= HostTimeouts->BTATimeout;
1492
1493
1494 __HAL_UNLOCK(hdsi);
1495
1496 return HAL_OK;
1497 }
1498
1499
1500
1501
1502
1503
1504
1505 HAL_StatusTypeDef HAL_DSI_Start(DSI_HandleTypeDef *hdsi)
1506 {
1507
1508 __HAL_LOCK(hdsi);
1509
1510
1511 __HAL_DSI_ENABLE(hdsi);
1512
1513
1514 __HAL_DSI_WRAPPER_ENABLE(hdsi);
1515
1516
1517 __HAL_UNLOCK(hdsi);
1518
1519 return HAL_OK;
1520 }
1521
1522
1523
1524
1525
1526
1527
1528 HAL_StatusTypeDef HAL_DSI_Stop(DSI_HandleTypeDef *hdsi)
1529 {
1530
1531 __HAL_LOCK(hdsi);
1532
1533
1534 __HAL_DSI_DISABLE(hdsi);
1535
1536
1537 __HAL_DSI_WRAPPER_DISABLE(hdsi);
1538
1539
1540 __HAL_UNLOCK(hdsi);
1541
1542 return HAL_OK;
1543 }
1544
1545
1546
1547
1548
1549
1550
1551 HAL_StatusTypeDef HAL_DSI_Refresh(DSI_HandleTypeDef *hdsi)
1552 {
1553
1554 __HAL_LOCK(hdsi);
1555
1556
1557 hdsi->Instance->WCR |= DSI_WCR_LTDCEN;
1558
1559
1560 __HAL_UNLOCK(hdsi);
1561
1562 return HAL_OK;
1563 }
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573 HAL_StatusTypeDef HAL_DSI_ColorMode(DSI_HandleTypeDef *hdsi, uint32_t ColorMode)
1574 {
1575
1576 __HAL_LOCK(hdsi);
1577
1578
1579 assert_param(IS_DSI_COLOR_MODE(ColorMode));
1580
1581
1582 hdsi->Instance->WCR &= ~DSI_WCR_COLM;
1583 hdsi->Instance->WCR |= ColorMode;
1584
1585
1586 __HAL_UNLOCK(hdsi);
1587
1588 return HAL_OK;
1589 }
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599 HAL_StatusTypeDef HAL_DSI_Shutdown(DSI_HandleTypeDef *hdsi, uint32_t Shutdown)
1600 {
1601
1602 __HAL_LOCK(hdsi);
1603
1604
1605 assert_param(IS_DSI_SHUT_DOWN(Shutdown));
1606
1607
1608 hdsi->Instance->WCR &= ~DSI_WCR_SHTDN;
1609 hdsi->Instance->WCR |= Shutdown;
1610
1611
1612 __HAL_UNLOCK(hdsi);
1613
1614 return HAL_OK;
1615 }
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630 HAL_StatusTypeDef HAL_DSI_ShortWrite(DSI_HandleTypeDef *hdsi,
1631 uint32_t ChannelID,
1632 uint32_t Mode,
1633 uint32_t Param1,
1634 uint32_t Param2)
1635 {
1636 HAL_StatusTypeDef status;
1637
1638 assert_param(IS_DSI_SHORT_WRITE_PACKET_TYPE(Mode));
1639
1640
1641 __HAL_LOCK(hdsi);
1642
1643 status = DSI_ShortWrite(hdsi, ChannelID, Mode, Param1, Param2);
1644
1645
1646 __HAL_UNLOCK(hdsi);
1647
1648 return status;
1649 }
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665 HAL_StatusTypeDef HAL_DSI_LongWrite(DSI_HandleTypeDef *hdsi,
1666 uint32_t ChannelID,
1667 uint32_t Mode,
1668 uint32_t NbParams,
1669 uint32_t Param1,
1670 const uint8_t *ParametersTable)
1671 {
1672 uint32_t uicounter;
1673 uint32_t nbBytes;
1674 uint32_t count;
1675 uint32_t tickstart;
1676 uint32_t fifoword;
1677 const uint8_t *pparams = ParametersTable;
1678
1679
1680 __HAL_LOCK(hdsi);
1681
1682
1683 assert_param(IS_DSI_LONG_WRITE_PACKET_TYPE(Mode));
1684
1685
1686 tickstart = HAL_GetTick();
1687
1688
1689 while ((hdsi->Instance->GPSR & DSI_GPSR_CMDFE) == 0U)
1690 {
1691
1692 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1693 {
1694
1695 __HAL_UNLOCK(hdsi);
1696
1697 return HAL_TIMEOUT;
1698 }
1699 }
1700
1701
1702 fifoword = Param1;
1703 nbBytes = (NbParams < 3U) ? NbParams : 3U;
1704
1705 for (count = 0U; count < nbBytes; count++)
1706 {
1707 fifoword |= (((uint32_t)(*(pparams + count))) << (8U + (8U * count)));
1708 }
1709 hdsi->Instance->GPDR = fifoword;
1710
1711 uicounter = NbParams - nbBytes;
1712 pparams += nbBytes;
1713
1714 while (uicounter != 0U)
1715 {
1716 nbBytes = (uicounter < 4U) ? uicounter : 4U;
1717 fifoword = 0U;
1718 for (count = 0U; count < nbBytes; count++)
1719 {
1720 fifoword |= (((uint32_t)(*(pparams + count))) << (8U * count));
1721 }
1722 hdsi->Instance->GPDR = fifoword;
1723
1724 uicounter -= nbBytes;
1725 pparams += nbBytes;
1726 }
1727
1728
1729 DSI_ConfigPacketHeader(hdsi->Instance,
1730 ChannelID,
1731 Mode,
1732 ((NbParams + 1U) & 0x00FFU),
1733 (((NbParams + 1U) & 0xFF00U) >> 8U));
1734
1735
1736 __HAL_UNLOCK(hdsi);
1737
1738 return HAL_OK;
1739 }
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754 HAL_StatusTypeDef HAL_DSI_Read(DSI_HandleTypeDef *hdsi,
1755 uint32_t ChannelNbr,
1756 uint8_t *Array,
1757 uint32_t Size,
1758 uint32_t Mode,
1759 uint32_t DCSCmd,
1760 uint8_t *ParametersTable)
1761 {
1762 uint32_t tickstart;
1763 uint8_t *pdata = Array;
1764 uint32_t datasize = Size;
1765 uint32_t fifoword;
1766 uint32_t nbbytes;
1767 uint32_t count;
1768
1769
1770 __HAL_LOCK(hdsi);
1771
1772
1773 assert_param(IS_DSI_READ_PACKET_TYPE(Mode));
1774
1775 if (datasize > 2U)
1776 {
1777
1778 if (DSI_ShortWrite(hdsi, ChannelNbr, DSI_MAX_RETURN_PKT_SIZE, ((datasize) & 0xFFU),
1779 (((datasize) >> 8U) & 0xFFU)) != HAL_OK)
1780 {
1781
1782 __HAL_UNLOCK(hdsi);
1783
1784 return HAL_ERROR;
1785 }
1786 }
1787
1788
1789 if (Mode == DSI_DCS_SHORT_PKT_READ)
1790 {
1791 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, DCSCmd, 0U);
1792 }
1793 else if (Mode == DSI_GEN_SHORT_PKT_READ_P0)
1794 {
1795 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, 0U, 0U);
1796 }
1797 else if (Mode == DSI_GEN_SHORT_PKT_READ_P1)
1798 {
1799 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], 0U);
1800 }
1801 else if (Mode == DSI_GEN_SHORT_PKT_READ_P2)
1802 {
1803 DSI_ConfigPacketHeader(hdsi->Instance, ChannelNbr, Mode, ParametersTable[0U], ParametersTable[1U]);
1804 }
1805 else
1806 {
1807
1808 __HAL_UNLOCK(hdsi);
1809
1810 return HAL_ERROR;
1811 }
1812
1813
1814 tickstart = HAL_GetTick();
1815
1816
1817 while (((int32_t)(datasize)) > 0)
1818 {
1819 if ((hdsi->Instance->GPSR & DSI_GPSR_PRDFE) == 0U)
1820 {
1821 fifoword = hdsi->Instance->GPDR;
1822 nbbytes = (datasize < 4U) ? datasize : 4U;
1823
1824 for (count = 0U; count < nbbytes; count++)
1825 {
1826 *pdata = (uint8_t)(fifoword >> (8U * count));
1827 pdata++;
1828 datasize--;
1829 }
1830 }
1831
1832
1833 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1834 {
1835
1836 __HAL_UNLOCK(hdsi);
1837
1838 return HAL_TIMEOUT;
1839 }
1840
1841
1842
1843
1844
1845 if ((hdsi->Instance->GPSR & DSI_GPSR_RCB) == 0U)
1846 {
1847 if ((hdsi->Instance->ISR[1U] & DSI_ISR1_PSE) == DSI_ISR1_PSE)
1848 {
1849
1850 __HAL_UNLOCK(hdsi);
1851
1852 return HAL_ERROR;
1853 }
1854 }
1855 }
1856
1857
1858 __HAL_UNLOCK(hdsi);
1859
1860 return HAL_OK;
1861 }
1862
1863
1864
1865
1866
1867
1868
1869
1870 HAL_StatusTypeDef HAL_DSI_EnterULPMData(DSI_HandleTypeDef *hdsi)
1871 {
1872 uint32_t tickstart;
1873
1874
1875 __HAL_LOCK(hdsi);
1876
1877
1878
1879
1880 if ((hdsi->Instance->PCTLR & (DSI_PCTLR_CKE | DSI_PCTLR_DEN)) != (DSI_PCTLR_CKE | DSI_PCTLR_DEN))
1881 {
1882
1883 __HAL_UNLOCK(hdsi);
1884 return HAL_ERROR;
1885 }
1886
1887
1888 if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN)
1889 {
1890
1891 __HAL_UNLOCK(hdsi);
1892 return HAL_ERROR;
1893 }
1894 else if ((hdsi->Instance->WRPCR & DSI_WRPCR_REGEN) != DSI_WRPCR_REGEN)
1895 {
1896
1897 __HAL_UNLOCK(hdsi);
1898 return HAL_ERROR;
1899 }
1900 else
1901 {
1902
1903 }
1904
1905
1906 if ((hdsi->Instance->PUCR & (DSI_PUCR_UEDL | DSI_PUCR_URDL)) != 0U)
1907 {
1908
1909 __HAL_UNLOCK(hdsi);
1910 return HAL_ERROR;
1911 }
1912
1913
1914 if ((hdsi->Instance->PTTCR & DSI_PTTCR_TX_TRIG) != 0U)
1915 {
1916
1917 __HAL_UNLOCK(hdsi);
1918 return HAL_ERROR;
1919 }
1920
1921
1922
1923 HAL_Delay(1);
1924
1925
1926 tickstart = HAL_GetTick();
1927
1928 while ((__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U))
1929 {
1930
1931 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1932 {
1933
1934 __HAL_UNLOCK(hdsi);
1935
1936 return HAL_TIMEOUT;
1937 }
1938 }
1939
1940
1941 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
1942 {
1943 if ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0)
1944 {
1945
1946 __HAL_UNLOCK(hdsi);
1947 return HAL_ERROR;
1948 }
1949 }
1950 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
1951 {
1952 if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1))
1953 {
1954
1955 __HAL_UNLOCK(hdsi);
1956 return HAL_ERROR;
1957 }
1958 }
1959 else
1960 {
1961
1962 __HAL_UNLOCK(hdsi);
1963 return HAL_ERROR;
1964 }
1965
1966
1967 hdsi->Instance->PUCR |= DSI_PUCR_URDL;
1968
1969
1970 tickstart = HAL_GetTick();
1971
1972
1973 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
1974 {
1975 while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != 0U)
1976 {
1977
1978 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1979 {
1980
1981 __HAL_UNLOCK(hdsi);
1982
1983 return HAL_TIMEOUT;
1984 }
1985 }
1986 }
1987 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
1988 {
1989 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != 0U)
1990 {
1991
1992 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
1993 {
1994
1995 __HAL_UNLOCK(hdsi);
1996
1997 return HAL_TIMEOUT;
1998 }
1999 }
2000 }
2001 else
2002 {
2003
2004 __HAL_UNLOCK(hdsi);
2005
2006 return HAL_ERROR;
2007 }
2008
2009
2010 __HAL_UNLOCK(hdsi);
2011
2012 return HAL_OK;
2013 }
2014
2015
2016
2017
2018
2019
2020
2021
2022 HAL_StatusTypeDef HAL_DSI_ExitULPMData(DSI_HandleTypeDef *hdsi)
2023 {
2024 uint32_t tickstart;
2025
2026
2027 __HAL_LOCK(hdsi);
2028
2029
2030 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2031 {
2032 if ((hdsi->Instance->PSR & DSI_PSR_UAN0) != 0U)
2033 {
2034
2035 __HAL_UNLOCK(hdsi);
2036
2037 return HAL_ERROR;
2038 }
2039 }
2040 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2041 {
2042 if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != 0U)
2043 {
2044
2045 __HAL_UNLOCK(hdsi);
2046
2047 return HAL_ERROR;
2048 }
2049 }
2050 else
2051 {
2052
2053 __HAL_UNLOCK(hdsi);
2054
2055 return HAL_ERROR;
2056 }
2057
2058
2059 __HAL_DSI_PLL_ENABLE(hdsi);
2060
2061
2062
2063 HAL_Delay(1);
2064
2065
2066 tickstart = HAL_GetTick();
2067
2068
2069 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)
2070 {
2071
2072 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2073 {
2074
2075 __HAL_UNLOCK(hdsi);
2076
2077 return HAL_TIMEOUT;
2078 }
2079 }
2080
2081
2082 hdsi->Instance->PUCR |= DSI_PUCR_UEDL;
2083
2084
2085 tickstart = HAL_GetTick();
2086
2087
2088 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2089 {
2090 while ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0)
2091 {
2092
2093 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2094 {
2095
2096 __HAL_UNLOCK(hdsi);
2097
2098 return HAL_TIMEOUT;
2099 }
2100 }
2101 }
2102 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2103 {
2104 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1))
2105 {
2106
2107 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2108 {
2109
2110 __HAL_UNLOCK(hdsi);
2111
2112 return HAL_TIMEOUT;
2113 }
2114 }
2115 }
2116 else
2117 {
2118
2119 __HAL_UNLOCK(hdsi);
2120
2121 return HAL_ERROR;
2122 }
2123
2124
2125 HAL_Delay(1U);
2126
2127
2128 hdsi->Instance->PUCR = 0U;
2129
2130
2131 if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN)
2132 {
2133
2134 __HAL_UNLOCK(hdsi);
2135 return HAL_ERROR;
2136 }
2137
2138
2139 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2140 {
2141 if ((hdsi->Instance->PSR & DSI_PSR_UAN0) != DSI_PSR_UAN0)
2142 {
2143
2144 __HAL_UNLOCK(hdsi);
2145 return HAL_ERROR;
2146 }
2147 }
2148 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2149 {
2150 if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1))
2151 {
2152
2153 __HAL_UNLOCK(hdsi);
2154 return HAL_ERROR;
2155 }
2156 }
2157 else
2158 {
2159
2160 __HAL_UNLOCK(hdsi);
2161 return HAL_ERROR;
2162 }
2163
2164
2165
2166
2167 HAL_Delay(1);
2168
2169
2170 tickstart = HAL_GetTick();
2171
2172
2173 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)
2174 {
2175
2176 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2177 {
2178
2179 __HAL_UNLOCK(hdsi);
2180
2181 return HAL_TIMEOUT;
2182 }
2183 }
2184
2185
2186 __HAL_UNLOCK(hdsi);
2187
2188 return HAL_OK;
2189 }
2190
2191
2192
2193
2194
2195
2196
2197
2198 HAL_StatusTypeDef HAL_DSI_EnterULPM(DSI_HandleTypeDef *hdsi)
2199 {
2200 uint32_t tickstart;
2201
2202
2203 __HAL_LOCK(hdsi);
2204
2205
2206
2207
2208 if ((hdsi->Instance->PCTLR & (DSI_PCTLR_CKE | DSI_PCTLR_DEN)) != (DSI_PCTLR_CKE | DSI_PCTLR_DEN))
2209 {
2210
2211 __HAL_UNLOCK(hdsi);
2212 return HAL_ERROR;
2213 }
2214
2215
2216 if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN)
2217 {
2218
2219 __HAL_UNLOCK(hdsi);
2220 return HAL_ERROR;
2221 }
2222 else if ((hdsi->Instance->WRPCR & DSI_WRPCR_REGEN) != DSI_WRPCR_REGEN)
2223 {
2224
2225 __HAL_UNLOCK(hdsi);
2226 return HAL_ERROR;
2227 }
2228 else
2229 {
2230
2231 }
2232
2233
2234 if ((hdsi->Instance->PUCR & (DSI_PUCR_UEDL | DSI_PUCR_URDL | DSI_PUCR_UECL | DSI_PUCR_URCL)) != 0U)
2235 {
2236
2237 __HAL_UNLOCK(hdsi);
2238 return HAL_ERROR;
2239 }
2240
2241
2242 if ((hdsi->Instance->PTTCR & DSI_PTTCR_TX_TRIG) != 0U)
2243 {
2244
2245 __HAL_UNLOCK(hdsi);
2246 return HAL_ERROR;
2247 }
2248
2249
2250
2251 HAL_Delay(1);
2252
2253
2254 tickstart = HAL_GetTick();
2255
2256 while ((__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U))
2257 {
2258
2259 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2260 {
2261
2262 __HAL_UNLOCK(hdsi);
2263
2264 return HAL_TIMEOUT;
2265 }
2266 }
2267
2268
2269 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2270 {
2271 if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0))
2272 {
2273
2274 __HAL_UNLOCK(hdsi);
2275 return HAL_ERROR;
2276 }
2277 }
2278 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2279 {
2280 if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | \
2281 DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | DSI_PSR_UAN1))
2282 {
2283
2284 __HAL_UNLOCK(hdsi);
2285 return HAL_ERROR;
2286 }
2287 }
2288 else
2289 {
2290
2291 __HAL_UNLOCK(hdsi);
2292 return HAL_ERROR;
2293 }
2294
2295
2296 hdsi->Instance->CLCR &= ~DSI_CLCR_DPCC;
2297
2298
2299 __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_PLL2);
2300
2301
2302 hdsi->Instance->PUCR |= (DSI_PUCR_URCL | DSI_PUCR_URDL);
2303
2304
2305 tickstart = HAL_GetTick();
2306
2307
2308 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2309 {
2310 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != 0U)
2311 {
2312
2313 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2314 {
2315
2316 __HAL_UNLOCK(hdsi);
2317
2318 return HAL_TIMEOUT;
2319 }
2320 }
2321 }
2322 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2323 {
2324 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != 0U)
2325 {
2326
2327 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2328 {
2329
2330 __HAL_UNLOCK(hdsi);
2331
2332 return HAL_TIMEOUT;
2333 }
2334 }
2335 }
2336 else
2337 {
2338
2339 __HAL_UNLOCK(hdsi);
2340
2341 return HAL_ERROR;
2342 }
2343
2344
2345 __HAL_DSI_PLL_DISABLE(hdsi);
2346
2347
2348 __HAL_UNLOCK(hdsi);
2349
2350 return HAL_OK;
2351 }
2352
2353
2354
2355
2356
2357
2358
2359
2360 HAL_StatusTypeDef HAL_DSI_ExitULPM(DSI_HandleTypeDef *hdsi)
2361 {
2362 uint32_t tickstart;
2363
2364
2365 __HAL_LOCK(hdsi);
2366
2367
2368 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2369 {
2370 if ((hdsi->Instance->PSR & (DSI_PSR_RUE0 | DSI_PSR_UAN0 | DSI_PSR_PSS0 | \
2371 DSI_PSR_UANC | DSI_PSR_PSSC | DSI_PSR_PD)) != 0U)
2372 {
2373
2374 __HAL_UNLOCK(hdsi);
2375
2376 return HAL_ERROR;
2377 }
2378 }
2379 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2380 {
2381 if ((hdsi->Instance->PSR & (DSI_PSR_RUE0 | DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_UAN1 | \
2382 DSI_PSR_PSS1 | DSI_PSR_UANC | DSI_PSR_PSSC | DSI_PSR_PD)) != 0U)
2383 {
2384
2385 __HAL_UNLOCK(hdsi);
2386
2387 return HAL_ERROR;
2388 }
2389 }
2390 else
2391 {
2392
2393 __HAL_UNLOCK(hdsi);
2394
2395 return HAL_ERROR;
2396 }
2397
2398
2399 __HAL_DSI_PLL_ENABLE(hdsi);
2400
2401
2402
2403 HAL_Delay(1);
2404
2405
2406 tickstart = HAL_GetTick();
2407
2408
2409 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)
2410 {
2411
2412 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2413 {
2414
2415 __HAL_UNLOCK(hdsi);
2416
2417 return HAL_TIMEOUT;
2418 }
2419 }
2420
2421
2422 hdsi->Instance->PUCR |= (DSI_PUCR_UECL | DSI_PUCR_UEDL);
2423
2424
2425 tickstart = HAL_GetTick();
2426
2427
2428 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2429 {
2430 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UANC))
2431 {
2432
2433 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2434 {
2435
2436 __HAL_UNLOCK(hdsi);
2437
2438 return HAL_TIMEOUT;
2439 }
2440 }
2441 }
2442 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2443 {
2444 while ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_UAN1 | DSI_PSR_UANC)) != (DSI_PSR_UAN0 | DSI_PSR_UAN1 |
2445 DSI_PSR_UANC))
2446 {
2447
2448 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2449 {
2450
2451 __HAL_UNLOCK(hdsi);
2452
2453 return HAL_TIMEOUT;
2454 }
2455 }
2456 }
2457 else
2458 {
2459
2460 __HAL_UNLOCK(hdsi);
2461
2462 return HAL_ERROR;
2463 }
2464
2465
2466 HAL_Delay(1U);
2467
2468
2469 hdsi->Instance->PUCR = 0U;
2470
2471
2472 __HAL_RCC_DSI_CONFIG(RCC_DSICLKSOURCE_PHY);
2473
2474
2475 hdsi->Instance->CLCR |= DSI_CLCR_DPCC;
2476
2477
2478 if ((hdsi->Instance->WRPCR & DSI_WRPCR_PLLEN) != DSI_WRPCR_PLLEN)
2479 {
2480
2481 __HAL_UNLOCK(hdsi);
2482 return HAL_ERROR;
2483 }
2484
2485
2486 if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_ONE_DATA_LANE)
2487 {
2488 if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0))
2489 {
2490
2491 __HAL_UNLOCK(hdsi);
2492 return HAL_ERROR;
2493 }
2494 }
2495 else if ((hdsi->Instance->PCONFR & DSI_PCONFR_NL) == DSI_TWO_DATA_LANES)
2496 {
2497 if ((hdsi->Instance->PSR & (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | \
2498 DSI_PSR_UAN1)) != (DSI_PSR_UAN0 | DSI_PSR_PSS0 | DSI_PSR_PSS1 | DSI_PSR_UAN1))
2499 {
2500
2501 __HAL_UNLOCK(hdsi);
2502 return HAL_ERROR;
2503 }
2504 }
2505 else
2506 {
2507
2508 __HAL_UNLOCK(hdsi);
2509 return HAL_ERROR;
2510 }
2511
2512
2513
2514
2515 HAL_Delay(1);
2516
2517
2518 tickstart = HAL_GetTick();
2519
2520
2521 while (__HAL_DSI_GET_FLAG(hdsi, DSI_FLAG_PLLLS) == 0U)
2522 {
2523
2524 if ((HAL_GetTick() - tickstart) > DSI_TIMEOUT_VALUE)
2525 {
2526
2527 __HAL_UNLOCK(hdsi);
2528
2529 return HAL_TIMEOUT;
2530 }
2531 }
2532
2533
2534 __HAL_UNLOCK(hdsi);
2535
2536 return HAL_OK;
2537 }
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553 HAL_StatusTypeDef HAL_DSI_PatternGeneratorStart(DSI_HandleTypeDef *hdsi, uint32_t Mode, uint32_t Orientation)
2554 {
2555
2556 __HAL_LOCK(hdsi);
2557
2558
2559 hdsi->Instance->VMCR &= ~(DSI_VMCR_PGM | DSI_VMCR_PGO);
2560 hdsi->Instance->VMCR |= ((Mode << 20U) | (Orientation << 24U));
2561
2562
2563 hdsi->Instance->VMCR |= DSI_VMCR_PGE;
2564
2565
2566 __HAL_UNLOCK(hdsi);
2567
2568 return HAL_OK;
2569 }
2570
2571
2572
2573
2574
2575
2576
2577 HAL_StatusTypeDef HAL_DSI_PatternGeneratorStop(DSI_HandleTypeDef *hdsi)
2578 {
2579
2580 __HAL_LOCK(hdsi);
2581
2582
2583 hdsi->Instance->VMCR &= ~DSI_VMCR_PGE;
2584
2585
2586 __HAL_UNLOCK(hdsi);
2587
2588 return HAL_OK;
2589 }
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602 HAL_StatusTypeDef HAL_DSI_SetSlewRateAndDelayTuning(DSI_HandleTypeDef *hdsi, uint32_t CommDelay, uint32_t Lane,
2603 uint32_t Value)
2604 {
2605
2606 __HAL_LOCK(hdsi);
2607
2608
2609 assert_param(IS_DSI_COMMUNICATION_DELAY(CommDelay));
2610 assert_param(IS_DSI_LANE_GROUP(Lane));
2611
2612 switch (CommDelay)
2613 {
2614 case DSI_SLEW_RATE_HSTX:
2615 if (Lane == DSI_CLOCK_LANE)
2616 {
2617
2618 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCCL;
2619 hdsi->Instance->WPCR[1U] |= Value << 16U;
2620 }
2621 else if (Lane == DSI_DATA_LANES)
2622 {
2623
2624 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXSRCDL;
2625 hdsi->Instance->WPCR[1U] |= Value << 18U;
2626 }
2627 else
2628 {
2629
2630 __HAL_UNLOCK(hdsi);
2631
2632 return HAL_ERROR;
2633 }
2634 break;
2635 case DSI_SLEW_RATE_LPTX:
2636 if (Lane == DSI_CLOCK_LANE)
2637 {
2638
2639 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCCL;
2640 hdsi->Instance->WPCR[1U] |= Value << 6U;
2641 }
2642 else if (Lane == DSI_DATA_LANES)
2643 {
2644
2645 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPSRCDL;
2646 hdsi->Instance->WPCR[1U] |= Value << 8U;
2647 }
2648 else
2649 {
2650
2651 __HAL_UNLOCK(hdsi);
2652
2653 return HAL_ERROR;
2654 }
2655 break;
2656 case DSI_HS_DELAY:
2657 if (Lane == DSI_CLOCK_LANE)
2658 {
2659
2660 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDCL;
2661 hdsi->Instance->WPCR[1U] |= Value;
2662 }
2663 else if (Lane == DSI_DATA_LANES)
2664 {
2665
2666 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_HSTXDDL;
2667 hdsi->Instance->WPCR[1U] |= Value << 2U;
2668 }
2669 else
2670 {
2671
2672 __HAL_UNLOCK(hdsi);
2673
2674 return HAL_ERROR;
2675 }
2676 break;
2677 default:
2678 break;
2679 }
2680
2681
2682 __HAL_UNLOCK(hdsi);
2683
2684 return HAL_OK;
2685 }
2686
2687
2688
2689
2690
2691
2692
2693
2694 HAL_StatusTypeDef HAL_DSI_SetLowPowerRXFilter(DSI_HandleTypeDef *hdsi, uint32_t Frequency)
2695 {
2696
2697 __HAL_LOCK(hdsi);
2698
2699
2700 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_LPRXFT;
2701 hdsi->Instance->WPCR[1U] |= Frequency << 25U;
2702
2703
2704 __HAL_UNLOCK(hdsi);
2705
2706 return HAL_OK;
2707 }
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717 HAL_StatusTypeDef HAL_DSI_SetSDD(DSI_HandleTypeDef *hdsi, FunctionalState State)
2718 {
2719
2720 __HAL_LOCK(hdsi);
2721
2722
2723 assert_param(IS_FUNCTIONAL_STATE(State));
2724
2725
2726 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_SDDC;
2727 hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 12U);
2728
2729
2730 __HAL_UNLOCK(hdsi);
2731
2732 return HAL_OK;
2733 }
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746 HAL_StatusTypeDef HAL_DSI_SetLanePinsConfiguration(DSI_HandleTypeDef *hdsi, uint32_t CustomLane, uint32_t Lane,
2747 FunctionalState State)
2748 {
2749
2750 __HAL_LOCK(hdsi);
2751
2752
2753 assert_param(IS_DSI_CUSTOM_LANE(CustomLane));
2754 assert_param(IS_DSI_LANE(Lane));
2755 assert_param(IS_FUNCTIONAL_STATE(State));
2756
2757 switch (CustomLane)
2758 {
2759 case DSI_SWAP_LANE_PINS:
2760 if (Lane == DSI_CLK_LANE)
2761 {
2762
2763 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWCL;
2764 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 6U);
2765 }
2766 else if (Lane == DSI_DATA_LANE0)
2767 {
2768
2769 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL0;
2770 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 7U);
2771 }
2772 else if (Lane == DSI_DATA_LANE1)
2773 {
2774
2775 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_SWDL1;
2776 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 8U);
2777 }
2778 else
2779 {
2780
2781 __HAL_UNLOCK(hdsi);
2782
2783 return HAL_ERROR;
2784 }
2785 break;
2786 case DSI_INVERT_HS_SIGNAL:
2787 if (Lane == DSI_CLK_LANE)
2788 {
2789
2790 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSICL;
2791 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 9U);
2792 }
2793 else if (Lane == DSI_DATA_LANE0)
2794 {
2795
2796 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL0;
2797 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 10U);
2798 }
2799 else if (Lane == DSI_DATA_LANE1)
2800 {
2801
2802 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_HSIDL1;
2803 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 11U);
2804 }
2805 else
2806 {
2807
2808 __HAL_UNLOCK(hdsi);
2809
2810 return HAL_ERROR;
2811 }
2812 break;
2813 default:
2814 break;
2815 }
2816
2817
2818 __HAL_UNLOCK(hdsi);
2819
2820 return HAL_OK;
2821 }
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833 HAL_StatusTypeDef HAL_DSI_SetPHYTimings(DSI_HandleTypeDef *hdsi, uint32_t Timing, FunctionalState State, uint32_t Value)
2834 {
2835
2836 __HAL_LOCK(hdsi);
2837
2838
2839 assert_param(IS_DSI_PHY_TIMING(Timing));
2840 assert_param(IS_FUNCTIONAL_STATE(State));
2841
2842 switch (Timing)
2843 {
2844 case DSI_TCLK_POST:
2845
2846 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPOSTEN;
2847 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 27U);
2848
2849 if (State != DISABLE)
2850 {
2851
2852 hdsi->Instance->WPCR[4U] &= ~DSI_WPCR4_TCLKPOST;
2853 hdsi->Instance->WPCR[4U] |= Value & DSI_WPCR4_TCLKPOST;
2854 }
2855
2856 break;
2857 case DSI_TLPX_CLK:
2858
2859 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXCEN;
2860 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 26U);
2861
2862 if (State != DISABLE)
2863 {
2864
2865 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXC;
2866 hdsi->Instance->WPCR[3U] |= (Value << 24U) & DSI_WPCR3_TLPXC;
2867 }
2868
2869 break;
2870 case DSI_THS_EXIT:
2871
2872 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSEXITEN;
2873 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 25U);
2874
2875 if (State != DISABLE)
2876 {
2877
2878 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSEXIT;
2879 hdsi->Instance->WPCR[3U] |= (Value << 16U) & DSI_WPCR3_THSEXIT;
2880 }
2881
2882 break;
2883 case DSI_TLPX_DATA:
2884
2885 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TLPXDEN;
2886 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 24U);
2887
2888 if (State != DISABLE)
2889 {
2890
2891 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_TLPXD;
2892 hdsi->Instance->WPCR[3U] |= (Value << 8U) & DSI_WPCR3_TLPXD;
2893 }
2894
2895 break;
2896 case DSI_THS_ZERO:
2897
2898 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSZEROEN;
2899 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 23U);
2900
2901 if (State != DISABLE)
2902 {
2903
2904 hdsi->Instance->WPCR[3U] &= ~DSI_WPCR3_THSZERO;
2905 hdsi->Instance->WPCR[3U] |= Value & DSI_WPCR3_THSZERO;
2906 }
2907
2908 break;
2909 case DSI_THS_TRAIL:
2910
2911 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSTRAILEN;
2912 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 22U);
2913
2914 if (State != DISABLE)
2915 {
2916
2917 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSTRAIL;
2918 hdsi->Instance->WPCR[2U] |= (Value << 24U) & DSI_WPCR2_THSTRAIL;
2919 }
2920
2921 break;
2922 case DSI_THS_PREPARE:
2923
2924 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_THSPREPEN;
2925 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 21U);
2926
2927 if (State != DISABLE)
2928 {
2929
2930 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_THSPREP;
2931 hdsi->Instance->WPCR[2U] |= (Value << 16U) & DSI_WPCR2_THSPREP;
2932 }
2933
2934 break;
2935 case DSI_TCLK_ZERO:
2936
2937 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKZEROEN;
2938 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 20U);
2939
2940 if (State != DISABLE)
2941 {
2942
2943 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKZERO;
2944 hdsi->Instance->WPCR[2U] |= (Value << 8U) & DSI_WPCR2_TCLKZERO;
2945 }
2946
2947 break;
2948 case DSI_TCLK_PREPARE:
2949
2950 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TCLKPREPEN;
2951 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 19U);
2952
2953 if (State != DISABLE)
2954 {
2955
2956 hdsi->Instance->WPCR[2U] &= ~DSI_WPCR2_TCLKPREP;
2957 hdsi->Instance->WPCR[2U] |= Value & DSI_WPCR2_TCLKPREP;
2958 }
2959
2960 break;
2961 default:
2962 break;
2963 }
2964
2965
2966 __HAL_UNLOCK(hdsi);
2967
2968 return HAL_OK;
2969 }
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980 HAL_StatusTypeDef HAL_DSI_ForceTXStopMode(DSI_HandleTypeDef *hdsi, uint32_t Lane, FunctionalState State)
2981 {
2982
2983 __HAL_LOCK(hdsi);
2984
2985
2986 assert_param(IS_DSI_LANE_GROUP(Lane));
2987 assert_param(IS_FUNCTIONAL_STATE(State));
2988
2989 if (Lane == DSI_CLOCK_LANE)
2990 {
2991
2992 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMCL;
2993 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 12U);
2994 }
2995 else if (Lane == DSI_DATA_LANES)
2996 {
2997
2998 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_FTXSMDL;
2999 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 13U);
3000 }
3001 else
3002 {
3003
3004 __HAL_UNLOCK(hdsi);
3005
3006 return HAL_ERROR;
3007 }
3008
3009
3010 __HAL_UNLOCK(hdsi);
3011
3012 return HAL_OK;
3013 }
3014
3015
3016
3017
3018
3019
3020
3021
3022 HAL_StatusTypeDef HAL_DSI_ForceRXLowPower(DSI_HandleTypeDef *hdsi, FunctionalState State)
3023 {
3024
3025 __HAL_LOCK(hdsi);
3026
3027
3028 assert_param(IS_FUNCTIONAL_STATE(State));
3029
3030
3031 hdsi->Instance->WPCR[1U] &= ~DSI_WPCR1_FLPRXLPM;
3032 hdsi->Instance->WPCR[1U] |= ((uint32_t)State << 22U);
3033
3034
3035 __HAL_UNLOCK(hdsi);
3036
3037 return HAL_OK;
3038 }
3039
3040
3041
3042
3043
3044
3045
3046
3047 HAL_StatusTypeDef HAL_DSI_ForceDataLanesInRX(DSI_HandleTypeDef *hdsi, FunctionalState State)
3048 {
3049
3050 __HAL_LOCK(hdsi);
3051
3052
3053 assert_param(IS_FUNCTIONAL_STATE(State));
3054
3055
3056 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_TDDL;
3057 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 16U);
3058
3059
3060 __HAL_UNLOCK(hdsi);
3061
3062 return HAL_OK;
3063 }
3064
3065
3066
3067
3068
3069
3070
3071
3072 HAL_StatusTypeDef HAL_DSI_SetPullDown(DSI_HandleTypeDef *hdsi, FunctionalState State)
3073 {
3074
3075 __HAL_LOCK(hdsi);
3076
3077
3078 assert_param(IS_FUNCTIONAL_STATE(State));
3079
3080
3081 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_PDEN;
3082 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 18U);
3083
3084
3085 __HAL_UNLOCK(hdsi);
3086
3087 return HAL_OK;
3088 }
3089
3090
3091
3092
3093
3094
3095
3096
3097 HAL_StatusTypeDef HAL_DSI_SetContentionDetectionOff(DSI_HandleTypeDef *hdsi, FunctionalState State)
3098 {
3099
3100 __HAL_LOCK(hdsi);
3101
3102
3103 assert_param(IS_FUNCTIONAL_STATE(State));
3104
3105
3106 hdsi->Instance->WPCR[0U] &= ~DSI_WPCR0_CDOFFDL;
3107 hdsi->Instance->WPCR[0U] |= ((uint32_t)State << 14U);
3108
3109
3110 __HAL_UNLOCK(hdsi);
3111
3112 return HAL_OK;
3113 }
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142 HAL_DSI_StateTypeDef HAL_DSI_GetState(const DSI_HandleTypeDef *hdsi)
3143 {
3144 return hdsi->State;
3145 }
3146
3147
3148
3149
3150
3151
3152
3153 uint32_t HAL_DSI_GetError(const DSI_HandleTypeDef *hdsi)
3154 {
3155
3156 return hdsi->ErrorCode;
3157 }
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171 #endif
3172
3173 #endif
3174
3175
3176
3177