183 #ifdef HAL_ETH_MODULE_ENABLED
197 #define ETH_MACCR_MASK 0xFFFB7F7CU
198 #define ETH_MACECR_MASK 0x3F077FFFU
199 #define ETH_MACFFR_MASK 0x800007FFU
200 #define ETH_MACWTR_MASK 0x0000010FU
201 #define ETH_MACTFCR_MASK 0xFFFF00F2U
202 #define ETH_MACRFCR_MASK 0x00000003U
203 #define ETH_MTLTQOMR_MASK 0x00000072U
204 #define ETH_MTLRQOMR_MASK 0x0000007BU
206 #define ETH_DMAMR_MASK 0x00007802U
207 #define ETH_DMASBMR_MASK 0x0000D001U
208 #define ETH_DMACCR_MASK 0x00013FFFU
209 #define ETH_DMACTCR_MASK 0x003F1010U
210 #define ETH_DMACRCR_MASK 0x803F0000U
211 #define ETH_MACPMTCSR_MASK (ETH_MACPMTCSR_PD | ETH_MACPMTCSR_WFE | \
212 ETH_MACPMTCSR_MPE | ETH_MACPMTCSR_GU)
215 #define ETH_SWRESET_TIMEOUT 500U
216 #define ETH_MDIO_BUS_TIMEOUT 1000U
218 #define ETH_DMARXDESC_ERRORS_MASK ((uint32_t)(ETH_DMARXDESC_DBE | ETH_DMARXDESC_RE | \
219 ETH_DMARXDESC_OE | ETH_DMARXDESC_RWT |\
220 ETH_DMARXDESC_LC | ETH_DMARXDESC_CE |\
221 ETH_DMARXDESC_DE | ETH_DMARXDESC_IPV4HCE))
223 #define ETH_MAC_US_TICK 1000000U
225 #define ETH_MACTSCR_MASK 0x0087FF2FU
227 #define ETH_PTPTSHR_VALUE 0xFFFFFFFFU
228 #define ETH_PTPTSLR_VALUE 0xBB9ACA00U
231 #define ETH_MACMIIAR_CR_MASK 0xFFFFFFE3U
234 #define ETH_REG_WRITE_DELAY 0x00000001U
237 #define ETH_MACCR_CLEAR_MASK 0xFD20810FU
240 #define ETH_MACFCR_CLEAR_MASK 0x0000FF41U
243 #define ETH_DMAOMR_CLEAR_MASK 0xF8DE3F23U
246 #define ETH_MAC_ADDR_HBASE (uint32_t)(ETH_MAC_BASE + 0x40U)
247 #define ETH_MAC_ADDR_LBASE (uint32_t)(ETH_MAC_BASE + 0x44U)
250 #define ETH_DMARXDESC_FRAMELENGTHSHIFT 16U
260 #define INCR_TX_DESC_INDEX(inx, offset) do {\
262 if ((inx) >= (uint32_t)ETH_TX_DESC_CNT){\
263 (inx) = ((inx) - (uint32_t)ETH_TX_DESC_CNT);}\
267 #define INCR_RX_DESC_INDEX(inx, offset) do {\
269 if ((inx) >= (uint32_t)ETH_RX_DESC_CNT){\
270 (inx) = ((inx) - (uint32_t)ETH_RX_DESC_CNT);}\
288 static void ETH_MACAddressConfig(
ETH_HandleTypeDef *heth, uint32_t MacAddr, uint8_t *Addr);
290 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
344 if (heth->gState == HAL_ETH_STATE_RESET)
346 heth->gState = HAL_ETH_STATE_BUSY;
348 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
350 ETH_InitCallbacksToDefault(heth);
352 if (heth->MspInitCallback == NULL)
358 heth->MspInitCallback(heth);
366 __HAL_RCC_SYSCFG_CLK_ENABLE();
369 SYSCFG->PMC &= ~(SYSCFG_PMC_MII_RMII_SEL);
370 SYSCFG->PMC |= (uint32_t)heth->Init.MediaInterface;
377 SET_BIT(heth->Instance->DMABMR, ETH_DMABMR_SR);
383 while (READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_SR) > 0U)
385 if (((
HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
388 heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
390 heth->gState = HAL_ETH_STATE_ERROR;
398 ETH_MACDMAConfig(heth);
402 ETH_DMATxDescListInit(heth);
405 ETH_DMARxDescListInit(heth);
408 ETH_MACAddressConfig(heth, ETH_MAC_ADDRESS0, heth->Init.MACAddr);
411 SET_BIT(heth->Instance->MACIMR, ETH_MACIMR_TSTIM | ETH_MACIMR_PMTIM);
414 SET_BIT(heth->Instance->MMCRIMR, ETH_MMCRIMR_RGUFM | ETH_MMCRIMR_RFAEM | \
418 SET_BIT(heth->Instance->MMCTIMR, ETH_MMCTIMR_TGFM | ETH_MMCTIMR_TGFMSCM | \
421 heth->ErrorCode = HAL_ETH_ERROR_NONE;
422 heth->gState = HAL_ETH_STATE_READY;
436 heth->gState = HAL_ETH_STATE_BUSY;
438 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
440 if (heth->MspDeInitCallback == NULL)
445 heth->MspDeInitCallback(heth);
454 heth->gState = HAL_ETH_STATE_RESET;
490 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
510 HAL_StatusTypeDef status = HAL_OK;
512 if (pCallback == NULL)
515 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
519 if (heth->gState == HAL_ETH_STATE_READY)
524 heth->TxCpltCallback = pCallback;
528 heth->RxCpltCallback = pCallback;
532 heth->ErrorCallback = pCallback;
536 heth->PMTCallback = pCallback;
541 heth->WakeUpCallback = pCallback;
545 heth->MspInitCallback = pCallback;
549 heth->MspDeInitCallback = pCallback;
554 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
560 else if (heth->gState == HAL_ETH_STATE_RESET)
565 heth->MspInitCallback = pCallback;
569 heth->MspDeInitCallback = pCallback;
574 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
583 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
608 HAL_StatusTypeDef status = HAL_OK;
610 if (heth->gState == HAL_ETH_STATE_READY)
645 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
651 else if (heth->gState == HAL_ETH_STATE_RESET)
665 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
674 heth->ErrorCode |= HAL_ETH_ERROR_INVALID_CALLBACK;
712 if (heth->gState == HAL_ETH_STATE_READY)
714 heth->gState = HAL_ETH_STATE_BUSY;
717 heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
720 ETH_UpdateDescriptor(heth);
723 SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
727 tmpreg1 = (heth->Instance)->MACCR;
729 (heth->Instance)->MACCR = tmpreg1;
732 SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
736 tmpreg1 = (heth->Instance)->MACCR;
738 (heth->Instance)->MACCR = tmpreg1;
741 ETH_FlushTransmitFIFO(heth);
744 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
747 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
749 heth->gState = HAL_ETH_STATE_STARTED;
769 if (heth->gState == HAL_ETH_STATE_READY)
771 heth->gState = HAL_ETH_STATE_BUSY;
774 heth->RxDescList.ItMode = 1U;
777 heth->RxDescList.RxBuildDescCnt = ETH_RX_DESC_CNT;
780 ETH_UpdateDescriptor(heth);
784 tmpreg1 = (heth->Instance)->MACCR;
786 (heth->Instance)->MACCR = tmpreg1;
789 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
792 SET_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
795 ETH_FlushTransmitFIFO(heth);
799 SET_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
803 tmpreg1 = (heth->Instance)->MACCR;
805 (heth->Instance)->MACCR = tmpreg1;
808 SET_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
815 __HAL_ETH_DMA_ENABLE_IT(heth, (ETH_DMAIER_NISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE |
816 ETH_DMAIER_FBEIE | ETH_DMAIER_AISE | ETH_DMAIER_RBUIE));
818 heth->gState = HAL_ETH_STATE_STARTED;
837 if (heth->gState == HAL_ETH_STATE_STARTED)
840 heth->gState = HAL_ETH_STATE_BUSY;
843 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
846 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
849 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
853 tmpreg1 = (heth->Instance)->MACCR;
855 (heth->Instance)->MACCR = tmpreg1;
858 ETH_FlushTransmitFIFO(heth);
861 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
865 tmpreg1 = (heth->Instance)->MACCR;
867 (heth->Instance)->MACCR = tmpreg1;
869 heth->gState = HAL_ETH_STATE_READY;
892 if (heth->gState == HAL_ETH_STATE_STARTED)
895 heth->gState = HAL_ETH_STATE_BUSY;
897 __HAL_ETH_DMA_DISABLE_IT(heth, (ETH_DMAIER_NISE | ETH_DMAIER_RIE | ETH_DMAIER_TIE |
898 ETH_DMAIER_FBEIE | ETH_DMAIER_AISE | ETH_DMAIER_RBUIE));
901 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_ST);
904 CLEAR_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_SR);
907 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_RE);
912 tmpreg1 = (heth->Instance)->MACCR;
914 (heth->Instance)->MACCR = tmpreg1;
917 ETH_FlushTransmitFIFO(heth);
920 CLEAR_BIT(heth->Instance->MACCR, ETH_MACCR_TE);
924 tmpreg1 = (heth->Instance)->MACCR;
926 (heth->Instance)->MACCR = tmpreg1;
929 for (descindex = 0; descindex < (uint32_t)ETH_RX_DESC_CNT; descindex++)
932 SET_BIT(dmarxdesc->DESC1, ETH_DMARXDESC_DIC);
935 heth->RxDescList.ItMode = 0U;
937 heth->gState = HAL_ETH_STATE_READY;
961 if (pTxConfig == NULL)
963 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
967 if (heth->gState == HAL_ETH_STATE_STARTED)
970 if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 0) != HAL_ETH_ERROR_NONE)
973 heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
980 dmatxdesc = (
ETH_DMADescTypeDef *)(&heth->TxDescList)->TxDesc[heth->TxDescList.CurTxDesc];
983 INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
987 WRITE_REG(heth->Instance->DMATPDR, (uint32_t)(heth->TxDescList.TxDesc[heth->TxDescList.CurTxDesc]));
992 while ((dmatxdesc->DESC0 & ETH_DMATXDESC_OWN) != (uint32_t)RESET)
994 if ((heth->Instance->DMASR & ETH_DMASR_FBES) != (uint32_t)RESET)
996 heth->ErrorCode |= HAL_ETH_ERROR_DMA;
997 heth->DMAErrorCode = heth->Instance->DMASR;
1003 if (Timeout != HAL_MAX_DELAY)
1005 if (((
HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
1007 heth->ErrorCode |= HAL_ETH_ERROR_TIMEOUT;
1009 dmatxdesc->DESC0 = (ETH_DMATXDESC_FS | ETH_DMATXDESC_LS);
1033 if (pTxConfig == NULL)
1035 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
1039 if (heth->gState == HAL_ETH_STATE_STARTED)
1042 heth->TxDescList.CurrentPacketAddress = (uint32_t *)pTxConfig->
pData;
1045 if (ETH_Prepare_Tx_Descriptors(heth, pTxConfig, 1) != HAL_ETH_ERROR_NONE)
1047 heth->ErrorCode |= HAL_ETH_ERROR_BUSY;
1055 INCR_TX_DESC_INDEX(heth->TxDescList.CurTxDesc, 1U);
1059 if (((heth->Instance)->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET)
1062 (heth->Instance)->DMASR = ETH_DMASR_TBUS;
1064 (heth->Instance)->DMATPDR = 0U;
1087 uint32_t desccnt = 0U;
1088 uint32_t desccntmax;
1089 uint32_t bufflength;
1090 uint8_t rxdataready = 0U;
1092 if (pAppBuff == NULL)
1094 heth->ErrorCode |= HAL_ETH_ERROR_PARAM;
1098 if (heth->gState != HAL_ETH_STATE_STARTED)
1103 descidx = heth->RxDescList.RxDescIdx;
1105 desccntmax = ETH_RX_DESC_CNT - heth->RxDescList.RxBuildDescCnt;
1108 while ((READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_OWN) == (uint32_t)RESET) && (desccnt < desccntmax)
1109 && (rxdataready == 0U))
1111 if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_LS) != (uint32_t)RESET)
1114 heth->RxDescList.TimeStamp.TimeStampHigh = dmarxdesc->DESC7;
1116 heth->RxDescList.TimeStamp.TimeStampLow = dmarxdesc->DESC6;
1118 if ((READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_FS) != (uint32_t)RESET) || (heth->RxDescList.pRxStart != NULL))
1121 if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_FS) != (uint32_t)RESET)
1123 heth->RxDescList.RxDescCnt = 0;
1124 heth->RxDescList.RxDataLength = 0;
1128 bufflength = ((dmarxdesc->DESC0 & ETH_DMARXDESC_FL) >> ETH_DMARXDESC_FRAMELENGTHSHIFT);
1131 if (READ_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_LS) != (uint32_t)RESET)
1134 heth->RxDescList.pRxLastRxDesc = dmarxdesc->DESC0;
1141 WRITE_REG(dmarxdesc->BackupAddr0, dmarxdesc->DESC2);
1142 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1144 heth->rxLinkCallback(&heth->RxDescList.pRxStart, &heth->RxDescList.pRxEnd,
1145 (uint8_t *)dmarxdesc->BackupAddr0, bufflength);
1149 (uint8_t *)dmarxdesc->BackupAddr0, (uint16_t) bufflength);
1151 heth->RxDescList.RxDescCnt++;
1152 heth->RxDescList.RxDataLength += bufflength;
1155 dmarxdesc->BackupAddr0 = 0;
1159 INCR_RX_DESC_INDEX(descidx, 1U);
1165 heth->RxDescList.RxBuildDescCnt += desccnt;
1166 if ((heth->RxDescList.RxBuildDescCnt) != 0U)
1169 ETH_UpdateDescriptor(heth);
1172 heth->RxDescList.RxDescIdx = descidx;
1174 if (rxdataready == 1U)
1177 *pAppBuff = heth->RxDescList.pRxStart;
1179 heth->RxDescList.pRxStart = NULL;
1202 uint8_t *buff = NULL;
1203 uint8_t allocStatus = 1U;
1205 descidx = heth->RxDescList.RxBuildDescIdx;
1207 desccount = heth->RxDescList.RxBuildDescCnt;
1209 while ((desccount > 0U) && (allocStatus != 0U))
1212 if (READ_REG(dmarxdesc->BackupAddr0) == 0U)
1215 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1217 heth->rxAllocateCallback(&buff);
1228 WRITE_REG(dmarxdesc->BackupAddr0, (uint32_t)buff);
1229 WRITE_REG(dmarxdesc->DESC2, (uint32_t)buff);
1233 if (allocStatus != 0U)
1235 if (heth->RxDescList.ItMode == 0U)
1237 WRITE_REG(dmarxdesc->DESC1, heth->Init.RxBuffLen | ETH_DMARXDESC_DIC | ETH_DMARXDESC_RCH);
1241 WRITE_REG(dmarxdesc->DESC1, heth->Init.RxBuffLen | ETH_DMARXDESC_RCH);
1244 SET_BIT(dmarxdesc->DESC0, ETH_DMARXDESC_OWN);
1247 INCR_RX_DESC_INDEX(descidx, 1U);
1254 if (heth->RxDescList.RxBuildDescCnt != desccount)
1257 tailidx = (descidx + 1U) % ETH_RX_DESC_CNT;
1263 WRITE_REG(heth->Instance->DMARPDR, ((uint32_t)(heth->Init.RxDesc + (tailidx))));
1265 heth->RxDescList.RxBuildDescIdx = descidx;
1266 heth->RxDescList.RxBuildDescCnt = desccount;
1280 if (rxAllocateCallback == NULL)
1287 heth->rxAllocateCallback = rxAllocateCallback;
1349 if (rxLinkCallback == NULL)
1356 heth->rxLinkCallback = rxLinkCallback;
1385 *pErrorCode = READ_BIT(heth->RxDescList.pRxLastRxDesc, ETH_DMARXDESC_ERRORS_MASK);
1399 if (txFreeCallback == NULL)
1406 heth->txFreeCallback = txFreeCallback;
1448 uint32_t numOfBuf = dmatxdesclist->BuffersInUse;
1449 uint32_t idx = dmatxdesclist->releaseIndex;
1450 uint8_t pktTxStatus = 1U;
1452 #ifdef HAL_ETH_USE_PTP
1457 while ((numOfBuf != 0U) && (pktTxStatus != 0U))
1462 if (dmatxdesclist->PacketAddress[idx] == NULL)
1465 INCR_TX_DESC_INDEX(idx, 1U);
1472 if ((heth->Init.TxDesc[idx].DESC0 & ETH_DMATXDESC_OWN) == 0U)
1474 #ifdef HAL_ETH_USE_PTP
1475 if ((heth->Init.TxDesc[idx].DESC3 & ETH_DMATXDESC_LS)
1476 && (heth->Init.TxDesc[idx].DESC3 & ETH_DMATXDESC_TTSS))
1479 timestamp->TimeStampLow = heth->Init.TxDesc[idx].DESC6;
1481 timestamp->TimeStampHigh = heth->Init.TxDesc[idx].DESC7;
1485 timestamp->TimeStampHigh = timestamp->TimeStampLow = UINT32_MAX;
1489 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1491 #ifdef HAL_ETH_USE_PTP
1493 if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX)
1495 heth->txPtpCallback(dmatxdesclist->PacketAddress[idx], timestamp);
1499 heth->txFreeCallback(dmatxdesclist->PacketAddress[idx]);
1502 #ifdef HAL_ETH_USE_PTP
1504 if (timestamp->TimeStampHigh != UINT32_MAX && timestamp->TimeStampLow != UINT32_MAX)
1514 dmatxdesclist->PacketAddress[idx] = NULL;
1517 INCR_TX_DESC_INDEX(idx, 1U);
1518 dmatxdesclist->BuffersInUse = numOfBuf;
1519 dmatxdesclist->releaseIndex = idx;
1531 #ifdef HAL_ETH_USE_PTP
1545 if (ptpconfig == NULL)
1552 ((uint32_t)ptpconfig->
TimestampAll << ETH_PTPTSCR_TSSARFE_Pos) |
1554 ((uint32_t)ptpconfig->
TimestampV2 << ETH_PTPTSCR_TSPTPPSV2E_Pos) |
1556 ((uint32_t)ptpconfig->
TimestampIPv6 << ETH_PTPTSCR_TSSIPV6FE_Pos) |
1557 ((uint32_t)ptpconfig->
TimestampIPv4 << ETH_PTPTSCR_TSSIPV4FE_Pos) |
1558 ((uint32_t)ptpconfig->
TimestampEvent << ETH_PTPTSCR_TSSEME_Pos) |
1564 MODIFY_REG(heth->Instance->PTPTSCR, ETH_MACTSCR_MASK, tmpTSCR);
1567 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSE);
1574 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSARU);
1575 while ((heth->Instance->PTPTSCR & ETH_PTPTSCR_TSARU) != 0)
1582 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSTI);
1585 heth->IsPtpConfigured = HAL_ETH_PTP_CONFIGURED;
1588 time.Seconds = heth->Instance->PTPTSHR;
1590 time.NanoSeconds = heth->Instance->PTPTSLR;
1608 if (ptpconfig == NULL)
1612 ptpconfig->
Timestamp = READ_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSE);
1614 ETH_PTPTSCR_TSFCU) >> ETH_PTPTSCR_TSFCU_Pos) > 0U) ? ENABLE : DISABLE;
1615 ptpconfig->
TimestampAll = ((READ_BIT(heth->Instance->PTPTSCR,
1616 ETH_PTPTSCR_TSSARFE) >> ETH_PTPTSCR_TSSARFE_Pos) > 0U) ? ENABLE : DISABLE;
1618 ETH_PTPTSCR_TSSSR) >> ETH_PTPTSCR_TSSSR_Pos) > 0U)
1620 ptpconfig->
TimestampV2 = ((READ_BIT(heth->Instance->PTPTSCR,
1621 ETH_PTPTSCR_TSPTPPSV2E) >> ETH_PTPTSCR_TSPTPPSV2E_Pos) > 0U) ? ENABLE : DISABLE;
1623 ETH_PTPTSCR_TSSPTPOEFE) >> ETH_PTPTSCR_TSSPTPOEFE_Pos) > 0U)
1625 ptpconfig->
TimestampIPv6 = ((READ_BIT(heth->Instance->PTPTSCR,
1626 ETH_PTPTSCR_TSSIPV6FE) >> ETH_PTPTSCR_TSSIPV6FE_Pos) > 0U) ? ENABLE : DISABLE;
1627 ptpconfig->
TimestampIPv4 = ((READ_BIT(heth->Instance->PTPTSCR,
1628 ETH_PTPTSCR_TSSIPV4FE) >> ETH_PTPTSCR_TSSIPV4FE_Pos) > 0U) ? ENABLE : DISABLE;
1630 ETH_PTPTSCR_TSSEME) >> ETH_PTPTSCR_TSSEME_Pos) > 0U) ? ENABLE : DISABLE;
1632 ETH_PTPTSCR_TSSMRME) >> ETH_PTPTSCR_TSSMRME_Pos) > 0U) ? ENABLE : DISABLE;
1634 ETH_PTPTSCR_TSPFFMAE) >> ETH_PTPTSCR_TSPFFMAE_Pos) > 0U) ? ENABLE : DISABLE;
1636 ETH_PTPTSCR_TSCNT) >> ETH_PTPTSCR_TSCNT_Pos) > 0U) ? ENABLE : DISABLE;
1652 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1655 heth->Instance->PTPTSHUR = time->Seconds;
1658 heth->Instance->PTPTSLUR = time->NanoSeconds;
1661 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSTU);
1683 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1686 time->Seconds = heth->Instance->PTPTSHR;
1688 time->NanoSeconds = heth->Instance->PTPTSLR;
1711 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1716 heth->Instance->PTPTSHUR = ETH_PTPTSHR_VALUE - timeoffset->Seconds + 1U;
1718 if (READ_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSSR) == ETH_PTPTSCR_TSSSR)
1721 heth->Instance->PTPTSLUR = ETH_PTPTSLR_VALUE - timeoffset->NanoSeconds;
1725 heth->Instance->PTPTSLUR = ETH_PTPTSHR_VALUE - timeoffset->NanoSeconds + 1U;
1731 heth->Instance->PTPTSHUR = timeoffset->Seconds;
1733 heth->Instance->PTPTSLUR = timeoffset->NanoSeconds;
1736 SET_BIT(heth->Instance->PTPTSCR, ETH_PTPTSCR_TSSTU);
1757 uint32_t descidx = dmatxdesclist->CurTxDesc;
1760 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1763 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_TTSE);
1786 uint32_t idx = dmatxdesclist->releaseIndex;
1789 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1792 timestamp->TimeStampLow = dmatxdesc->DESC0;
1794 timestamp->TimeStampHigh = dmatxdesc->DESC1;
1816 if (heth->IsPtpConfigured == HAL_ETH_PTP_CONFIGURED)
1819 timestamp->TimeStampLow = heth->RxDescList.TimeStamp.TimeStampLow;
1821 timestamp->TimeStampHigh = heth->RxDescList.TimeStamp.TimeStampHigh;
1842 if (txPtpCallback == NULL)
1848 heth->txPtpCallback = txPtpCallback;
1892 uint32_t mac_flag = READ_REG(heth->Instance->MACSR);
1893 uint32_t dma_flag = READ_REG(heth->Instance->DMASR);
1894 uint32_t dma_itsource = READ_REG(heth->Instance->DMAIER);
1895 uint32_t exti_flag = READ_REG(EXTI->PR);
1898 if (((dma_flag & ETH_DMASR_RS) != 0U) && ((dma_itsource & ETH_DMAIER_RIE) != 0U))
1901 __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMASR_RS | ETH_DMASR_NIS);
1903 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1905 heth->RxCpltCallback(heth);
1913 if (((dma_flag & ETH_DMASR_TS) != 0U) && ((dma_itsource & ETH_DMAIER_TIE) != 0U))
1916 __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMASR_TS | ETH_DMASR_NIS);
1918 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1920 heth->TxCpltCallback(heth);
1928 if (((dma_flag & ETH_DMASR_AIS) != 0U) && ((dma_itsource & ETH_DMAIER_AISE) != 0U))
1930 heth->ErrorCode |= HAL_ETH_ERROR_DMA;
1932 if ((dma_flag & ETH_DMASR_FBES) != 0U)
1935 heth->DMAErrorCode = READ_BIT(heth->Instance->DMASR, (ETH_DMASR_FBES | ETH_DMASR_TPS | ETH_DMASR_RPS));
1938 __HAL_ETH_DMA_DISABLE_IT(heth, ETH_DMAIER_NISE | ETH_DMAIER_AISE);
1941 heth->gState = HAL_ETH_STATE_ERROR;
1946 heth->DMAErrorCode = READ_BIT(heth->Instance->DMASR, (ETH_DMASR_ETS | ETH_DMASR_RWTS |
1947 ETH_DMASR_RBUS | ETH_DMASR_AIS));
1950 __HAL_ETH_DMA_CLEAR_IT(heth, (ETH_DMASR_ETS | ETH_DMASR_RWTS |
1951 ETH_DMASR_RBUS | ETH_DMASR_AIS));
1953 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1955 heth->ErrorCallback(heth);
1964 if ((mac_flag & ETH_MAC_PMT_IT) != 0U)
1967 heth->MACWakeUpEvent = READ_BIT(heth->Instance->MACPMTCSR, (ETH_MACPMTCSR_WFR | ETH_MACPMTCSR_MPR));
1969 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1971 heth->PMTCallback(heth);
1977 heth->MACWakeUpEvent = (uint32_t)(0x0U);
1982 if ((exti_flag & ETH_WAKEUP_EXTI_LINE) != 0U)
1985 __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG(ETH_WAKEUP_EXTI_LINE);
1986 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
1988 heth->WakeUpCallback(heth);
2082 uint32_t *pRegValue)
2088 tmpreg1 = heth->Instance->MACMIIAR;
2091 tmpreg1 &= ~ETH_MACMIIAR_CR_MASK;
2094 tmpreg1 |= ((PHYAddr << 11U) & ETH_MACMIIAR_PA);
2095 tmpreg1 |= (((uint32_t)PHYReg << 6U) & ETH_MACMIIAR_MR);
2096 tmpreg1 &= ~ETH_MACMIIAR_MW;
2097 tmpreg1 |= ETH_MACMIIAR_MB;
2100 heth->Instance->MACMIIAR = tmpreg1;
2106 while ((tmpreg1 & ETH_MACMIIAR_MB) == ETH_MACMIIAR_MB)
2114 tmpreg1 = heth->Instance->MACMIIAR;
2118 *pRegValue = (uint16_t)(heth->Instance->MACMIIDR);
2139 tmpreg1 = heth->Instance->MACMIIAR;
2142 tmpreg1 &= ~ETH_MACMIIAR_CR_MASK;
2145 tmpreg1 |= ((PHYAddr << 11U) & ETH_MACMIIAR_PA);
2146 tmpreg1 |= (((uint32_t)PHYReg << 6U) & ETH_MACMIIAR_MR);
2147 tmpreg1 |= ETH_MACMIIAR_MW;
2148 tmpreg1 |= ETH_MACMIIAR_MB;
2151 heth->Instance->MACMIIDR = (uint16_t)RegValue;
2154 heth->Instance->MACMIIAR = tmpreg1;
2160 while ((tmpreg1 & ETH_MACMIIAR_MB) == ETH_MACMIIAR_MB)
2168 tmpreg1 = heth->Instance->MACMIIAR;
2202 if (macconf == NULL)
2208 macconf->
DeferralCheck = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_DC) >> 4) > 0U) ? ENABLE : DISABLE;
2209 macconf->
BackOffLimit = READ_BIT(heth->Instance->MACCR, ETH_MACCR_BL);
2210 macconf->
RetryTransmission = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_RD) >> 9) == 0U) ? ENABLE : DISABLE;
2213 macconf->
ReceiveOwn = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_ROD) >> 13) == 0U) ? ENABLE : DISABLE;
2214 macconf->
LoopbackMode = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_LM) >> 12) > 0U) ? ENABLE : DISABLE;
2215 macconf->
DuplexMode = READ_BIT(heth->Instance->MACCR, ETH_MACCR_DM);
2216 macconf->
Speed = READ_BIT(heth->Instance->MACCR, ETH_MACCR_FES);
2217 macconf->
Jabber = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_JD) >> 22) == 0U) ? ENABLE : DISABLE;
2218 macconf->
Watchdog = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_WD) >> 23) == 0U) ? ENABLE : DISABLE;
2219 macconf->
AutomaticPadCRCStrip = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_APCS) >> 7) > 0U) ? ENABLE : DISABLE;
2221 macconf->
ChecksumOffload = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_IPCO) >> 10U) > 0U) ? ENABLE : DISABLE;
2222 macconf->
CRCStripTypePacket = ((READ_BIT(heth->Instance->MACCR, ETH_MACCR_CSTF) >> 25U) > 0U) ? ENABLE : DISABLE;
2224 macconf->
TransmitFlowControl = ((READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_TFCE) >> 1) > 0U) ? ENABLE : DISABLE;
2225 macconf->
ZeroQuantaPause = ((READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_ZQPD) >> 7) == 0U) ? ENABLE : DISABLE;
2227 macconf->
PauseTime = (READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_PT) >> 16);
2228 macconf->
ReceiveFlowControl = ((READ_BIT(heth->Instance->MACFCR, ETH_MACFCR_RFCE) >> 2U) > 0U) ? ENABLE : DISABLE;
2245 if (dmaconf == NULL)
2251 (ETH_DMAARBITRATION_RXPRIORTX | ETH_DMAARBITRATION_ROUNDROBIN_RXTX_4_1));
2252 dmaconf->
AddressAlignedBeats = ((READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_AAB) >> 25U) > 0U) ? ENABLE : DISABLE;
2253 dmaconf->
BurstMode = READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_FB | ETH_DMABMR_MB);
2254 dmaconf->
RxDMABurstLength = READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_RDP);
2255 dmaconf->
TxDMABurstLength = READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_PBL);
2256 dmaconf->
EnhancedDescriptorFormat = ((READ_BIT(heth->Instance->DMABMR, ETH_DMABMR_EDE) >> 7) > 0U) ? ENABLE : DISABLE;
2260 ETH_DMAOMR_DTCEFD) >> 26) > 0U) ? DISABLE : ENABLE;
2261 dmaconf->
ReceiveStoreForward = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_RSF) >> 25) > 0U) ? ENABLE : DISABLE;
2262 dmaconf->
FlushRxPacket = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_FTF) >> 20) > 0U) ? DISABLE : ENABLE;
2263 dmaconf->
TransmitStoreForward = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_TSF) >> 21) > 0U) ? ENABLE : DISABLE;
2265 dmaconf->
ForwardErrorFrames = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_FEF) >> 7) > 0U) ? ENABLE : DISABLE;
2267 ETH_DMAOMR_FUGF) >> 6) > 0U) ? ENABLE : DISABLE;
2269 dmaconf->
SecondFrameOperate = ((READ_BIT(heth->Instance->DMAOMR, ETH_DMAOMR_OSF) >> 2) > 0U) ? ENABLE : DISABLE;
2284 if (macconf == NULL)
2289 if (heth->gState == HAL_ETH_STATE_READY)
2291 ETH_SetMACConfig(heth, macconf);
2311 if (dmaconf == NULL)
2316 if (heth->gState == HAL_ETH_STATE_READY)
2318 ETH_SetDMAConfig(heth, dmaconf);
2340 tmpreg = (heth->Instance)->MACMIIAR;
2342 tmpreg &= ETH_MACMIIAR_CR_MASK;
2348 if (hclk < 35000000U)
2351 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16;
2353 else if (hclk < 60000000U)
2356 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26;
2358 else if (hclk < 100000000U)
2361 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42;
2363 else if (hclk < 150000000U)
2366 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62;
2371 tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div102;
2375 (heth->Instance)->MACMIIAR = (uint32_t)tmpreg;
2388 uint32_t filterconfig;
2391 if (pFilterConfig == NULL)
2401 ((uint32_t)((pFilterConfig->
BroadcastFilter == DISABLE) ? 1U : 0U) << 5) |
2408 MODIFY_REG(heth->Instance->MACFFR, ETH_MACFFR_MASK, filterconfig);
2412 tmpreg1 = (heth->Instance)->MACFFR;
2414 (heth->Instance)->MACFFR = tmpreg1;
2429 if (pFilterConfig == NULL)
2434 pFilterConfig->
PromiscuousMode = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_PM)) > 0U) ? ENABLE : DISABLE;
2435 pFilterConfig->
HashUnicast = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_HU) >> 1) > 0U) ? ENABLE : DISABLE;
2436 pFilterConfig->
HashMulticast = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_HM) >> 2) > 0U) ? ENABLE : DISABLE;
2438 ETH_MACFFR_DAIF) >> 3) > 0U) ? ENABLE : DISABLE;
2439 pFilterConfig->
PassAllMulticast = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_PAM) >> 4) > 0U) ? ENABLE : DISABLE;
2440 pFilterConfig->
BroadcastFilter = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_BFD) >> 5) == 0U) ? ENABLE : DISABLE;
2443 ETH_MACFFR_SAIF) >> 8) > 0U) ? ENABLE : DISABLE;
2444 pFilterConfig->
SrcAddrFiltering = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_SAF) >> 9) > 0U) ? ENABLE : DISABLE;
2445 pFilterConfig->
HachOrPerfectFilter = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_HPF) >> 10) > 0U)
2447 pFilterConfig->
ReceiveAllMode = ((READ_BIT(heth->Instance->MACFFR, ETH_MACFFR_RA) >> 31) > 0U) ? ENABLE : DISABLE;
2465 const uint8_t *pMACAddr)
2470 if (pMACAddr == NULL)
2476 macaddrhr = ((uint32_t) &(heth->Instance->MACA0HR) + AddrNbr);
2478 macaddrlr = ((uint32_t) &(heth->Instance->MACA0LR) + AddrNbr);
2481 (*(__IO uint32_t *)macaddrhr) = (((uint32_t)(pMACAddr[5]) << 8) | (uint32_t)pMACAddr[4]);
2483 (*(__IO uint32_t *)macaddrlr) = (((uint32_t)(pMACAddr[3]) << 24) | ((uint32_t)(pMACAddr[2]) << 16) |
2484 ((uint32_t)(pMACAddr[1]) << 8) | (uint32_t)pMACAddr[0]);
2487 (*(__IO uint32_t *)macaddrhr) |= (ETH_MACA1HR_AE | ETH_MACA1HR_SA);
2503 if (pHashTable == NULL)
2508 heth->Instance->MACHTHR = pHashTable[0];
2512 tmpreg1 = (heth->Instance)->MACHTHR;
2514 (heth->Instance)->MACHTHR = tmpreg1;
2516 heth->Instance->MACHTLR = pHashTable[1];
2520 tmpreg1 = (heth->Instance)->MACHTLR;
2522 (heth->Instance)->MACHTLR = tmpreg1;
2539 MODIFY_REG(heth->Instance->MACVLANTR, ETH_MACVLANTR_VLANTI, VLANIdentifier);
2540 if (ComparisonBits == ETH_VLANTAGCOMPARISON_16BIT)
2542 CLEAR_BIT(heth->Instance->MACVLANTR, ETH_MACVLANTR_VLANTC);
2546 SET_BIT(heth->Instance->MACVLANTR, ETH_MACVLANTR_VLANTC);
2551 tmpreg1 = (heth->Instance)->MACVLANTR;
2553 (heth->Instance)->MACVLANTR = tmpreg1;
2566 uint32_t powerdownconfig;
2568 powerdownconfig = (((uint32_t)pPowerDownConfig->
MagicPacket << ETH_MACPMTCSR_MPE_Pos) |
2569 ((uint32_t)pPowerDownConfig->
WakeUpPacket << ETH_MACPMTCSR_WFE_Pos) |
2570 ((uint32_t)pPowerDownConfig->
GlobalUnicast << ETH_MACPMTCSR_GU_Pos) |
2573 MODIFY_REG(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_MASK, powerdownconfig);
2587 CLEAR_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_WFE | ETH_MACPMTCSR_MPE | ETH_MACPMTCSR_GU);
2591 tmpreg1 = (heth->Instance)->MACPMTCSR;
2593 (heth->Instance)->MACPMTCSR = tmpreg1;
2595 if (READ_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_PD) != 0U)
2598 CLEAR_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_PD);
2602 tmpreg1 = (heth->Instance)->MACPMTCSR;
2604 (heth->Instance)->MACPMTCSR = tmpreg1;
2608 SET_BIT(heth->Instance->MACIMR, ETH_MACIMR_PMTIM);
2623 if (pFilter == NULL)
2629 SET_BIT(heth->Instance->MACPMTCSR, ETH_MACPMTCSR_WFFRPR);
2632 for (regindex = 0; regindex < Count; regindex++)
2635 WRITE_REG(heth->Instance->MACRWUFFR, pFilter[regindex]);
2670 return heth->gState;
2681 return heth->ErrorCode;
2692 return heth->DMAErrorCode;
2703 return heth->MACErrorCode;
2714 return heth->MACWakeUpEvent;
2737 __IO uint32_t tmpreg = 0;
2740 (heth->Instance)->DMAOMR |= ETH_DMAOMR_FTF;
2744 tmpreg = (heth->Instance)->DMAOMR;
2746 (heth->Instance)->DMAOMR = tmpreg;
2755 tmpreg1 = (heth->Instance)->MACCR;
2757 tmpreg1 &= ETH_MACCR_CLEAR_MASK;
2760 ((uint32_t)((macconf->
Watchdog == DISABLE) ? 1U : 0U) << 23U) |
2761 ((uint32_t)((macconf->
Jabber == DISABLE) ? 1U : 0U) << 22U) |
2765 ((uint32_t)((macconf->
ReceiveOwn == DISABLE) ? 1U : 0U) << 13U) |
2775 (heth->Instance)->MACCR = (uint32_t)tmpreg1;
2779 tmpreg1 = (heth->Instance)->MACCR;
2781 (heth->Instance)->MACCR = tmpreg1;
2786 tmpreg1 = (heth->Instance)->MACFCR;
2788 tmpreg1 &= ETH_MACFCR_CLEAR_MASK;
2790 tmpreg1 |= (uint32_t)((macconf->
PauseTime << 16U) |
2798 (heth->Instance)->MACFCR = (uint32_t)tmpreg1;
2802 tmpreg1 = (heth->Instance)->MACFCR;
2804 (heth->Instance)->MACFCR = tmpreg1;
2813 tmpreg1 = (heth->Instance)->DMAOMR;
2815 tmpreg1 &= ETH_DMAOMR_CLEAR_MASK;
2819 ((uint32_t)((dmaconf->
FlushRxPacket == DISABLE) ? 1U : 0U) << 20U) |
2828 (heth->Instance)->DMAOMR = (uint32_t)tmpreg1;
2832 tmpreg1 = (heth->Instance)->DMAOMR;
2834 (heth->Instance)->DMAOMR = tmpreg1;
2849 tmpreg1 = (heth->Instance)->DMABMR;
2851 (heth->Instance)->DMABMR = tmpreg1;
2868 macDefaultConf.
Jabber = ENABLE;
2884 macDefaultConf.
Speed = ETH_SPEED_100M;
2885 macDefaultConf.
DuplexMode = ETH_FULLDUPLEX_MODE;
2889 ETH_SetMACConfig(heth, &macDefaultConf);
2902 dmaDefaultConf.
BurstMode = ETH_BURSTLENGTH_FIXED;
2907 dmaDefaultConf.
DMAArbitration = ETH_DMAARBITRATION_ROUNDROBIN_RXTX_1_1;
2910 ETH_SetDMAConfig(heth, &dmaDefaultConf);
2925 static void ETH_MACAddressConfig(
ETH_HandleTypeDef *heth, uint32_t MacAddr, uint8_t *Addr)
2933 tmpreg1 = ((uint32_t)Addr[5U] << 8U) | (uint32_t)Addr[4U];
2935 (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_HBASE + MacAddr))) = tmpreg1;
2937 tmpreg1 = ((uint32_t)Addr[3U] << 24U) | ((uint32_t)Addr[2U] << 16U) | ((uint32_t)Addr[1U] << 8U) | Addr[0U];
2940 (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_LBASE + MacAddr))) = tmpreg1;
2956 for (i = 0; i < (uint32_t)ETH_TX_DESC_CNT; i++)
2958 dmatxdesc = heth->Init.TxDesc + i;
2960 WRITE_REG(dmatxdesc->DESC0, 0x0U);
2961 WRITE_REG(dmatxdesc->DESC1, 0x0U);
2962 WRITE_REG(dmatxdesc->DESC2, 0x0U);
2963 WRITE_REG(dmatxdesc->DESC3, 0x0U);
2965 WRITE_REG(heth->TxDescList.TxDesc[i], (uint32_t)dmatxdesc);
2968 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_TCH);
2970 if (i < ((uint32_t)ETH_TX_DESC_CNT - 1U))
2972 WRITE_REG(dmatxdesc->DESC3, (uint32_t)(heth->Init.TxDesc + i + 1U));
2976 WRITE_REG(dmatxdesc->DESC3, (uint32_t)(heth->Init.TxDesc));
2980 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_CHECKSUMTCPUDPICMPFULL);
2983 heth->TxDescList.CurTxDesc = 0;
2986 WRITE_REG(heth->Instance->DMATDLAR, (uint32_t) heth->Init.TxDesc);
3001 for (i = 0; i < (uint32_t)ETH_RX_DESC_CNT; i++)
3003 dmarxdesc = heth->Init.RxDesc + i;
3005 WRITE_REG(dmarxdesc->DESC0, 0x0U);
3006 WRITE_REG(dmarxdesc->DESC1, 0x0U);
3007 WRITE_REG(dmarxdesc->DESC2, 0x0U);
3008 WRITE_REG(dmarxdesc->DESC3, 0x0U);
3009 WRITE_REG(dmarxdesc->BackupAddr0, 0x0U);
3010 WRITE_REG(dmarxdesc->BackupAddr1, 0x0U);
3013 dmarxdesc->DESC0 = ETH_DMARXDESC_OWN;
3016 dmarxdesc->DESC1 = heth->Init.RxBuffLen | ETH_DMARXDESC_RCH;
3019 dmarxdesc->DESC1 &= ~ETH_DMARXDESC_DIC;
3021 WRITE_REG(heth->RxDescList.RxDesc[i], (uint32_t)dmarxdesc);
3023 if (i < ((uint32_t)ETH_RX_DESC_CNT - 1U))
3025 WRITE_REG(dmarxdesc->DESC3, (uint32_t)(heth->Init.RxDesc + i + 1U));
3029 WRITE_REG(dmarxdesc->DESC3, (uint32_t)(heth->Init.RxDesc));
3033 WRITE_REG(heth->RxDescList.RxDescIdx, 0U);
3034 WRITE_REG(heth->RxDescList.RxDescCnt, 0U);
3035 WRITE_REG(heth->RxDescList.RxBuildDescIdx, 0U);
3036 WRITE_REG(heth->RxDescList.RxBuildDescCnt, 0U);
3037 WRITE_REG(heth->RxDescList.ItMode, 0U);
3040 WRITE_REG(heth->Instance->DMARDLAR, (uint32_t) heth->Init.RxDesc);
3056 uint32_t descidx = dmatxdesclist->CurTxDesc;
3057 uint32_t firstdescidx = dmatxdesclist->CurTxDesc;
3059 uint32_t descnbr = 0;
3063 uint32_t bd_count = 0;
3064 uint32_t primask_bit;
3067 if ((READ_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN) == ETH_DMATXDESC_OWN)
3068 || (dmatxdesclist->PacketAddress[descidx] != NULL))
3070 return HAL_ETH_ERROR_BUSY;
3077 WRITE_REG(dmatxdesc->DESC2, (uint32_t)txbuffer->buffer);
3080 MODIFY_REG(dmatxdesc->DESC1, ETH_DMATXDESC_TBS1, txbuffer->len);
3082 if (READ_BIT(pTxConfig->
Attributes, ETH_TX_PACKETS_FEATURES_CSUM) != 0U)
3084 MODIFY_REG(dmatxdesc->DESC0, ETH_DMATXDESC_CIC, pTxConfig->
ChecksumCtrl);
3087 if (READ_BIT(pTxConfig->
Attributes, ETH_TX_PACKETS_FEATURES_CRCPAD) != 0U)
3089 MODIFY_REG(dmatxdesc->DESC0, ETH_CRC_PAD_DISABLE, pTxConfig->
CRCPadCtrl);
3093 if (READ_BIT(pTxConfig->
Attributes, ETH_TX_PACKETS_FEATURES_VLANTAG) != 0U)
3096 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_VF);
3100 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_FS);
3103 while (txbuffer->next != NULL)
3106 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_LS);
3107 if (ItMode != ((uint32_t)RESET))
3110 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3115 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3118 INCR_TX_DESC_INDEX(descidx, 1U);
3123 if ((READ_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN) == ETH_DMATXDESC_OWN)
3124 || (dmatxdesclist->PacketAddress[descidx] != NULL))
3126 descidx = firstdescidx;
3130 for (idx = 0; idx < descnbr; idx ++)
3135 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN);
3138 INCR_TX_DESC_INDEX(descidx, 1U);
3143 return HAL_ETH_ERROR_BUSY;
3147 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_FS);
3152 txbuffer = txbuffer->next;
3155 WRITE_REG(dmatxdesc->DESC2, (uint32_t)txbuffer->buffer);
3158 MODIFY_REG(dmatxdesc->DESC1, ETH_DMATXDESC_TBS1, txbuffer->len);
3165 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN);
3168 if (ItMode != ((uint32_t)RESET))
3171 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3176 CLEAR_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_IC);
3180 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_LS);
3187 SET_BIT(dmatxdesc->DESC0, ETH_DMATXDESC_OWN);
3189 dmatxdesclist->PacketAddress[descidx] = dmatxdesclist->CurrentPacketAddress;
3191 dmatxdesclist->CurTxDesc = descidx;
3194 primask_bit = __get_PRIMASK();
3197 dmatxdesclist->BuffersInUse += bd_count + 1U;
3200 __set_PRIMASK(primask_bit);
3203 return HAL_ETH_ERROR_NONE;
3206 #if (USE_HAL_ETH_REGISTER_CALLBACKS == 1)
3217 #ifdef HAL_ETH_USE_PTP
void HAL_ETH_MspDeInit(ETH_HandleTypeDef *heth)
DeInitializes ETH MSP.
void HAL_ETH_MspInit(ETH_HandleTypeDef *heth)
Initializes the ETH MSP.
HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth)
Initialize the Ethernet peripheral registers.
HAL_StatusTypeDef HAL_ETH_DeInit(ETH_HandleTypeDef *heth)
DeInitializes the ETH peripheral.
HAL_StatusTypeDef HAL_ETH_RegisterCallback(ETH_HandleTypeDef *heth, HAL_ETH_CallbackIDTypeDef CallbackID, pETH_CallbackTypeDef pCallback)
Register a User ETH Callback To be used instead of the weak predefined callback.
HAL_StatusTypeDef HAL_ETH_UnRegisterCallback(ETH_HandleTypeDef *heth, HAL_ETH_CallbackIDTypeDef CallbackID)
Unregister an ETH Callback ETH callback is redirected to the weak predefined callback.
void HAL_ETH_TxFreeCallback(uint32_t *buff)
Tx Free callback.
void HAL_ETH_RxAllocateCallback(uint8_t **buff)
Rx Allocate callback.
HAL_StatusTypeDef HAL_ETH_Transmit_IT(ETH_HandleTypeDef *heth, ETH_TxPacketConfigTypeDef *pTxConfig)
Sends an Ethernet Packet in interrupt mode.
HAL_StatusTypeDef HAL_ETH_Start(ETH_HandleTypeDef *heth)
Enables Ethernet MAC and DMA reception and transmission.
HAL_StatusTypeDef HAL_ETH_RegisterTxPtpCallback(ETH_HandleTypeDef *heth, pETH_txPtpCallbackTypeDef txPtpCallback)
Register the Tx Ptp callback.
HAL_StatusTypeDef HAL_ETH_PTP_GetTime(ETH_HandleTypeDef *heth, ETH_TimeTypeDef *time)
Get Seconds and Nanoseconds for the Ethernet PTP registers.
void HAL_ETH_TxPtpCallback(uint32_t *buff, ETH_TimeStampTypeDef *timestamp)
Tx Ptp callback.
HAL_StatusTypeDef HAL_ETH_UnRegisterRxAllocateCallback(ETH_HandleTypeDef *heth)
Unregister the Rx alloc callback.
HAL_StatusTypeDef HAL_ETH_ReleaseTxPacket(ETH_HandleTypeDef *heth)
Release transmitted Tx packets.
HAL_StatusTypeDef HAL_ETH_PTP_GetConfig(ETH_HandleTypeDef *heth, ETH_PTP_ConfigTypeDef *ptpconfig)
Get the Ethernet PTP configuration.
HAL_StatusTypeDef HAL_ETH_Transmit(ETH_HandleTypeDef *heth, ETH_TxPacketConfigTypeDef *pTxConfig, uint32_t Timeout)
Sends an Ethernet Packet in polling mode.
HAL_StatusTypeDef HAL_ETH_Stop_IT(ETH_HandleTypeDef *heth)
Stop Ethernet MAC and DMA reception/transmission in Interrupt mode.
HAL_StatusTypeDef HAL_ETH_PTP_SetTime(ETH_HandleTypeDef *heth, ETH_TimeTypeDef *time)
Set Seconds and Nanoseconds for the Ethernet PTP registers.
HAL_StatusTypeDef HAL_ETH_WritePHYRegister(const ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg, uint32_t RegValue)
Writes to a PHY register.
HAL_StatusTypeDef HAL_ETH_RegisterRxLinkCallback(ETH_HandleTypeDef *heth, pETH_rxLinkCallbackTypeDef rxLinkCallback)
Set the Rx link data function.
HAL_StatusTypeDef HAL_ETH_RegisterTxFreeCallback(ETH_HandleTypeDef *heth, pETH_txFreeCallbackTypeDef txFreeCallback)
Set the Tx free function.
HAL_StatusTypeDef HAL_ETH_UnRegisterTxFreeCallback(ETH_HandleTypeDef *heth)
Unregister the Tx free callback.
HAL_StatusTypeDef HAL_ETH_PTP_InsertTxTimestamp(ETH_HandleTypeDef *heth)
Insert Timestamp in transmission.
HAL_StatusTypeDef HAL_ETH_RegisterRxAllocateCallback(ETH_HandleTypeDef *heth, pETH_rxAllocateCallbackTypeDef rxAllocateCallback)
Register the Rx alloc callback.
HAL_StatusTypeDef HAL_ETH_Start_IT(ETH_HandleTypeDef *heth)
Enables Ethernet MAC and DMA reception/transmission in Interrupt mode.
HAL_StatusTypeDef HAL_ETH_ReadPHYRegister(ETH_HandleTypeDef *heth, uint32_t PHYAddr, uint32_t PHYReg, uint32_t *pRegValue)
Read a PHY register.
HAL_StatusTypeDef HAL_ETH_GetRxDataErrorCode(const ETH_HandleTypeDef *heth, uint32_t *pErrorCode)
Get the error state of the last received packet.
HAL_StatusTypeDef HAL_ETH_ReadData(ETH_HandleTypeDef *heth, void **pAppBuff)
Read a received packet.
void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length)
Rx Link callback.
void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *heth)
Rx Transfer completed callbacks.
HAL_StatusTypeDef HAL_ETH_PTP_GetRxTimestamp(ETH_HandleTypeDef *heth, ETH_TimeStampTypeDef *timestamp)
Get receive timestamp.
void HAL_ETH_WakeUpCallback(ETH_HandleTypeDef *heth)
ETH WAKEUP interrupt callback.
void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *heth)
Tx Transfer completed callbacks.
void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth)
Ethernet transfer error callbacks.
HAL_StatusTypeDef HAL_ETH_PTP_AddTimeOffset(ETH_HandleTypeDef *heth, ETH_PtpUpdateTypeDef ptpoffsettype, ETH_TimeTypeDef *timeoffset)
Update time for the Ethernet PTP registers.
void HAL_ETH_PMTCallback(ETH_HandleTypeDef *heth)
Ethernet Power Management module IT callback.
void HAL_ETH_IRQHandler(ETH_HandleTypeDef *heth)
This function handles ETH interrupt request.
HAL_StatusTypeDef HAL_ETH_UnRegisterRxLinkCallback(ETH_HandleTypeDef *heth)
Unregister the Rx link callback.
HAL_StatusTypeDef HAL_ETH_Stop(ETH_HandleTypeDef *heth)
Stop Ethernet MAC and DMA reception/transmission.
HAL_StatusTypeDef HAL_ETH_UnRegisterTxPtpCallback(ETH_HandleTypeDef *heth)
Unregister the Tx Ptp callback.
HAL_StatusTypeDef HAL_ETH_PTP_SetConfig(ETH_HandleTypeDef *heth, ETH_PTP_ConfigTypeDef *ptpconfig)
Set the Ethernet PTP configuration.
HAL_StatusTypeDef HAL_ETH_PTP_GetTxTimestamp(ETH_HandleTypeDef *heth, ETH_TimeStampTypeDef *timestamp)
Get transmission timestamp.
HAL_StatusTypeDef HAL_ETH_GetMACFilterConfig(const ETH_HandleTypeDef *heth, ETH_MACFilterConfigTypeDef *pFilterConfig)
Get the ETH MAC (L2) Filters configuration.
HAL_StatusTypeDef HAL_ETH_GetDMAConfig(const ETH_HandleTypeDef *heth, ETH_DMAConfigTypeDef *dmaconf)
Get the configuration of the DMA.
HAL_StatusTypeDef HAL_ETH_SetWakeUpFilter(ETH_HandleTypeDef *heth, uint32_t *pFilter, uint32_t Count)
Set the WakeUp filter.
HAL_StatusTypeDef HAL_ETH_GetMACConfig(const ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
Get the configuration of the MAC and MTL subsystems.
HAL_StatusTypeDef HAL_ETH_SetMACFilterConfig(ETH_HandleTypeDef *heth, const ETH_MACFilterConfigTypeDef *pFilterConfig)
Set the ETH MAC (L2) Filters configuration.
HAL_StatusTypeDef HAL_ETH_SetDMAConfig(ETH_HandleTypeDef *heth, ETH_DMAConfigTypeDef *dmaconf)
Set the ETH DMA configuration.
void HAL_ETH_SetRxVLANIdentifier(ETH_HandleTypeDef *heth, uint32_t ComparisonBits, uint32_t VLANIdentifier)
Set the VLAN Identifier for Rx packets.
void HAL_ETH_EnterPowerDownMode(ETH_HandleTypeDef *heth, const ETH_PowerDownConfigTypeDef *pPowerDownConfig)
Enters the Power down mode.
void HAL_ETH_ExitPowerDownMode(ETH_HandleTypeDef *heth)
Exits from the Power down mode.
HAL_StatusTypeDef HAL_ETH_SetMACConfig(ETH_HandleTypeDef *heth, ETH_MACConfigTypeDef *macconf)
Set the MAC configuration.
void HAL_ETH_SetMDIOClockRange(ETH_HandleTypeDef *heth)
Configures the Clock range of ETH MDIO interface.
HAL_StatusTypeDef HAL_ETH_SetSourceMACAddrMatch(const ETH_HandleTypeDef *heth, uint32_t AddrNbr, const uint8_t *pMACAddr)
Set the source MAC Address to be matched.
HAL_StatusTypeDef HAL_ETH_SetHashTable(ETH_HandleTypeDef *heth, uint32_t *pHashTable)
Set the ETH Hash Table Value.
HAL_ETH_StateTypeDef HAL_ETH_GetState(const ETH_HandleTypeDef *heth)
Returns the ETH state.
uint32_t HAL_ETH_GetMACWakeUpSource(const ETH_HandleTypeDef *heth)
Returns the ETH MAC WakeUp event source.
uint32_t HAL_ETH_GetError(const ETH_HandleTypeDef *heth)
Returns the ETH error code.
uint32_t HAL_ETH_GetDMAError(const ETH_HandleTypeDef *heth)
Returns the ETH DMA error code.
uint32_t HAL_ETH_GetMACError(const ETH_HandleTypeDef *heth)
Returns the ETH MAC error code.
uint32_t TimestampEthernet
FunctionalState WakeUpPacket
FunctionalState AutomaticPadCRCStrip
FunctionalState UnicastPausePacketDetect
FunctionalState ReceiveStoreForward
uint32_t PauseLowThreshold
FunctionalState SrcAddrFiltering
FunctionalState AddressAlignedBeats
FunctionalState ReceiveOwn
FunctionalState RetryTransmission
FunctionalState BroadcastFilter
uint32_t ReceiveThresholdControl
uint32_t ControlPacketsFilter
FunctionalState LoopbackMode
uint32_t TimestampSubsecondInc
FunctionalState SrcAddrInverseFiltering
uint32_t InterPacketGapVal
FunctionalState PassAllMulticast
FunctionalState SecondFrameOperate
FunctionalState HachOrPerfectFilter
uint32_t TimestampAddendUpdate
FunctionalState GlobalUnicast
FunctionalState HashUnicast
FunctionalState ForwardErrorFrames
uint32_t RxDMABurstLength
ETH_BufferTypeDef * TxBuffer
FunctionalState ReceiveAllMode
FunctionalState DestAddrInverseFiltering
FunctionalState ForwardUndersizedGoodFrames
uint32_t TransmitThresholdControl
FunctionalState ChecksumOffload
FunctionalState DeferralCheck
FunctionalState EnhancedDescriptorFormat
FunctionalState ZeroQuantaPause
uint32_t TimestampClockType
uint32_t DescriptorSkipLength
FunctionalState CRCStripTypePacket
FunctionalState DropTCPIPChecksumErrorFrame
FunctionalState MagicPacket
uint32_t TimestampRolloverMode
FunctionalState ReceiveFlowControl
FunctionalState TransmitStoreForward
FunctionalState PromiscuousMode
FunctionalState CarrierSenseDuringTransmit
FunctionalState FlushRxPacket
uint32_t TxDMABurstLength
FunctionalState TransmitFlowControl
FunctionalState HashMulticast
void(* pETH_CallbackTypeDef)(ETH_HandleTypeDef *heth)
HAL ETH Callback pointer definition.
void(* pETH_rxAllocateCallbackTypeDef)(uint8_t **buffer)
HAL ETH Rx Get Buffer Function definition.
void(* pETH_txFreeCallbackTypeDef)(uint32_t *buffer)
HAL ETH Tx Free Function definition.
struct __ETH_HandleTypeDef else typedef struct endif ETH_HandleTypeDef
ETH Handle Structure definition.
ETH_PtpUpdateTypeDef
HAL ETH PTP Update type enum definition.
void(* pETH_rxLinkCallbackTypeDef)(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length)
HAL ETH Rx Set App Data Function definition.
void(* pETH_txPtpCallbackTypeDef)(uint32_t *buffer, ETH_TimeStampTypeDef *timestamp)
HAL ETH Tx Free Function definition.
uint32_t HAL_ETH_StateTypeDef
HAL State structures definition.
HAL_ETH_CallbackIDTypeDef
HAL ETH Callback ID enumeration definition.
@ HAL_ETH_PTP_NEGATIVE_UPDATE
@ HAL_ETH_RX_COMPLETE_CB_ID
@ HAL_ETH_MSPDEINIT_CB_ID
@ HAL_ETH_TX_COMPLETE_CB_ID
ETH DMA Configuration Structure definition.
ETH DMA Descriptor structure definition.
ETH MAC Configuration Structure definition.
ETH MAC filter structure definition.
ETH PTP Init Structure definition.
ETH Power Down structure definition.
ETH Timestamp structure definition.
ETH Timeupdate structure definition.
DMA Transmit Descriptors Wrapper structure definition.
Transmit Packet Configuration structure definition.
ETH Buffers List structure definition.
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.
uint32_t HAL_RCC_GetHCLKFreq(void)
Returns the HCLK frequency.
This file contains all the functions prototypes for the HAL module driver.