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 = 4
50 #pragma location = MIMXRT1170_ETH3_RAM_SECTION
53 #pragma data_alignment = 4
54 #pragma location = MIMXRT1170_ETH3_RAM_SECTION
57 #pragma data_alignment = 8
58 #pragma location = MIMXRT1170_ETH3_RAM_SECTION
61 #pragma data_alignment = 8
62 #pragma location = MIMXRT1170_ETH3_RAM_SECTION
126 TRACE_INFO(
"Initializing i.MX RT1170 Ethernet MAC (ENET_QOS)...\r\n");
129 nicDriverInterface = interface;
132 CLOCK_EnableClock(kCLOCK_Enet_Qos);
138 ENET_QOS->DMA_MODE |= ENET_QOS_DMA_MODE_SWR_MASK;
140 while((ENET_QOS->DMA_MODE & ENET_QOS_DMA_MODE_SWR_MASK) != 0)
145 ENET_QOS->MAC_MDIO_ADDRESS = ENET_QOS_MAC_MDIO_ADDRESS_CR(7);
148 if(interface->phyDriver != NULL)
151 error = interface->phyDriver->init(interface);
153 else if(interface->switchDriver != NULL)
156 error = interface->switchDriver->init(interface);
171 ENET_QOS->MAC_CONFIGURATION = ENET_QOS_MAC_CONFIGURATION_GPSLCE_MASK |
172 ENET_QOS_MAC_CONFIGURATION_DO_MASK;
175 temp = ENET_QOS->MAC_EXT_CONFIGURATION & ~ENET_QOS_MAC_EXT_CONFIGURATION_GPSL_MASK;
182 ENET_QOS->MAC_TX_FLOW_CTRL_Q[0] = 0;
183 ENET_QOS->MAC_RX_FLOW_CTRL = 0;
186 ENET_QOS->MAC_RXQ_CTRL[0] = ENET_QOS_MAC_RXQ_CTRL_RXQ0EN(2);
189 ENET_QOS->DMA_MODE = ENET_QOS_DMA_MODE_INTM(0) | ENET_QOS_DMA_MODE_DSPW(0);
191 ENET_QOS->DMA_SYSBUS_MODE |= ENET_QOS_DMA_SYSBUS_MODE_AAL_MASK;
194 ENET_QOS->DMA_CH[0].DMA_CHX_CTRL = ENET_QOS_DMA_CHX_CTRL_DSL(0);
196 ENET_QOS->DMA_CH[0].DMA_CHX_TX_CTRL = ENET_QOS_DMA_CHX_TX_CTRL_TxPBL(32);
199 ENET_QOS->DMA_CH[0].DMA_CHX_RX_CTRL = ENET_QOS_DMA_CHX_RX_CTRL_RxPBL(32) |
203 ENET_QOS->MTL_QUEUE[0].MTL_TXQX_OP_MODE |= ENET_QOS_MTL_TXQX_OP_MODE_TQS(7) |
204 ENET_QOS_MTL_TXQX_OP_MODE_TXQEN(2) | ENET_QOS_MTL_TXQX_OP_MODE_TSF_MASK;
207 ENET_QOS->MTL_QUEUE[0].MTL_RXQX_OP_MODE |= ENET_QOS_MTL_RXQX_OP_MODE_RQS(7) |
208 ENET_QOS_MTL_RXQX_OP_MODE_RSF_MASK;
215 ENET_QOS->MAC_MMC_TX_INTERRUPT_MASK = 0xFFFFFFFF;
216 ENET_QOS->MAC_MMC_RX_INTERRUPT_MASK = 0xFFFFFFFF;
217 ENET_QOS->MAC_MMC_IPC_RX_INTERRUPT_MASK = 0xFFFFFFFF;
218 ENET_QOS->MAC_MMC_FPE_TX_INTERRUPT_MASK = 0xFFFFFFFF;
219 ENET_QOS->MAC_MMC_FPE_RX_INTERRUPT_MASK = 0xFFFFFFFF;
222 ENET_QOS->MAC_INTERRUPT_ENABLE = 0;
225 ENET_QOS->DMA_CH[0].DMA_CHX_INT_EN = ENET_QOS_DMA_CHX_INT_EN_NIE_MASK |
226 ENET_QOS_DMA_CHX_INT_EN_RIE_MASK | ENET_QOS_DMA_CHX_INT_EN_TIE_MASK;
236 ENET_QOS->MAC_CONFIGURATION |= ENET_QOS_MAC_CONFIGURATION_TE_MASK |
237 ENET_QOS_MAC_CONFIGURATION_RE_MASK;
240 ENET_QOS->DMA_CH[0].DMA_CHX_TX_CTRL |= ENET_QOS_DMA_CHX_TX_CTRL_ST_MASK;
241 ENET_QOS->DMA_CH[0].DMA_CHX_RX_CTRL |= ENET_QOS_DMA_CHX_RX_CTRL_SR_MASK;
259 #if defined(USE_MIMXRT1170_EVK)
261 gpio_pin_config_t pinConfig;
262 clock_root_config_t rootConfig = {0};
264 clock_sys_pll1_config_t sysPll1Config = {0};
267 sysPll1Config.pllDiv2En =
true;
268 CLOCK_InitSysPll1(&sysPll1Config);
272 rootConfig.clockOff =
false;
273 rootConfig.mux = kCLOCK_ENET_QOS_ClockRoot_MuxSysPll1Div2;
275 CLOCK_SetRootClock(kCLOCK_Root_Enet_Qos, &rootConfig);
279 CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd3, 24);
282 rootConfig.clockOff =
false;
283 rootConfig.mux = kCLOCK_BUS_ClockRoot_MuxSysPll2Pfd3;
285 CLOCK_SetRootClock(kCLOCK_Root_Bus, &rootConfig);
289 temp = IOMUXC_GPR->GPR6 & ~IOMUXC_GPR_GPR6_ENET_QOS_INTF_SEL_MASK;
290 IOMUXC_GPR->GPR6 = temp | IOMUXC_GPR_GPR6_ENET_QOS_INTF_SEL(1);
293 IOMUXC_GPR->GPR6 |= IOMUXC_GPR_GPR6_ENET_QOS_CLKGEN_EN_MASK;
295 IOMUXC_GPR->GPR6 |= IOMUXC_GPR_GPR6_ENET_QOS_RGMII_EN_MASK;
298 CLOCK_EnableClock(kCLOCK_Iomuxc);
301 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_00_ENET_QOS_RX_EN, 0);
304 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_00_ENET_QOS_RX_EN,
305 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
306 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
307 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
308 IOMUXC_SW_PAD_CTL_PAD_PULL(2) |
309 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
312 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_01_ENET_QOS_RX_CLK, 0);
315 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_01_ENET_QOS_RX_CLK,
316 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
317 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
318 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
319 IOMUXC_SW_PAD_CTL_PAD_PULL(2) |
320 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
323 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_02_ENET_QOS_RX_DATA00, 0);
326 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_02_ENET_QOS_RX_DATA00,
327 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
328 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
329 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
330 IOMUXC_SW_PAD_CTL_PAD_PULL(2) |
331 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
334 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_03_ENET_QOS_RX_DATA01, 0);
337 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_03_ENET_QOS_RX_DATA01,
338 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
339 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
340 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
341 IOMUXC_SW_PAD_CTL_PAD_PULL(2) |
342 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
345 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_04_ENET_QOS_RX_DATA02, 0);
348 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_04_ENET_QOS_RX_DATA02,
349 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
350 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
351 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
352 IOMUXC_SW_PAD_CTL_PAD_PULL(2) |
353 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
356 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_05_ENET_QOS_RX_DATA03, 0);
359 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_05_ENET_QOS_RX_DATA03,
360 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
361 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
362 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
363 IOMUXC_SW_PAD_CTL_PAD_PULL(2) |
364 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
367 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_06_ENET_QOS_TX_DATA03, 0);
370 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_06_ENET_QOS_TX_DATA03,
371 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
372 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
373 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
374 IOMUXC_SW_PAD_CTL_PAD_PULL(3) |
375 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
378 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_07_ENET_QOS_TX_DATA02, 0);
381 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_07_ENET_QOS_TX_DATA02,
382 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
383 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
384 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
385 IOMUXC_SW_PAD_CTL_PAD_PULL(3) |
386 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
389 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_08_ENET_QOS_TX_DATA01, 0);
392 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_08_ENET_QOS_TX_DATA01,
393 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
394 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
395 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
396 IOMUXC_SW_PAD_CTL_PAD_PULL(3) |
397 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
400 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_09_ENET_QOS_TX_DATA00, 0);
403 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_09_ENET_QOS_TX_DATA00,
404 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
405 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
406 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
407 IOMUXC_SW_PAD_CTL_PAD_PULL(3) |
408 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
411 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_10_ENET_QOS_TX_EN, 0);
414 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_10_ENET_QOS_TX_EN,
415 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
416 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
417 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
418 IOMUXC_SW_PAD_CTL_PAD_PULL(3) |
419 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
422 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B1_11_ENET_QOS_TX_CLK, 0);
425 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B1_11_ENET_QOS_TX_CLK,
426 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
427 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
428 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
429 IOMUXC_SW_PAD_CTL_PAD_PULL(3) |
430 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
433 IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_B2_19_ENET_QOS_MDC, 0);
436 IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_B2_19_ENET_QOS_MDC,
437 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
438 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
439 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
440 IOMUXC_SW_PAD_CTL_PAD_PULL(3) |
441 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
444 IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_B2_20_ENET_QOS_MDIO, 0);
447 IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_B2_20_ENET_QOS_MDIO,
448 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
449 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
450 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
451 IOMUXC_SW_PAD_CTL_PAD_PULL(1) |
452 IOMUXC_SW_PAD_CTL_PAD_PDRV(0));
455 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B2_13_GPIO11_IO14, 0);
458 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B2_13_GPIO11_IO14,
459 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
460 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
461 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
462 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
463 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
464 IOMUXC_SW_PAD_CTL_PAD_DSE(1) |
465 IOMUXC_SW_PAD_CTL_PAD_SRE(0));
468 IOMUXC_SetPinMux(IOMUXC_GPIO_DISP_B2_12_GPIO11_IO13, 0);
471 IOMUXC_SetPinConfig(IOMUXC_GPIO_DISP_B2_12_GPIO11_IO13,
472 IOMUXC_SW_PAD_CTL_PAD_DWP_LOCK(0) |
473 IOMUXC_SW_PAD_CTL_PAD_DWP(0) |
474 IOMUXC_SW_PAD_CTL_PAD_ODE(0) |
475 IOMUXC_SW_PAD_CTL_PAD_PUS(0) |
476 IOMUXC_SW_PAD_CTL_PAD_PUE(0) |
477 IOMUXC_SW_PAD_CTL_PAD_DSE(1) |
478 IOMUXC_SW_PAD_CTL_PAD_SRE(0));
481 pinConfig.direction = kGPIO_DigitalOutput;
482 pinConfig.outputLogic = 0;
483 pinConfig.interruptMode = kGPIO_NoIntmode;
484 GPIO_PinInit(GPIO11, 14, &pinConfig);
487 pinConfig.direction = kGPIO_DigitalInput;
488 pinConfig.outputLogic = 0;
489 pinConfig.interruptMode = kGPIO_NoIntmode;
490 GPIO_PinInit(GPIO11, 13, &pinConfig);
493 GPIO_PinWrite(GPIO11, 14, 0);
495 GPIO_PinWrite(GPIO11, 14, 1);
537 ENET_QOS->DMA_CH[0].DMA_CHX_TXDESC_LIST_ADDR = (uint32_t) &
txDmaDesc[0];
542 ENET_QOS->DMA_CH[0].DMA_CHX_RXDESC_LIST_ADDR = (uint32_t) &
rxDmaDesc[0];
560 if(interface->phyDriver != NULL)
563 interface->phyDriver->tick(interface);
565 else if(interface->switchDriver != NULL)
568 interface->switchDriver->tick(interface);
585 NVIC_EnableIRQ(ENET_QOS_IRQn);
588 if(interface->phyDriver != NULL)
591 interface->phyDriver->enableIrq(interface);
593 else if(interface->switchDriver != NULL)
596 interface->switchDriver->enableIrq(interface);
613 NVIC_DisableIRQ(ENET_QOS_IRQn);
616 if(interface->phyDriver != NULL)
619 interface->phyDriver->disableIrq(interface);
621 else if(interface->switchDriver != NULL)
624 interface->switchDriver->disableIrq(interface);
649 status = ENET_QOS->DMA_CH[0].DMA_CHX_STAT;
652 if((status & ENET_QOS_DMA_CHX_STAT_TI_MASK) != 0)
655 ENET_QOS->DMA_CH[0].DMA_CHX_STAT = ENET_QOS_DMA_CHX_STAT_TI_MASK;
666 if((status & ENET_QOS_DMA_CHX_STAT_RI_MASK) != 0)
669 ENET_QOS->DMA_CH[0].DMA_CHX_STAT = ENET_QOS_DMA_CHX_STAT_RI_MASK;
672 nicDriverInterface->nicEvent =
TRUE;
678 ENET_QOS->DMA_CH[0].DMA_CHX_STAT = ENET_QOS_DMA_CHX_STAT_NIS_MASK;
752 ENET_QOS->DMA_CH[0].DMA_CHX_STAT = ENET_QOS_DMA_CHX_STAT_TBU_MASK;
754 ENET_QOS->DMA_CH[0].DMA_CHX_TXDESC_TAIL_PTR = 0;
840 ENET_QOS->DMA_CH[0].DMA_CHX_STAT = ENET_QOS_DMA_CHX_STAT_RBU_MASK;
842 ENET_QOS->DMA_CH[0].DMA_CHX_RXDESC_TAIL_PTR = 0;
865 ENET_QOS->MAC_PACKET_FILTER = 0;
868 ENET_QOS->MAC_ADDRESS[0].LOW = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
869 ENET_QOS->MAC_ADDRESS[0].HIGH = interface->macAddr.w[2];
876 entry = &interface->macAddrFilter[i];
882 ENET_QOS->MAC_ADDRESS[j].LOW = entry->
addr.w[0] | (entry->
addr.w[1] << 16);
883 ENET_QOS->MAC_ADDRESS[j].HIGH = entry->
addr.w[2] | ENET_QOS_HIGH_AE_MASK;
894 ENET_QOS->MAC_ADDRESS[j].LOW = 0;
895 ENET_QOS->MAC_ADDRESS[j].HIGH = 0;
917 config = ENET_QOS->MAC_CONFIGURATION;
922 config &= ~ENET_QOS_MAC_CONFIGURATION_PS_MASK;
923 config &= ~ENET_QOS_MAC_CONFIGURATION_FES_MASK;
928 config |= ENET_QOS_MAC_CONFIGURATION_PS_MASK;
929 config |= ENET_QOS_MAC_CONFIGURATION_FES_MASK;
934 config |= ENET_QOS_MAC_CONFIGURATION_PS_MASK;
935 config &= ~ENET_QOS_MAC_CONFIGURATION_FES_MASK;
941 config |= ENET_QOS_MAC_CONFIGURATION_DM_MASK;
945 config &= ~ENET_QOS_MAC_CONFIGURATION_DM_MASK;
949 ENET_QOS->MAC_CONFIGURATION = config;
973 temp = ENET_QOS->MAC_MDIO_ADDRESS & ENET_QOS_MAC_MDIO_ADDRESS_CR_MASK;
976 temp |= ENET_QOS_MAC_MDIO_ADDRESS_GOC_0_MASK |
977 ENET_QOS_MAC_MDIO_ADDRESS_GB_MASK;
980 temp |= ENET_QOS_MAC_MDIO_ADDRESS_PA(phyAddr);
982 temp |= ENET_QOS_MAC_MDIO_ADDRESS_RDA(
regAddr);
985 ENET_QOS->MAC_MDIO_DATA =
data & ENET_QOS_MAC_MDIO_DATA_GD_MASK;
988 ENET_QOS->MAC_MDIO_ADDRESS = temp;
990 while((ENET_QOS->MAC_MDIO_ADDRESS & ENET_QOS_MAC_MDIO_ADDRESS_GB_MASK) != 0)
1019 temp = ENET_QOS->MAC_MDIO_ADDRESS & ENET_QOS_MAC_MDIO_ADDRESS_CR_MASK;
1022 temp |= ENET_QOS_MAC_MDIO_ADDRESS_GOC_1_MASK |
1023 ENET_QOS_MAC_MDIO_ADDRESS_GOC_0_MASK | ENET_QOS_MAC_MDIO_ADDRESS_GB_MASK;
1026 temp |= ENET_QOS_MAC_MDIO_ADDRESS_PA(phyAddr);
1028 temp |= ENET_QOS_MAC_MDIO_ADDRESS_RDA(
regAddr);
1031 ENET_QOS->MAC_MDIO_ADDRESS = temp;
1033 while((ENET_QOS->MAC_MDIO_ADDRESS & ENET_QOS_MAC_MDIO_ADDRESS_GB_MASK) != 0)
1038 data = ENET_QOS->MAC_MDIO_DATA & ENET_QOS_MAC_MDIO_DATA_GD_MASK;