32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include "fsl_device_registers.h"
36 #include "fsl_clock.h"
37 #include "fsl_memory.h"
38 #include "fsl_siul2.h"
47 #if defined(__ICCARM__)
50 #pragma data_alignment = 4
51 #pragma location = MCXE31B_ETH_RAM_SECTION
54 #pragma data_alignment = 4
55 #pragma location = MCXE31B_ETH_RAM_SECTION
58 #pragma data_alignment = 4
59 #pragma location = MCXE31B_ETH_RAM_SECTION
62 #pragma data_alignment = 4
63 #pragma location = MCXE31B_ETH_RAM_SECTION
127 TRACE_INFO(
"Initializing MCX E31B Ethernet MAC...\r\n");
130 nicDriverInterface = interface;
136 CLOCK_EnableClock(kCLOCK_Emac);
139 EMAC->DMA_MODE |= EMAC_DMA_MODE_SWR_MASK;
141 while((EMAC->DMA_MODE & EMAC_DMA_MODE_SWR_MASK) != 0)
146 EMAC->MAC_MDIO_ADDRESS = EMAC_MAC_MDIO_ADDRESS_CR(4);
149 if(interface->phyDriver != NULL)
152 error = interface->phyDriver->init(interface);
154 else if(interface->switchDriver != NULL)
157 error = interface->switchDriver->init(interface);
172 EMAC->MAC_CONFIGURATION = EMAC_MAC_CONFIGURATION_GPSLCE_MASK |
173 EMAC_MAC_CONFIGURATION_PS_MASK | EMAC_MAC_CONFIGURATION_DO_MASK;
176 temp = EMAC->MAC_EXT_CONFIGURATION & ~EMAC_MAC_EXT_CONFIGURATION_GPSL_MASK;
183 EMAC->MAC_TX_FLOW_CTRL_Q[0] = 0;
184 EMAC->MAC_RX_FLOW_CTRL = 0;
187 EMAC->MAC_RXQ_CTRL[0] = EMAC_MAC_RXQ_CTRL_RXQ0EN(2);
190 EMAC->DMA_MODE = EMAC_DMA_MODE_PR(0);
192 EMAC->DMA_SYSBUS_MODE |= EMAC_DMA_SYSBUS_MODE_AAL_MASK;
195 EMAC->DMA_CH[0].DMA_CHX_CTRL = EMAC_DMA_CHX_CTRL_DSL(0);
197 EMAC->DMA_CH[0].DMA_CHX_TX_CTRL = EMAC_DMA_CHX_TX_CTRL_TxPBL(32);
200 EMAC->DMA_CH[0].DMA_CHX_RX_CTRL = EMAC_DMA_CHX_RX_CTRL_RxPBL(32) |
204 EMAC->MTL_QUEUE[0].MTL_TXQX_OP_MODE |= EMAC_MTL_TXQX_OP_MODE_TQS(7) |
205 EMAC_MTL_TXQX_OP_MODE_TXQEN(2) | EMAC_MTL_TXQX_OP_MODE_TSF_MASK;
208 EMAC->MTL_QUEUE[0].MTL_RXQX_OP_MODE |= EMAC_MTL_RXQX_OP_MODE_RQS(7) |
209 EMAC_MTL_RXQX_OP_MODE_RSF_MASK;
216 EMAC->MMC_TX_INTERRUPT_MASK = 0xFFFFFFFF;
217 EMAC->MMC_RX_INTERRUPT_MASK = 0xFFFFFFFF;
218 EMAC->MMC_FPE_TX_INTERRUPT_MASK = 0xFFFFFFFF;
219 EMAC->MMC_FPE_RX_INTERRUPT_MASK = 0xFFFFFFFF;
222 EMAC->MAC_INTERRUPT_ENABLE = 0;
225 EMAC->DMA_CH[0].DMA_CHX_INT_EN = EMAC_DMA_CHX_INT_EN_NIE_MASK |
226 EMAC_DMA_CHX_INT_EN_RIE_MASK | EMAC_DMA_CHX_INT_EN_TIE_MASK;
236 EMAC->MAC_CONFIGURATION |= EMAC_MAC_CONFIGURATION_TE_MASK |
237 EMAC_MAC_CONFIGURATION_RE_MASK;
240 EMAC->DMA_CH[0].DMA_CHX_TX_CTRL |= EMAC_DMA_CHX_TX_CTRL_ST_MASK;
241 EMAC->DMA_CH[0].DMA_CHX_RX_CTRL |= EMAC_DMA_CHX_RX_CTRL_SR_MASK;
259 #if defined(USE_FRDM_MCXE31B)
261 DCM_GPR->DCMRWF1 |= DCM_GPR_DCMRWF1_RMII_MII_SEL_MASK;
264 SIUL2_SetPinInputBuffer(SIUL2, 107,
true, 296, kPORT_INPUT_MUX_ALT1);
267 SIUL2_SetPinOutputBuffer(SIUL2, 108,
true, kPORT_MUX_ALT5);
269 SIUL2_SetPinOutputBuffer(SIUL2, 66,
true, kPORT_MUX_ALT5);
271 SIUL2_SetPinOutputBuffer(SIUL2, 103,
true, kPORT_MUX_ALT5);
274 SIUL2_SetPinInputBuffer(SIUL2, 81,
true, 292, kPORT_INPUT_MUX_ALT1);
276 SIUL2_SetPinInputBuffer(SIUL2, 65,
true, 294, kPORT_INPUT_MUX_ALT1);
278 SIUL2_SetPinInputBuffer(SIUL2, 64,
true, 295, kPORT_INPUT_MUX_ALT1);
281 SIUL2_SetPinOutputBuffer(SIUL2, 37,
true, kPORT_MUX_ALT7);
284 SIUL2_SetPinOutputBuffer(SIUL2, 36,
true, kPORT_MUX_ALT5);
285 SIUL2_SetPinInputBuffer(SIUL2, 36,
true, 291, kPORT_INPUT_MUX_ALT1);
288 SIUL2_SetPinOutputBuffer(SIUL2, 67,
true, kPORT_MUX_AS_GPIO);
291 SIUL2_PortPinWrite(SIUL2, kSIUL2_PTC, 3, 0);
293 SIUL2_PortPinWrite(SIUL2, kSIUL2_PTC, 3, 1);
297 CLOCK_SetEmacRmiiTxClkFreq(50000000);
298 CLOCK_AttachClk(kEMAC_RMII_TX_CLK_to_EMAC_TX);
299 CLOCK_AttachClk(kEMAC_RMII_TX_CLK_to_EMAC_RX);
300 CLOCK_AttachClk(kEMAC_RMII_TX_CLK_to_EMAC_TS);
301 CLOCK_SetClkDiv(kCLOCK_DivEmacRxClk, 2);
302 CLOCK_SetClkDiv(kCLOCK_DivEmacTxClk, 2);
303 CLOCK_SetClkDiv(kCLOCK_DivEmacTsClk, 1);
334 rxDmaDesc[i].rdes0 = MEMORY_ConvertMemoryMapAddress(
335 (uint32_t)
rxBuffer[i], kMEMORY_Local2DMA);
346 EMAC->DMA_CH[0].DMA_CHX_TXDESC_LIST_ADDR = MEMORY_ConvertMemoryMapAddress(
347 (uint32_t) &
txDmaDesc[0], kMEMORY_Local2DMA);
353 EMAC->DMA_CH[0].DMA_CHX_RXDESC_LIST_ADDR = MEMORY_ConvertMemoryMapAddress(
354 (uint32_t) &
rxDmaDesc[0], kMEMORY_Local2DMA);
373 if(interface->phyDriver != NULL)
376 interface->phyDriver->tick(interface);
378 else if(interface->switchDriver != NULL)
381 interface->switchDriver->tick(interface);
398 NVIC_EnableIRQ(EMAC_0_IRQn);
401 if(interface->phyDriver != NULL)
404 interface->phyDriver->enableIrq(interface);
406 else if(interface->switchDriver != NULL)
409 interface->switchDriver->enableIrq(interface);
426 NVIC_DisableIRQ(EMAC_0_IRQn);
429 if(interface->phyDriver != NULL)
432 interface->phyDriver->disableIrq(interface);
434 else if(interface->switchDriver != NULL)
437 interface->switchDriver->disableIrq(interface);
462 status = EMAC->DMA_CH[0].DMA_CHX_STAT;
465 if((status & EMAC_DMA_CHX_STAT_TI_MASK) != 0)
468 EMAC->DMA_CH[0].DMA_CHX_STAT = EMAC_DMA_CHX_STAT_TI_MASK;
479 if((status & EMAC_DMA_CHX_STAT_RI_MASK) != 0)
482 EMAC->DMA_CH[0].DMA_CHX_STAT = EMAC_DMA_CHX_STAT_RI_MASK;
485 nicDriverInterface->nicEvent =
TRUE;
491 EMAC->DMA_CH[0].DMA_CHX_STAT = EMAC_DMA_CHX_STAT_NIS_MASK;
555 txDmaDesc[txIndex].tdes0 = MEMORY_ConvertMemoryMapAddress(
556 (uint32_t)
txBuffer[txIndex], kMEMORY_Local2DMA);
567 EMAC->DMA_CH[0].DMA_CHX_STAT = EMAC_DMA_CHX_STAT_TBU_MASK;
569 EMAC->DMA_CH[0].DMA_CHX_TXDESC_TAIL_PTR = 0;
638 rxDmaDesc[rxIndex].rdes0 = MEMORY_ConvertMemoryMapAddress(
639 (uint32_t)
rxBuffer[rxIndex], kMEMORY_Local2DMA);
657 EMAC->DMA_CH[0].DMA_CHX_STAT = EMAC_DMA_CHX_STAT_RBU_MASK;
659 EMAC->DMA_CH[0].DMA_CHX_RXDESC_TAIL_PTR = 0;
678 uint32_t hashTable[2];
686 if(interface->promiscuous)
689 EMAC->MAC_PACKET_FILTER = EMAC_MAC_PACKET_FILTER_PR_MASK;
694 EMAC->MAC_ADDRESS[0].LOW = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
695 EMAC->MAC_ADDRESS[0].HIGH = interface->macAddr.w[2];
710 entry = &interface->macAddrFilter[i];
723 k = (crc >> 26) & 0x3F;
726 hashTable[k / 32] |= (1 << (k % 32));
734 unicastMacAddr[j++] = entry->
addr;
744 EMAC->MAC_ADDRESS[1].LOW = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
745 EMAC->MAC_ADDRESS[1].HIGH = unicastMacAddr[0].w[2] | EMAC_HIGH_AE_MASK;
750 EMAC->MAC_ADDRESS[1].LOW = 0;
751 EMAC->MAC_ADDRESS[1].HIGH = 0;
758 EMAC->MAC_ADDRESS[2].LOW = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
759 EMAC->MAC_ADDRESS[2].HIGH = unicastMacAddr[1].w[2] | EMAC_HIGH_AE_MASK;
764 EMAC->MAC_ADDRESS[2].LOW = 0;
765 EMAC->MAC_ADDRESS[2].HIGH = 0;
770 if(interface->acceptAllMulticast)
773 EMAC->MAC_PACKET_FILTER = EMAC_MAC_PACKET_FILTER_HPF_MASK |
774 EMAC_MAC_PACKET_FILTER_PM_MASK;
779 EMAC->MAC_PACKET_FILTER = EMAC_MAC_PACKET_FILTER_HPF_MASK |
780 EMAC_MAC_PACKET_FILTER_HMC_MASK;
783 EMAC->MAC_HASH_TABLE_REG0 = hashTable[0];
784 EMAC->MAC_HASH_TABLE_REG1 = hashTable[1];
787 TRACE_DEBUG(
" MAC_HASH_TABLE_REG0 = 0x%08" PRIX32
"\r\n", EMAC->MAC_HASH_TABLE_REG0);
788 TRACE_DEBUG(
" MAC_HASH_TABLE_REG1 = 0x%08" PRIX32
"\r\n", EMAC->MAC_HASH_TABLE_REG1);
808 config = EMAC->MAC_CONFIGURATION;
813 config |= EMAC_MAC_CONFIGURATION_FES_MASK;
817 config &= ~EMAC_MAC_CONFIGURATION_FES_MASK;
823 config |= EMAC_MAC_CONFIGURATION_DM_MASK;
827 config &= ~EMAC_MAC_CONFIGURATION_DM_MASK;
831 EMAC->MAC_CONFIGURATION = config;
855 temp = EMAC->MAC_MDIO_ADDRESS & EMAC_MAC_MDIO_ADDRESS_CR_MASK;
857 temp |= EMAC_MAC_MDIO_ADDRESS_GOC_0_MASK | EMAC_MAC_MDIO_ADDRESS_GB_MASK;
860 temp |= EMAC_MAC_MDIO_ADDRESS_PA(phyAddr);
862 temp |= EMAC_MAC_MDIO_ADDRESS_RDA(
regAddr);
865 EMAC->MAC_MDIO_DATA =
data & EMAC_MAC_MDIO_DATA_GD_MASK;
868 EMAC->MAC_MDIO_ADDRESS = temp;
870 while((EMAC->MAC_MDIO_ADDRESS & EMAC_MAC_MDIO_ADDRESS_GB_MASK) != 0)
899 temp = EMAC->MAC_MDIO_ADDRESS & EMAC_MAC_MDIO_ADDRESS_CR_MASK;
902 temp |= EMAC_MAC_MDIO_ADDRESS_GOC_1_MASK |
903 EMAC_MAC_MDIO_ADDRESS_GOC_0_MASK | EMAC_MAC_MDIO_ADDRESS_GB_MASK;
906 temp |= EMAC_MAC_MDIO_ADDRESS_PA(phyAddr);
908 temp |= EMAC_MAC_MDIO_ADDRESS_RDA(
regAddr);
911 EMAC->MAC_MDIO_ADDRESS = temp;
913 while((EMAC->MAC_MDIO_ADDRESS & EMAC_MAC_MDIO_ADDRESS_GB_MASK) != 0)
918 data = EMAC->MAC_MDIO_DATA & EMAC_MAC_MDIO_DATA_GD_MASK;
946 p = (uint8_t *)
data;
951 for(i = 0; i <
length; i++)
954 for(j = 0; j < 8; j++)
957 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
959 crc = (crc << 1) ^ 0x04C11DB7;