32 #define TRACE_LEVEL NIC_TRACE_LEVEL
44 #if defined(__ICCARM__)
47 #pragma data_alignment = 4
48 #pragma location = XMC4400_ETH_RAM_SECTION
51 #pragma data_alignment = 4
52 #pragma location = XMC4400_ETH_RAM_SECTION
55 #pragma data_alignment = 4
56 #pragma location = XMC4400_ETH_RAM_SECTION
59 #pragma data_alignment = 4
60 #pragma location = XMC4400_ETH_RAM_SECTION
123 TRACE_INFO(
"Initializing XMC4400 Ethernet MAC...\r\n");
126 nicDriverInterface = interface;
129 SCU_PARITY->PETE = 0;
131 PPB->CCR &= ~PPB_CCR_UNALIGN_TRP_Msk;
134 SCU_CLK->CLKSET = SCU_CLK_CLKSET_ETH0CEN_Msk;
140 SCU_RESET->PRSET2 = SCU_RESET_PRSET2_ETH0RS_Msk;
141 SCU_RESET->PRCLR2 = SCU_RESET_PRCLR2_ETH0RS_Msk;
144 ETH0->BUS_MODE |= ETH_BUS_MODE_SWR_Msk;
146 while((ETH0->BUS_MODE & ETH_BUS_MODE_SWR_Msk) != 0)
154 if(interface->phyDriver != NULL)
157 error = interface->phyDriver->init(interface);
159 else if(interface->switchDriver != NULL)
162 error = interface->switchDriver->init(interface);
178 ETH_MAC_CONFIGURATION_DO_Msk;
184 ETH0->FLOW_CONTROL = 0;
186 ETH0->OPERATION_MODE = ETH_OPERATION_MODE_RSF_Msk | ETH_OPERATION_MODE_TSF_Msk;
189 ETH0->BUS_MODE = ETH_BUS_MODE_AAL_Msk | ETH_BUS_MODE_USP_Msk |
197 ETH0->MMC_TRANSMIT_INTERRUPT_MASK = 0xFFFFFFFF;
198 ETH0->MMC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;
199 ETH0->MMC_IPC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;
202 ETH0->INTERRUPT_MASK = ETH_INTERRUPT_MASK_TSIM_Msk | ETH_INTERRUPT_MASK_PMTIM_Msk;
205 ETH0->INTERRUPT_ENABLE = ETH_INTERRUPT_ENABLE_NIE_Msk |
206 ETH_INTERRUPT_ENABLE_RIE_Msk | ETH_INTERRUPT_ENABLE_TIE_Msk;
216 ETH0->MAC_CONFIGURATION |= ETH_MAC_CONFIGURATION_TE_Msk | ETH_MAC_CONFIGURATION_RE_Msk;
218 ETH0->OPERATION_MODE |= ETH_OPERATION_MODE_ST_Msk | ETH_OPERATION_MODE_SR_Msk;
236 #if defined(USE_KIT_XMC4400_PLT2GO)
241 temp &= ~PORT0_IOCR4_PC4_Msk;
242 temp |= (17UL << PORT0_IOCR4_PC4_Pos);
247 temp &= ~(PORT2_IOCR0_PC0_Msk | PORT2_IOCR0_PC2_Msk | PORT2_IOCR0_PC3_Msk);
248 temp |= (0UL << PORT2_IOCR0_PC0_Pos) | (0UL << PORT2_IOCR0_PC2_Pos) | (0UL << PORT2_IOCR0_PC3_Pos);
253 temp &= ~(PORT2_IOCR4_PC4_Msk | PORT2_IOCR4_PC7_Msk);
254 temp |= (0UL << PORT2_IOCR4_PC4_Pos) | (17UL << PORT2_IOCR4_PC7_Pos);
259 temp &= ~(PORT2_IOCR8_PC8_Msk | PORT2_IOCR8_PC9_Msk);
260 temp |= (17UL << PORT2_IOCR8_PC8_Pos) | (17UL << PORT2_IOCR8_PC9_Pos);
264 temp = PORT15->IOCR8;
265 temp &= ~(PORT15_IOCR8_PC8_Msk | PORT15_IOCR8_PC9_Msk);
266 temp |= (0UL << PORT15_IOCR8_PC8_Pos) | (0UL << PORT15_IOCR8_PC9_Pos);
267 PORT15->IOCR8 = temp;
270 temp = PORT2->HWSEL & ~PORT2_HWSEL_HW0_Msk;
271 PORT2->HWSEL = temp | (1UL << PORT2_HWSEL_HW0_Pos);
275 temp &= ~PORT2_PDR0_PD5_Msk;
276 temp |= (0UL << PORT2_PDR0_PD5_Pos);
281 temp &= ~(PORT2_PDR1_PD8_Msk | PORT2_PDR1_PD9_Msk);
282 temp |= (0UL << PORT2_PDR1_PD8_Pos) | (0UL << PORT2_PDR1_PD9_Pos);
286 PORT15->PDISC &= ~(PORT15_PDISC_PDIS8_Msk | PORT15_PDISC_PDIS9_Msk);
341 ETH0->TRANSMIT_DESCRIPTOR_LIST_ADDRESS = (uint32_t)
txDmaDesc;
343 ETH0->RECEIVE_DESCRIPTOR_LIST_ADDRESS = (uint32_t)
rxDmaDesc;
359 if(interface->phyDriver != NULL)
362 interface->phyDriver->tick(interface);
364 else if(interface->switchDriver != NULL)
367 interface->switchDriver->tick(interface);
384 NVIC_EnableIRQ(ETH0_0_IRQn);
387 if(interface->phyDriver != NULL)
390 interface->phyDriver->enableIrq(interface);
392 else if(interface->switchDriver != NULL)
395 interface->switchDriver->enableIrq(interface);
412 NVIC_DisableIRQ(ETH0_0_IRQn);
415 if(interface->phyDriver != NULL)
418 interface->phyDriver->disableIrq(interface);
420 else if(interface->switchDriver != NULL)
423 interface->switchDriver->disableIrq(interface);
448 status = ETH0->STATUS;
451 if((status & ETH_STATUS_TI_Msk) != 0)
454 ETH0->STATUS = ETH_STATUS_TI_Msk;
465 if((status & ETH_STATUS_RI_Msk) != 0)
468 ETH0->STATUS = ETH_STATUS_RI_Msk;
471 nicDriverInterface->nicEvent =
TRUE;
477 ETH0->STATUS = ETH_STATUS_NIS_Msk;
548 ETH0->STATUS = ETH_STATUS_TU_Msk;
550 ETH0->TRANSMIT_POLL_DEMAND = 0;
628 ETH0->STATUS = ETH_STATUS_RU_Msk;
630 ETH0->RECEIVE_POLL_DEMAND = 0;
649 uint32_t hashTable[2];
657 if(interface->promiscuous)
660 ETH0->MAC_FRAME_FILTER = ETH_MAC_FRAME_FILTER_PR_Msk;
665 ETH0->MAC_ADDRESS0_LOW = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
666 ETH0->MAC_ADDRESS0_HIGH = interface->macAddr.w[2];
682 entry = &interface->macAddrFilter[i];
695 k = (crc >> 26) & 0x3F;
698 hashTable[k / 32] |= (1 << (k % 32));
706 unicastMacAddr[j++] = entry->
addr;
716 ETH0->MAC_ADDRESS1_LOW = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
717 ETH0->MAC_ADDRESS1_HIGH = unicastMacAddr[0].w[2] | ETH_MAC_ADDRESS1_HIGH_AE_Msk;
722 ETH0->MAC_ADDRESS1_LOW = 0;
723 ETH0->MAC_ADDRESS1_HIGH = 0;
730 ETH0->MAC_ADDRESS2_LOW = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
731 ETH0->MAC_ADDRESS2_HIGH = unicastMacAddr[1].w[2] | ETH_MAC_ADDRESS2_HIGH_AE_Msk;
736 ETH0->MAC_ADDRESS2_LOW = 0;
737 ETH0->MAC_ADDRESS2_HIGH = 0;
744 ETH0->MAC_ADDRESS3_LOW = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
745 ETH0->MAC_ADDRESS3_HIGH = unicastMacAddr[2].w[2] | ETH_MAC_ADDRESS3_HIGH_AE_Msk;
750 ETH0->MAC_ADDRESS3_LOW = 0;
751 ETH0->MAC_ADDRESS3_HIGH = 0;
756 if(interface->acceptAllMulticast)
759 ETH0->MAC_FRAME_FILTER = ETH_MAC_FRAME_FILTER_HPF_Msk |
760 ETH_MAC_FRAME_FILTER_PM_Msk;
765 ETH0->MAC_FRAME_FILTER = ETH_MAC_FRAME_FILTER_HPF_Msk |
766 ETH_MAC_FRAME_FILTER_HMC_Msk;
769 ETH0->HASH_TABLE_LOW = hashTable[0];
770 ETH0->HASH_TABLE_HIGH = hashTable[1];
773 TRACE_DEBUG(
" HASH_TABLE_LOW = 0x%08" PRIX32
"\r\n", ETH0->HASH_TABLE_LOW);
774 TRACE_DEBUG(
" HASH_TABLE_HIGH = 0x%08" PRIX32
"\r\n", ETH0->HASH_TABLE_HIGH);
794 config = ETH0->MAC_CONFIGURATION;
799 config |= ETH_MAC_CONFIGURATION_FES_Msk;
803 config &= ~ETH_MAC_CONFIGURATION_FES_Msk;
809 config |= ETH_MAC_CONFIGURATION_DM_Msk;
813 config &= ~ETH_MAC_CONFIGURATION_DM_Msk;
817 ETH0->MAC_CONFIGURATION = config;
841 temp = ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_CR_Msk;
843 temp |= ETH_GMII_ADDRESS_MW_Msk | ETH_GMII_ADDRESS_MB_Msk;
845 temp |= (phyAddr << ETH_GMII_ADDRESS_PA_Pos) & ETH_GMII_ADDRESS_PA_Msk;
847 temp |= (
regAddr << ETH_GMII_ADDRESS_MR_Pos) & ETH_GMII_ADDRESS_MR_Msk;
850 ETH0->GMII_DATA =
data & ETH_GMII_DATA_MD_Msk;
853 ETH0->GMII_ADDRESS = temp;
855 while((ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_MB_Msk) != 0)
884 temp = ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_CR_Msk;
886 temp |= ETH_GMII_ADDRESS_MB_Msk;
888 temp |= (phyAddr << ETH_GMII_ADDRESS_PA_Pos) & ETH_GMII_ADDRESS_PA_Msk;
890 temp |= (
regAddr << ETH_GMII_ADDRESS_MR_Pos) & ETH_GMII_ADDRESS_MR_Msk;
893 ETH0->GMII_ADDRESS = temp;
895 while((ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_MB_Msk) != 0)
900 data = ETH0->GMII_DATA & ETH_GMII_DATA_MD_Msk;
928 p = (uint8_t *)
data;
933 for(i = 0; i <
length; i++)
936 for(j = 0; j < 8; j++)
939 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
941 crc = (crc << 1) ^ 0x04C11DB7;