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
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178 #include "stm32h7xx_hal.h"
0179
0180
0181
0182
0183 #ifdef HAL_ETH_MODULE_ENABLED
0184
0185 #if defined(ETH)
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198 #define ETH_MACCR_MASK 0xFFFB7F7CU
0199 #define ETH_MACECR_MASK 0x3F077FFFU
0200 #define ETH_MACPFR_MASK 0x800007FFU
0201 #define ETH_MACWTR_MASK 0x0000010FU
0202 #define ETH_MACTFCR_MASK 0xFFFF00F2U
0203 #define ETH_MACRFCR_MASK 0x00000003U
0204 #define ETH_MTLTQOMR_MASK 0x00000072U
0205 #define ETH_MTLRQOMR_MASK 0x0000007BU
0206
0207 #define ETH_DMAMR_MASK 0x00007802U
0208 #define ETH_DMASBMR_MASK 0x0000D001U
0209 #define ETH_DMACCR_MASK 0x00013FFFU
0210 #define ETH_DMACTCR_MASK 0x003F1010U
0211 #define ETH_DMACRCR_MASK 0x803F0000U
0212 #define ETH_MACPCSR_MASK (ETH_MACPCSR_PWRDWN | ETH_MACPCSR_RWKPKTEN | \
0213 ETH_MACPCSR_MGKPKTEN | ETH_MACPCSR_GLBLUCAST | \
0214 ETH_MACPCSR_RWKPFE)
0215
0216
0217 #define ETH_DMARXNDESCWBF_ERRORS_MASK ((uint32_t)(ETH_DMARXNDESCWBF_DE | ETH_DMARXNDESCWBF_RE | \
0218 ETH_DMARXNDESCWBF_OE | ETH_DMARXNDESCWBF_RWT |\
0219 ETH_DMARXNDESCWBF_GP | ETH_DMARXNDESCWBF_CE))
0220
0221 #define ETH_MACTSCR_MASK 0x0087FF2FU
0222
0223 #define ETH_MACSTSUR_VALUE 0xFFFFFFFFU
0224 #define ETH_MACSTNUR_VALUE 0xBB9ACA00U
0225 #define ETH_SEGMENT_SIZE_DEFAULT 0x218U
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236 #define INCR_TX_DESC_INDEX(inx, offset) do {\
0237 (inx) += (offset);\
0238 if ((inx) >= (uint32_t)ETH_TX_DESC_CNT){\
0239 (inx) = ((inx) - (uint32_t)ETH_TX_DESC_CNT);}\
0240 } while (0)
0241
0242
0243 #define INCR_RX_DESC_INDEX(inx, offset) do {\
0244 (inx) += (offset);\
0245 if ((inx) >= (uint32_t)ETH_RX_DESC_CNT){\
0246 (inx) = ((inx) - (uint32_t)ETH_RX_DESC_CNT);}\
0247 } while (0)
0248
0249
0250
0251
0252
0253
0254
0255
0256 static void ETH_SetMACConfig(ETH_HandleTypeDef *heth, const ETH_MACConfigTypeDef *macconf);
0257 static void ETH_SetDMAConfig(ETH_HandleTypeDef *heth, const ETH_DMAConfigTypeDef *dmaconf);
0258 static void ETH_MACDMAConfig(ETH_HandleTypeDef *heth);
0259 static void ETH_DMATxDescListInit(ETH_HandleTypeDef *heth);
0260 static void ETH_DMARxDescListInit(ETH_HandleTypeDef *heth);
0261 static uint32_t ETH_Prepare_Tx_Descriptors(ETH_HandleTypeDef *heth, const ETH_TxPacketConfigTypeDef *pTxConfig,
0262 uint32_t ItMode);
0263 static void ETH_UpdateDescriptor(ETH_HandleTypeDef *heth);
0264
0265 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
0266 static void ETH_InitCallbacksToDefault(ETH_HandleTypeDef *heth);
0267 #endif
0268
0269
0270
0271
0272
0273
0274
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
0312
0313 HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth)
0314 {
0315 uint32_t tickstart;
0316
0317 if (heth == NULL)
0318 {
0319 return HAL_ERROR;
0320 }
0321 if (heth->gState == HAL_ETH_STATE_RESET)
0322 {
0323 heth->gState = HAL_ETH_STATE_BUSY;
0324
0325 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
0326
0327 ETH_InitCallbacksToDefault(heth);
0328
0329 if (heth->MspInitCallback == NULL)
0330 {
0331 heth->MspInitCallback = HAL_ETH_MspInit;
0332 }
0333
0334
0335 heth->MspInitCallback(heth);
0336 #else
0337
0338 HAL_ETH_MspInit(heth);
0339
0340 #endif
0341 }
0342
0343 __HAL_RCC_SYSCFG_CLK_ENABLE();
0344
0345 if (heth->Init.MediaInterface == HAL_ETH_MII_MODE)
0346 {
0347 HAL_SYSCFG_ETHInterfaceSelect(SYSCFG_ETH_MII);
0348 }
0349 else
0350 {
0351 HAL_SYSCFG_ETHInterfaceSelect(SYSCFG_ETH_RMII);
0352 }
0353
0354
0355 (void)SYSCFG->PMCR;
0356
0357
0358
0359
0360 SET_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR);
0361
0362
0363 tickstart = HAL_GetTick();
0364
0365
0366 while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
0367 {
0368 if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
0369 {
0370
0371 heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
0372
0373 heth->gState = HAL_ETH_STATE_ERROR;
0374
0375 return HAL_ERROR;
0376 }
0377 }
0378
0379
0380 HAL_ETH_SetMDIOClockRange(heth);
0381
0382
0383 WRITE_REG(heth->Instance->MAC1USTCR, (((uint32_t)HAL_RCC_GetHCLKFreq() / ETH_MAC_US_TICK) - 1U));
0384
0385
0386 ETH_MACDMAConfig(heth);
0387
0388 #ifndef __rtems__
0389
0390 MODIFY_REG(heth->Instance->DMACCR, ETH_DMACCR_DSL, ETH_DMACCR_DSL_64BIT);
0391 #endif
0392
0393
0394 if ((heth->Init.RxBuffLen % 0x4U) != 0x0U)
0395 {
0396
0397 heth->ErrorCode = HAL_ETH_ERROR_PARAM;
0398
0399 heth->gState = HAL_ETH_STATE_ERROR;
0400
0401 return HAL_ERROR;
0402 }
0403 else
0404 {
0405 MODIFY_REG(heth->Instance->DMACRCR, ETH_DMACRCR_RBSZ, ((heth->Init.RxBuffLen) << 1));
0406 }
0407
0408
0409 ETH_DMATxDescListInit(heth);
0410
0411
0412 ETH_DMARxDescListInit(heth);
0413
0414
0415
0416 heth->Instance->MACA0HR = (((uint32_t)(heth->Init.MACAddr[5]) << 8) | (uint32_t)heth->Init.MACAddr[4]);
0417
0418 heth->Instance->MACA0LR = (((uint32_t)(heth->Init.MACAddr[3]) << 24) | ((uint32_t)(heth->Init.MACAddr[2]) << 16) |
0419 ((uint32_t)(heth->Init.MACAddr[1]) << 8) | (uint32_t)heth->Init.MACAddr[0]);
0420
0421
0422 SET_BIT(heth->Instance->MMCRIMR, ETH_MMCRIMR_RXLPITRCIM | ETH_MMCRIMR_RXLPIUSCIM | \
0423 ETH_MMCRIMR_RXUCGPIM | ETH_MMCRIMR_RXALGNERPIM | ETH_MMCRIMR_RXCRCERPIM);
0424
0425
0426 SET_BIT(heth->Instance->MMCTIMR, ETH_MMCTIMR_TXLPITRCIM | ETH_MMCTIMR_TXLPIUSCIM | \
0427 ETH_MMCTIMR_TXGPKTIM | ETH_MMCTIMR_TXMCOLGPIM | ETH_MMCTIMR_TXSCOLGPIM);
0428
0429 heth->ErrorCode = HAL_ETH_ERROR_NONE;
0430 heth->gState = HAL_ETH_STATE_READY;
0431
0432 return HAL_OK;
0433 }
0434
0435
0436
0437
0438
0439
0440
0441 HAL_StatusTypeDef HAL_ETH_DeInit(ETH_HandleTypeDef *heth)
0442 {
0443
0444 heth->gState = HAL_ETH_STATE_BUSY;
0445
0446 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
0447
0448 if (heth->MspDeInitCallback == NULL)
0449 {
0450 heth->MspDeInitCallback = HAL_ETH_MspDeInit;
0451 }
0452
0453 heth->MspDeInitCallback(heth);
0454 #else
0455
0456
0457 HAL_ETH_MspDeInit(heth);
0458
0459 #endif
0460
0461
0462 heth->gState = HAL_ETH_STATE_RESET;
0463
0464
0465 return HAL_OK;
0466 }
0467
0468 #ifndef __rtems__
0469
0470
0471
0472
0473
0474
0475 __weak void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
0476 {
0477
0478 UNUSED(heth);
0479
0480
0481
0482 }
0483 #endif
0484
0485
0486
0487
0488
0489
0490
0491 __weak void HAL_ETH_MspDeInit(ETH_HandleTypeDef *heth)
0492 {
0493
0494 UNUSED(heth);
0495
0496
0497
0498 }
0499
0500 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518 HAL_StatusTypeDef HAL_ETH_RegisterCallback(ETH_HandleTypeDef *heth, HAL_ETH_CallbackIDTypeDef CallbackID,
0519 pETH_CallbackTypeDef pCallback)
0520 {
0521 HAL_StatusTypeDef status = HAL_OK;
0522
0523 if (pCallback == NULL)
0524 {
0525
0526 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
0527 return HAL_ERROR;
0528 }
0529
0530 if (heth->gState == HAL_ETH_STATE_READY)
0531 {
0532 switch (CallbackID)
0533 {
0534 case HAL_ETH_TX_COMPLETE_CB_ID :
0535 heth->TxCpltCallback = pCallback;
0536 break;
0537
0538 case HAL_ETH_RX_COMPLETE_CB_ID :
0539 heth->RxCpltCallback = pCallback;
0540 break;
0541
0542 case HAL_ETH_ERROR_CB_ID :
0543 heth->ErrorCallback = pCallback;
0544 break;
0545
0546 case HAL_ETH_PMT_CB_ID :
0547 heth->PMTCallback = pCallback;
0548 break;
0549
0550 case HAL_ETH_EEE_CB_ID :
0551 heth->EEECallback = pCallback;
0552 break;
0553
0554 case HAL_ETH_WAKEUP_CB_ID :
0555 heth->WakeUpCallback = pCallback;
0556 break;
0557
0558 case HAL_ETH_MSPINIT_CB_ID :
0559 heth->MspInitCallback = pCallback;
0560 break;
0561
0562 case HAL_ETH_MSPDEINIT_CB_ID :
0563 heth->MspDeInitCallback = pCallback;
0564 break;
0565
0566 default :
0567
0568 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
0569
0570 status = HAL_ERROR;
0571 break;
0572 }
0573 }
0574 else if (heth->gState == HAL_ETH_STATE_RESET)
0575 {
0576 switch (CallbackID)
0577 {
0578 case HAL_ETH_MSPINIT_CB_ID :
0579 heth->MspInitCallback = pCallback;
0580 break;
0581
0582 case HAL_ETH_MSPDEINIT_CB_ID :
0583 heth->MspDeInitCallback = pCallback;
0584 break;
0585
0586 default :
0587
0588 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
0589
0590 status = HAL_ERROR;
0591 break;
0592 }
0593 }
0594 else
0595 {
0596
0597 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
0598
0599 status = HAL_ERROR;
0600 }
0601
0602 return status;
0603 }
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621 HAL_StatusTypeDef HAL_ETH_UnRegisterCallback(ETH_HandleTypeDef *heth, HAL_ETH_CallbackIDTypeDef CallbackID)
0622 {
0623 HAL_StatusTypeDef status = HAL_OK;
0624
0625 if (heth->gState == HAL_ETH_STATE_READY)
0626 {
0627 switch (CallbackID)
0628 {
0629 case HAL_ETH_TX_COMPLETE_CB_ID :
0630 heth->TxCpltCallback = HAL_ETH_TxCpltCallback;
0631 break;
0632
0633 case HAL_ETH_RX_COMPLETE_CB_ID :
0634 heth->RxCpltCallback = HAL_ETH_RxCpltCallback;
0635 break;
0636
0637 case HAL_ETH_ERROR_CB_ID :
0638 heth->ErrorCallback = HAL_ETH_ErrorCallback;
0639 break;
0640
0641 case HAL_ETH_PMT_CB_ID :
0642 heth->PMTCallback = HAL_ETH_PMTCallback;
0643 break;
0644
0645 case HAL_ETH_EEE_CB_ID :
0646 heth->EEECallback = HAL_ETH_EEECallback;
0647 break;
0648
0649 case HAL_ETH_WAKEUP_CB_ID :
0650 heth->WakeUpCallback = HAL_ETH_WakeUpCallback;
0651 break;
0652
0653 case HAL_ETH_MSPINIT_CB_ID :
0654 heth->MspInitCallback = HAL_ETH_MspInit;
0655 break;
0656
0657 case HAL_ETH_MSPDEINIT_CB_ID :
0658 heth->MspDeInitCallback = HAL_ETH_MspDeInit;
0659 break;
0660
0661 default :
0662
0663 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
0664
0665 status = HAL_ERROR;
0666 break;
0667 }
0668 }
0669 else if (heth->gState == HAL_ETH_STATE_RESET)
0670 {
0671 switch (CallbackID)
0672 {
0673 case HAL_ETH_MSPINIT_CB_ID :
0674 heth->MspInitCallback = HAL_ETH_MspInit;
0675 break;
0676
0677 case HAL_ETH_MSPDEINIT_CB_ID :
0678 heth->MspDeInitCallback = HAL_ETH_MspDeInit;
0679 break;
0680
0681 default :
0682
0683 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
0684
0685 status = HAL_ERROR;
0686 break;
0687 }
0688 }
0689 else
0690 {
0691
0692 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
0693
0694 status = HAL_ERROR;
0695 }
0696
0697 return status;
0698 }
0699 #endif
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727 HAL_StatusTypeDef HAL_ETH_Start(ETH_HandleTypeDef *heth)
0728 {
0729 if (heth->gState == HAL_ETH_STATE_READY)
0730 {
0731 heth->gState = HAL_ETH_STATE_BUSY;
0732
0733
0734 heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
0735
0736
0737 ETH_UpdateDescriptor(heth);
0738
0739
0740 SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
0741
0742
0743 SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
0744
0745
0746 SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
0747
0748
0749 SET_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
0750
0751
0752 SET_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
0753
0754
0755 heth->Instance->DMACSR |= (ETH_DMACSR_TPS | ETH_DMACSR_RPS);
0756
0757 heth->gState = HAL_ETH_STATE_STARTED;
0758
0759 return HAL_OK;
0760 }
0761 else
0762 {
0763 return HAL_ERROR;
0764 }
0765 }
0766
0767
0768
0769
0770
0771
0772
0773 HAL_StatusTypeDef HAL_ETH_Start_IT(ETH_HandleTypeDef *heth)
0774 {
0775 if (heth->gState == HAL_ETH_STATE_READY)
0776 {
0777 heth->gState = HAL_ETH_STATE_BUSY;
0778
0779
0780 heth->RxDescList.ItMode = 1U;
0781
0782
0783 heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
0784
0785
0786 ETH_UpdateDescriptor(heth);
0787
0788
0789 SET_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
0790
0791
0792 SET_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
0793
0794
0795 heth->Instance->DMACSR |= (ETH_DMACSR_TPS | ETH_DMACSR_RPS);
0796
0797
0798 SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
0799
0800
0801 SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
0802
0803
0804 SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
0805
0806
0807
0808
0809
0810
0811 __HAL_ETH_DMA_ENABLE_IT(heth, (ETH_DMACIER_NIE | ETH_DMACIER_RIE | ETH_DMACIER_TIE |
0812 ETH_DMACIER_FBEE | ETH_DMACIER_AIE | ETH_DMACIER_RBUE));
0813
0814 heth->gState = HAL_ETH_STATE_STARTED;
0815 return HAL_OK;
0816 }
0817 else
0818 {
0819 return HAL_ERROR;
0820 }
0821 }
0822
0823
0824
0825
0826
0827
0828
0829 HAL_StatusTypeDef HAL_ETH_Stop(ETH_HandleTypeDef *heth)
0830 {
0831 if (heth->gState == HAL_ETH_STATE_STARTED)
0832 {
0833
0834 heth->gState = HAL_ETH_STATE_BUSY;
0835
0836
0837 CLEAR_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
0838
0839
0840 CLEAR_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
0841
0842
0843 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
0844
0845
0846 SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
0847
0848
0849 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
0850
0851 heth->gState = HAL_ETH_STATE_READY;
0852
0853
0854 return HAL_OK;
0855 }
0856 else
0857 {
0858 return HAL_ERROR;
0859 }
0860 }
0861
0862
0863
0864
0865
0866
0867
0868 HAL_StatusTypeDef HAL_ETH_Stop_IT(ETH_HandleTypeDef *heth)
0869 {
0870 ETH_DMADescTypeDef *dmarxdesc;
0871 uint32_t descindex;
0872
0873 if (heth->gState == HAL_ETH_STATE_STARTED)
0874 {
0875
0876 heth->gState = HAL_ETH_STATE_BUSY;
0877
0878
0879
0880
0881
0882
0883 __HAL_ETH_DMA_DISABLE_IT(heth, (ETH_DMACIER_NIE | ETH_DMACIER_RIE | ETH_DMACIER_TIE |
0884 ETH_DMACIER_FBEE | ETH_DMACIER_AIE | ETH_DMACIER_RBUE));
0885
0886
0887 CLEAR_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_ST);
0888
0889
0890 CLEAR_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_SR);
0891
0892
0893 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
0894
0895
0896 SET_BIT(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_FTQ);
0897
0898
0899 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
0900
0901
0902 for (descindex = 0; descindex < (uint32_t)ETH_RX_DESC_CNT; descindex++)
0903 {
0904 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descindex];
0905 CLEAR_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCRF_IOC);
0906 }
0907
0908 heth->RxDescList.ItMode = 0U;
0909
0910 heth->gState = HAL_ETH_STATE_READY;
0911
0912
0913 return HAL_OK;
0914 }
0915 else
0916 {
0917 return HAL_ERROR;
0918 }
0919 }
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929 HAL_StatusTypeDef HAL_ETH_Transmit(ETH_HandleTypeDef *heth, ETH_TxPacketConfigTypeDef *pTxConfig, uint32_t Timeout)
0930 {
0931 uint32_t tickstart;
0932 ETH_DMADescTypeDef *dmatxdesc;
0933
0934 if (pTxConfig == NULL)
0935 {
0936 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
0937 return HAL_ERROR;
0938 }
0939
0940 if (heth->gState == HAL_ETH_STATE_STARTED)
0941 {
0942
0943 if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 0) != HAL_ETH_ERROR_NONE)
0944 {
0945
0946 heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
0947 return HAL_ERROR;
0948 }
0949
0950
0951 __DSB();
0952
0953 dmatxdesc = (ETH_DMADescTypeDef *)(&heth->TxDescList)->TxDesc[heth->TxDescList.CurTxDesc];
0954
0955
0956 INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
0957
0958
0959
0960 WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));
0961
0962 tickstart = HAL_GetTick();
0963
0964
0965 while ((dmatxdesc->DESC3 & ETH_DMATXNDESCWBF_OWN) != (uint32_t)RESET)
0966 {
0967 if ((heth->Instance->DMACSR & ETH_DMACSR_FBE) != (uint32_t)RESET)
0968 {
0969 heth->ErrorCode |= HAL_ETH_ERROR_DMA;
0970 heth->DMAErrorCode = heth->Instance->DMACSR;
0971
0972 return HAL_ERROR;
0973 }
0974
0975
0976 if (Timeout != HAL_MAX_DELAY)
0977 {
0978 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
0979 {
0980 heth->ErrorCode |= HAL_ETH_ERROR_TIMEOUT;
0981
0982 dmatxdesc->DESC3 = (ETH_DMATXNDESCWBF_FD | ETH_DMATXNDESCWBF_LD);
0983 return HAL_ERROR;
0984 }
0985 }
0986 }
0987
0988
0989 return HAL_OK;
0990 }
0991 else
0992 {
0993 return HAL_ERROR;
0994 }
0995 }
0996
0997
0998
0999
1000
1001
1002
1003
1004 HAL_StatusTypeDef HAL_ETH_Transmit_IT(ETH_HandleTypeDef *heth, ETH_TxPacketConfigTypeDef *pTxConfig)
1005 {
1006 if (pTxConfig == NULL)
1007 {
1008 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
1009 return HAL_ERROR;
1010 }
1011
1012 if (heth->gState == HAL_ETH_STATE_STARTED)
1013 {
1014
1015 heth->TxDescList.CurrentPacketAddress = (uint32_t *)pTxConfig->pData;
1016
1017
1018 if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 1) != HAL_ETH_ERROR_NONE)
1019 {
1020 heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
1021 return HAL_ERROR;
1022 }
1023
1024
1025 __DSB();
1026
1027
1028 INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
1029
1030
1031
1032 WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));
1033
1034 return HAL_OK;
1035
1036 }
1037 else
1038 {
1039 return HAL_ERROR;
1040 }
1041 }
1042
1043
1044
1045
1046
1047
1048
1049
1050 HAL_StatusTypeDef HAL_ETH_ReadData(ETH_HandleTypeDef *heth, void **pAppBuff)
1051 {
1052 uint32_t descidx;
1053 ETH_DMADescTypeDef *dmarxdesc;
1054 uint32_t desccnt = 0U;
1055 uint32_t desccntmax;
1056 uint32_t bufflength;
1057 uint8_t rxdataready = 0U;
1058
1059 if (pAppBuff == NULL)
1060 {
1061 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
1062 return HAL_ERROR;
1063 }
1064
1065 if (heth->gState != HAL_ETH_STATE_STARTED)
1066 {
1067 return HAL_ERROR;
1068 }
1069
1070 descidx = heth->RxDescList.RxDescIdx;
1071 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1072 desccntmax = ETH_RX_DESC_CNT - heth->RxDescList.RxBuildDescCnt;
1073
1074
1075 while ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
1076 && (rxdataready == 0U))
1077 {
1078 if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_CTXT) != (uint32_t)RESET)
1079 {
1080
1081 heth->RxDescList.TimeStamp.TimeStampHigh = dmarxdesc->DESC1;
1082
1083 heth->RxDescList.TimeStamp.TimeStampLow = dmarxdesc->DESC0;
1084 }
1085 if ((READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_FD) != (uint32_t)RESET) || (heth->RxDescList.pRxStart != NULL))
1086 {
1087
1088 if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_FD) != (uint32_t)RESET)
1089 {
1090 heth->RxDescList.RxDescCnt = 0;
1091 heth->RxDescList.RxDataLength = 0;
1092 }
1093
1094
1095 bufflength = READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_PL) - heth->RxDescList.RxDataLength;
1096
1097
1098 if (READ_BIT(dmarxdesc->DESC3, ETH_DMARXNDESCWBF_LD) != (uint32_t)RESET)
1099 {
1100
1101 heth->RxDescList.pRxLastRxDesc = dmarxdesc->DESC3;
1102
1103
1104 rxdataready = 1;
1105 }
1106
1107
1108 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1109
1110 heth->rxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
1111 (uint8_t *)dmarxdesc->BackupAddr0, bufflength);
1112 #else
1113
1114 HAL_ETH_RxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
1115 (uint8_t *)dmarxdesc->BackupAddr0, (uint16_t) bufflength);
1116 #endif
1117 heth->RxDescList.RxDescCnt++;
1118 heth->RxDescList.RxDataLength += bufflength;
1119
1120
1121 dmarxdesc->BackupAddr0 = 0;
1122 }
1123
1124
1125 INCR_RX_DESC_INDEX(descidx, 1U);
1126
1127 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1128 desccnt++;
1129 }
1130
1131 heth->RxDescList.RxBuildDescCnt += desccnt;
1132 if ((heth->RxDescList.RxBuildDescCnt) != 0U)
1133 {
1134
1135 ETH_UpdateDescriptor(heth);
1136 }
1137
1138 heth->RxDescList.RxDescIdx = descidx;
1139
1140 if (rxdataready == 1U)
1141 {
1142
1143 *pAppBuff = heth->RxDescList.pRxStart;
1144
1145 heth->RxDescList.pRxStart = NULL;
1146
1147 return HAL_OK;
1148 }
1149
1150
1151 return HAL_ERROR;
1152 }
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162 static void ETH_UpdateDescriptor(ETH_HandleTypeDef *heth)
1163 {
1164 #ifndef __rtems__
1165 uint32_t descidx;
1166 uint32_t tailidx;
1167 uint32_t desccount;
1168 ETH_DMADescTypeDef *dmarxdesc;
1169 uint8_t *buff = NULL;
1170 uint8_t allocStatus = 1U;
1171
1172 descidx = heth->RxDescList.RxBuildDescIdx;
1173 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1174 desccount = heth->RxDescList.RxBuildDescCnt;
1175
1176 while ((desccount > 0U) && (allocStatus != 0U))
1177 {
1178
1179 if (READ_REG(dmarxdesc->BackupAddr0) == 0U)
1180 {
1181
1182 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1183
1184 heth->rxAllocateCallback(&buff);
1185 #else
1186
1187 HAL_ETH_RxAllocateCallback(&buff);
1188 #endif
1189 if (buff == NULL)
1190 {
1191 allocStatus = 0U;
1192 }
1193 else
1194 {
1195 WRITE_REG(dmarxdesc->BackupAddr0, (uint32_t)buff);
1196 WRITE_REG(dmarxdesc->DESC0, (uint32_t)buff);
1197 }
1198 }
1199
1200 if (allocStatus != 0U)
1201 {
1202
1203 if (heth->RxDescList.ItMode != 0U)
1204 {
1205 WRITE_REG(dmarxdesc->DESC3, ETH_DMARXNDESCRF_OWN | ETH_DMARXNDESCRF_BUF1V | ETH_DMARXNDESCRF_IOC);
1206 }
1207 else
1208 {
1209 WRITE_REG(dmarxdesc->DESC3, ETH_DMARXNDESCRF_OWN | ETH_DMARXNDESCRF_BUF1V);
1210 }
1211
1212
1213 INCR_RX_DESC_INDEX(descidx, 1U);
1214
1215 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1216 desccount--;
1217 }
1218 }
1219
1220 if (heth->RxDescList.RxBuildDescCnt != desccount)
1221 {
1222
1223 tailidx = (descidx + 1U) % ETH_RX_DESC_CNT;
1224
1225
1226 __DMB();
1227
1228
1229 WRITE_REG(heth->Instance->DMACRDTPR, ((uint32_t)(heth->Init.RxDesc + (tailidx))));
1230
1231 heth->RxDescList.RxBuildDescIdx = descidx;
1232 heth->RxDescList.RxBuildDescCnt = desccount;
1233 }
1234 #endif
1235 }
1236
1237
1238
1239
1240
1241
1242
1243
1244 HAL_StatusTypeDef HAL_ETH_RegisterRxAllocateCallback(ETH_HandleTypeDef *heth,
1245 pETH_rxAllocateCallbackTypeDef rxAllocateCallback)
1246 {
1247 if (rxAllocateCallback == NULL)
1248 {
1249
1250 return HAL_ERROR;
1251 }
1252
1253
1254 heth->rxAllocateCallback = rxAllocateCallback;
1255
1256 return HAL_OK;
1257 }
1258
1259
1260
1261
1262
1263
1264
1265 HAL_StatusTypeDef HAL_ETH_UnRegisterRxAllocateCallback(ETH_HandleTypeDef *heth)
1266 {
1267
1268 heth->rxAllocateCallback = HAL_ETH_RxAllocateCallback;
1269
1270 return HAL_OK;
1271 }
1272
1273
1274
1275
1276
1277
1278 __weak void HAL_ETH_RxAllocateCallback(uint8_t **buff)
1279 {
1280
1281 UNUSED(buff);
1282
1283
1284
1285 }
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295 __weak void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length)
1296 {
1297
1298 UNUSED(pStart);
1299 UNUSED(pEnd);
1300 UNUSED(buff);
1301 UNUSED(Length);
1302
1303
1304
1305 }
1306
1307
1308
1309
1310
1311
1312
1313
1314 HAL_StatusTypeDef HAL_ETH_RegisterRxLinkCallback(ETH_HandleTypeDef *heth, pETH_rxLinkCallbackTypeDef rxLinkCallback)
1315 {
1316 if (rxLinkCallback == NULL)
1317 {
1318
1319 return HAL_ERROR;
1320 }
1321
1322
1323 heth->rxLinkCallback = rxLinkCallback;
1324
1325 return HAL_OK;
1326 }
1327
1328
1329
1330
1331
1332
1333
1334 HAL_StatusTypeDef HAL_ETH_UnRegisterRxLinkCallback(ETH_HandleTypeDef *heth)
1335 {
1336
1337 heth->rxLinkCallback = HAL_ETH_RxLinkCallback;
1338
1339 return HAL_OK;
1340 }
1341
1342
1343
1344
1345
1346
1347
1348
1349 HAL_StatusTypeDef HAL_ETH_GetRxDataErrorCode(const ETH_HandleTypeDef *heth, uint32_t *pErrorCode)
1350 {
1351
1352 *pErrorCode = READ_BIT(heth->RxDescList.pRxLastRxDesc, ETH_DMARXNDESCWBF_ERRORS_MASK);
1353
1354 return HAL_OK;
1355 }
1356
1357
1358
1359
1360
1361
1362
1363
1364 HAL_StatusTypeDef HAL_ETH_RegisterTxFreeCallback(ETH_HandleTypeDef *heth, pETH_txFreeCallbackTypeDef txFreeCallback)
1365 {
1366 if (txFreeCallback == NULL)
1367 {
1368
1369 return HAL_ERROR;
1370 }
1371
1372
1373 heth->txFreeCallback = txFreeCallback;
1374
1375 return HAL_OK;
1376 }
1377
1378
1379
1380
1381
1382
1383
1384 HAL_StatusTypeDef HAL_ETH_UnRegisterTxFreeCallback(ETH_HandleTypeDef *heth)
1385 {
1386
1387 heth->txFreeCallback = HAL_ETH_TxFreeCallback;
1388
1389 return HAL_OK;
1390 }
1391
1392
1393
1394
1395
1396
1397 __weak void HAL_ETH_TxFreeCallback(uint32_t *buff)
1398 {
1399
1400 UNUSED(buff);
1401
1402
1403
1404 }
1405
1406
1407
1408
1409
1410
1411
1412 HAL_StatusTypeDef HAL_ETH_ReleaseTxPacket(ETH_HandleTypeDef *heth)
1413 {
1414 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
1415 uint32_t numOfBuf = dmatxdesclist->BuffersInUse;
1416 uint32_t idx = dmatxdesclist->releaseIndex;
1417 uint8_t pktTxStatus = 1U;
1418 uint8_t pktInUse;
1419 #ifdef HAL_ETH_USE_PTP
1420 ETH_TimeStampTypeDef *timestamp = &heth->TxTimestamp;
1421 #endif
1422
1423
1424 while ((numOfBuf != 0U) && (pktTxStatus != 0U))
1425 {
1426 pktInUse = 1U;
1427 numOfBuf--;
1428
1429 if (dmatxdesclist->PacketAddress[idx] == NULL)
1430 {
1431
1432 INCR_TX_DESC_INDEX(idx, 1U);
1433 pktInUse = 0U;
1434 }
1435
1436 if (pktInUse != 0U)
1437 {
1438
1439 if ((heth->Init.TxDesc[idx].DESC3 & ETH_DMATXNDESCRF_OWN) == 0U)
1440 {
1441 #ifdef HAL_ETH_USE_PTP
1442
1443
1444 CLEAR_BIT(heth->Init.TxDesc[idx].DESC3, (0x40000000U));
1445
1446 if ((heth->Init.TxDesc[idx].DESC3 & ETH_DMATXNDESCWBF_LD)
1447 && (heth->Init.TxDesc[idx].DESC3 & ETH_DMATXNDESCWBF_TTSS))
1448 {
1449
1450 timestamp->TimeStampLow = heth->Init.TxDesc[idx].DESC0;
1451
1452 timestamp->TimeStampHigh = heth->Init.TxDesc[idx].DESC1;
1453 }
1454 else
1455 {
1456 timestamp->TimeStampHigh = timestamp->TimeStampLow = UINT32_MAX;
1457 }
1458 #endif
1459
1460 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1461
1462 #ifdef HAL_ETH_USE_PTP
1463
1464 if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX)
1465 {
1466 heth->txPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp);
1467 }
1468 #endif
1469
1470 heth->txFreeCallback(dmatxdesclist->PacketAddress[idx]);
1471 #else
1472
1473 #ifdef HAL_ETH_USE_PTP
1474
1475 if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX)
1476 {
1477 HAL_ETH_TxPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp);
1478 }
1479 #endif
1480
1481 HAL_ETH_TxFreeCallback(dmatxdesclist->PacketAddress[idx]);
1482 #endif
1483
1484
1485 dmatxdesclist->PacketAddress[idx] = NULL;
1486
1487
1488 INCR_TX_DESC_INDEX(idx, 1U);
1489 dmatxdesclist->BuffersInUse = numOfBuf;
1490 dmatxdesclist->releaseIndex = idx;
1491 }
1492 else
1493 {
1494
1495 pktTxStatus = 0U;
1496 }
1497 }
1498 }
1499 return HAL_OK;
1500 }
1501
1502 #ifdef HAL_ETH_USE_PTP
1503
1504
1505
1506
1507
1508
1509
1510
1511 HAL_StatusTypeDef HAL_ETH_PTP_SetConfig(ETH_HandleTypeDef *heth, ETH_PTP_ConfigTypeDef *ptpconfig)
1512 {
1513 uint32_t tmpTSCR;
1514 ETH_TimeTypeDef time;
1515
1516 if (ptpconfig == NULL)
1517 {
1518 return HAL_ERROR;
1519 }
1520
1521 tmpTSCR = ptpconfig->Timestamp |
1522 ((uint32_t)ptpconfig->TimestampUpdate << ETH_MACTSCR_TSUPDT_Pos) |
1523 ((uint32_t)ptpconfig->TimestampAll << ETH_MACTSCR_TSENALL_Pos) |
1524 ((uint32_t)ptpconfig->TimestampRolloverMode << ETH_MACTSCR_TSCTRLSSR_Pos) |
1525 ((uint32_t)ptpconfig->TimestampV2 << ETH_MACTSCR_TSVER2ENA_Pos) |
1526 ((uint32_t)ptpconfig->TimestampEthernet << ETH_MACTSCR_TSIPENA_Pos) |
1527 ((uint32_t)ptpconfig->TimestampIPv6 << ETH_MACTSCR_TSIPV6ENA_Pos) |
1528 ((uint32_t)ptpconfig->TimestampIPv4 << ETH_MACTSCR_TSIPV4ENA_Pos) |
1529 ((uint32_t)ptpconfig->TimestampEvent << ETH_MACTSCR_TSEVNTENA_Pos) |
1530 ((uint32_t)ptpconfig->TimestampMaster << ETH_MACTSCR_TSMSTRENA_Pos) |
1531 ((uint32_t)ptpconfig->TimestampSnapshots << ETH_MACTSCR_SNAPTYPSEL_Pos) |
1532 ((uint32_t)ptpconfig->TimestampFilter << ETH_MACTSCR_TSENMACADDR_Pos) |
1533 ((uint32_t)ptpconfig->TimestampChecksumCorrection << ETH_MACTSCR_CSC_Pos) |
1534 ((uint32_t)ptpconfig->TimestampStatusMode << ETH_MACTSCR_TXTSSTSM_Pos);
1535
1536
1537 MODIFY_REG(heth->Instance->MACTSCR, ETH_MACTSCR_MASK, tmpTSCR);
1538
1539
1540 SET_BIT(heth->Instance->MACTSCR, ETH_MACTSCR_TSENA);
1541 WRITE_REG(heth->Instance->MACSSIR, ptpconfig->TimestampSubsecondInc);
1542 WRITE_REG(heth->Instance->MACTSAR, ptpconfig->TimestampAddend);
1543
1544
1545 if (ptpconfig->TimestampAddendUpdate == ENABLE)
1546 {
1547 SET_BIT(heth->Instance->MACTSCR, ETH_MACTSCR_TSADDREG);
1548 while ((heth->Instance->MACTSCR & ETH_MACTSCR_TSADDREG) != 0)
1549 {
1550
1551 }
1552 }
1553
1554
1555 SET_BIT(heth->Instance->MACTSCR, ETH_MACTSCR_TSINIT);
1556
1557
1558 heth->IsPtpConfigured = HAL_ETH_PTP_CONFIGURED;
1559
1560
1561 time.Seconds = heth->Instance->MACSTSR;
1562
1563 time.NanoSeconds = heth->Instance->MACSTNR;
1564
1565 HAL_ETH_PTP_SetTime(heth, &time);
1566
1567
1568 return HAL_OK;
1569 }
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579 HAL_StatusTypeDef HAL_ETH_PTP_GetConfig(ETH_HandleTypeDef *heth, ETH_PTP_ConfigTypeDef *ptpconfig)
1580 {
1581 if (ptpconfig == NULL)
1582 {
1583 return HAL_ERROR;
1584 }
1585 ptpconfig->Timestamp = READ_BIT(heth->Instance->MACTSCR, ETH_MACTSCR_TSENA);
1586 ptpconfig->TimestampUpdate = ((READ_BIT(heth->Instance->MACTSCR,
1587 ETH_MACTSCR_TSCFUPDT) >> ETH_MACTSCR_TSUPDT_Pos) > 0U) ? ENABLE : DISABLE;
1588 ptpconfig->TimestampAll = ((READ_BIT(heth->Instance->MACTSCR,
1589 ETH_MACTSCR_TSENALL) >> ETH_MACTSCR_TSENALL_Pos) > 0U) ? ENABLE : DISABLE;
1590 ptpconfig->TimestampRolloverMode = ((READ_BIT(heth->Instance->MACTSCR,
1591 ETH_MACTSCR_TSCTRLSSR) >> ETH_MACTSCR_TSCTRLSSR_Pos) > 0U)
1592 ? ENABLE : DISABLE;
1593 ptpconfig->TimestampV2 = ((READ_BIT(heth->Instance->MACTSCR,
1594 ETH_MACTSCR_TSVER2ENA) >> ETH_MACTSCR_TSVER2ENA_Pos) > 0U) ? ENABLE : DISABLE;
1595 ptpconfig->TimestampEthernet = ((READ_BIT(heth->Instance->MACTSCR,
1596 ETH_MACTSCR_TSIPENA) >> ETH_MACTSCR_TSIPENA_Pos) > 0U) ? ENABLE : DISABLE;
1597 ptpconfig->TimestampIPv6 = ((READ_BIT(heth->Instance->MACTSCR,
1598 ETH_MACTSCR_TSIPV6ENA) >> ETH_MACTSCR_TSIPV6ENA_Pos) > 0U) ? ENABLE : DISABLE;
1599 ptpconfig->TimestampIPv4 = ((READ_BIT(heth->Instance->MACTSCR,
1600 ETH_MACTSCR_TSIPV4ENA) >> ETH_MACTSCR_TSIPV4ENA_Pos) > 0U) ? ENABLE : DISABLE;
1601 ptpconfig->TimestampEvent = ((READ_BIT(heth->Instance->MACTSCR,
1602 ETH_MACTSCR_TSEVNTENA) >> ETH_MACTSCR_TSEVNTENA_Pos) > 0U) ? ENABLE : DISABLE;
1603 ptpconfig->TimestampMaster = ((READ_BIT(heth->Instance->MACTSCR,
1604 ETH_MACTSCR_TSMSTRENA) >> ETH_MACTSCR_TSMSTRENA_Pos) > 0U) ? ENABLE : DISABLE;
1605 ptpconfig->TimestampSnapshots = ((READ_BIT(heth->Instance->MACTSCR,
1606 ETH_MACTSCR_SNAPTYPSEL) >> ETH_MACTSCR_SNAPTYPSEL_Pos) > 0U)
1607 ? ENABLE : DISABLE;
1608 ptpconfig->TimestampFilter = ((READ_BIT(heth->Instance->MACTSCR,
1609 ETH_MACTSCR_TSENMACADDR) >> ETH_MACTSCR_TSENMACADDR_Pos) > 0U)
1610 ? ENABLE : DISABLE;
1611 ptpconfig->TimestampChecksumCorrection = ((READ_BIT(heth->Instance->MACTSCR,
1612 ETH_MACTSCR_CSC) >> ETH_MACTSCR_CSC_Pos) > 0U) ? ENABLE : DISABLE;
1613 ptpconfig->TimestampStatusMode = ((READ_BIT(heth->Instance->MACTSCR,
1614 ETH_MACTSCR_TXTSSTSM) >> ETH_MACTSCR_TXTSSTSM_Pos) > 0U)
1615 ? ENABLE : DISABLE;
1616
1617
1618 return HAL_OK;
1619 }
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629 HAL_StatusTypeDef HAL_ETH_PTP_SetTime(ETH_HandleTypeDef *heth, ETH_TimeTypeDef *time)
1630 {
1631 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1632 {
1633
1634 heth->Instance->MACSTSUR = time->Seconds;
1635
1636
1637 heth->Instance->MACSTNUR = time->NanoSeconds;
1638
1639
1640 SET_BIT(heth->Instance->MACTSCR, ETH_MACTSCR_TSUPDT);
1641
1642
1643 return HAL_OK;
1644 }
1645 else
1646 {
1647
1648 return HAL_ERROR;
1649 }
1650 }
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660 HAL_StatusTypeDef HAL_ETH_PTP_GetTime(ETH_HandleTypeDef *heth, ETH_TimeTypeDef *time)
1661 {
1662 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1663 {
1664
1665 time->Seconds = heth->Instance->MACSTSR;
1666
1667 time->NanoSeconds = heth->Instance->MACSTNR;
1668
1669
1670 return HAL_OK;
1671 }
1672 else
1673 {
1674
1675 return HAL_ERROR;
1676 }
1677 }
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687 HAL_StatusTypeDef HAL_ETH_PTP_AddTimeOffset(ETH_HandleTypeDef *heth, ETH_PtpUpdateTypeDef ptpoffsettype,
1688 ETH_TimeTypeDef *timeoffset)
1689 {
1690 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1691 {
1692 if (ptpoffsettype == HAL_ETH_PTP_NEGATIVE_UPDATE)
1693 {
1694
1695 heth->Instance->MACSTSUR = ETH_MACSTSUR_VALUE - timeoffset->Seconds + 1U;
1696
1697 if (READ_BIT(heth->Instance->MACTSCR, ETH_MACTSCR_TSCTRLSSR) == ETH_MACTSCR_TSCTRLSSR)
1698 {
1699
1700 heth->Instance->MACSTNUR = ETH_MACSTNUR_VALUE - timeoffset->NanoSeconds;
1701 }
1702 else
1703 {
1704
1705 heth->Instance->MACSTNUR = ETH_MACSTSUR_VALUE - timeoffset->NanoSeconds + 1U;
1706 }
1707 }
1708 else
1709 {
1710
1711 heth->Instance->MACSTSUR = timeoffset->Seconds;
1712
1713 heth->Instance->MACSTNUR = timeoffset->NanoSeconds;
1714 }
1715
1716 SET_BIT(heth->Instance->MACTSCR, ETH_MACTSCR_TSUPDT);
1717
1718
1719 return HAL_OK;
1720 }
1721 else
1722 {
1723
1724 return HAL_ERROR;
1725 }
1726 }
1727
1728
1729
1730
1731
1732
1733
1734 HAL_StatusTypeDef HAL_ETH_PTP_InsertTxTimestamp(ETH_HandleTypeDef *heth)
1735 {
1736 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
1737 uint32_t descidx = dmatxdesclist->CurTxDesc;
1738 ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
1739
1740 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1741 {
1742
1743 SET_BIT(dmatxdesc->DESC2, ETH_DMATXNDESCRF_TTSE);
1744
1745
1746 return HAL_OK;
1747 }
1748 else
1749 {
1750
1751 return HAL_ERROR;
1752 }
1753 }
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763 HAL_StatusTypeDef HAL_ETH_PTP_GetTxTimestamp(ETH_HandleTypeDef *heth, ETH_TimeStampTypeDef *timestamp)
1764 {
1765 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
1766 uint32_t idx = dmatxdesclist->releaseIndex;
1767 ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[idx];
1768
1769 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1770 {
1771
1772 timestamp->TimeStampLow = dmatxdesc->DESC0;
1773
1774 timestamp->TimeStampHigh = dmatxdesc->DESC1;
1775
1776
1777 return HAL_OK;
1778 }
1779 else
1780 {
1781
1782 return HAL_ERROR;
1783 }
1784 }
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794 HAL_StatusTypeDef HAL_ETH_PTP_GetRxTimestamp(ETH_HandleTypeDef *heth, ETH_TimeStampTypeDef *timestamp)
1795 {
1796 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1797 {
1798
1799 timestamp->TimeStampLow = heth->RxDescList.TimeStamp.TimeStampLow;
1800
1801 timestamp->TimeStampHigh = heth->RxDescList.TimeStamp.TimeStampHigh;
1802
1803
1804 return HAL_OK;
1805 }
1806 else
1807 {
1808
1809 return HAL_ERROR;
1810 }
1811 }
1812
1813
1814
1815
1816
1817
1818
1819
1820 HAL_StatusTypeDef HAL_ETH_RegisterTxPtpCallback(ETH_HandleTypeDef *heth, pETH_txPtpCallbackTypeDef txPtpCallback)
1821 {
1822 if (txPtpCallback == NULL)
1823 {
1824
1825 return HAL_ERROR;
1826 }
1827
1828 heth->txPtpCallback = txPtpCallback;
1829
1830 return HAL_OK;
1831 }
1832
1833
1834
1835
1836
1837
1838
1839 HAL_StatusTypeDef HAL_ETH_UnRegisterTxPtpCallback(ETH_HandleTypeDef *heth)
1840 {
1841
1842 heth->txPtpCallback = HAL_ETH_TxPtpCallback;
1843
1844 return HAL_OK;
1845 }
1846
1847
1848
1849
1850
1851
1852
1853
1854 __weak void HAL_ETH_TxPtpCallback(uint32_t *buff, ETH_TimeStampTypeDef *timestamp)
1855 {
1856
1857 UNUSED(buff);
1858
1859
1860
1861 }
1862 #endif
1863
1864
1865
1866
1867
1868
1869
1870 void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth)
1871 {
1872 uint32_t mac_flag = READ_REG(heth->Instance->MACISR);
1873 uint32_t dma_flag = READ_REG(heth->Instance->DMACSR);
1874 uint32_t dma_itsource = READ_REG(heth->Instance->DMACIER);
1875 uint32_t exti_d1_flag = READ_REG(EXTI_D1->PR3);
1876 #if defined(DUAL_CORE)
1877 uint32_t exti_d2_flag = READ_REG(EXTI_D2->PR3);
1878 #endif
1879
1880
1881 if (((dma_flag & ETH_DMACSR_RI) != 0U) && ((dma_itsource & ETH_DMACIER_RIE) != 0U))
1882 {
1883
1884 __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_RI | ETH_DMACSR_NIS);
1885
1886 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1887
1888 heth->RxCpltCallback(heth);
1889 #else
1890
1891 HAL_ETH_RxCpltCallback(heth);
1892 #endif
1893 }
1894
1895
1896 if (((dma_flag & ETH_DMACSR_TI) != 0U) && ((dma_itsource & ETH_DMACIER_TIE) != 0U))
1897 {
1898
1899 __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_TI | ETH_DMACSR_NIS);
1900
1901 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1902
1903 heth->TxCpltCallback(heth);
1904 #else
1905
1906 HAL_ETH_TxCpltCallback(heth);
1907 #endif
1908 }
1909
1910
1911 if (((dma_flag & ETH_DMACSR_AIS) != 0U) && ((dma_itsource & ETH_DMACIER_AIE) != 0U))
1912 {
1913 heth->ErrorCode |= HAL_ETH_ERROR_DMA;
1914
1915 if ((dma_flag & ETH_DMACSR_FBE) != 0U)
1916 {
1917
1918 heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_FBE | ETH_DMACSR_TPS | ETH_DMACSR_RPS));
1919
1920
1921 __HAL_ETH_DMA_DISABLE_IT(heth, ETH_DMACIER_NIE | ETH_DMACIER_AIE);
1922
1923
1924 heth->gState = HAL_ETH_STATE_ERROR;
1925 }
1926 else
1927 {
1928
1929 heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
1930 ETH_DMACSR_RBU | ETH_DMACSR_AIS));
1931
1932
1933 __HAL_ETH_DMA_CLEAR_IT(heth, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
1934 ETH_DMACSR_RBU | ETH_DMACSR_AIS));
1935 }
1936 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1937
1938 heth->ErrorCallback(heth);
1939 #else
1940
1941 HAL_ETH_ErrorCallback(heth);
1942 #endif
1943 }
1944
1945
1946 if (((mac_flag & ETH_MACIER_RXSTSIE) == ETH_MACIER_RXSTSIE) || \
1947 ((mac_flag & ETH_MACIER_TXSTSIE) == ETH_MACIER_TXSTSIE))
1948 {
1949 heth->ErrorCode |= HAL_ETH_ERROR_MAC;
1950
1951
1952 heth->MACErrorCode = READ_REG(heth->Instance->MACRXTXSR);
1953
1954 heth->gState = HAL_ETH_STATE_ERROR;
1955
1956 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1957
1958 heth->ErrorCallback(heth);
1959 #else
1960
1961 HAL_ETH_ErrorCallback(heth);
1962 #endif
1963 heth->MACErrorCode = (uint32_t)(0x0U);
1964 }
1965
1966
1967 if ((mac_flag & ETH_MAC_PMT_IT) != 0U)
1968 {
1969
1970 heth->MACWakeUpEvent = READ_BIT(heth->Instance->MACPCSR, (ETH_MACPCSR_RWKPRCVD | ETH_MACPCSR_MGKPRCVD));
1971
1972 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1973
1974 heth->PMTCallback(heth);
1975 #else
1976
1977 HAL_ETH_PMTCallback(heth);
1978 #endif
1979
1980 heth->MACWakeUpEvent = (uint32_t)(0x0U);
1981 }
1982
1983
1984 if ((mac_flag & ETH_MAC_LPI_IT) != 0U)
1985 {
1986
1987 heth->MACLPIEvent = READ_BIT(heth->Instance->MACLCSR, 0x0000000FU);
1988
1989 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1990
1991 heth->EEECallback(heth);
1992 #else
1993
1994 HAL_ETH_EEECallback(heth);
1995 #endif
1996
1997 heth->MACLPIEvent = (uint32_t)(0x0U);
1998 }
1999
2000 #if defined(DUAL_CORE)
2001 if (HAL_GetCurrentCPUID() == CM7_CPUID)
2002 {
2003
2004 if ((exti_d1_flag & ETH_WAKEUP_EXTI_LINE) != 0U)
2005 {
2006
2007 __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG(ETH_WAKEUP_EXTI_LINE);
2008 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
2009
2010 heth->WakeUpCallback(heth);
2011 #else
2012
2013 HAL_ETH_WakeUpCallback(heth);
2014 #endif
2015 }
2016 }
2017 else
2018 {
2019
2020 if ((exti_d2_flag & ETH_WAKEUP_EXTI_LINE) != 0U)
2021 {
2022
2023 __HAL_ETH_WAKEUP_EXTID2_CLEAR_FLAG(ETH_WAKEUP_EXTI_LINE);
2024 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
2025
2026 heth->WakeUpCallback(heth);
2027 #else
2028
2029 HAL_ETH_WakeUpCallback(heth);
2030 #endif
2031 }
2032 }
2033 #else
2034
2035 if ((exti_d1_flag & ETH_WAKEUP_EXTI_LINE) != 0U)
2036 {
2037
2038 __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG(ETH_WAKEUP_EXTI_LINE);
2039 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
2040
2041 heth->WakeUpCallback(heth);
2042 #else
2043
2044 HAL_ETH_WakeUpCallback(heth);
2045 #endif
2046 }
2047 #endif
2048 }
2049
2050
2051
2052
2053
2054
2055
2056 __weak void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)
2057 {
2058
2059 UNUSED(heth);
2060
2061
2062
2063 }
2064
2065
2066
2067
2068
2069
2070
2071 __weak void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
2072 {
2073
2074 UNUSED(heth);
2075
2076
2077
2078 }
2079
2080
2081
2082
2083
2084
2085
2086 __weak void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
2087 {
2088
2089 UNUSED(heth);
2090
2091
2092
2093 }
2094
2095
2096
2097
2098
2099
2100
2101 __weak void HAL_ETH_PMTCallback(ETH_HandleTypeDef *heth)
2102 {
2103
2104 UNUSED(heth);
2105
2106
2107
2108 }
2109
2110
2111
2112
2113
2114
2115
2116 __weak void HAL_ETH_EEECallback(ETH_HandleTypeDef *heth)
2117 {
2118
2119 UNUSED(heth);
2120
2121
2122
2123 }
2124
2125
2126
2127
2128
2129
2130
2131 __weak void HAL_ETH_WakeUpCallback(ETH_HandleTypeDef *heth)
2132 {
2133
2134 UNUSED(heth);
2135
2136
2137
2138 }
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149 HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
2150 uint32_t *pRegValue)
2151 {
2152 uint32_t tickstart;
2153 uint32_t tmpreg;
2154
2155
2156 if (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) != (uint32_t)RESET)
2157 {
2158 return HAL_ERROR;
2159 }
2160
2161
2162 WRITE_REG(tmpreg, heth->Instance->MACMDIOAR);
2163
2164
2165
2166
2167
2168
2169
2170 MODIFY_REG(tmpreg, ETH_MACMDIOAR_PA, (PHYAddr << 21));
2171 MODIFY_REG(tmpreg, ETH_MACMDIOAR_RDA, (PHYReg << 16));
2172 MODIFY_REG(tmpreg, ETH_MACMDIOAR_MOC, ETH_MACMDIOAR_MOC_RD);
2173 SET_BIT(tmpreg, ETH_MACMDIOAR_MB);
2174
2175
2176 WRITE_REG(heth->Instance->MACMDIOAR, tmpreg);
2177
2178 tickstart = HAL_GetTick();
2179
2180
2181 while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
2182 {
2183 if (((HAL_GetTick() - tickstart) > ETH_MDIO_BUS_TIMEOUT))
2184 {
2185 return HAL_ERROR;
2186 }
2187 }
2188
2189
2190 WRITE_REG(*pRegValue, (uint16_t)heth->Instance->MACMDIODR);
2191
2192 return HAL_OK;
2193 }
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204 HAL_StatusTypeDef HAL_ETH_WritePHYRegister(const ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
2205 uint32_t RegValue)
2206 {
2207 uint32_t tickstart;
2208 uint32_t tmpreg;
2209
2210
2211 if (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) != (uint32_t)RESET)
2212 {
2213 return HAL_ERROR;
2214 }
2215
2216
2217 WRITE_REG(tmpreg, heth->Instance->MACMDIOAR);
2218
2219
2220
2221
2222
2223
2224
2225 MODIFY_REG(tmpreg, ETH_MACMDIOAR_PA, (PHYAddr << 21));
2226 MODIFY_REG(tmpreg, ETH_MACMDIOAR_RDA, (PHYReg << 16));
2227 MODIFY_REG(tmpreg, ETH_MACMDIOAR_MOC, ETH_MACMDIOAR_MOC_WR);
2228 SET_BIT(tmpreg, ETH_MACMDIOAR_MB);
2229
2230
2231 WRITE_REG(ETH->MACMDIODR, (uint16_t)RegValue);
2232
2233
2234 WRITE_REG(ETH->MACMDIOAR, tmpreg);
2235
2236 tickstart = HAL_GetTick();
2237
2238
2239 while (READ_BIT(heth->Instance->MACMDIOAR, ETH_MACMDIOAR_MB) > 0U)
2240 {
2241 if (((HAL_GetTick() - tickstart) > ETH_MDIO_BUS_TIMEOUT))
2242 {
2243 return HAL_ERROR;
2244 }
2245 }
2246
2247 return HAL_OK;
2248 }
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277 HAL_StatusTypeDef HAL_ETH_GetMACConfig(const ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
2278 {
2279 if (macconf == NULL)
2280 {
2281 return HAL_ERROR;
2282 }
2283
2284
2285 macconf->PreambleLength = READ_BIT(heth->Instance->MACCR, ETH_MACCR_PRELEN);
2286 macconf->DeferralCheck = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DC) >> 4) > 0U) ? ENABLE : DISABLE;
2287 macconf->BackOffLimit = READ_BIT(heth->Instance->MACCR, ETH_MACCR_BL);
2288 macconf->RetryTransmission = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DR) >> 8) == 0U) ? ENABLE : DISABLE;
2289 macconf->CarrierSenseDuringTransmit = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DCRS) >> 9) > 0U)
2290 ? ENABLE : DISABLE;
2291 macconf->ReceiveOwn = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DO) >> 10) == 0U) ? ENABLE : DISABLE;
2292 macconf->CarrierSenseBeforeTransmit = ((READ_BIT(heth->Instance->MACCR,
2293 ETH_MACCR_ECRSFD) >> 11) > 0U) ? ENABLE : DISABLE;
2294 macconf->LoopbackMode = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_LM) >> 12) > 0U) ? ENABLE : DISABLE;
2295 macconf->DuplexMode = READ_BIT(heth->Instance->MACCR, ETH_MACCR_DM);
2296 macconf->Speed = READ_BIT(heth->Instance->MACCR, ETH_MACCR_FES);
2297 macconf->JumboPacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JE) >> 16) > 0U) ? ENABLE : DISABLE;
2298 macconf->Jabber = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JD) >> 17) == 0U) ? ENABLE : DISABLE;
2299 macconf->Watchdog = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_WD) >> 19) == 0U) ? ENABLE : DISABLE;
2300 macconf->AutomaticPadCRCStrip = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_ACS) >> 20) > 0U) ? ENABLE : DISABLE;
2301 macconf->CRCStripTypePacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_CST) >> 21) > 0U) ? ENABLE : DISABLE;
2302 macconf->Support2KPacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_S2KP) >> 22) > 0U) ? ENABLE : DISABLE;
2303 macconf->GiantPacketSizeLimitControl = ((READ_BIT(heth->Instance->MACCR,
2304 ETH_MACCR_GPSLCE) >> 23) > 0U) ? ENABLE : DISABLE;
2305 macconf->InterPacketGapVal = READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPG);
2306 macconf->ChecksumOffload = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPC) >> 27) > 0U) ? ENABLE : DISABLE;
2307 macconf->SourceAddrControl = READ_BIT(heth->Instance->MACCR, ETH_MACCR_SARC);
2308
2309 macconf->GiantPacketSizeLimit = READ_BIT(heth->Instance->MACECR, ETH_MACECR_GPSL);
2310 macconf->CRCCheckingRxPackets = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_DCRCC) >> 16) == 0U) ? ENABLE : DISABLE;
2311 macconf->SlowProtocolDetect = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_SPEN) >> 17) > 0U) ? ENABLE : DISABLE;
2312 macconf->UnicastSlowProtocolPacketDetect = ((READ_BIT(heth->Instance->MACECR,
2313 ETH_MACECR_USP) >> 18) > 0U) ? ENABLE : DISABLE;
2314 macconf->ExtendedInterPacketGap = ((READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPGEN) >> 24) > 0U)
2315 ? ENABLE : DISABLE;
2316 macconf->ExtendedInterPacketGapVal = READ_BIT(heth->Instance->MACECR, ETH_MACECR_EIPG) >> 25;
2317
2318 macconf->ProgrammableWatchdog = ((READ_BIT(heth->Instance->MACWTR, ETH_MACWTR_PWE) >> 8) > 0U) ? ENABLE : DISABLE;
2319 macconf->WatchdogTimeout = READ_BIT(heth->Instance->MACWTR, ETH_MACWTR_WTO);
2320
2321 macconf->TransmitFlowControl = ((READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_TFE) >> 1) > 0U) ? ENABLE : DISABLE;
2322 macconf->ZeroQuantaPause = ((READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_DZPQ) >> 7) == 0U) ? ENABLE : DISABLE;
2323 macconf->PauseLowThreshold = READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_PLT);
2324 macconf->PauseTime = (READ_BIT(heth->Instance->MACTFCR, ETH_MACTFCR_PT) >> 16);
2325 macconf->ReceiveFlowControl = (READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_RFE) > 0U) ? ENABLE : DISABLE;
2326 macconf->UnicastPausePacketDetect = ((READ_BIT(heth->Instance->MACRFCR, ETH_MACRFCR_UP) >> 1) > 0U)
2327 ? ENABLE : DISABLE;
2328
2329 macconf->TransmitQueueMode = READ_BIT(heth->Instance->MTLTQOMR, (ETH_MTLTQOMR_TTC | ETH_MTLTQOMR_TSF));
2330
2331 macconf->ReceiveQueueMode = READ_BIT(heth->Instance->MTLRQOMR, (ETH_MTLRQOMR_RTC | ETH_MTLRQOMR_RSF));
2332 macconf->ForwardRxUndersizedGoodPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
2333 ETH_MTLRQOMR_FUP) >> 3) > 0U) ? ENABLE : DISABLE;
2334 macconf->ForwardRxErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR, ETH_MTLRQOMR_FEP) >> 4) > 0U) ? ENABLE : DISABLE;
2335 macconf->DropTCPIPChecksumErrorPacket = ((READ_BIT(heth->Instance->MTLRQOMR,
2336 ETH_MTLRQOMR_DISTCPEF) >> 6) == 0U) ? ENABLE : DISABLE;
2337
2338 return HAL_OK;
2339 }
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349 HAL_StatusTypeDef HAL_ETH_GetDMAConfig(const ETH_HandleTypeDef *heth, ETH_DMAConfigTypeDef *dmaconf)
2350 {
2351 if (dmaconf == NULL)
2352 {
2353 return HAL_ERROR;
2354 }
2355
2356 dmaconf->AddressAlignedBeats = ((READ_BIT(heth->Instance->DMASBMR, ETH_DMASBMR_AAL) >> 12) > 0U) ? ENABLE : DISABLE;
2357 dmaconf->BurstMode = READ_BIT(heth->Instance->DMASBMR, ETH_DMASBMR_FB | ETH_DMASBMR_MB);
2358 dmaconf->RebuildINCRxBurst = ((READ_BIT(heth->Instance->DMASBMR, ETH_DMASBMR_RB) >> 15) > 0U) ? ENABLE : DISABLE;
2359
2360 dmaconf->DMAArbitration = READ_BIT(heth->Instance->DMAMR, (ETH_DMAMR_TXPR | ETH_DMAMR_PR | ETH_DMAMR_DA));
2361
2362 dmaconf->PBLx8Mode = ((READ_BIT(heth->Instance->DMACCR, ETH_DMACCR_8PBL) >> 16) > 0U) ? ENABLE : DISABLE;
2363 dmaconf->MaximumSegmentSize = READ_BIT(heth->Instance->DMACCR, ETH_DMACCR_MSS);
2364
2365 dmaconf->FlushRxPacket = ((READ_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_RPF) >> 31) > 0U) ? ENABLE : DISABLE;
2366 dmaconf->RxDMABurstLength = READ_BIT(heth->Instance->DMACRCR, ETH_DMACRCR_RPBL);
2367
2368 dmaconf->SecondPacketOperate = ((READ_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_OSP) >> 4) > 0U) ? ENABLE : DISABLE;
2369 dmaconf->TCPSegmentation = ((READ_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_TSE) >> 12) > 0U) ? ENABLE : DISABLE;
2370 dmaconf->TxDMABurstLength = READ_BIT(heth->Instance->DMACTCR, ETH_DMACTCR_TPBL);
2371
2372 return HAL_OK;
2373 }
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383 HAL_StatusTypeDef HAL_ETH_SetMACConfig(ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
2384 {
2385 if (macconf == NULL)
2386 {
2387 return HAL_ERROR;
2388 }
2389
2390 if (heth->gState == HAL_ETH_STATE_READY)
2391 {
2392 ETH_SetMACConfig(heth, macconf);
2393
2394 return HAL_OK;
2395 }
2396 else
2397 {
2398 return HAL_ERROR;
2399 }
2400 }
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410 HAL_StatusTypeDef HAL_ETH_SetDMAConfig(ETH_HandleTypeDef *heth, ETH_DMAConfigTypeDef *dmaconf)
2411 {
2412 if (dmaconf == NULL)
2413 {
2414 return HAL_ERROR;
2415 }
2416
2417 if (heth->gState == HAL_ETH_STATE_READY)
2418 {
2419 ETH_SetDMAConfig(heth, dmaconf);
2420
2421 return HAL_OK;
2422 }
2423 else
2424 {
2425 return HAL_ERROR;
2426 }
2427 }
2428
2429
2430
2431
2432
2433
2434
2435 void HAL_ETH_SetMDIOClockRange(ETH_HandleTypeDef *heth)
2436 {
2437 uint32_t hclk;
2438 uint32_t tmpreg;
2439
2440
2441 tmpreg = (heth->Instance)->MACMDIOAR;
2442
2443
2444 tmpreg &= ~ETH_MACMDIOAR_CR;
2445
2446
2447 hclk = HAL_RCC_GetHCLKFreq();
2448
2449
2450 if (hclk < 35000000U)
2451 {
2452
2453 tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV16;
2454 }
2455 else if (hclk < 60000000U)
2456 {
2457
2458 tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV26;
2459 }
2460 else if (hclk < 100000000U)
2461 {
2462
2463 tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV42;
2464 }
2465 else if (hclk < 150000000U)
2466 {
2467
2468 tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV62;
2469 }
2470 else if (hclk < 250000000U)
2471 {
2472
2473 tmpreg |= (uint32_t)ETH_MACMDIOAR_CR_DIV102;
2474 }
2475 else
2476 {
2477
2478 tmpreg |= (uint32_t)(ETH_MACMDIOAR_CR_DIV124);
2479 }
2480
2481
2482 (heth->Instance)->MACMDIOAR = (uint32_t)tmpreg;
2483 }
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493 HAL_StatusTypeDef HAL_ETH_SetMACFilterConfig(ETH_HandleTypeDef *heth, const ETH_MACFilterConfigTypeDef *pFilterConfig)
2494 {
2495 uint32_t filterconfig;
2496
2497 if (pFilterConfig == NULL)
2498 {
2499 return HAL_ERROR;
2500 }
2501
2502 filterconfig = ((uint32_t)pFilterConfig->PromiscuousMode |
2503 ((uint32_t)pFilterConfig->HashUnicast << 1) |
2504 ((uint32_t)pFilterConfig->HashMulticast << 2) |
2505 ((uint32_t)pFilterConfig->DestAddrInverseFiltering << 3) |
2506 ((uint32_t)pFilterConfig->PassAllMulticast << 4) |
2507 ((uint32_t)((pFilterConfig->BroadcastFilter == DISABLE) ? 1U : 0U) << 5) |
2508 ((uint32_t)pFilterConfig->SrcAddrInverseFiltering << 8) |
2509 ((uint32_t)pFilterConfig->SrcAddrFiltering << 9) |
2510 ((uint32_t)pFilterConfig->HachOrPerfectFilter << 10) |
2511 ((uint32_t)pFilterConfig->ReceiveAllMode << 31) |
2512 pFilterConfig->ControlPacketsFilter);
2513
2514 MODIFY_REG(heth->Instance->MACPFR, ETH_MACPFR_MASK, filterconfig);
2515
2516 return HAL_OK;
2517 }
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527 HAL_StatusTypeDef HAL_ETH_GetMACFilterConfig(const ETH_HandleTypeDef *heth, ETH_MACFilterConfigTypeDef *pFilterConfig)
2528 {
2529 if (pFilterConfig == NULL)
2530 {
2531 return HAL_ERROR;
2532 }
2533
2534 pFilterConfig->PromiscuousMode = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_PR)) > 0U) ? ENABLE : DISABLE;
2535 pFilterConfig->HashUnicast = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_HUC) >> 1) > 0U) ? ENABLE : DISABLE;
2536 pFilterConfig->HashMulticast = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_HMC) >> 2) > 0U) ? ENABLE : DISABLE;
2537 pFilterConfig->DestAddrInverseFiltering = ((READ_BIT(heth->Instance->MACPFR,
2538 ETH_MACPFR_DAIF) >> 3) > 0U) ? ENABLE : DISABLE;
2539 pFilterConfig->PassAllMulticast = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_PM) >> 4) > 0U) ? ENABLE : DISABLE;
2540 pFilterConfig->BroadcastFilter = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_DBF) >> 5) == 0U) ? ENABLE : DISABLE;
2541 pFilterConfig->ControlPacketsFilter = READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_PCF);
2542 pFilterConfig->SrcAddrInverseFiltering = ((READ_BIT(heth->Instance->MACPFR,
2543 ETH_MACPFR_SAIF) >> 8) > 0U) ? ENABLE : DISABLE;
2544 pFilterConfig->SrcAddrFiltering = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_SAF) >> 9) > 0U) ? ENABLE : DISABLE;
2545 pFilterConfig->HachOrPerfectFilter = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_HPF) >> 10) > 0U)
2546 ? ENABLE : DISABLE;
2547 pFilterConfig->ReceiveAllMode = ((READ_BIT(heth->Instance->MACPFR, ETH_MACPFR_RA) >> 31) > 0U) ? ENABLE : DISABLE;
2548
2549 return HAL_OK;
2550 }
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564 HAL_StatusTypeDef HAL_ETH_SetSourceMACAddrMatch(const ETH_HandleTypeDef *heth, uint32_t AddrNbr,
2565 const uint8_t *pMACAddr)
2566 {
2567 uint32_t macaddrlr;
2568 uint32_t macaddrhr;
2569
2570 if (pMACAddr == NULL)
2571 {
2572 return HAL_ERROR;
2573 }
2574
2575
2576 macaddrhr = ((uint32_t) &(heth->Instance->MACA0HR) + AddrNbr);
2577
2578 macaddrlr = ((uint32_t) &(heth->Instance->MACA0LR) + AddrNbr);
2579
2580
2581 (*(__IO uint32_t *)macaddrhr) = (((uint32_t)(pMACAddr[5]) << 8) | (uint32_t)pMACAddr[4]);
2582
2583 (*(__IO uint32_t *)macaddrlr) = (((uint32_t)(pMACAddr[3]) << 24) | ((uint32_t)(pMACAddr[2]) << 16) |
2584 ((uint32_t)(pMACAddr[1]) << 8) | (uint32_t)pMACAddr[0]);
2585
2586
2587 (*(__IO uint32_t *)macaddrhr) |= (ETH_MACAHR_SA | ETH_MACAHR_AE);
2588
2589 return HAL_OK;
2590 }
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600 HAL_StatusTypeDef HAL_ETH_SetHashTable(ETH_HandleTypeDef *heth, uint32_t *pHashTable)
2601 {
2602 if (pHashTable == NULL)
2603 {
2604 return HAL_ERROR;
2605 }
2606
2607 heth->Instance->MACHT0R = pHashTable[0];
2608 heth->Instance->MACHT1R = pHashTable[1];
2609
2610 return HAL_OK;
2611 }
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622 void HAL_ETH_SetRxVLANIdentifier(ETH_HandleTypeDef *heth, uint32_t ComparisonBits, uint32_t VLANIdentifier)
2623 {
2624 if (ComparisonBits == ETH_VLANTAGCOMPARISON_16BIT)
2625 {
2626 MODIFY_REG(heth->Instance->MACVTR, ETH_MACVTR_VL, VLANIdentifier);
2627 CLEAR_BIT(heth->Instance->MACVTR, ETH_MACVTR_ETV);
2628 }
2629 else
2630 {
2631 MODIFY_REG(heth->Instance->MACVTR, ETH_MACVTR_VL_VID, VLANIdentifier);
2632 SET_BIT(heth->Instance->MACVTR, ETH_MACVTR_ETV);
2633 }
2634 }
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644 void HAL_ETH_EnterPowerDownMode(ETH_HandleTypeDef *heth, const ETH_PowerDownConfigTypeDef *pPowerDownConfig)
2645 {
2646 uint32_t powerdownconfig;
2647
2648 powerdownconfig = (((uint32_t)pPowerDownConfig->MagicPacket << 1) |
2649 ((uint32_t)pPowerDownConfig->WakeUpPacket << 2) |
2650 ((uint32_t)pPowerDownConfig->GlobalUnicast << 9) |
2651 ((uint32_t)pPowerDownConfig->WakeUpForward << 10) |
2652 ETH_MACPCSR_PWRDWN);
2653
2654
2655 __HAL_ETH_MAC_ENABLE_IT(heth, ETH_MACIER_PMTIE);
2656
2657 MODIFY_REG(heth->Instance->MACPCSR, ETH_MACPCSR_MASK, powerdownconfig);
2658 }
2659
2660
2661
2662
2663
2664
2665
2666 void HAL_ETH_ExitPowerDownMode(ETH_HandleTypeDef *heth)
2667 {
2668
2669 CLEAR_BIT(heth->Instance->MACPCSR, ETH_MACPCSR_RWKPKTEN | ETH_MACPCSR_MGKPKTEN | ETH_MACPCSR_GLBLUCAST |
2670 ETH_MACPCSR_RWKPFE);
2671
2672 if (READ_BIT(heth->Instance->MACPCSR, ETH_MACPCSR_PWRDWN) != (uint32_t)RESET)
2673 {
2674
2675 CLEAR_BIT(heth->Instance->MACPCSR, ETH_MACPCSR_PWRDWN);
2676 }
2677
2678
2679 __HAL_ETH_MAC_DISABLE_IT(heth, ETH_MACIER_PMTIE);
2680 }
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690 HAL_StatusTypeDef HAL_ETH_SetWakeUpFilter(ETH_HandleTypeDef *heth, uint32_t *pFilter, uint32_t Count)
2691 {
2692 uint32_t regindex;
2693
2694 if (pFilter == NULL)
2695 {
2696 return HAL_ERROR;
2697 }
2698
2699
2700 SET_BIT(heth->Instance->MACPCSR, ETH_MACPCSR_RWKFILTRST);
2701
2702
2703 for (regindex = 0; regindex < Count; regindex++)
2704 {
2705
2706 WRITE_REG(heth->Instance->MACRWKPFR, pFilter[regindex]);
2707 }
2708
2709 return HAL_OK;
2710 }
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740 HAL_ETH_StateTypeDef HAL_ETH_GetState(const ETH_HandleTypeDef *heth)
2741 {
2742 return heth->gState;
2743 }
2744
2745
2746
2747
2748
2749
2750
2751 uint32_t HAL_ETH_GetError(const ETH_HandleTypeDef *heth)
2752 {
2753 return heth->ErrorCode;
2754 }
2755
2756
2757
2758
2759
2760
2761
2762 uint32_t HAL_ETH_GetDMAError(const ETH_HandleTypeDef *heth)
2763 {
2764 return heth->DMAErrorCode;
2765 }
2766
2767
2768
2769
2770
2771
2772
2773 uint32_t HAL_ETH_GetMACError(const ETH_HandleTypeDef *heth)
2774 {
2775 return heth->MACErrorCode;
2776 }
2777
2778
2779
2780
2781
2782
2783
2784 uint32_t HAL_ETH_GetMACWakeUpSource(const ETH_HandleTypeDef *heth)
2785 {
2786 return heth->MACWakeUpEvent;
2787 }
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801 static void ETH_SetMACConfig(ETH_HandleTypeDef *heth, const ETH_MACConfigTypeDef *macconf)
2802 {
2803 uint32_t macregval;
2804
2805
2806 macregval = (macconf->InterPacketGapVal |
2807 macconf->SourceAddrControl |
2808 ((uint32_t)macconf->ChecksumOffload << 27) |
2809 ((uint32_t)macconf->GiantPacketSizeLimitControl << 23) |
2810 ((uint32_t)macconf->Support2KPacket << 22) |
2811 ((uint32_t)macconf->CRCStripTypePacket << 21) |
2812 ((uint32_t)macconf->AutomaticPadCRCStrip << 20) |
2813 ((uint32_t)((macconf->Watchdog == DISABLE) ? 1U : 0U) << 19) |
2814 ((uint32_t)((macconf->Jabber == DISABLE) ? 1U : 0U) << 17) |
2815 ((uint32_t)macconf->JumboPacket << 16) |
2816 macconf->Speed |
2817 macconf->DuplexMode |
2818 ((uint32_t)macconf->LoopbackMode << 12) |
2819 ((uint32_t)macconf->CarrierSenseBeforeTransmit << 11) |
2820 ((uint32_t)((macconf->ReceiveOwn == DISABLE) ? 1U : 0U) << 10) |
2821 ((uint32_t)macconf->CarrierSenseDuringTransmit << 9) |
2822 ((uint32_t)((macconf->RetryTransmission == DISABLE) ? 1U : 0U) << 8) |
2823 macconf->BackOffLimit |
2824 ((uint32_t)macconf->DeferralCheck << 4) |
2825 macconf->PreambleLength);
2826
2827
2828 MODIFY_REG(heth->Instance->MACCR, ETH_MACCR_MASK, macregval);
2829
2830
2831 macregval = ((macconf->ExtendedInterPacketGapVal << 25) |
2832 ((uint32_t)macconf->ExtendedInterPacketGap << 24) |
2833 ((uint32_t)macconf->UnicastSlowProtocolPacketDetect << 18) |
2834 ((uint32_t)macconf->SlowProtocolDetect << 17) |
2835 ((uint32_t)((macconf->CRCCheckingRxPackets == DISABLE) ? 1U : 0U) << 16) |
2836 macconf->GiantPacketSizeLimit);
2837
2838
2839 MODIFY_REG(heth->Instance->MACECR, ETH_MACECR_MASK, macregval);
2840
2841
2842 macregval = (((uint32_t)macconf->ProgrammableWatchdog << 8) |
2843 macconf->WatchdogTimeout);
2844
2845
2846 MODIFY_REG(heth->Instance->MACWTR, ETH_MACWTR_MASK, macregval);
2847
2848
2849 macregval = (((uint32_t)macconf->TransmitFlowControl << 1) |
2850 macconf->PauseLowThreshold |
2851 ((uint32_t)((macconf->ZeroQuantaPause == DISABLE) ? 1U : 0U) << 7) |
2852 (macconf->PauseTime << 16));
2853
2854
2855 MODIFY_REG(heth->Instance->MACTFCR, ETH_MACTFCR_MASK, macregval);
2856
2857
2858 macregval = ((uint32_t)macconf->ReceiveFlowControl |
2859 ((uint32_t)macconf->UnicastPausePacketDetect << 1));
2860
2861
2862 MODIFY_REG(heth->Instance->MACRFCR, ETH_MACRFCR_MASK, macregval);
2863
2864
2865
2866 MODIFY_REG(heth->Instance->MTLTQOMR, ETH_MTLTQOMR_MASK, macconf->TransmitQueueMode);
2867
2868
2869 macregval = (macconf->ReceiveQueueMode |
2870 ((uint32_t)((macconf->DropTCPIPChecksumErrorPacket == DISABLE) ? 1U : 0U) << 6) |
2871 ((uint32_t)macconf->ForwardRxErrorPacket << 4) |
2872 ((uint32_t)macconf->ForwardRxUndersizedGoodPacket << 3));
2873
2874
2875 MODIFY_REG(heth->Instance->MTLRQOMR, ETH_MTLRQOMR_MASK, macregval);
2876 }
2877
2878 static void ETH_SetDMAConfig(ETH_HandleTypeDef *heth, const ETH_DMAConfigTypeDef *dmaconf)
2879 {
2880 uint32_t dmaregval;
2881
2882
2883 MODIFY_REG(heth->Instance->DMAMR, ETH_DMAMR_MASK, dmaconf->DMAArbitration);
2884
2885
2886 dmaregval = (((uint32_t)dmaconf->AddressAlignedBeats << 12) |
2887 dmaconf->BurstMode |
2888 ((uint32_t)dmaconf->RebuildINCRxBurst << 15));
2889
2890 MODIFY_REG(heth->Instance->DMASBMR, ETH_DMASBMR_MASK, dmaregval);
2891
2892
2893 dmaregval = (((uint32_t)dmaconf->PBLx8Mode << 16) |
2894 dmaconf->MaximumSegmentSize);
2895 MODIFY_REG(heth->Instance->DMACCR, ETH_DMACCR_MASK, dmaregval);
2896
2897
2898 dmaregval = (dmaconf->TxDMABurstLength |
2899 ((uint32_t)dmaconf->SecondPacketOperate << 4) |
2900 ((uint32_t)dmaconf->TCPSegmentation << 12));
2901
2902 MODIFY_REG(heth->Instance->DMACTCR, ETH_DMACTCR_MASK, dmaregval);
2903
2904
2905 dmaregval = (((uint32_t)dmaconf->FlushRxPacket << 31) |
2906 dmaconf->RxDMABurstLength);
2907
2908
2909 MODIFY_REG(heth->Instance->DMACRCR, ETH_DMACRCR_MASK, dmaregval);
2910 }
2911
2912
2913
2914
2915
2916
2917
2918
2919 static void ETH_MACDMAConfig(ETH_HandleTypeDef *heth)
2920 {
2921 ETH_MACConfigTypeDef macDefaultConf;
2922 ETH_DMAConfigTypeDef dmaDefaultConf;
2923
2924
2925 macDefaultConf.AutomaticPadCRCStrip = ENABLE;
2926 macDefaultConf.BackOffLimit = ETH_BACKOFFLIMIT_10;
2927 macDefaultConf.CarrierSenseBeforeTransmit = DISABLE;
2928 macDefaultConf.CarrierSenseDuringTransmit = DISABLE;
2929 macDefaultConf.ChecksumOffload = ENABLE;
2930 macDefaultConf.CRCCheckingRxPackets = ENABLE;
2931 macDefaultConf.CRCStripTypePacket = ENABLE;
2932 macDefaultConf.DeferralCheck = DISABLE;
2933 macDefaultConf.DropTCPIPChecksumErrorPacket = ENABLE;
2934 macDefaultConf.DuplexMode = ETH_FULLDUPLEX_MODE;
2935 macDefaultConf.ExtendedInterPacketGap = DISABLE;
2936 macDefaultConf.ExtendedInterPacketGapVal = 0x0U;
2937 macDefaultConf.ForwardRxErrorPacket = DISABLE;
2938 macDefaultConf.ForwardRxUndersizedGoodPacket = DISABLE;
2939 macDefaultConf.GiantPacketSizeLimit = 0x618U;
2940 macDefaultConf.GiantPacketSizeLimitControl = DISABLE;
2941 macDefaultConf.InterPacketGapVal = ETH_INTERPACKETGAP_96BIT;
2942 macDefaultConf.Jabber = ENABLE;
2943 macDefaultConf.JumboPacket = DISABLE;
2944 macDefaultConf.LoopbackMode = DISABLE;
2945 macDefaultConf.PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS_4;
2946 macDefaultConf.PauseTime = 0x0U;
2947 macDefaultConf.PreambleLength = ETH_PREAMBLELENGTH_7;
2948 macDefaultConf.ProgrammableWatchdog = DISABLE;
2949 macDefaultConf.ReceiveFlowControl = DISABLE;
2950 macDefaultConf.ReceiveOwn = ENABLE;
2951 macDefaultConf.ReceiveQueueMode = ETH_RECEIVESTOREFORWARD;
2952 macDefaultConf.RetryTransmission = ENABLE;
2953 macDefaultConf.SlowProtocolDetect = DISABLE;
2954 macDefaultConf.SourceAddrControl = ETH_SOURCEADDRESS_REPLACE_ADDR0;
2955 macDefaultConf.Speed = ETH_SPEED_100M;
2956 macDefaultConf.Support2KPacket = DISABLE;
2957 macDefaultConf.TransmitQueueMode = ETH_TRANSMITSTOREFORWARD;
2958 macDefaultConf.TransmitFlowControl = DISABLE;
2959 macDefaultConf.UnicastPausePacketDetect = DISABLE;
2960 macDefaultConf.UnicastSlowProtocolPacketDetect = DISABLE;
2961 macDefaultConf.Watchdog = ENABLE;
2962 macDefaultConf.WatchdogTimeout = ETH_MACWTR_WTO_2KB;
2963 macDefaultConf.ZeroQuantaPause = ENABLE;
2964
2965
2966 ETH_SetMACConfig(heth, &macDefaultConf);
2967
2968
2969 dmaDefaultConf.AddressAlignedBeats = ENABLE;
2970 dmaDefaultConf.BurstMode = ETH_BURSTLENGTH_FIXED;
2971 dmaDefaultConf.DMAArbitration = ETH_DMAARBITRATION_RX1_TX1;
2972 dmaDefaultConf.FlushRxPacket = DISABLE;
2973 dmaDefaultConf.PBLx8Mode = DISABLE;
2974 dmaDefaultConf.RebuildINCRxBurst = DISABLE;
2975 dmaDefaultConf.RxDMABurstLength = ETH_RXDMABURSTLENGTH_32BEAT;
2976 dmaDefaultConf.SecondPacketOperate = DISABLE;
2977 dmaDefaultConf.TxDMABurstLength = ETH_TXDMABURSTLENGTH_32BEAT;
2978 dmaDefaultConf.TCPSegmentation = DISABLE;
2979 dmaDefaultConf.MaximumSegmentSize = ETH_SEGMENT_SIZE_DEFAULT;
2980
2981
2982 ETH_SetDMAConfig(heth, &dmaDefaultConf);
2983 }
2984
2985
2986
2987
2988
2989
2990
2991
2992 static void ETH_DMATxDescListInit(ETH_HandleTypeDef *heth)
2993 {
2994 #ifndef __rtems__
2995 ETH_DMADescTypeDef *dmatxdesc;
2996 uint32_t i;
2997
2998
2999 for (i = 0; i < (uint32_t)ETH_TX_DESC_CNT; i++)
3000 {
3001 dmatxdesc = heth->Init.TxDesc + i;
3002
3003 WRITE_REG(dmatxdesc->DESC0, 0x0U);
3004 WRITE_REG(dmatxdesc->DESC1, 0x0U);
3005 WRITE_REG(dmatxdesc->DESC2, 0x0U);
3006 WRITE_REG(dmatxdesc->DESC3, 0x0U);
3007
3008 WRITE_REG(heth->TxDescList.TxDesc[i], (uint32_t)dmatxdesc);
3009
3010 }
3011
3012 heth->TxDescList.CurTxDesc = 0;
3013
3014
3015 WRITE_REG(heth->Instance->DMACTDRLR, (ETH_TX_DESC_CNT - 1U));
3016
3017
3018 WRITE_REG(heth->Instance->DMACTDLAR, (uint32_t) heth->Init.TxDesc);
3019
3020
3021 WRITE_REG(heth->Instance->DMACTDTPR, (uint32_t) heth->Init.TxDesc);
3022 #endif
3023 }
3024
3025
3026
3027
3028
3029
3030
3031
3032 static void ETH_DMARxDescListInit(ETH_HandleTypeDef *heth)
3033 {
3034 #ifndef __rtems__
3035 ETH_DMADescTypeDef *dmarxdesc;
3036 uint32_t i;
3037
3038 for (i = 0; i < (uint32_t)ETH_RX_DESC_CNT; i++)
3039 {
3040 dmarxdesc = heth->Init.RxDesc + i;
3041
3042 WRITE_REG(dmarxdesc->DESC0, 0x0U);
3043 WRITE_REG(dmarxdesc->DESC1, 0x0U);
3044 WRITE_REG(dmarxdesc->DESC2, 0x0U);
3045 WRITE_REG(dmarxdesc->DESC3, 0x0U);
3046 WRITE_REG(dmarxdesc->BackupAddr0, 0x0U);
3047 WRITE_REG(dmarxdesc->BackupAddr1, 0x0U);
3048
3049
3050 WRITE_REG(heth->RxDescList.RxDesc[i], (uint32_t)dmarxdesc);
3051
3052 }
3053
3054 WRITE_REG(heth->RxDescList.RxDescIdx, 0U);
3055 WRITE_REG(heth->RxDescList.RxDescCnt, 0U);
3056 WRITE_REG(heth->RxDescList.RxBuildDescIdx, 0U);
3057 WRITE_REG(heth->RxDescList.RxBuildDescCnt, 0U);
3058 WRITE_REG(heth->RxDescList.ItMode, 0U);
3059
3060
3061 WRITE_REG(heth->Instance->DMACRDRLR, ((uint32_t)(ETH_RX_DESC_CNT - 1U)));
3062
3063
3064 WRITE_REG(heth->Instance->DMACRDLAR, (uint32_t) heth->Init.RxDesc);
3065
3066
3067 WRITE_REG(heth->Instance->DMACRDTPR, ((uint32_t)(heth->Init.RxDesc + (uint32_t)(ETH_RX_DESC_CNT - 1U))));
3068 #endif
3069 }
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080 static uint32_t ETH_Prepare_Tx_Descriptors(ETH_HandleTypeDef *heth, const ETH_TxPacketConfigTypeDef *pTxConfig,
3081 uint32_t ItMode)
3082 {
3083 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
3084 uint32_t descidx = dmatxdesclist->CurTxDesc;
3085 uint32_t firstdescidx = dmatxdesclist->CurTxDesc;
3086 uint32_t idx;
3087 uint32_t descnbr = 0;
3088 ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3089
3090 ETH_BufferTypeDef *txbuffer = pTxConfig->TxBuffer;
3091 uint32_t bd_count = 0;
3092 uint32_t primask_bit;
3093
3094
3095 if ((READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCWBF_OWN) == ETH_DMATXNDESCWBF_OWN)
3096 || (dmatxdesclist->PacketAddress[descidx] != NULL))
3097 {
3098 return HAL_ETH_ERROR_BUSY;
3099 }
3100
3101
3102
3103
3104
3105 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
3106 {
3107
3108 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXCDESC_VT, pTxConfig->VlanTag);
3109
3110 SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_VLTV);
3111
3112 SET_BIT(heth->Instance->MACVIR, ETH_MACVIR_VLTI);
3113
3114
3115 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_INNERVLANTAG) != (uint32_t)RESET)
3116 {
3117
3118 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXCDESC_IVT, (pTxConfig->InnerVlanTag << 16));
3119
3120 SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_IVLTV);
3121
3122
3123 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXCDESC_IVTIR, pTxConfig->InnerVlanCtrl);
3124
3125
3126 SET_BIT(heth->Instance->MACIVIR, ETH_MACIVIR_VLTI);
3127
3128 SET_BIT(heth->Instance->MACVTR, ETH_MACVTR_EDVLP);
3129 }
3130 }
3131
3132
3133 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
3134 {
3135
3136 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXCDESC_MSS, pTxConfig->MaxSegmentSize);
3137
3138 SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_TCMSSV);
3139 }
3140
3141 if ((READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
3142 || (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET))
3143 {
3144
3145 SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_CTXT);
3146
3147 __DMB();
3148
3149 SET_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_OWN);
3150
3151 INCR_TX_DESC_INDEX(descidx, 1U);
3152
3153 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3154
3155 descnbr += 1U;
3156
3157
3158 if (READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCWBF_OWN) == ETH_DMATXNDESCWBF_OWN)
3159 {
3160 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[firstdescidx];
3161
3162 __DMB();
3163
3164 CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXCDESC_OWN);
3165
3166 return HAL_ETH_ERROR_BUSY;
3167 }
3168 }
3169
3170
3171
3172
3173
3174 descnbr += 1U;
3175
3176
3177 WRITE_REG(dmatxdesc->DESC0, (uint32_t)txbuffer->buffer);
3178
3179 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B1L, txbuffer->len);
3180
3181 if (txbuffer->next != NULL)
3182 {
3183 txbuffer = txbuffer->next;
3184
3185 WRITE_REG(dmatxdesc->DESC1, (uint32_t)txbuffer->buffer);
3186
3187 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, (txbuffer->len << 16));
3188 }
3189 else
3190 {
3191 WRITE_REG(dmatxdesc->DESC1, 0x0U);
3192
3193 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, 0x0U);
3194 }
3195
3196 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
3197 {
3198
3199 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_THL, (pTxConfig->TCPHeaderLen << 19));
3200
3201 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TPL, pTxConfig->PayloadLen);
3202
3203 SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TSE);
3204 }
3205 else
3206 {
3207 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FL, pTxConfig->Length);
3208
3209 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != (uint32_t)RESET)
3210 {
3211 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CIC, pTxConfig->ChecksumCtrl);
3212 }
3213
3214 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CRCPAD) != (uint32_t)RESET)
3215 {
3216 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CPC, pTxConfig->CRCPadCtrl);
3217 }
3218 }
3219
3220 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != (uint32_t)RESET)
3221 {
3222
3223 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_VTIR, pTxConfig->VlanCtrl);
3224 }
3225
3226
3227 SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FD);
3228
3229 CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CTXT);
3230
3231 __DMB();
3232
3233 SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
3234
3235
3236 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_SAIC) != (uint32_t)RESET)
3237 {
3238 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_SAIC, pTxConfig->SrcAddrCtrl);
3239 }
3240
3241
3242 while (txbuffer->next != NULL)
3243 {
3244
3245 CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_LD);
3246
3247 INCR_TX_DESC_INDEX(descidx, 1U);
3248
3249 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3250
3251
3252 CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FD);
3253
3254
3255 if ((READ_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN) == ETH_DMATXNDESCRF_OWN)
3256 || (dmatxdesclist->PacketAddress[descidx] != NULL))
3257 {
3258 descidx = firstdescidx;
3259 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3260
3261
3262 for (idx = 0; idx < descnbr; idx ++)
3263 {
3264
3265 __DMB();
3266
3267 CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
3268
3269
3270 INCR_TX_DESC_INDEX(descidx, 1U);
3271
3272 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3273 }
3274
3275 return HAL_ETH_ERROR_BUSY;
3276 }
3277
3278 descnbr += 1U;
3279
3280
3281 txbuffer = txbuffer->next;
3282
3283
3284 WRITE_REG(dmatxdesc->DESC0, (uint32_t)txbuffer->buffer);
3285
3286 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B1L, txbuffer->len);
3287
3288 if (txbuffer->next != NULL)
3289 {
3290
3291 txbuffer = txbuffer->next;
3292
3293 WRITE_REG(dmatxdesc->DESC1, (uint32_t)txbuffer->buffer);
3294
3295 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, (txbuffer->len << 16));
3296 }
3297 else
3298 {
3299 WRITE_REG(dmatxdesc->DESC1, 0x0U);
3300
3301 MODIFY_REG(dmatxdesc->DESC2, ETH_DMATXNDESCRF_B2L, 0x0U);
3302 }
3303
3304 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_TSO) != (uint32_t)RESET)
3305 {
3306
3307 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TPL, pTxConfig->PayloadLen);
3308
3309 SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_TSE);
3310 }
3311 else
3312 {
3313
3314 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_FL, pTxConfig->Length);
3315
3316 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != (uint32_t)RESET)
3317 {
3318
3319 MODIFY_REG(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CIC, pTxConfig->ChecksumCtrl);
3320 }
3321 }
3322
3323 bd_count += 1U;
3324
3325
3326 __DMB();
3327
3328 SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_OWN);
3329
3330 CLEAR_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_CTXT);
3331 }
3332
3333 if (ItMode != ((uint32_t)RESET))
3334 {
3335
3336 SET_BIT(dmatxdesc->DESC2, ETH_DMATXNDESCRF_IOC);
3337 }
3338 else
3339 {
3340
3341 CLEAR_BIT(dmatxdesc->DESC2, ETH_DMATXNDESCRF_IOC);
3342 }
3343
3344
3345 SET_BIT(dmatxdesc->DESC3, ETH_DMATXNDESCRF_LD);
3346
3347 dmatxdesclist->PacketAddress[descidx] = dmatxdesclist->CurrentPacketAddress;
3348
3349 dmatxdesclist->CurTxDesc = descidx;
3350
3351
3352 primask_bit = __get_PRIMASK();
3353 __set_PRIMASK(1);
3354
3355 dmatxdesclist->BuffersInUse += bd_count + 1U;
3356
3357
3358 __set_PRIMASK(primask_bit);
3359
3360
3361 return HAL_ETH_ERROR_NONE;
3362 }
3363
3364 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
3365 static void ETH_InitCallbacksToDefault(ETH_HandleTypeDef *heth)
3366 {
3367
3368 heth->TxCpltCallback = HAL_ETH_TxCpltCallback;
3369 heth->RxCpltCallback = HAL_ETH_RxCpltCallback;
3370 heth->ErrorCallback = HAL_ETH_ErrorCallback;
3371 heth->PMTCallback = HAL_ETH_PMTCallback;
3372 heth->EEECallback = HAL_ETH_EEECallback;
3373 heth->WakeUpCallback = HAL_ETH_WakeUpCallback;
3374 heth->rxLinkCallback = HAL_ETH_RxLinkCallback;
3375 heth->txFreeCallback = HAL_ETH_TxFreeCallback;
3376 #ifdef HAL_ETH_USE_PTP
3377 heth->txPtpCallback = HAL_ETH_TxPtpCallback;
3378 #endif
3379 heth->rxAllocateCallback = HAL_ETH_RxAllocateCallback;
3380 }
3381 #endif
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391 #endif
3392
3393 #endif
3394
3395
3396
3397