32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include "fsl_device_registers.h"
36 #include "fsl_clock.h"
45 #if defined(__ICCARM__)
48 #pragma data_alignment = 16
51 #pragma data_alignment = 16
54 #pragma data_alignment = 16
57 #pragma data_alignment = 16
79 static uint_t txBufferIndex;
81 static uint_t rxBufferIndex;
121 TRACE_INFO(
"Initializing MCXE247 Ethernet MAC...\r\n");
124 nicDriverInterface = interface;
127 SYSMPU->CESR &= ~SYSMPU_CESR_VLD_MASK;
130 SIM->MISCTRL0 &= ~(SIM_MISCTRL0_RMII_CLK_SEL_MASK |
131 SIM_MISCTRL0_RMII_CLK_OBE_MASK);
134 CLOCK_EnableClock(kCLOCK_Enet);
140 ENET->ECR = ENET_ECR_RESET_MASK;
142 while((ENET->ECR & ENET_ECR_RESET_MASK) != 0)
148 ENET_RCR_RMII_MODE_MASK | ENET_RCR_MII_MODE_MASK;
153 ENET->MSCR = ENET_MSCR_MII_SPEED(23);
156 if(interface->phyDriver != NULL)
159 error = interface->phyDriver->init(interface);
161 else if(interface->switchDriver != NULL)
164 error = interface->switchDriver->init(interface);
179 value = interface->macAddr.b[5];
180 value |= (interface->macAddr.b[4] << 8);
181 ENET->PAUR = ENET_PAUR_PADDR2(
value) | ENET_PAUR_TYPE(0x8808);
184 value = interface->macAddr.b[3];
185 value |= (interface->macAddr.b[2] << 8);
186 value |= (interface->macAddr.b[1] << 16);
187 value |= (interface->macAddr.b[0] << 24);
188 ENET->PALR = ENET_PALR_PADDR1(
value);
203 ENET->ECR = ENET_ECR_DBSWP_MASK | ENET_ECR_EN1588_MASK;
206 ENET->MIBC = ENET_MIBC_MIB_CLEAR_MASK;
213 ENET->EIR = 0xFFFFFFFF;
215 ENET->EIMR = ENET_EIMR_TXF_MASK | ENET_EIMR_RXF_MASK | ENET_EIMR_EBERR_MASK;
233 ENET->ECR |= ENET_ECR_ETHEREN_MASK;
235 ENET->RDAR = ENET_RDAR_RDAR_MASK;
253 #if defined(USE_FRDM_MCXE247)
255 CLOCK_EnableClock(kCLOCK_PortB);
256 CLOCK_EnableClock(kCLOCK_PortC);
257 CLOCK_EnableClock(kCLOCK_PortD);
258 CLOCK_EnableClock(kCLOCK_PortE);
261 PORTC->PCR[0] = PORT_PCR_MUX(4);
263 PORTC->PCR[1] = PORT_PCR_MUX(5);
265 PORTC->PCR[2] = PORT_PCR_MUX(5);
267 PORTC->PCR[17] = PORT_PCR_MUX(5);
269 PORTD->PCR[7] = PORT_PCR_MUX(5);
271 PORTD->PCR[11] = PORT_PCR_MUX(5);
273 PORTD->PCR[12] = PORT_PCR_MUX(5);
276 PORTB->PCR[4] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;
278 PORTE->PCR[8] = PORT_PCR_MUX(5);
281 PORTC->PCR[3] = PORT_PCR_MUX(1);
282 GPIOC->PDDR |= (1 << 3);
285 GPIOC->PCOR |= (1 << 3);
287 GPIOC->PSOR |= (1 << 3);
304 osMemset(txBufferDesc, 0,
sizeof(txBufferDesc));
305 osMemset(rxBufferDesc, 0,
sizeof(rxBufferDesc));
342 ENET->TDSR = (uint32_t) txBufferDesc;
344 ENET->RDSR = (uint32_t) rxBufferDesc;
362 if(interface->phyDriver != NULL)
365 interface->phyDriver->tick(interface);
367 else if(interface->switchDriver != NULL)
370 interface->switchDriver->tick(interface);
387 NVIC_EnableIRQ(ENET_Transmit_IRQn);
388 NVIC_EnableIRQ(ENET_Receive_IRQn);
389 NVIC_EnableIRQ(ENET_Error_IRQn);
392 if(interface->phyDriver != NULL)
395 interface->phyDriver->enableIrq(interface);
397 else if(interface->switchDriver != NULL)
400 interface->switchDriver->enableIrq(interface);
417 NVIC_DisableIRQ(ENET_Transmit_IRQn);
418 NVIC_DisableIRQ(ENET_Receive_IRQn);
419 NVIC_DisableIRQ(ENET_Error_IRQn);
422 if(interface->phyDriver != NULL)
425 interface->phyDriver->disableIrq(interface);
427 else if(interface->switchDriver != NULL)
430 interface->switchDriver->disableIrq(interface);
454 if((ENET->EIR & ENET_EIR_TXF_MASK) != 0)
457 ENET->EIR = ENET_EIR_TXF_MASK;
460 if((txBufferDesc[txBufferIndex][0] &
ENET_TBD0_R) == 0)
467 ENET->TDAR = ENET_TDAR_TDAR_MASK;
490 if((ENET->EIR & ENET_EIR_RXF_MASK) != 0)
493 ENET->EIMR &= ~ENET_EIMR_RXF_MASK;
496 nicDriverInterface->nicEvent =
TRUE;
521 if((ENET->EIR & ENET_EIR_EBERR_MASK) != 0)
524 ENET->EIMR &= ~ENET_EIMR_EBERR_MASK;
527 nicDriverInterface->nicEvent =
TRUE;
551 if((status & ENET_EIR_RXF_MASK) != 0)
554 ENET->EIR = ENET_EIR_RXF_MASK;
567 if((status & ENET_EIR_EBERR_MASK) != 0)
570 ENET->EIR = ENET_EIR_EBERR_MASK;
573 ENET->ECR &= ~ENET_ECR_ETHEREN_MASK;
577 ENET->ECR |= ENET_ECR_ETHEREN_MASK;
579 ENET->RDAR = ENET_RDAR_RDAR_MASK;
583 ENET->EIMR = ENET_EIMR_TXF_MASK | ENET_EIMR_RXF_MASK | ENET_EIMR_EBERR_MASK;
615 if((txBufferDesc[txBufferIndex][0] &
ENET_TBD0_R) != 0)
624 txBufferDesc[txBufferIndex][4] = 0;
647 ENET->TDAR = ENET_TDAR_TDAR_MASK;
650 if((txBufferDesc[txBufferIndex][0] &
ENET_TBD0_R) == 0)
674 if((rxBufferDesc[rxBufferIndex][0] &
ENET_RBD0_E) == 0)
677 if((rxBufferDesc[rxBufferIndex][0] &
ENET_RBD0_L) != 0)
710 rxBufferDesc[rxBufferIndex][4] = 0;
729 ENET->RDAR = ENET_RDAR_RDAR_MASK;
754 uint32_t unicastHashTable[2];
755 uint32_t multicastHashTable[2];
762 value = interface->macAddr.b[5];
763 value |= (interface->macAddr.b[4] << 8);
764 ENET->PAUR = ENET_PAUR_PADDR2(
value) | ENET_PAUR_TYPE(0x8808);
767 value = interface->macAddr.b[3];
768 value |= (interface->macAddr.b[2] << 8);
769 value |= (interface->macAddr.b[1] << 16);
770 value |= (interface->macAddr.b[0] << 24);
771 ENET->PALR = ENET_PALR_PADDR1(
value);
774 unicastHashTable[0] = 0;
775 unicastHashTable[1] = 0;
778 multicastHashTable[0] = 0;
779 multicastHashTable[1] = 0;
786 entry = &interface->macAddrFilter[i];
796 k = (crc >> 26) & 0x3F;
802 multicastHashTable[k / 32] |= (1 << (k % 32));
807 unicastHashTable[k / 32] |= (1 << (k % 32));
813 ENET->IALR = unicastHashTable[0];
814 ENET->IAUR = unicastHashTable[1];
817 ENET->GALR = multicastHashTable[0];
818 ENET->GAUR = multicastHashTable[1];
821 TRACE_DEBUG(
" IALR = %08" PRIX32
"\r\n", ENET->IALR);
822 TRACE_DEBUG(
" IAUR = %08" PRIX32
"\r\n", ENET->IAUR);
823 TRACE_DEBUG(
" GALR = %08" PRIX32
"\r\n", ENET->GALR);
824 TRACE_DEBUG(
" GAUR = %08" PRIX32
"\r\n", ENET->GAUR);
840 ENET->ECR &= ~ENET_ECR_ETHEREN_MASK;
846 ENET->RCR &= ~ENET_RCR_RMII_10T_MASK;
851 ENET->RCR |= ENET_RCR_RMII_10T_MASK;
858 ENET->TCR |= ENET_TCR_FDEN_MASK;
860 ENET->RCR &= ~ENET_RCR_DRT_MASK;
865 ENET->TCR &= ~ENET_TCR_FDEN_MASK;
867 ENET->RCR |= ENET_RCR_DRT_MASK;
874 ENET->ECR |= ENET_ECR_ETHEREN_MASK;
876 ENET->RDAR = ENET_RDAR_RDAR_MASK;
900 temp = ENET_MMFR_ST(1) | ENET_MMFR_OP(1) | ENET_MMFR_TA(2);
902 temp |= ENET_MMFR_PA(phyAddr);
906 temp |= ENET_MMFR_DATA(
data);
909 ENET->EIR = ENET_EIR_MII_MASK;
914 while((ENET->EIR & ENET_EIR_MII_MASK) == 0)
943 temp = ENET_MMFR_ST(1) | ENET_MMFR_OP(2) | ENET_MMFR_TA(2);
945 temp |= ENET_MMFR_PA(phyAddr);
950 ENET->EIR = ENET_EIR_MII_MASK;
955 while((ENET->EIR & ENET_EIR_MII_MASK) == 0)
960 data = ENET->MMFR & ENET_MMFR_DATA_MASK;
988 p = (uint8_t *)
data;
993 for(i = 0; i <
length; i++)
999 for(j = 0; j < 8; j++)
1001 if((crc & 0x01) != 0)
1003 crc = (crc >> 1) ^ 0xEDB88320;