32 #define TRACE_LEVEL NIC_TRACE_LEVEL
44 #if defined(__ICCARM__)
47 #pragma data_alignment = 4
48 #pragma location = LPC43XX_ETH_RAM_SECTION
51 #pragma data_alignment = 4
52 #pragma location = LPC43XX_ETH_RAM_SECTION
55 #pragma data_alignment = 4
56 #pragma location = LPC43XX_ETH_RAM_SECTION
59 #pragma data_alignment = 4
60 #pragma location = LPC43XX_ETH_RAM_SECTION
123 TRACE_INFO(
"Initializing LPC43xx Ethernet MAC...\r\n");
126 nicDriverInterface = interface;
129 LPC_CCU1->CLK_M4_ETHERNET_CFG |= CCU1_CLK_M4_ETHERNET_CFG_RUN_Msk;
131 while((LPC_CCU1->CLK_M4_ETHERNET_STAT & CCU1_CLK_M4_ETHERNET_STAT_RUN_Msk) == 0)
136 LPC_RGU->RESET_EXT_STAT19 |= RGU_RESET_EXT_STAT19_MASTER_RESET_Msk;
137 LPC_RGU->RESET_EXT_STAT19 &= ~RGU_RESET_EXT_STAT19_MASTER_RESET_Msk;
140 LPC_RGU->RESET_EXT_STAT22 |= RGU_RESET_EXT_STAT22_MASTER_RESET_Msk;
141 LPC_RGU->RESET_EXT_STAT22 &= ~RGU_RESET_EXT_STAT22_MASTER_RESET_Msk;
147 LPC_RGU->RESET_CTRL0 = RGU_RESET_CTRL0_ETHERNET_RST_Msk;
149 while((LPC_RGU->RESET_ACTIVE_STATUS0 & RGU_RESET_ACTIVE_STATUS0_ETHERNET_RST_Msk) == 0)
154 LPC_ETHERNET->DMA_BUS_MODE |= ETHERNET_DMA_BUS_MODE_SWR_Msk;
156 while((LPC_ETHERNET->DMA_BUS_MODE & ETHERNET_DMA_BUS_MODE_SWR_Msk) != 0)
164 if(interface->phyDriver != NULL)
167 error = interface->phyDriver->init(interface);
169 else if(interface->switchDriver != NULL)
172 error = interface->switchDriver->init(interface);
187 LPC_ETHERNET->MAC_CONFIG = ETHERNET_MAC_CONFIG_DO_Msk;
190 LPC_ETHERNET->MAC_ADDR0_LOW = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
191 LPC_ETHERNET->MAC_ADDR0_HIGH = interface->macAddr.w[2];
194 LPC_ETHERNET->MAC_HASHTABLE_LOW = 0;
195 LPC_ETHERNET->MAC_HASHTABLE_HIGH = 0;
198 LPC_ETHERNET->MAC_FRAME_FILTER = ETHERNET_MAC_FRAME_FILTER_HPF_Msk |
199 ETHERNET_MAC_FRAME_FILTER_HMC_Msk;
202 LPC_ETHERNET->MAC_FLOW_CTRL = 0;
207 LPC_ETHERNET->DMA_BUS_MODE = ETHERNET_DMA_BUS_MODE_AAL_Msk | ETHERNET_DMA_BUS_MODE_USP_Msk |
215 LPC_ETHERNET->MAC_INTR_MASK = ETHERNET_MAC_INTR_MASK_TSIM_Msk |
216 ETHERNET_MAC_INTR_MASK_PMTIM_Msk;
219 LPC_ETHERNET->DMA_INT_EN = ETHERNET_DMA_INT_EN_NIE_Msk |
220 ETHERNET_DMA_INT_EN_AIE_Msk | ETHERNET_DMA_INT_EN_RIE_Msk |
221 ETHERNET_DMA_INT_EN_OVE_Msk | ETHERNET_DMA_INT_EN_TIE_Msk |
222 ETHERNET_DMA_INT_EN_UNE_Msk;
232 LPC_ETHERNET->MAC_CONFIG |= ETHERNET_MAC_CONFIG_TE_Msk | ETHERNET_MAC_CONFIG_RE_Msk;
234 LPC_ETHERNET->DMA_OP_MODE |= ETHERNET_DMA_OP_MODE_ST_Msk | ETHERNET_DMA_OP_MODE_SR_Msk;
252 #if defined(USE_LPC4330_XPLORER) || defined(USE_LPCXPRESSO_4337)
254 LPC_CCU1->CLK_M4_GPIO_CFG |= CCU1_CLK_M4_GPIO_CFG_RUN_Msk;
256 while((LPC_CCU1->CLK_M4_GPIO_STAT & CCU1_CLK_M4_GPIO_STAT_RUN_Msk) == 0)
261 LPC_CREG->CREG6 &= ~CREG_CREG6_ETHMODE_Msk;
265 LPC_SCU->SFSP0_0 = SCU_SFSP0_0_EZI_Msk | SCU_SFSP0_0_EHS_Msk | (2 & SCU_SFSP0_0_MODE_Msk);
267 LPC_SCU->SFSP0_1 = SCU_SFSP0_1_EHS_Msk | (6 & SCU_SFSP0_1_MODE_Msk);
270 LPC_SCU->SFSP1_15 = SCU_SFSP1_15_EZI_Msk | SCU_SFSP1_15_EHS_Msk | (3 & SCU_SFSP1_15_MODE_Msk);
272 LPC_SCU->SFSP1_16 = SCU_SFSP1_16_EZI_Msk | SCU_SFSP1_16_EHS_Msk | (7 & SCU_SFSP1_16_MODE_Msk);
274 LPC_SCU->SFSP1_17 = SCU_SFSP1_17_EZI_Msk | (3 & SCU_SFSP1_17_MODE_Msk);
276 LPC_SCU->SFSP1_18 = SCU_SFSP1_18_EHS_Msk | (3 & SCU_SFSP1_18_MODE_Msk);
278 LPC_SCU->SFSP1_19 = SCU_SFSP1_19_EZI_Msk | SCU_SFSP1_19_EHS_Msk | (0 & SCU_SFSP1_19_MODE_Msk);
280 LPC_SCU->SFSP1_20 = SCU_SFSP1_20_EHS_Msk | (3 & SCU_SFSP1_20_MODE_Msk);
283 LPC_SCU->SFSP2_0 = (7 & SCU_SFSP2_0_MODE_Msk);
347 LPC_ETHERNET->DMA_TRANS_DES_ADDR = (uint32_t)
txDmaDesc;
349 LPC_ETHERNET->DMA_REC_DES_ADDR = (uint32_t)
rxDmaDesc;
365 if(interface->phyDriver != NULL)
368 interface->phyDriver->tick(interface);
370 else if(interface->switchDriver != NULL)
373 interface->switchDriver->tick(interface);
390 NVIC_EnableIRQ(ETHERNET_IRQn);
393 if(interface->phyDriver != NULL)
396 interface->phyDriver->enableIrq(interface);
398 else if(interface->switchDriver != NULL)
401 interface->switchDriver->enableIrq(interface);
418 NVIC_DisableIRQ(ETHERNET_IRQn);
421 if(interface->phyDriver != NULL)
424 interface->phyDriver->disableIrq(interface);
426 else if(interface->switchDriver != NULL)
429 interface->switchDriver->disableIrq(interface);
454 status = LPC_ETHERNET->DMA_STAT;
457 if((status & (ETHERNET_DMA_STAT_TI_Msk | ETHERNET_DMA_STAT_UNF_Msk)) != 0)
460 LPC_ETHERNET->DMA_STAT = ETHERNET_DMA_STAT_TI_Msk | ETHERNET_DMA_STAT_UNF_Msk;
471 if((status & (ETHERNET_DMA_STAT_RI_Msk | ETHERNET_DMA_STAT_OVF_Msk)) != 0)
474 LPC_ETHERNET->DMA_INT_EN &= ~(ETHERNET_DMA_INT_EN_RIE_Msk |
475 ETHERNET_DMA_INT_EN_OVE_Msk);
478 nicDriverInterface->nicEvent =
TRUE;
484 LPC_ETHERNET->DMA_STAT = ETHERNET_DMA_STAT_NIS_Msk | ETHERNET_DMA_STAT_AIE_Msk;
501 if((LPC_ETHERNET->DMA_STAT & (ETHERNET_DMA_STAT_RI_Msk | ETHERNET_DMA_STAT_OVF_Msk)) != 0)
504 LPC_ETHERNET->DMA_STAT = ETHERNET_DMA_STAT_RI_Msk | ETHERNET_DMA_STAT_OVF_Msk;
517 LPC_ETHERNET->DMA_INT_EN = ETHERNET_DMA_INT_EN_NIE_Msk |
518 ETHERNET_DMA_INT_EN_AIE_Msk | ETHERNET_DMA_INT_EN_RIE_Msk |
519 ETHERNET_DMA_INT_EN_OVE_Msk | ETHERNET_DMA_INT_EN_TIE_Msk |
520 ETHERNET_DMA_INT_EN_UNE_Msk;
568 LPC_ETHERNET->DMA_STAT = ETHERNET_DMA_STAT_TU_Msk;
570 LPC_ETHERNET->DMA_TRANS_POLL_DEMAND = 0;
648 LPC_ETHERNET->DMA_STAT = ETHERNET_DMA_STAT_RU_Msk;
650 LPC_ETHERNET->DMA_REC_POLL_DEMAND = 0;
668 uint32_t hashTable[2];
675 LPC_ETHERNET->MAC_ADDR0_LOW = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
676 LPC_ETHERNET->MAC_ADDR0_HIGH = interface->macAddr.w[2];
687 entry = &interface->macAddrFilter[i];
697 k = (crc >> 26) & 0x3F;
700 hashTable[k / 32] |= (1 << (k % 32));
705 LPC_ETHERNET->MAC_HASHTABLE_LOW = hashTable[0];
706 LPC_ETHERNET->MAC_HASHTABLE_HIGH = hashTable[1];
709 TRACE_DEBUG(
" MAC_HASHTABLE_LOW = %08" PRIX32
"\r\n", LPC_ETHERNET->MAC_HASHTABLE_LOW);
710 TRACE_DEBUG(
" MAC_HASHTABLE_HIGH = %08" PRIX32
"\r\n", LPC_ETHERNET->MAC_HASHTABLE_HIGH);
728 config = LPC_ETHERNET->MAC_CONFIG;
733 config |= ETHERNET_MAC_CONFIG_FES_Msk;
737 config &= ~ETHERNET_MAC_CONFIG_FES_Msk;
743 config |= ETHERNET_MAC_CONFIG_DM_Msk;
747 config &= ~ETHERNET_MAC_CONFIG_DM_Msk;
751 LPC_ETHERNET->MAC_CONFIG = config;
775 temp = LPC_ETHERNET->MAC_MII_ADDR & ETHERNET_MAC_MII_ADDR_CR_Msk;
777 temp |= ETHERNET_MAC_MII_ADDR_W_Msk | ETHERNET_MAC_MII_ADDR_GB_Msk;
779 temp |= (phyAddr << ETHERNET_MAC_MII_ADDR_PA_Pos) & ETHERNET_MAC_MII_ADDR_PA_Msk;
781 temp |= (
regAddr << ETHERNET_MAC_MII_ADDR_GR_Pos) & ETHERNET_MAC_MII_ADDR_GR_Msk;
784 LPC_ETHERNET->MAC_MII_DATA =
data & ETHERNET_MAC_MII_DATA_GD_Msk;
787 LPC_ETHERNET->MAC_MII_ADDR = temp;
789 while((LPC_ETHERNET->MAC_MII_ADDR & ETHERNET_MAC_MII_ADDR_GB_Msk) != 0)
818 temp = LPC_ETHERNET->MAC_MII_ADDR & ETHERNET_MAC_MII_ADDR_CR_Msk;
820 temp |= ETHERNET_MAC_MII_ADDR_GB_Msk;
822 temp |= (phyAddr << ETHERNET_MAC_MII_ADDR_PA_Pos) & ETHERNET_MAC_MII_ADDR_PA_Msk;
824 temp |= (
regAddr << ETHERNET_MAC_MII_ADDR_GR_Pos) & ETHERNET_MAC_MII_ADDR_GR_Msk;
827 LPC_ETHERNET->MAC_MII_ADDR = temp;
829 while((LPC_ETHERNET->MAC_MII_ADDR & ETHERNET_MAC_MII_ADDR_GB_Msk) != 0)
834 data = LPC_ETHERNET->MAC_MII_DATA & ETHERNET_MAC_MII_DATA_GD_Msk;
862 p = (uint8_t *)
data;
867 for(i = 0; i <
length; i++)
870 for(j = 0; j < 8; j++)
873 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
875 crc = (crc << 1) ^ 0x04C11DB7;