32 #define TRACE_LEVEL NIC_TRACE_LEVEL
35 #include "fsl_device_registers.h"
37 #include "fsl_iomuxc.h"
46 #if defined(__ICCARM__)
49 #pragma data_alignment = 64
50 #pragma location = MIMXRT1060_ETH1_RAM_SECTION
53 #pragma data_alignment = 64
54 #pragma location = MIMXRT1060_ETH1_RAM_SECTION
57 #pragma data_alignment = 64
58 #pragma location = MIMXRT1060_ETH1_RAM_SECTION
61 #pragma data_alignment = 64
62 #pragma location = MIMXRT1060_ETH1_RAM_SECTION
84 static uint_t txBufferIndex;
86 static uint_t rxBufferIndex;
126 TRACE_INFO(
"Initializing i.MX RT1060 Ethernet MAC (ENET)...\r\n");
129 nicDriverInterface = interface;
132 CLOCK_EnableClock(kCLOCK_Enet);
138 ENET->ECR = ENET_ECR_RESET_MASK;
140 while((ENET->ECR & ENET_ECR_RESET_MASK) != 0)
146 ENET_RCR_RMII_MODE_MASK | ENET_RCR_MII_MODE_MASK;
151 ENET->MSCR = ENET_MSCR_HOLDTIME(10) | ENET_MSCR_MII_SPEED(120);
154 if(interface->phyDriver != NULL)
157 error = interface->phyDriver->init(interface);
159 else if(interface->switchDriver != NULL)
162 error = interface->switchDriver->init(interface);
177 value = interface->macAddr.b[5];
178 value |= (interface->macAddr.b[4] << 8);
179 ENET->PAUR = ENET_PAUR_PADDR2(
value) | ENET_PAUR_TYPE(0x8808);
182 value = interface->macAddr.b[3];
183 value |= (interface->macAddr.b[2] << 8);
184 value |= (interface->macAddr.b[1] << 16);
185 value |= (interface->macAddr.b[0] << 24);
186 ENET->PALR = ENET_PALR_PADDR1(
value);
201 ENET->ECR = ENET_ECR_DBSWP_MASK | ENET_ECR_EN1588_MASK;
204 ENET->MIBC = ENET_MIBC_MIB_CLEAR_MASK;
211 ENET->EIR = 0xFFFFFFFF;
213 ENET->EIMR = ENET_EIMR_TXF_MASK | ENET_EIMR_RXF_MASK | ENET_EIMR_EBERR_MASK;
223 ENET->ECR |= ENET_ECR_ETHEREN_MASK;
225 ENET->RDAR = ENET_RDAR_RDAR_MASK;
243 #if defined(USE_MIMXRT1060_EVK) || defined(USE_MIMXRT1060_EVKB) || \
244 defined(USE_MIMXRT1064_EVK)
245 gpio_pin_config_t pinConfig;
246 clock_enet_pll_config_t pllConfig;
249 pllConfig.enableClkOutput =
true;
250 pllConfig.enableClkOutput25M =
false;
251 pllConfig.loopDivider = 1;
253 pllConfig.enableClkOutput1 =
true;
254 pllConfig.loopDivider1 = 1;
255 CLOCK_InitEnetPll(&pllConfig);
258 IOMUXC_EnableMode(IOMUXC_GPR, kIOMUXC_GPR_ENET1TxClkOutputDir,
true);
261 CLOCK_EnableClock(kCLOCK_Iomuxc);
264 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_04_ENET_RX_DATA00, 0);
267 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_04_ENET_RX_DATA00,
268 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
269 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
270 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
271 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
272 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
273 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
274 IOMUXC_SW_PAD_CTL_PAD_DSE(0) |
275 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
278 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_05_ENET_RX_DATA01, 0);
281 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_05_ENET_RX_DATA01,
282 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
283 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
284 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
285 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
286 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
287 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
288 IOMUXC_SW_PAD_CTL_PAD_DSE(0) |
289 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
292 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_06_ENET_RX_EN, 0);
295 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_06_ENET_RX_EN,
296 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
297 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
298 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
299 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
300 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
301 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
302 IOMUXC_SW_PAD_CTL_PAD_DSE(0) |
303 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
306 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_ENET_TX_DATA00, 0);
309 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_07_ENET_TX_DATA00,
310 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
311 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
312 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
313 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
314 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
315 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
316 IOMUXC_SW_PAD_CTL_PAD_DSE(5) |
317 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
320 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_08_ENET_TX_DATA01, 0);
323 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_08_ENET_TX_DATA01,
324 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
325 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
326 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
327 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
328 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
329 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
330 IOMUXC_SW_PAD_CTL_PAD_DSE(5) |
331 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
334 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_09_ENET_TX_EN, 0);
337 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_09_ENET_TX_EN,
338 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
339 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
340 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
341 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
342 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
343 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
344 IOMUXC_SW_PAD_CTL_PAD_DSE(5) |
345 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
348 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_10_ENET_REF_CLK, 1);
351 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_10_ENET_REF_CLK,
352 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
353 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
354 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
355 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
356 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
357 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
358 IOMUXC_SW_PAD_CTL_PAD_DSE(5) |
359 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
362 IOMUXC_SetPinMux(IOMUXC_GPIO_B1_11_ENET_RX_ER, 0);
365 IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_11_ENET_RX_ER,
366 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
367 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
368 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
369 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
370 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
371 IOMUXC_SW_PAD_CTL_PAD_SPEED(3) |
372 IOMUXC_SW_PAD_CTL_PAD_DSE(0) |
373 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
376 IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_40_ENET_MDC, 0);
379 IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_40_ENET_MDC,
380 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
381 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
382 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
383 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
384 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
385 IOMUXC_SW_PAD_CTL_PAD_SPEED(0) |
386 IOMUXC_SW_PAD_CTL_PAD_DSE(5) |
387 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
390 IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_ENET_MDIO, 0);
393 IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_41_ENET_MDIO,
394 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
395 IOMUXC_SW_PAD_CTL_PAD_PUS(2) |
396 IOMUXC_SW_PAD_CTL_PAD_PUE(1) |
397 IOMUXC_SW_PAD_CTL_PAD_PKE(1) |
398 IOMUXC_SW_PAD_CTL_PAD_ODE(1) |
399 IOMUXC_SW_PAD_CTL_PAD_SPEED(0) |
400 IOMUXC_SW_PAD_CTL_PAD_DSE(5) |
401 IOMUXC_SW_PAD_CTL_PAD_SRE(1));
404 IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0);
407 IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09,
408 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
409 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
410 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
411 IOMUXC_SW_PAD_CTL_PAD_PKE(0) |
412 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
413 IOMUXC_SW_PAD_CTL_PAD_SPEED(0) |
414 IOMUXC_SW_PAD_CTL_PAD_DSE(5) |
415 IOMUXC_SW_PAD_CTL_PAD_SRE(0));
418 IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_10_GPIO1_IO10, 0);
421 IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_10_GPIO1_IO10,
422 IOMUXC_SW_PAD_CTL_PAD_HYS(0) |
423 IOMUXC_SW_PAD_CTL_PAD_PUS(2) |
424 IOMUXC_SW_PAD_CTL_PAD_PUE(1) |
425 IOMUXC_SW_PAD_CTL_PAD_PKE(1) |
426 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
427 IOMUXC_SW_PAD_CTL_PAD_SPEED(0) |
428 IOMUXC_SW_PAD_CTL_PAD_DSE(0) |
429 IOMUXC_SW_PAD_CTL_PAD_SRE(0));
432 pinConfig.direction = kGPIO_DigitalOutput;
433 pinConfig.outputLogic = 0;
434 pinConfig.interruptMode = kGPIO_NoIntmode;
435 GPIO_PinInit(GPIO1, 9, &pinConfig);
438 pinConfig.direction = kGPIO_DigitalInput;
439 pinConfig.outputLogic = 0;
440 pinConfig.interruptMode = kGPIO_NoIntmode;
441 GPIO_PinInit(GPIO1, 10, &pinConfig);
444 GPIO_PinWrite(GPIO1, 9, 0);
446 GPIO_PinWrite(GPIO1, 9, 1);
463 osMemset(txBufferDesc, 0,
sizeof(txBufferDesc));
464 osMemset(rxBufferDesc, 0,
sizeof(rxBufferDesc));
501 ENET->TDSR = (uint32_t) txBufferDesc;
503 ENET->RDSR = (uint32_t) rxBufferDesc;
521 if(interface->phyDriver != NULL)
524 interface->phyDriver->tick(interface);
526 else if(interface->switchDriver != NULL)
529 interface->switchDriver->tick(interface);
546 NVIC_EnableIRQ(ENET_IRQn);
549 if(interface->phyDriver != NULL)
552 interface->phyDriver->enableIrq(interface);
554 else if(interface->switchDriver != NULL)
557 interface->switchDriver->enableIrq(interface);
574 NVIC_DisableIRQ(ENET_IRQn);
577 if(interface->phyDriver != NULL)
580 interface->phyDriver->disableIrq(interface);
582 else if(interface->switchDriver != NULL)
585 interface->switchDriver->disableIrq(interface);
612 if((events & ENET_EIR_TXF_MASK) != 0)
615 ENET->EIR = ENET_EIR_TXF_MASK;
618 if((txBufferDesc[txBufferIndex][0] &
ENET_TBD0_R) == 0)
625 ENET->TDAR = ENET_TDAR_TDAR_MASK;
629 if((events & ENET_EIR_RXF_MASK) != 0)
632 ENET->EIMR &= ~ENET_EIMR_RXF_MASK;
635 nicDriverInterface->nicEvent =
TRUE;
641 if((events & ENET_EIR_EBERR_MASK) != 0)
644 ENET->EIMR &= ~ENET_EIMR_EBERR_MASK;
647 nicDriverInterface->nicEvent =
TRUE;
671 if((status & ENET_EIR_RXF_MASK) != 0)
674 ENET->EIR = ENET_EIR_RXF_MASK;
687 if((status & ENET_EIR_EBERR_MASK) != 0)
690 ENET->EIR = ENET_EIR_EBERR_MASK;
693 ENET->ECR &= ~ENET_ECR_ETHEREN_MASK;
697 ENET->ECR |= ENET_ECR_ETHEREN_MASK;
699 ENET->RDAR = ENET_RDAR_RDAR_MASK;
703 ENET->EIMR = ENET_EIMR_TXF_MASK | ENET_EIMR_RXF_MASK | ENET_EIMR_EBERR_MASK;
735 if((txBufferDesc[txBufferIndex][0] &
ENET_TBD0_R) != 0)
744 txBufferDesc[txBufferIndex][4] = 0;
770 ENET->TDAR = ENET_TDAR_TDAR_MASK;
773 if((txBufferDesc[txBufferIndex][0] &
ENET_TBD0_R) == 0)
797 if((rxBufferDesc[rxBufferIndex][0] &
ENET_RBD0_E) == 0)
800 if((rxBufferDesc[rxBufferIndex][0] &
ENET_RBD0_L) != 0)
833 rxBufferDesc[rxBufferIndex][4] = 0;
852 ENET->RDAR = ENET_RDAR_RDAR_MASK;
877 uint32_t unicastHashTable[2];
878 uint32_t multicastHashTable[2];
885 value = interface->macAddr.b[5];
886 value |= (interface->macAddr.b[4] << 8);
887 ENET->PAUR = ENET_PAUR_PADDR2(
value) | ENET_PAUR_TYPE(0x8808);
890 value = interface->macAddr.b[3];
891 value |= (interface->macAddr.b[2] << 8);
892 value |= (interface->macAddr.b[1] << 16);
893 value |= (interface->macAddr.b[0] << 24);
894 ENET->PALR = ENET_PALR_PADDR1(
value);
897 unicastHashTable[0] = 0;
898 unicastHashTable[1] = 0;
901 multicastHashTable[0] = 0;
902 multicastHashTable[1] = 0;
909 entry = &interface->macAddrFilter[i];
919 k = (crc >> 26) & 0x3F;
925 multicastHashTable[k / 32] |= (1 << (k % 32));
930 unicastHashTable[k / 32] |= (1 << (k % 32));
936 ENET->IALR = unicastHashTable[0];
937 ENET->IAUR = unicastHashTable[1];
940 ENET->GALR = multicastHashTable[0];
941 ENET->GAUR = multicastHashTable[1];
944 TRACE_DEBUG(
" IALR = 0x%08" PRIX32
"\r\n", ENET->IALR);
945 TRACE_DEBUG(
" IAUR = 0x%08" PRIX32
"\r\n", ENET->IAUR);
946 TRACE_DEBUG(
" GALR = 0x%08" PRIX32
"\r\n", ENET->GALR);
947 TRACE_DEBUG(
" GAUR = 0x%08" PRIX32
"\r\n", ENET->GAUR);
963 ENET->ECR &= ~ENET_ECR_ETHEREN_MASK;
969 ENET->RCR &= ~ENET_RCR_RMII_10T_MASK;
974 ENET->RCR |= ENET_RCR_RMII_10T_MASK;
981 ENET->TCR |= ENET_TCR_FDEN_MASK;
983 ENET->RCR &= ~ENET_RCR_DRT_MASK;
988 ENET->TCR &= ~ENET_TCR_FDEN_MASK;
990 ENET->RCR |= ENET_RCR_DRT_MASK;
997 ENET->ECR |= ENET_ECR_ETHEREN_MASK;
999 ENET->RDAR = ENET_RDAR_RDAR_MASK;
1023 temp = ENET_MMFR_ST(1) | ENET_MMFR_OP(1) | ENET_MMFR_TA(2);
1025 temp |= ENET_MMFR_PA(phyAddr);
1027 temp |= ENET_MMFR_RA(
regAddr);
1029 temp |= ENET_MMFR_DATA(
data);
1032 ENET->EIR = ENET_EIR_MII_MASK;
1037 while((ENET->EIR & ENET_EIR_MII_MASK) == 0)
1066 temp = ENET_MMFR_ST(1) | ENET_MMFR_OP(2) | ENET_MMFR_TA(2);
1068 temp |= ENET_MMFR_PA(phyAddr);
1070 temp |= ENET_MMFR_RA(
regAddr);
1073 ENET->EIR = ENET_EIR_MII_MASK;
1078 while((ENET->EIR & ENET_EIR_MII_MASK) == 0)
1083 data = ENET->MMFR & ENET_MMFR_DATA_MASK;
1111 p = (uint8_t *)
data;
1116 for(i = 0; i <
length; i++)
1122 for(j = 0; j < 8; j++)
1124 if((crc & 0x01) != 0)
1126 crc = (crc >> 1) ^ 0xEDB88320;