184#ifdef HAL_ETH_MODULE_ENABLED
198#define ETH_MACCR_MASK 0xFFFB7F7CU
199#define ETH_MACECR_MASK 0x3F077FFFU
200#define ETH_MACFFR_MASK 0x800007FFU
201#define ETH_MACWTR_MASK 0x0000010FU
202#define ETH_MACTFCR_MASK 0xFFFF00F2U
203#define ETH_MACRFCR_MASK 0x00000003U
204#define ETH_MTLTQOMR_MASK 0x00000072U
205#define ETH_MTLRQOMR_MASK 0x0000007BU
207#define ETH_DMAMR_MASK 0x00007802U
208#define ETH_DMASBMR_MASK 0x0000D001U
209#define ETH_DMACCR_MASK 0x00013FFFU
210#define ETH_DMACTCR_MASK 0x003F1010U
211#define ETH_DMACRCR_MASK 0x803F0000U
212#define ETH_MACPMTCSR_MASK (ETH_MACPMTCSR_PD | ETH_MACPMTCSR_WFE | \
213 ETH_MACPMTCSR_MPE | ETH_MACPMTCSR_GU)
216#define ETH_SWRESET_TIMEOUT 500U
217#define ETH_MDIO_BUS_TIMEOUT 1000U
219#define ETH_DMARXDESC_ERRORS_MASK ((uint32_t)(ETH_DMARXDESC_DBE | ETH_DMARXDESC_RE | \
220 ETH_DMARXDESC_OE | ETH_DMARXDESC_RWT |\
221 ETH_DMARXDESC_LC | ETH_DMARXDESC_CE |\
222 ETH_DMARXDESC_DE | ETH_DMARXDESC_IPV4HCE))
224#define ETH_MAC_US_TICK 1000000U
226#define ETH_MACTSCR_MASK 0x0087FF2FU
228#define ETH_PTPTSHR_VALUE 0xFFFFFFFFU
229#define ETH_PTPTSLR_VALUE 0xBB9ACA00U
232#define ETH_MACMIIAR_CR_MASK 0xFFFFFFE3U
235#define ETH_REG_WRITE_DELAY 0x00000001U
238#define ETH_MACCR_CLEAR_MASK 0xFD20810FU
241#define ETH_MACFCR_CLEAR_MASK 0x0000FF41U
244#define ETH_DMAOMR_CLEAR_MASK 0xF8DE3F23U
247#define ETH_MAC_ADDR_HBASE (uint32_t)(ETH_MAC_BASE + 0x40U)
248#define ETH_MAC_ADDR_LBASE (uint32_t)(ETH_MAC_BASE + 0x44U)
251#define ETH_DMARXDESC_FRAMELENGTHSHIFT 16U
261#define INCR_TX_DESC_INDEX(inx, offset) do {\
263 if ((inx) >= (uint32_t)ETH_TX_DESC_CNT){\
264 (inx) = ((inx) - (uint32_t)ETH_TX_DESC_CNT);}\
268#define INCR_RX_DESC_INDEX(inx, offset) do {\
270 if ((inx) >= (uint32_t)ETH_RX_DESC_CNT){\
271 (inx) = ((inx) - (uint32_t)ETH_RX_DESC_CNT);}\
280static void ETH_SetMACConfig(ETH_HandleTypeDef *heth,
const ETH_MACConfigTypeDef *macconf);
281static void ETH_SetDMAConfig(ETH_HandleTypeDef *heth,
const ETH_DMAConfigTypeDef *dmaconf);
282static void ETH_MACDMAConfig(ETH_HandleTypeDef *heth);
283static void ETH_DMATxDescListInit(ETH_HandleTypeDef *heth);
284static void ETH_DMARxDescListInit(ETH_HandleTypeDef *heth);
285static uint32_t ETH_Prepare_Tx_Descriptors(ETH_HandleTypeDef *heth,
const ETH_TxPacketConfigTypeDef *pTxConfig,
287static void ETH_UpdateDescriptor(ETH_HandleTypeDef *heth);
288static void ETH_FlushTransmitFIFO(ETH_HandleTypeDef *heth);
289static void ETH_MACAddressConfig(ETH_HandleTypeDef *heth, uint32_t MacAddr, uint8_t *Addr);
291#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
292static void ETH_InitCallbacksToDefault(ETH_HandleTypeDef *heth);
295#ifdef HAL_ETH_USE_PTP
296static HAL_StatusTypeDef HAL_ETH_PTP_AddendUpdate(ETH_HandleTypeDef *heth, int32_t timeoffset);
350 if (heth->gState == HAL_ETH_STATE_RESET)
352 heth->gState = HAL_ETH_STATE_BUSY;
354#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
356 ETH_InitCallbacksToDefault(heth);
358 if (heth->MspInitCallback == NULL)
360 heth->MspInitCallback = HAL_ETH_MspInit;
364 heth->MspInitCallback(heth);
367 HAL_ETH_MspInit(heth);
375 SYSCFG->PMC &= ~(SYSCFG_PMC_MII_RMII_SEL);
376 SYSCFG->PMC |= (uint32_t)heth->Init.MediaInterface;
383 SET_BIT(heth->Instance->DMABMR, ETH_DMABMR_SR);
389 while (READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_SR) > 0U)
391 if (((
HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
394 heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
396 heth->gState = HAL_ETH_STATE_ERROR;
404 ETH_MACDMAConfig(heth);
408 ETH_DMATxDescListInit(heth);
411 ETH_DMARxDescListInit(heth);
414 ETH_MACAddressConfig(heth, ETH_MAC_ADDRESS0, heth->Init.MACAddr);
417 SET_BIT(heth->Instance->MACIMR, ETH_MACIMR_TSTIM | ETH_MACIMR_PMTIM);
420 SET_BIT(heth->Instance->MMCRIMR, ETH_MMCRIMR_RGUFM | ETH_MMCRIMR_RFAEM | \
424 SET_BIT(heth->Instance->MMCTIMR, ETH_MMCTIMR_TGFM | ETH_MMCTIMR_TGFMSCM | \
427 heth->ErrorCode = HAL_ETH_ERROR_NONE;
428 heth->gState = HAL_ETH_STATE_READY;
442 heth->gState = HAL_ETH_STATE_BUSY;
444#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
446 if (heth->MspDeInitCallback == NULL)
448 heth->MspDeInitCallback = HAL_ETH_MspDeInit;
451 heth->MspDeInitCallback(heth);
455 HAL_ETH_MspDeInit(heth);
460 heth->gState = HAL_ETH_STATE_RESET;
472__weak
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
487__weak
void HAL_ETH_MspDeInit(ETH_HandleTypeDef *heth)
496#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
513HAL_StatusTypeDef HAL_ETH_RegisterCallback(ETH_HandleTypeDef *heth, HAL_ETH_CallbackIDTypeDef CallbackID,
514 pETH_CallbackTypeDef pCallback)
518 if (pCallback == NULL)
521 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
525 if (heth->gState == HAL_ETH_STATE_READY)
529 case HAL_ETH_TX_COMPLETE_CB_ID :
530 heth->TxCpltCallback = pCallback;
533 case HAL_ETH_RX_COMPLETE_CB_ID :
534 heth->RxCpltCallback = pCallback;
537 case HAL_ETH_ERROR_CB_ID :
538 heth->ErrorCallback = pCallback;
541 case HAL_ETH_PMT_CB_ID :
542 heth->PMTCallback = pCallback;
546 case HAL_ETH_WAKEUP_CB_ID :
547 heth->WakeUpCallback = pCallback;
550 case HAL_ETH_MSPINIT_CB_ID :
551 heth->MspInitCallback = pCallback;
554 case HAL_ETH_MSPDEINIT_CB_ID :
555 heth->MspDeInitCallback = pCallback;
560 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
566 else if (heth->gState == HAL_ETH_STATE_RESET)
570 case HAL_ETH_MSPINIT_CB_ID :
571 heth->MspInitCallback = pCallback;
574 case HAL_ETH_MSPDEINIT_CB_ID :
575 heth->MspDeInitCallback = pCallback;
580 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
589 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
612HAL_StatusTypeDef HAL_ETH_UnRegisterCallback(ETH_HandleTypeDef *heth, HAL_ETH_CallbackIDTypeDef CallbackID)
616 if (heth->gState == HAL_ETH_STATE_READY)
620 case HAL_ETH_TX_COMPLETE_CB_ID :
621 heth->TxCpltCallback = HAL_ETH_TxCpltCallback;
624 case HAL_ETH_RX_COMPLETE_CB_ID :
625 heth->RxCpltCallback = HAL_ETH_RxCpltCallback;
628 case HAL_ETH_ERROR_CB_ID :
629 heth->ErrorCallback = HAL_ETH_ErrorCallback;
632 case HAL_ETH_PMT_CB_ID :
633 heth->PMTCallback = HAL_ETH_PMTCallback;
637 case HAL_ETH_WAKEUP_CB_ID :
638 heth->WakeUpCallback = HAL_ETH_WakeUpCallback;
641 case HAL_ETH_MSPINIT_CB_ID :
642 heth->MspInitCallback = HAL_ETH_MspInit;
645 case HAL_ETH_MSPDEINIT_CB_ID :
646 heth->MspDeInitCallback = HAL_ETH_MspDeInit;
651 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
657 else if (heth->gState == HAL_ETH_STATE_RESET)
661 case HAL_ETH_MSPINIT_CB_ID :
662 heth->MspInitCallback = HAL_ETH_MspInit;
665 case HAL_ETH_MSPDEINIT_CB_ID :
666 heth->MspDeInitCallback = HAL_ETH_MspDeInit;
671 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
680 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
718 if (heth->gState == HAL_ETH_STATE_READY)
720 heth->gState = HAL_ETH_STATE_BUSY;
723 heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
726 ETH_UpdateDescriptor(heth);
729 SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
733 tmpreg1 = (heth->Instance)->MACCR;
735 (heth->Instance)->MACCR = tmpreg1;
738 SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
742 tmpreg1 = (heth->Instance)->MACCR;
744 (heth->Instance)->MACCR = tmpreg1;
747 ETH_FlushTransmitFIFO(heth);
750 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
753 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
755 heth->gState = HAL_ETH_STATE_STARTED;
775 if (heth->gState == HAL_ETH_STATE_READY)
777 heth->gState = HAL_ETH_STATE_BUSY;
780 heth->RxDescList.ItMode = 1U;
783 heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
786 ETH_UpdateDescriptor(heth);
790 tmpreg1 = (heth->Instance)->MACCR;
792 (heth->Instance)->MACCR = tmpreg1;
795 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
798 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
801 ETH_FlushTransmitFIFO(heth);
805 SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
809 tmpreg1 = (heth->Instance)->MACCR;
811 (heth->Instance)->MACCR = tmpreg1;
814 SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
821 __HAL_ETH_DMA_ENABLE_IT(heth, (ETH_DMAIER_NISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE |
822 ETH_DMAIER_FBEIE | ETH_DMAIER_AISE | ETH_DMAIER_RBUIE));
824 heth->gState = HAL_ETH_STATE_STARTED;
843 if (heth->gState == HAL_ETH_STATE_STARTED)
846 heth->gState = HAL_ETH_STATE_BUSY;
849 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
852 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
855 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
859 tmpreg1 = (heth->Instance)->MACCR;
861 (heth->Instance)->MACCR = tmpreg1;
864 ETH_FlushTransmitFIFO(heth);
867 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
871 tmpreg1 = (heth->Instance)->MACCR;
873 (heth->Instance)->MACCR = tmpreg1;
875 heth->gState = HAL_ETH_STATE_READY;
894 ETH_DMADescTypeDef *dmarxdesc;
898 if (heth->gState == HAL_ETH_STATE_STARTED)
901 heth->gState = HAL_ETH_STATE_BUSY;
903 __HAL_ETH_DMA_DISABLE_IT(heth, (ETH_DMAIER_NISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE |
904 ETH_DMAIER_FBEIE | ETH_DMAIER_AISE | ETH_DMAIER_RBUIE));
907 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
910 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
913 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
918 tmpreg1 = (heth->Instance)->MACCR;
920 (heth->Instance)->MACCR = tmpreg1;
923 ETH_FlushTransmitFIFO(heth);
926 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
930 tmpreg1 = (heth->Instance)->MACCR;
932 (heth->Instance)->MACCR = tmpreg1;
935 for (descindex = 0; descindex < (uint32_t)ETH_RX_DESC_CNT; descindex++)
937 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descindex];
938 SET_BIT(dmarxdesc->DESC1, ETH_DMARXDESC_DIC);
941 heth->RxDescList.ItMode = 0U;
943 heth->gState = HAL_ETH_STATE_READY;
962HAL_StatusTypeDef HAL_ETH_Transmit(ETH_HandleTypeDef *heth, ETH_TxPacketConfigTypeDef *pTxConfig, uint32_t Timeout)
965 ETH_DMADescTypeDef *dmatxdesc;
967 if (pTxConfig == NULL)
969 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
973 if (heth->gState == HAL_ETH_STATE_STARTED)
976 if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 0) != HAL_ETH_ERROR_NONE)
979 heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
986 dmatxdesc = (ETH_DMADescTypeDef *)(&heth->TxDescList)->TxDesc[heth->TxDescList.CurTxDesc];
989 INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
993 WRITE_REG(heth->Instance->DMATPDR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));
998 while ((dmatxdesc->DESC0 & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
1000 if ((heth->Instance->DMASR & ETH_DMASR_FBES) != (uint32_t)RESET)
1002 heth->ErrorCode |= HAL_ETH_ERROR_DMA;
1003 heth->DMAErrorCode = heth->Instance->DMASR;
1011 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
1013 heth->ErrorCode |= HAL_ETH_ERROR_TIMEOUT;
1015 dmatxdesc->DESC0 = (ETH_DMATXDESC_FS | ETH_DMATXDESC_LS);
1037HAL_StatusTypeDef HAL_ETH_Transmit_IT(ETH_HandleTypeDef *heth, ETH_TxPacketConfigTypeDef *pTxConfig)
1039 if (pTxConfig == NULL)
1041 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
1045 if (heth->gState == HAL_ETH_STATE_STARTED)
1048 heth->TxDescList.CurrentPacketAddress = (uint32_t *)pTxConfig->pData;
1051 if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 1) != HAL_ETH_ERROR_NONE)
1053 heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
1061 INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
1065 if (((heth->Instance)->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
1068 (heth->Instance)->DMASR = ETH_DMASR_TBUS;
1070 (heth->Instance)->DMATPDR = 0U;
1092 ETH_DMADescTypeDef *dmarxdesc;
1093 uint32_t desccnt = 0U;
1094 uint32_t desccntmax;
1095 uint32_t bufflength;
1096 uint8_t rxdataready = 0U;
1098 if (pAppBuff == NULL)
1100 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
1104 if (heth->gState != HAL_ETH_STATE_STARTED)
1109 descidx = heth->RxDescList.RxDescIdx;
1110 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1111 desccntmax = ETH_RX_DESC_CNT - heth->RxDescList.RxBuildDescCnt;
1114 while ((READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
1115 && (rxdataready == 0U))
1117 if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_LS) != (uint32_t)RESET)
1120 heth->RxDescList.TimeStamp.TimeStampHigh = dmarxdesc->DESC7;
1122 heth->RxDescList.TimeStamp.TimeStampLow = dmarxdesc->DESC6;
1124 if ((READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_FS) != (uint32_t)RESET) || (heth->RxDescList.pRxStart != NULL))
1127 if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_FS) != (uint32_t)RESET)
1129 heth->RxDescList.RxDescCnt = 0;
1130 heth->RxDescList.RxDataLength = 0;
1134 bufflength = ((dmarxdesc->DESC0 & ETH_DMARXDESC_FL) >> ETH_DMARXDESC_FRAMELENGTHSHIFT);
1137 if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_LS) != (uint32_t)RESET)
1140 heth->RxDescList.pRxLastRxDesc = dmarxdesc->DESC0;
1147 WRITE_REG(dmarxdesc->BackupAddr0, dmarxdesc->DESC2);
1148#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1150 heth->rxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
1151 (uint8_t *)dmarxdesc->BackupAddr0, bufflength);
1154 HAL_ETH_RxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
1155 (uint8_t *)dmarxdesc->BackupAddr0, (uint16_t) bufflength);
1157 heth->RxDescList.RxDescCnt++;
1158 heth->RxDescList.RxDataLength += bufflength;
1161 dmarxdesc->BackupAddr0 = 0;
1165 INCR_RX_DESC_INDEX(descidx, 1U);
1167 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1171 heth->RxDescList.RxBuildDescCnt += desccnt;
1172 if ((heth->RxDescList.RxBuildDescCnt) != 0U)
1175 ETH_UpdateDescriptor(heth);
1178 heth->RxDescList.RxDescIdx = descidx;
1180 if (rxdataready == 1U)
1183 *pAppBuff = heth->RxDescList.pRxStart;
1185 heth->RxDescList.pRxStart = NULL;
1202static void ETH_UpdateDescriptor(ETH_HandleTypeDef *heth)
1207 ETH_DMADescTypeDef *dmarxdesc;
1208 uint8_t *buff = NULL;
1209 uint8_t allocStatus = 1U;
1211 descidx = heth->RxDescList.RxBuildDescIdx;
1212 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1213 desccount = heth->RxDescList.RxBuildDescCnt;
1215 while ((desccount > 0U) && (allocStatus != 0U))
1218 if (READ_REG(dmarxdesc->BackupAddr0) == 0U)
1221#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1223 heth->rxAllocateCallback(&buff);
1226 HAL_ETH_RxAllocateCallback(&buff);
1234 WRITE_REG(dmarxdesc->BackupAddr0, (uint32_t)buff);
1235 WRITE_REG(dmarxdesc->DESC2, (uint32_t)buff);
1239 if (allocStatus != 0U)
1241 if (heth->RxDescList.ItMode == 0U)
1243 WRITE_REG(dmarxdesc->DESC1, heth->Init.RxBuffLen | ETH_DMARXDESC_DIC | ETH_DMARXDESC_RCH);
1247 WRITE_REG(dmarxdesc->DESC1, heth->Init.RxBuffLen | ETH_DMARXDESC_RCH);
1250 SET_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_OWN);
1253 INCR_RX_DESC_INDEX(descidx, 1U);
1255 dmarxdesc = (ETH_DMADescTypeDef *)heth->RxDescList.RxDesc[descidx];
1260 if (heth->RxDescList.RxBuildDescCnt != desccount)
1263 tailidx = (ETH_RX_DESC_CNT + descidx - 1U) % ETH_RX_DESC_CNT;
1269 WRITE_REG(heth->Instance->DMARPDR, ((uint32_t)(heth->Init.RxDesc + (tailidx))));
1271 heth->RxDescList.RxBuildDescIdx = descidx;
1272 heth->RxDescList.RxBuildDescCnt = desccount;
1284 pETH_rxAllocateCallbackTypeDef rxAllocateCallback)
1286 if (rxAllocateCallback == NULL)
1293 heth->rxAllocateCallback = rxAllocateCallback;
1307 heth->rxAllocateCallback = HAL_ETH_RxAllocateCallback;
1317__weak
void HAL_ETH_RxAllocateCallback(uint8_t **buff)
1334__weak
void HAL_ETH_RxLinkCallback(
void **pStart,
void **pEnd, uint8_t *buff, uint16_t Length)
1353HAL_StatusTypeDef HAL_ETH_RegisterRxLinkCallback(ETH_HandleTypeDef *heth, pETH_rxLinkCallbackTypeDef rxLinkCallback)
1355 if (rxLinkCallback == NULL)
1362 heth->rxLinkCallback = rxLinkCallback;
1376 heth->rxLinkCallback = HAL_ETH_RxLinkCallback;
1388HAL_StatusTypeDef HAL_ETH_GetRxDataErrorCode(
const ETH_HandleTypeDef *heth, uint32_t *pErrorCode)
1391 *pErrorCode = READ_BIT(heth->RxDescList.pRxLastRxDesc, ETH_DMARXDESC_ERRORS_MASK);
1403HAL_StatusTypeDef HAL_ETH_RegisterTxFreeCallback(ETH_HandleTypeDef *heth, pETH_txFreeCallbackTypeDef txFreeCallback)
1405 if (txFreeCallback == NULL)
1412 heth->txFreeCallback = txFreeCallback;
1426 heth->txFreeCallback = HAL_ETH_TxFreeCallback;
1436__weak
void HAL_ETH_TxFreeCallback(uint32_t *buff)
1453 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
1454 uint32_t numOfBuf = dmatxdesclist->BuffersInUse;
1455 uint32_t idx = dmatxdesclist->releaseIndex;
1456 uint8_t pktTxStatus = 1U;
1458#ifdef HAL_ETH_USE_PTP
1459 ETH_TimeStampTypeDef *timestamp = &heth->TxTimestamp;
1463 while ((numOfBuf != 0U) && (pktTxStatus != 0U))
1468 if (dmatxdesclist->PacketAddress[idx] == NULL)
1471 INCR_TX_DESC_INDEX(idx, 1U);
1478 if ((heth->Init.TxDesc[idx].DESC0 & ETH_DMATXDESC_OWN) == 0U)
1480#ifdef HAL_ETH_USE_PTP
1481 if ((heth->Init.TxDesc[idx].DESC0 & ETH_DMATXDESC_LS)
1482 && (heth->Init.TxDesc[idx].DESC0 & ETH_DMATXDESC_TTSS))
1485 timestamp->TimeStampLow = heth->Init.TxDesc[idx].DESC6;
1487 timestamp->TimeStampHigh = heth->Init.TxDesc[idx].DESC7;
1491 timestamp->TimeStampHigh = timestamp->TimeStampLow = UINT32_MAX;
1495#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1497#ifdef HAL_ETH_USE_PTP
1499 if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX)
1501 heth->txPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp);
1505 heth->txFreeCallback(dmatxdesclist->PacketAddress[idx]);
1508#ifdef HAL_ETH_USE_PTP
1510 if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX)
1512 HAL_ETH_TxPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp);
1516 HAL_ETH_TxFreeCallback(dmatxdesclist->PacketAddress[idx]);
1520 dmatxdesclist->PacketAddress[idx] = NULL;
1523 INCR_TX_DESC_INDEX(idx, 1U);
1524 dmatxdesclist->BuffersInUse = numOfBuf;
1525 dmatxdesclist->releaseIndex = idx;
1537#ifdef HAL_ETH_USE_PTP
1546HAL_StatusTypeDef HAL_ETH_PTP_SetConfig(ETH_HandleTypeDef *heth, ETH_PTP_ConfigTypeDef *ptpconfig)
1549 ETH_TimeTypeDef time;
1551 if (ptpconfig == NULL)
1557 CLEAR_BIT(heth->Instance->MACIMR, ETH_MACIMR_TSTIM);
1559 tmpTSCR = ptpconfig->Timestamp |
1560 ((uint32_t)ptpconfig->TimestampUpdate << ETH_PTPTSCR_TSFCU_Pos) |
1561 ((uint32_t)ptpconfig->TimestampAll << ETH_PTPTSCR_TSSARFE_Pos) |
1562 ((uint32_t)ptpconfig->TimestampRolloverMode << ETH_PTPTSCR_TSSSR_Pos) |
1563 ((uint32_t)ptpconfig->TimestampV2 << ETH_PTPTSCR_TSPTPPSV2E_Pos) |
1564 ((uint32_t)ptpconfig->TimestampEthernet << ETH_PTPTSCR_TSSPTPOEFE_Pos) |
1565 ((uint32_t)ptpconfig->TimestampIPv6 << ETH_PTPTSCR_TSSIPV6FE_Pos) |
1566 ((uint32_t)ptpconfig->TimestampIPv4 << ETH_PTPTSCR_TSSIPV4FE_Pos) |
1567 ((uint32_t)ptpconfig->TimestampEvent << ETH_PTPTSCR_TSSEME_Pos) |
1568 ((uint32_t)ptpconfig->TimestampMaster << ETH_PTPTSCR_TSSMRME_Pos) |
1569 ((uint32_t)ptpconfig->TimestampFilter << ETH_PTPTSCR_TSPFFMAE_Pos) |
1570 ((uint32_t)ptpconfig->TimestampClockType << ETH_PTPTSCR_TSCNT_Pos);
1573 MODIFY_REG(heth->Instance->PTPTSCR, ETH_MACTSCR_MASK, tmpTSCR);
1576 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSE);
1577 WRITE_REG(heth->Instance->PTPSSIR, ptpconfig->TimestampSubsecondInc);
1578 WRITE_REG(heth->Instance->PTPTSAR, ptpconfig->TimestampAddend);
1581 if (ptpconfig->TimestampAddendUpdate == ENABLE)
1583 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSARU);
1584 while ((heth->Instance->PTPTSCR & ETH_PTPTSCR_TSARU) != 0)
1591 if (ptpconfig->TimestampUpdateMode == ENABLE)
1593 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSFCU);
1597 heth->IsPtpConfigured = HAL_ETH_PTP_CONFIGURED;
1600 time.Seconds = heth->Instance->PTPTSHR;
1602 time.NanoSeconds = heth->Instance->PTPTSLR;
1604 HAL_ETH_PTP_SetTime(heth, &time);
1607 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSTI);
1621HAL_StatusTypeDef HAL_ETH_PTP_GetConfig(ETH_HandleTypeDef *heth, ETH_PTP_ConfigTypeDef *ptpconfig)
1623 if (ptpconfig == NULL)
1627 ptpconfig->Timestamp = READ_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSE);
1628 ptpconfig->TimestampUpdate = ((READ_BIT(heth->Instance->PTPTSCR,
1629 ETH_PTPTSCR_TSFCU) >> ETH_PTPTSCR_TSFCU_Pos) > 0U) ? ENABLE : DISABLE;
1630 ptpconfig->TimestampAll = ((READ_BIT(heth->Instance->PTPTSCR,
1631 ETH_PTPTSCR_TSSARFE) >> ETH_PTPTSCR_TSSARFE_Pos) > 0U) ? ENABLE : DISABLE;
1632 ptpconfig->TimestampRolloverMode = ((READ_BIT(heth->Instance->PTPTSCR,
1633 ETH_PTPTSCR_TSSSR) >> ETH_PTPTSCR_TSSSR_Pos) > 0U)
1635 ptpconfig->TimestampV2 = ((READ_BIT(heth->Instance->PTPTSCR,
1636 ETH_PTPTSCR_TSPTPPSV2E) >> ETH_PTPTSCR_TSPTPPSV2E_Pos) > 0U) ? ENABLE : DISABLE;
1637 ptpconfig->TimestampEthernet = ((READ_BIT(heth->Instance->PTPTSCR,
1638 ETH_PTPTSCR_TSSPTPOEFE) >> ETH_PTPTSCR_TSSPTPOEFE_Pos) > 0U)
1640 ptpconfig->TimestampIPv6 = ((READ_BIT(heth->Instance->PTPTSCR,
1641 ETH_PTPTSCR_TSSIPV6FE) >> ETH_PTPTSCR_TSSIPV6FE_Pos) > 0U) ? ENABLE : DISABLE;
1642 ptpconfig->TimestampIPv4 = ((READ_BIT(heth->Instance->PTPTSCR,
1643 ETH_PTPTSCR_TSSIPV4FE) >> ETH_PTPTSCR_TSSIPV4FE_Pos) > 0U) ? ENABLE : DISABLE;
1644 ptpconfig->TimestampEvent = ((READ_BIT(heth->Instance->PTPTSCR,
1645 ETH_PTPTSCR_TSSEME) >> ETH_PTPTSCR_TSSEME_Pos) > 0U) ? ENABLE : DISABLE;
1646 ptpconfig->TimestampMaster = ((READ_BIT(heth->Instance->PTPTSCR,
1647 ETH_PTPTSCR_TSSMRME) >> ETH_PTPTSCR_TSSMRME_Pos) > 0U) ? ENABLE : DISABLE;
1648 ptpconfig->TimestampFilter = ((READ_BIT(heth->Instance->PTPTSCR,
1649 ETH_PTPTSCR_TSPFFMAE) >> ETH_PTPTSCR_TSPFFMAE_Pos) > 0U) ? ENABLE : DISABLE;
1650 ptpconfig->TimestampClockType = ((READ_BIT(heth->Instance->PTPTSCR,
1651 ETH_PTPTSCR_TSCNT) >> ETH_PTPTSCR_TSCNT_Pos) > 0U) ? ENABLE : DISABLE;
1665HAL_StatusTypeDef HAL_ETH_PTP_SetTime(ETH_HandleTypeDef *heth, ETH_TimeTypeDef *time)
1667 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1670 heth->Instance->PTPTSHUR = time->Seconds;
1673 heth->Instance->PTPTSLUR = time->NanoSeconds;
1676 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSTU);
1696HAL_StatusTypeDef HAL_ETH_PTP_GetTime(ETH_HandleTypeDef *heth, ETH_TimeTypeDef *time)
1698 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1701 time->Seconds = heth->Instance->PTPTSHR;
1703 time->NanoSeconds = heth->Instance->PTPTSLR;
1723HAL_StatusTypeDef HAL_ETH_PTP_AddTimeOffset(ETH_HandleTypeDef *heth, ETH_PtpUpdateTypeDef ptpoffsettype,
1724 ETH_TimeTypeDef *timeoffset)
1726 int32_t addendtime ;
1727 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1729 if (ptpoffsettype == HAL_ETH_PTP_NEGATIVE_UPDATE)
1732 heth->Instance->PTPTSHUR = ETH_PTPTSHR_VALUE - timeoffset->Seconds + 1U;
1734 if (READ_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSSR) == ETH_PTPTSCR_TSSSR)
1737 heth->Instance->PTPTSLUR = ETH_PTPTSLR_VALUE - timeoffset->NanoSeconds;
1741 heth->Instance->PTPTSLUR = ETH_PTPTSHR_VALUE - timeoffset->NanoSeconds + 1U;
1745 addendtime = - timeoffset->NanoSeconds;
1746 HAL_ETH_PTP_AddendUpdate(heth, addendtime);
1752 heth->Instance->PTPTSHUR = timeoffset->Seconds;
1754 heth->Instance->PTPTSLUR = timeoffset->NanoSeconds;
1757 addendtime = timeoffset->NanoSeconds;
1758 HAL_ETH_PTP_AddendUpdate(heth, addendtime);
1762 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSTU);
1782static HAL_StatusTypeDef HAL_ETH_PTP_AddendUpdate(ETH_HandleTypeDef *heth, int32_t timeoffset)
1785 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1789 tmpreg = READ_REG(heth->Instance->PTPTSAR);
1790 tmpreg += timeoffset ;
1791 WRITE_REG(heth->Instance->PTPTSAR, tmpreg);
1793 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSARU);
1794 while ((heth->Instance->PTPTSCR & ETH_PTPTSCR_TSARU) != 0)
1816 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
1817 uint32_t descidx = dmatxdesclist->CurTxDesc;
1818 ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
1820 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1823 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_TTSE);
1843HAL_StatusTypeDef HAL_ETH_PTP_GetTxTimestamp(ETH_HandleTypeDef *heth, ETH_TimeStampTypeDef *timestamp)
1845 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
1846 uint32_t idx = dmatxdesclist->releaseIndex;
1847 ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[idx];
1849 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1852 timestamp->TimeStampLow = dmatxdesc->DESC0;
1854 timestamp->TimeStampHigh = dmatxdesc->DESC1;
1874HAL_StatusTypeDef HAL_ETH_PTP_GetRxTimestamp(ETH_HandleTypeDef *heth, ETH_TimeStampTypeDef *timestamp)
1876 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1879 timestamp->TimeStampLow = heth->RxDescList.TimeStamp.TimeStampLow;
1881 timestamp->TimeStampHigh = heth->RxDescList.TimeStamp.TimeStampHigh;
1900HAL_StatusTypeDef HAL_ETH_RegisterTxPtpCallback(ETH_HandleTypeDef *heth, pETH_txPtpCallbackTypeDef txPtpCallback)
1902 if (txPtpCallback == NULL)
1908 heth->txPtpCallback = txPtpCallback;
1922 heth->txPtpCallback = HAL_ETH_TxPtpCallback;
1934__weak
void HAL_ETH_TxPtpCallback(uint32_t *buff, ETH_TimeStampTypeDef *timestamp)
1950void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth)
1952 uint32_t mac_flag = READ_REG(heth->Instance->MACSR);
1953 uint32_t dma_flag = READ_REG(heth->Instance->DMASR);
1954 uint32_t dma_itsource = READ_REG(heth->Instance->DMAIER);
1955 uint32_t exti_flag = READ_REG(EXTI->PR);
1958 if (((dma_flag & ETH_DMASR_RS) != 0U) && ((dma_itsource & ETH_DMAIER_RIE) != 0U))
1961 __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMASR_RS | ETH_DMASR_NIS);
1963#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1965 heth->RxCpltCallback(heth);
1968 HAL_ETH_RxCpltCallback(heth);
1973 if (((dma_flag & ETH_DMASR_TS) != 0U) && ((dma_itsource & ETH_DMAIER_TIE) != 0U))
1976 __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMASR_TS | ETH_DMASR_NIS);
1978#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1980 heth->TxCpltCallback(heth);
1983 HAL_ETH_TxCpltCallback(heth);
1988 if (((dma_flag & ETH_DMASR_AIS) != 0U) && ((dma_itsource & ETH_DMAIER_AISE) != 0U))
1990 heth->ErrorCode |= HAL_ETH_ERROR_DMA;
1992 if ((dma_flag & ETH_DMASR_FBES) != 0U)
1995 heth->DMAErrorCode = READ_BIT(heth->Instance->DMASR, (ETH_DMASR_FBES | ETH_DMASR_TPS | ETH_DMASR_RPS));
1998 __HAL_ETH_DMA_DISABLE_IT(heth, ETH_DMAIER_NISE | ETH_DMAIER_AISE);
2001 heth->gState = HAL_ETH_STATE_ERROR;
2006 heth->DMAErrorCode = READ_BIT(heth->Instance->DMASR, (ETH_DMASR_ETS | ETH_DMASR_RWTS |
2007 ETH_DMASR_RBUS | ETH_DMASR_AIS));
2010 __HAL_ETH_DMA_CLEAR_IT(heth, (ETH_DMASR_ETS | ETH_DMASR_RWTS |
2011 ETH_DMASR_RBUS | ETH_DMASR_AIS));
2013#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
2015 heth->ErrorCallback(heth);
2018 HAL_ETH_ErrorCallback(heth);
2024 if ((mac_flag & ETH_MAC_PMT_IT) != 0U)
2027 heth->MACWakeUpEvent = READ_BIT(heth->Instance->MACPMTCSR, (ETH_MACPMTCSR_WFR | ETH_MACPMTCSR_MPR));
2029#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
2031 heth->PMTCallback(heth);
2034 HAL_ETH_PMTCallback(heth);
2037 heth->MACWakeUpEvent = (uint32_t)(0x0U);
2042 if ((exti_flag & ETH_WAKEUP_EXTI_LINE) != 0U)
2045 __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG(ETH_WAKEUP_EXTI_LINE);
2046#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
2048 heth->WakeUpCallback(heth);
2051 HAL_ETH_WakeUpCallback(heth);
2062__weak
void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)
2077__weak
void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
2092__weak
void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
2107__weak
void HAL_ETH_PMTCallback(ETH_HandleTypeDef *heth)
2123__weak
void HAL_ETH_WakeUpCallback(ETH_HandleTypeDef *heth)
2141HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
2142 uint32_t *pRegValue)
2148 tmpreg1 = heth->Instance->MACMIIAR;
2151 tmpreg1 &= ~ETH_MACMIIAR_CR_MASK;
2154 tmpreg1 |= ((PHYAddr << 11U) & ETH_MACMIIAR_PA);
2155 tmpreg1 |= (((uint32_t)PHYReg << 6U) & ETH_MACMIIAR_MR);
2156 tmpreg1 &= ~ETH_MACMIIAR_MW;
2157 tmpreg1 |= ETH_MACMIIAR_MB;
2160 heth->Instance->MACMIIAR = tmpreg1;
2166 while ((tmpreg1 & ETH_MACMIIAR_MB) == ETH_MACMIIAR_MB)
2174 tmpreg1 = heth->Instance->MACMIIAR;
2178 *pRegValue = (uint16_t)(heth->Instance->MACMIIDR);
2192HAL_StatusTypeDef HAL_ETH_WritePHYRegister(
const ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg,
2199 tmpreg1 = heth->Instance->MACMIIAR;
2202 tmpreg1 &= ~ETH_MACMIIAR_CR_MASK;
2205 tmpreg1 |= ((PHYAddr << 11U) & ETH_MACMIIAR_PA);
2206 tmpreg1 |= (((uint32_t)PHYReg << 6U) & ETH_MACMIIAR_MR);
2207 tmpreg1 |= ETH_MACMIIAR_MW;
2208 tmpreg1 |= ETH_MACMIIAR_MB;
2211 heth->Instance->MACMIIDR = (uint16_t)RegValue;
2214 heth->Instance->MACMIIAR = tmpreg1;
2220 while ((tmpreg1 & ETH_MACMIIAR_MB) == ETH_MACMIIAR_MB)
2228 tmpreg1 = heth->Instance->MACMIIAR;
2260HAL_StatusTypeDef HAL_ETH_GetMACConfig(
const ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
2262 if (macconf == NULL)
2268 macconf->DeferralCheck = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DC) >> 4) > 0U) ? ENABLE : DISABLE;
2269 macconf->BackOffLimit = READ_BIT(heth->Instance->MACCR, ETH_MACCR_BL);
2270 macconf->RetryTransmission = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_RD) >> 9) == 0U) ? ENABLE : DISABLE;
2271 macconf->CarrierSenseDuringTransmit = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_CSD) >> 16) > 0U)
2273 macconf->ReceiveOwn = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_ROD) >> 13) == 0U) ? ENABLE : DISABLE;
2274 macconf->LoopbackMode = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_LM) >> 12) > 0U) ? ENABLE : DISABLE;
2275 macconf->DuplexMode = READ_BIT(heth->Instance->MACCR, ETH_MACCR_DM);
2276 macconf->Speed = READ_BIT(heth->Instance->MACCR, ETH_MACCR_FES);
2277 macconf->Jabber = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JD) >> 22) == 0U) ? ENABLE : DISABLE;
2278 macconf->Watchdog = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_WD) >> 23) == 0U) ? ENABLE : DISABLE;
2279 macconf->AutomaticPadCRCStrip = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_APCS) >> 7) > 0U) ? ENABLE : DISABLE;
2280 macconf->InterPacketGapVal = READ_BIT(heth->Instance->MACCR, ETH_MACCR_IFG);
2281 macconf->ChecksumOffload = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPCO) >> 10U) > 0U) ? ENABLE : DISABLE;
2282 macconf->CRCStripTypePacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_CSTF) >> 25U) > 0U) ? ENABLE : DISABLE;
2284 macconf->TransmitFlowControl = ((READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_TFCE) >> 1) > 0U) ? ENABLE : DISABLE;
2285 macconf->ZeroQuantaPause = ((READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_ZQPD) >> 7) == 0U) ? ENABLE : DISABLE;
2286 macconf->PauseLowThreshold = READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_PLT);
2287 macconf->PauseTime = (READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_PT) >> 16);
2288 macconf->ReceiveFlowControl = ((READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_RFCE) >> 2U) > 0U) ? ENABLE : DISABLE;
2289 macconf->UnicastPausePacketDetect = ((READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_UPFD) >> 3U) > 0U)
2303HAL_StatusTypeDef HAL_ETH_GetDMAConfig(
const ETH_HandleTypeDef *heth, ETH_DMAConfigTypeDef *dmaconf)
2305 if (dmaconf == NULL)
2310 dmaconf->DMAArbitration = READ_BIT(heth->Instance->DMABMR,
2311 (ETH_DMAARBITRATION_RXPRIORTX | ETH_DMAARBITRATION_ROUNDROBIN_RXTX_4_1));
2312 dmaconf->AddressAlignedBeats = ((READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_AAB) >> 25U) > 0U) ? ENABLE : DISABLE;
2313 dmaconf->BurstMode = READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_FB | ETH_DMABMR_MB);
2314 dmaconf->RxDMABurstLength = READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_RDP);
2315 dmaconf->TxDMABurstLength = READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_PBL);
2316 dmaconf->EnhancedDescriptorFormat = ((READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_EDE) >> 7) > 0U) ? ENABLE : DISABLE;
2317 dmaconf->DescriptorSkipLength = READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_DSL) >> 2;
2319 dmaconf->DropTCPIPChecksumErrorFrame = ((READ_BIT(heth->Instance->DMAOMR,
2320 ETH_DMAOMR_DTCEFD) >> 26) > 0U) ? DISABLE : ENABLE;
2321 dmaconf->ReceiveStoreForward = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_RSF) >> 25) > 0U) ? ENABLE : DISABLE;
2322 dmaconf->FlushRxPacket = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_FTF) >> 20) > 0U) ? DISABLE : ENABLE;
2323 dmaconf->TransmitStoreForward = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_TSF) >> 21) > 0U) ? ENABLE : DISABLE;
2324 dmaconf->TransmitThresholdControl = READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_TTC);
2325 dmaconf->ForwardErrorFrames = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_FEF) >> 7) > 0U) ? ENABLE : DISABLE;
2326 dmaconf->ForwardUndersizedGoodFrames = ((READ_BIT(heth->Instance->DMAOMR,
2327 ETH_DMAOMR_FUGF) >> 6) > 0U) ? ENABLE : DISABLE;
2328 dmaconf->ReceiveThresholdControl = READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_RTC);
2329 dmaconf->SecondFrameOperate = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_OSF) >> 2) > 0U) ? ENABLE : DISABLE;
2342HAL_StatusTypeDef HAL_ETH_SetMACConfig(ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
2344 if (macconf == NULL)
2349 if (heth->gState == HAL_ETH_STATE_READY)
2351 ETH_SetMACConfig(heth, macconf);
2369HAL_StatusTypeDef HAL_ETH_SetDMAConfig(ETH_HandleTypeDef *heth, ETH_DMAConfigTypeDef *dmaconf)
2371 if (dmaconf == NULL)
2376 if (heth->gState == HAL_ETH_STATE_READY)
2378 ETH_SetDMAConfig(heth, dmaconf);
2394void HAL_ETH_SetMDIOClockRange(ETH_HandleTypeDef *heth)
2400 tmpreg = (heth->Instance)->MACMIIAR;
2402 tmpreg &= ETH_MACMIIAR_CR_MASK;
2408 if (hclk < 35000000U)
2411 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16;
2413 else if (hclk < 60000000U)
2416 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26;
2418 else if (hclk < 100000000U)
2421 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42;
2423 else if (hclk < 150000000U)
2426 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62;
2431 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div102;
2435 (heth->Instance)->MACMIIAR = (uint32_t)tmpreg;
2446HAL_StatusTypeDef HAL_ETH_SetMACFilterConfig(ETH_HandleTypeDef *heth,
const ETH_MACFilterConfigTypeDef *pFilterConfig)
2448 uint32_t filterconfig;
2451 if (pFilterConfig == NULL)
2456 filterconfig = ((uint32_t)pFilterConfig->PromiscuousMode |
2457 ((uint32_t)pFilterConfig->HashUnicast << 1) |
2458 ((uint32_t)pFilterConfig->HashMulticast << 2) |
2459 ((uint32_t)pFilterConfig->DestAddrInverseFiltering << 3) |
2460 ((uint32_t)pFilterConfig->PassAllMulticast << 4) |
2461 ((uint32_t)((pFilterConfig->BroadcastFilter == ENABLE) ? 1U : 0U) << 5) |
2462 ((uint32_t)pFilterConfig->SrcAddrInverseFiltering << 8) |
2463 ((uint32_t)pFilterConfig->SrcAddrFiltering << 9) |
2464 ((uint32_t)pFilterConfig->HachOrPerfectFilter << 10) |
2465 ((uint32_t)pFilterConfig->ReceiveAllMode << 31) |
2466 pFilterConfig->ControlPacketsFilter);
2468 MODIFY_REG(heth->Instance->MACFFR, ETH_MACFFR_MASK, filterconfig);
2472 tmpreg1 = (heth->Instance)->MACFFR;
2474 (heth->Instance)->MACFFR = tmpreg1;
2487HAL_StatusTypeDef HAL_ETH_GetMACFilterConfig(
const ETH_HandleTypeDef *heth, ETH_MACFilterConfigTypeDef *pFilterConfig)
2489 if (pFilterConfig == NULL)
2494 pFilterConfig->PromiscuousMode = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_PM)) > 0U) ? ENABLE : DISABLE;
2495 pFilterConfig->HashUnicast = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_HU) >> 1) > 0U) ? ENABLE : DISABLE;
2496 pFilterConfig->HashMulticast = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_HM) >> 2) > 0U) ? ENABLE : DISABLE;
2497 pFilterConfig->DestAddrInverseFiltering = ((READ_BIT(heth->Instance->MACFFR,
2498 ETH_MACFFR_DAIF) >> 3) > 0U) ? ENABLE : DISABLE;
2499 pFilterConfig->PassAllMulticast = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_PAM) >> 4) > 0U) ? ENABLE : DISABLE;
2500 pFilterConfig->BroadcastFilter = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_BFD) >> 5) > 0U) ? ENABLE : DISABLE;
2501 pFilterConfig->ControlPacketsFilter = READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_PCF);
2502 pFilterConfig->SrcAddrInverseFiltering = ((READ_BIT(heth->Instance->MACFFR,
2503 ETH_MACFFR_SAIF) >> 8) > 0U) ? ENABLE : DISABLE;
2504 pFilterConfig->SrcAddrFiltering = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_SAF) >> 9) > 0U) ? ENABLE : DISABLE;
2505 pFilterConfig->HachOrPerfectFilter = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_HPF) >> 10) > 0U)
2507 pFilterConfig->ReceiveAllMode = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_RA) >> 31) > 0U) ? ENABLE : DISABLE;
2524HAL_StatusTypeDef HAL_ETH_SetSourceMACAddrMatch(
const ETH_HandleTypeDef *heth, uint32_t AddrNbr,
2525 const uint8_t *pMACAddr)
2530 if (pMACAddr == NULL)
2536 macaddrhr = ((uint32_t) &(heth->Instance->MACA0HR) + AddrNbr);
2538 macaddrlr = ((uint32_t) &(heth->Instance->MACA0LR) + AddrNbr);
2541 (*(__IO uint32_t *)macaddrhr) = (((uint32_t)(pMACAddr[5]) << 8) | (uint32_t)pMACAddr[4]);
2543 (*(__IO uint32_t *)macaddrlr) = (((uint32_t)(pMACAddr[3]) << 24) | ((uint32_t)(pMACAddr[2]) << 16) |
2544 ((uint32_t)(pMACAddr[1]) << 8) | (uint32_t)pMACAddr[0]);
2547 (*(__IO uint32_t *)macaddrhr) |= (ETH_MACA1HR_AE | ETH_MACA1HR_SA);
2560HAL_StatusTypeDef HAL_ETH_SetHashTable(ETH_HandleTypeDef *heth, uint32_t *pHashTable)
2563 if (pHashTable == NULL)
2568 heth->Instance->MACHTHR = pHashTable[0];
2572 tmpreg1 = (heth->Instance)->MACHTHR;
2574 (heth->Instance)->MACHTHR = tmpreg1;
2576 heth->Instance->MACHTLR = pHashTable[1];
2580 tmpreg1 = (heth->Instance)->MACHTLR;
2582 (heth->Instance)->MACHTLR = tmpreg1;
2596void HAL_ETH_SetRxVLANIdentifier(ETH_HandleTypeDef *heth, uint32_t ComparisonBits, uint32_t VLANIdentifier)
2599 MODIFY_REG(heth->Instance->MACVLANTR, ETH_MACVLANTR_VLANTI, VLANIdentifier);
2600 if (ComparisonBits == ETH_VLANTAGCOMPARISON_16BIT)
2602 CLEAR_BIT(heth->Instance->MACVLANTR, ETH_MACVLANTR_VLANTC);
2606 SET_BIT(heth->Instance->MACVLANTR, ETH_MACVLANTR_VLANTC);
2611 tmpreg1 = (heth->Instance)->MACVLANTR;
2613 (heth->Instance)->MACVLANTR = tmpreg1;
2624void HAL_ETH_EnterPowerDownMode(ETH_HandleTypeDef *heth,
const ETH_PowerDownConfigTypeDef *pPowerDownConfig)
2626 uint32_t powerdownconfig;
2628 powerdownconfig = (((uint32_t)pPowerDownConfig->MagicPacket << ETH_MACPMTCSR_MPE_Pos) |
2629 ((uint32_t)pPowerDownConfig->WakeUpPacket << ETH_MACPMTCSR_WFE_Pos) |
2630 ((uint32_t)pPowerDownConfig->GlobalUnicast << ETH_MACPMTCSR_GU_Pos) |
2633 MODIFY_REG(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_MASK, powerdownconfig);
2642void HAL_ETH_ExitPowerDownMode(ETH_HandleTypeDef *heth)
2647 CLEAR_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_WFE | ETH_MACPMTCSR_MPE | ETH_MACPMTCSR_GU);
2651 tmpreg1 = (heth->Instance)->MACPMTCSR;
2653 (heth->Instance)->MACPMTCSR = tmpreg1;
2655 if (READ_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_PD) != 0U)
2658 CLEAR_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_PD);
2662 tmpreg1 = (heth->Instance)->MACPMTCSR;
2664 (heth->Instance)->MACPMTCSR = tmpreg1;
2668 SET_BIT(heth->Instance->MACIMR, ETH_MACIMR_PMTIM);
2679HAL_StatusTypeDef HAL_ETH_SetWakeUpFilter(ETH_HandleTypeDef *heth, uint32_t *pFilter, uint32_t Count)
2683 if (pFilter == NULL)
2689 SET_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_WFFRPR);
2692 for (regindex = 0; regindex < Count; regindex++)
2695 WRITE_REG(heth->Instance->MACRWUFFR, pFilter[regindex]);
2728HAL_ETH_StateTypeDef HAL_ETH_GetState(
const ETH_HandleTypeDef *heth)
2730 return heth->gState;
2739uint32_t HAL_ETH_GetError(
const ETH_HandleTypeDef *heth)
2741 return heth->ErrorCode;
2750uint32_t HAL_ETH_GetDMAError(
const ETH_HandleTypeDef *heth)
2752 return heth->DMAErrorCode;
2761uint32_t HAL_ETH_GetMACError(
const ETH_HandleTypeDef *heth)
2763 return heth->MACErrorCode;
2772uint32_t HAL_ETH_GetMACWakeUpSource(
const ETH_HandleTypeDef *heth)
2774 return heth->MACWakeUpEvent;
2783uint32_t HAL_ETH_GetTxBuffersNumber(
const ETH_HandleTypeDef *heth)
2785 return heth->TxDescList.BuffersInUse;
2805static void ETH_FlushTransmitFIFO(ETH_HandleTypeDef *heth)
2807 __IO uint32_t tmpreg = 0;
2810 (heth->Instance)->DMAOMR |= ETH_DMAOMR_FTF;
2814 tmpreg = (heth->Instance)->DMAOMR;
2816 (heth->Instance)->DMAOMR = tmpreg;
2819static void ETH_SetMACConfig(ETH_HandleTypeDef *heth,
const ETH_MACConfigTypeDef *macconf)
2825 tmpreg1 = (heth->Instance)->MACCR;
2827 tmpreg1 &= ETH_MACCR_CLEAR_MASK;
2829 tmpreg1 |= (uint32_t)(((uint32_t)macconf->CRCStripTypePacket << 25U) |
2830 ((uint32_t)((macconf->Watchdog == DISABLE) ? 1U : 0U) << 23U) |
2831 ((uint32_t)((macconf->Jabber == DISABLE) ? 1U : 0U) << 22U) |
2832 (uint32_t)macconf->InterPacketGapVal |
2833 ((uint32_t)macconf->CarrierSenseDuringTransmit << 16U) |
2835 ((uint32_t)((macconf->ReceiveOwn == DISABLE) ? 1U : 0U) << 13U) |
2836 ((uint32_t)macconf->LoopbackMode << 12U) |
2837 macconf->DuplexMode |
2838 ((uint32_t)macconf->ChecksumOffload << 10U) |
2839 ((uint32_t)((macconf->RetryTransmission == DISABLE) ? 1U : 0U) << 9U) |
2840 ((uint32_t)macconf->AutomaticPadCRCStrip << 7U) |
2841 macconf->BackOffLimit |
2842 ((uint32_t)macconf->DeferralCheck << 4U));
2845 (heth->Instance)->MACCR = (uint32_t)tmpreg1;
2849 tmpreg1 = (heth->Instance)->MACCR;
2851 (heth->Instance)->MACCR = tmpreg1;
2856 tmpreg1 = (heth->Instance)->MACFCR;
2858 tmpreg1 &= ETH_MACFCR_CLEAR_MASK;
2860 tmpreg1 |= (uint32_t)((macconf->PauseTime << 16U) |
2861 ((uint32_t)((macconf->ZeroQuantaPause == DISABLE) ? 1U : 0U) << 7U) |
2862 macconf->PauseLowThreshold |
2863 ((uint32_t)((macconf->UnicastPausePacketDetect == ENABLE) ? 1U : 0U) << 3U) |
2864 ((uint32_t)((macconf->ReceiveFlowControl == ENABLE) ? 1U : 0U) << 2U) |
2865 ((uint32_t)((macconf->TransmitFlowControl == ENABLE) ? 1U : 0U) << 1U));
2868 (heth->Instance)->MACFCR = (uint32_t)tmpreg1;
2872 tmpreg1 = (heth->Instance)->MACFCR;
2874 (heth->Instance)->MACFCR = tmpreg1;
2877static void ETH_SetDMAConfig(ETH_HandleTypeDef *heth,
const ETH_DMAConfigTypeDef *dmaconf)
2883 tmpreg1 = (heth->Instance)->DMAOMR;
2885 tmpreg1 &= ETH_DMAOMR_CLEAR_MASK;
2887 tmpreg1 |= (uint32_t)(((uint32_t)((dmaconf->DropTCPIPChecksumErrorFrame == DISABLE) ? 1U : 0U) << 26U) |
2888 ((uint32_t)dmaconf->ReceiveStoreForward << 25U) |
2889 ((uint32_t)((dmaconf->FlushRxPacket == DISABLE) ? 1U : 0U) << 20U) |
2890 ((uint32_t)dmaconf->TransmitStoreForward << 21U) |
2891 dmaconf->TransmitThresholdControl |
2892 ((uint32_t)dmaconf->ForwardErrorFrames << 7U) |
2893 ((uint32_t)dmaconf->ForwardUndersizedGoodFrames << 6U) |
2894 dmaconf->ReceiveThresholdControl |
2895 ((uint32_t)dmaconf->SecondFrameOperate << 2U));
2898 (heth->Instance)->DMAOMR = (uint32_t)tmpreg1;
2902 tmpreg1 = (heth->Instance)->DMAOMR;
2904 (heth->Instance)->DMAOMR = tmpreg1;
2907 (heth->Instance)->DMABMR = (uint32_t)(((uint32_t)dmaconf->AddressAlignedBeats << 25U) |
2908 dmaconf->BurstMode |
2909 dmaconf->RxDMABurstLength |
2911 dmaconf->TxDMABurstLength |
2912 ((uint32_t)dmaconf->EnhancedDescriptorFormat << 7U) |
2913 (dmaconf->DescriptorSkipLength << 2U) |
2914 dmaconf->DMAArbitration |
2919 tmpreg1 = (heth->Instance)->DMABMR;
2921 (heth->Instance)->DMABMR = tmpreg1;
2931static void ETH_MACDMAConfig(ETH_HandleTypeDef *heth)
2933 ETH_MACConfigTypeDef macDefaultConf;
2934 ETH_DMAConfigTypeDef dmaDefaultConf;
2937 macDefaultConf.Watchdog = ENABLE;
2938 macDefaultConf.Jabber = ENABLE;
2939 macDefaultConf.InterPacketGapVal = ETH_INTERFRAMEGAP_96BIT;
2940 macDefaultConf.CarrierSenseDuringTransmit = DISABLE;
2941 macDefaultConf.ReceiveOwn = ENABLE;
2942 macDefaultConf.LoopbackMode = DISABLE;
2943 macDefaultConf.CRCStripTypePacket = ENABLE;
2944 macDefaultConf.ChecksumOffload = ENABLE;
2945 macDefaultConf.RetryTransmission = DISABLE;
2946 macDefaultConf.AutomaticPadCRCStrip = DISABLE;
2947 macDefaultConf.BackOffLimit = ETH_BACKOFFLIMIT_10;
2948 macDefaultConf.DeferralCheck = DISABLE;
2949 macDefaultConf.PauseTime = 0x0U;
2950 macDefaultConf.ZeroQuantaPause = DISABLE;
2951 macDefaultConf.PauseLowThreshold = ETH_PAUSELOWTHRESHOLD_MINUS4;
2952 macDefaultConf.ReceiveFlowControl = DISABLE;
2953 macDefaultConf.TransmitFlowControl = DISABLE;
2954 macDefaultConf.Speed = ETH_SPEED_100M;
2955 macDefaultConf.DuplexMode = ETH_FULLDUPLEX_MODE;
2956 macDefaultConf.UnicastPausePacketDetect = DISABLE;
2959 ETH_SetMACConfig(heth, &macDefaultConf);
2962 dmaDefaultConf.DropTCPIPChecksumErrorFrame = ENABLE;
2963 dmaDefaultConf.ReceiveStoreForward = ENABLE;
2964 dmaDefaultConf.FlushRxPacket = ENABLE;
2965 dmaDefaultConf.TransmitStoreForward = ENABLE;
2966 dmaDefaultConf.TransmitThresholdControl = ETH_TRANSMITTHRESHOLDCONTROL_64BYTES;
2967 dmaDefaultConf.ForwardErrorFrames = DISABLE;
2968 dmaDefaultConf.ForwardUndersizedGoodFrames = DISABLE;
2969 dmaDefaultConf.ReceiveThresholdControl = ETH_RECEIVEDTHRESHOLDCONTROL_64BYTES;
2970 dmaDefaultConf.SecondFrameOperate = ENABLE;
2971 dmaDefaultConf.AddressAlignedBeats = ENABLE;
2972 dmaDefaultConf.BurstMode = ETH_BURSTLENGTH_FIXED;
2973 dmaDefaultConf.RxDMABurstLength = ETH_RXDMABURSTLENGTH_32BEAT;
2974 dmaDefaultConf.TxDMABurstLength = ETH_TXDMABURSTLENGTH_32BEAT;
2975 dmaDefaultConf.EnhancedDescriptorFormat = ENABLE;
2976 dmaDefaultConf.DescriptorSkipLength = 0x0U;
2977 dmaDefaultConf.DMAArbitration = ETH_DMAARBITRATION_ROUNDROBIN_RXTX_1_1;
2980 ETH_SetDMAConfig(heth, &dmaDefaultConf);
2995static void ETH_MACAddressConfig(ETH_HandleTypeDef *heth, uint32_t MacAddr, uint8_t *Addr)
3003 tmpreg1 = ((uint32_t)Addr[5U] << 8U) | (uint32_t)Addr[4U];
3005 (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_HBASE + MacAddr))) = tmpreg1;
3007 tmpreg1 = ((uint32_t)Addr[3U] << 24U) | ((uint32_t)Addr[2U] << 16U) | ((uint32_t)Addr[1U] << 8U) | Addr[0U];
3010 (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_LBASE + MacAddr))) = tmpreg1;
3020static void ETH_DMATxDescListInit(ETH_HandleTypeDef *heth)
3022 ETH_DMADescTypeDef *dmatxdesc;
3026 for (i = 0; i < (uint32_t)ETH_TX_DESC_CNT; i++)
3028 dmatxdesc = heth->Init.TxDesc + i;
3030 WRITE_REG(dmatxdesc->DESC0, 0x0U);
3031 WRITE_REG(dmatxdesc->DESC1, 0x0U);
3032 WRITE_REG(dmatxdesc->DESC2, 0x0U);
3033 WRITE_REG(dmatxdesc->DESC3, 0x0U);
3035 WRITE_REG(heth->TxDescList.TxDesc[i], (uint32_t)dmatxdesc);
3038 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_TCH);
3040 if (i < ((uint32_t)ETH_TX_DESC_CNT - 1U))
3042 WRITE_REG(dmatxdesc->DESC3, (uint32_t)(heth->Init.TxDesc + i + 1U));
3046 WRITE_REG(dmatxdesc->DESC3, (uint32_t)(heth->Init.TxDesc));
3050 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_CHECKSUMTCPUDPICMPFULL);
3053 heth->TxDescList.CurTxDesc = 0;
3056 WRITE_REG(heth->Instance->DMATDLAR, (uint32_t) heth->Init.TxDesc);
3066static void ETH_DMARxDescListInit(ETH_HandleTypeDef *heth)
3068 ETH_DMADescTypeDef *dmarxdesc;
3071 for (i = 0; i < (uint32_t)ETH_RX_DESC_CNT; i++)
3073 dmarxdesc = heth->Init.RxDesc + i;
3075 WRITE_REG(dmarxdesc->DESC0, 0x0U);
3076 WRITE_REG(dmarxdesc->DESC1, 0x0U);
3077 WRITE_REG(dmarxdesc->DESC2, 0x0U);
3078 WRITE_REG(dmarxdesc->DESC3, 0x0U);
3079 WRITE_REG(dmarxdesc->BackupAddr0, 0x0U);
3080 WRITE_REG(dmarxdesc->BackupAddr1, 0x0U);
3083 dmarxdesc->DESC0 = ETH_DMARXDESC_OWN;
3086 dmarxdesc->DESC1 = heth->Init.RxBuffLen | ETH_DMARXDESC_RCH;
3089 dmarxdesc->DESC1 &= ~ETH_DMARXDESC_DIC;
3091 WRITE_REG(heth->RxDescList.RxDesc[i], (uint32_t)dmarxdesc);
3093 if (i < ((uint32_t)ETH_RX_DESC_CNT - 1U))
3095 WRITE_REG(dmarxdesc->DESC3, (uint32_t)(heth->Init.RxDesc + i + 1U));
3099 WRITE_REG(dmarxdesc->DESC3, (uint32_t)(heth->Init.RxDesc));
3103 WRITE_REG(heth->RxDescList.RxDescIdx, 0U);
3104 WRITE_REG(heth->RxDescList.RxDescCnt, 0U);
3105 WRITE_REG(heth->RxDescList.RxBuildDescIdx, 0U);
3106 WRITE_REG(heth->RxDescList.RxBuildDescCnt, 0U);
3107 WRITE_REG(heth->RxDescList.ItMode, 0U);
3110 WRITE_REG(heth->Instance->DMARDLAR, (uint32_t) heth->Init.RxDesc);
3122static uint32_t ETH_Prepare_Tx_Descriptors(ETH_HandleTypeDef *heth,
const ETH_TxPacketConfigTypeDef *pTxConfig,
3125 ETH_TxDescListTypeDef *dmatxdesclist = &heth->TxDescList;
3126 uint32_t descidx = dmatxdesclist->CurTxDesc;
3127 uint32_t firstdescidx = dmatxdesclist->CurTxDesc;
3129 uint32_t descnbr = 0;
3130 ETH_DMADescTypeDef *dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3132 ETH_BufferTypeDef *txbuffer = pTxConfig->TxBuffer;
3133 uint32_t bd_count = 0;
3134 uint32_t primask_bit;
3137 if ((READ_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN) == ETH_DMATXDESC_OWN)
3138 || (dmatxdesclist->PacketAddress[descidx] != NULL))
3140 return HAL_ETH_ERROR_BUSY;
3147 WRITE_REG(dmatxdesc->DESC2, (uint32_t)txbuffer->buffer);
3150 MODIFY_REG(dmatxdesc->DESC1, ETH_DMATXDESC_TBS1, txbuffer->len);
3152 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != 0U)
3154 MODIFY_REG(dmatxdesc->DESC0, ETH_DMATXDESC_CIC, pTxConfig->ChecksumCtrl);
3157 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_CRCPAD) != 0U)
3159 MODIFY_REG(dmatxdesc->DESC0, ETH_CRC_PAD_DISABLE, pTxConfig->CRCPadCtrl);
3163 if (READ_BIT(pTxConfig->Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != 0U)
3166 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_VF);
3170 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_FS);
3173 while (txbuffer->next != NULL)
3176 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_LS);
3177 if (ItMode != ((uint32_t)RESET))
3180 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3185 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3188 INCR_TX_DESC_INDEX(descidx, 1U);
3190 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3193 if ((READ_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN) == ETH_DMATXDESC_OWN)
3194 || (dmatxdesclist->PacketAddress[descidx] != NULL))
3196 descidx = firstdescidx;
3197 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3200 for (idx = 0; idx < descnbr; idx ++)
3205 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN);
3208 INCR_TX_DESC_INDEX(descidx, 1U);
3210 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[descidx];
3213 return HAL_ETH_ERROR_BUSY;
3217 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_FS);
3222 txbuffer = txbuffer->next;
3225 WRITE_REG(dmatxdesc->DESC2, (uint32_t)txbuffer->buffer);
3228 MODIFY_REG(dmatxdesc->DESC1, ETH_DMATXDESC_TBS1, txbuffer->len);
3235 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN);
3238 if (ItMode != ((uint32_t)RESET))
3241 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3246 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3250 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_LS);
3253 dmatxdesc = (ETH_DMADescTypeDef *)dmatxdesclist->TxDesc[firstdescidx];
3257 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN);
3259 dmatxdesclist->PacketAddress[descidx] = dmatxdesclist->CurrentPacketAddress;
3261 dmatxdesclist->CurTxDesc = descidx;
3264 primask_bit = __get_PRIMASK();
3267 dmatxdesclist->BuffersInUse += bd_count + 1U;
3270 __set_PRIMASK(primask_bit);
3273 return HAL_ETH_ERROR_NONE;
3276#if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
3277static void ETH_InitCallbacksToDefault(ETH_HandleTypeDef *heth)
3280 heth->TxCpltCallback = HAL_ETH_TxCpltCallback;
3281 heth->RxCpltCallback = HAL_ETH_RxCpltCallback;
3282 heth->ErrorCallback = HAL_ETH_ErrorCallback;
3283 heth->PMTCallback = HAL_ETH_PMTCallback;
3284 heth->WakeUpCallback = HAL_ETH_WakeUpCallback;
3285 heth->rxLinkCallback = HAL_ETH_RxLinkCallback;
3286 heth->txFreeCallback = HAL_ETH_TxFreeCallback;
3287#ifdef HAL_ETH_USE_PTP
3288 heth->txPtpCallback = HAL_ETH_TxPtpCallback;
3290 heth->rxAllocateCallback = HAL_ETH_RxAllocateCallback;
void HAL_Delay(uint32_t Delay)
This function provides minimum delay (in milliseconds) based on variable incremented.
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define __HAL_RCC_SYSCFG_CLK_ENABLE()
uint32_t HAL_RCC_GetHCLKFreq(void)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition.