32 #define TRACE_LEVEL NIC_TRACE_LEVEL
44 #if defined(__ICCARM__)
47 #pragma data_alignment = 4
48 #pragma location = XMC4700_ETH_RAM_SECTION
51 #pragma data_alignment = 4
52 #pragma location = XMC4700_ETH_RAM_SECTION
55 #pragma data_alignment = 4
56 #pragma location = XMC4700_ETH_RAM_SECTION
59 #pragma data_alignment = 4
60 #pragma location = XMC4700_ETH_RAM_SECTION
123 TRACE_INFO(
"Initializing XMC4700 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_XMC4700_RELAX)
241 temp &= ~(PORT2_IOCR0_PC0_Msk | PORT2_IOCR0_PC2_Msk | PORT2_IOCR0_PC3_Msk);
242 temp |= (0UL << PORT2_IOCR0_PC0_Pos) | (0UL << PORT2_IOCR0_PC2_Pos) | (0UL << PORT2_IOCR0_PC3_Pos);
247 temp &= ~(PORT2_IOCR4_PC4_Msk | PORT2_IOCR4_PC5_Msk | PORT2_IOCR4_PC7_Msk);
248 temp |= (0UL << PORT2_IOCR4_PC4_Pos) | (17UL << PORT2_IOCR4_PC5_Pos) | (17UL << PORT2_IOCR4_PC7_Pos);
253 temp &= ~(PORT2_IOCR8_PC8_Msk | PORT2_IOCR8_PC9_Msk);
254 temp |= (17UL << PORT2_IOCR8_PC8_Pos) | (17UL << PORT2_IOCR8_PC9_Pos);
258 temp = PORT15->IOCR8;
259 temp &= ~(PORT15_IOCR8_PC8_Msk | PORT15_IOCR8_PC9_Msk);
260 temp |= (0UL << PORT15_IOCR8_PC8_Pos) | (0UL << PORT15_IOCR8_PC9_Pos);
261 PORT15->IOCR8 = temp;
264 temp = PORT2->HWSEL & ~PORT2_HWSEL_HW0_Msk;
265 PORT2->HWSEL = temp | (1UL << PORT2_HWSEL_HW0_Pos);
269 temp &= ~PORT2_PDR0_PD5_Msk;
270 temp |= (0UL << PORT2_PDR0_PD5_Pos);
275 temp &= ~(PORT2_PDR1_PD8_Msk | PORT2_PDR1_PD9_Msk);
276 temp |= (0UL << PORT2_PDR1_PD8_Pos) | (0UL << PORT2_PDR1_PD9_Pos);
280 PORT15->PDISC &= ~(PORT15_PDISC_PDIS8_Msk | PORT15_PDISC_PDIS9_Msk);
335 ETH0->TRANSMIT_DESCRIPTOR_LIST_ADDRESS = (uint32_t)
txDmaDesc;
337 ETH0->RECEIVE_DESCRIPTOR_LIST_ADDRESS = (uint32_t)
rxDmaDesc;
353 if(interface->phyDriver != NULL)
356 interface->phyDriver->tick(interface);
358 else if(interface->switchDriver != NULL)
361 interface->switchDriver->tick(interface);
378 NVIC_EnableIRQ(ETH0_0_IRQn);
381 if(interface->phyDriver != NULL)
384 interface->phyDriver->enableIrq(interface);
386 else if(interface->switchDriver != NULL)
389 interface->switchDriver->enableIrq(interface);
406 NVIC_DisableIRQ(ETH0_0_IRQn);
409 if(interface->phyDriver != NULL)
412 interface->phyDriver->disableIrq(interface);
414 else if(interface->switchDriver != NULL)
417 interface->switchDriver->disableIrq(interface);
442 status = ETH0->STATUS;
445 if((status & ETH_STATUS_TI_Msk) != 0)
448 ETH0->STATUS = ETH_STATUS_TI_Msk;
459 if((status & ETH_STATUS_RI_Msk) != 0)
462 ETH0->STATUS = ETH_STATUS_RI_Msk;
465 nicDriverInterface->nicEvent =
TRUE;
471 ETH0->STATUS = ETH_STATUS_NIS_Msk;
542 ETH0->STATUS = ETH_STATUS_TU_Msk;
544 ETH0->TRANSMIT_POLL_DEMAND = 0;
622 ETH0->STATUS = ETH_STATUS_RU_Msk;
624 ETH0->RECEIVE_POLL_DEMAND = 0;
643 uint32_t hashTable[2];
651 if(interface->promiscuous)
654 ETH0->MAC_FRAME_FILTER = ETH_MAC_FRAME_FILTER_PR_Msk;
659 ETH0->MAC_ADDRESS0_LOW = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
660 ETH0->MAC_ADDRESS0_HIGH = interface->macAddr.w[2];
676 entry = &interface->macAddrFilter[i];
689 k = (crc >> 26) & 0x3F;
692 hashTable[k / 32] |= (1 << (k % 32));
700 unicastMacAddr[j++] = entry->
addr;
710 ETH0->MAC_ADDRESS1_LOW = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
711 ETH0->MAC_ADDRESS1_HIGH = unicastMacAddr[0].w[2] | ETH_MAC_ADDRESS1_HIGH_AE_Msk;
716 ETH0->MAC_ADDRESS1_LOW = 0;
717 ETH0->MAC_ADDRESS1_HIGH = 0;
724 ETH0->MAC_ADDRESS2_LOW = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
725 ETH0->MAC_ADDRESS2_HIGH = unicastMacAddr[1].w[2] | ETH_MAC_ADDRESS2_HIGH_AE_Msk;
730 ETH0->MAC_ADDRESS2_LOW = 0;
731 ETH0->MAC_ADDRESS2_HIGH = 0;
738 ETH0->MAC_ADDRESS3_LOW = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
739 ETH0->MAC_ADDRESS3_HIGH = unicastMacAddr[2].w[2] | ETH_MAC_ADDRESS3_HIGH_AE_Msk;
744 ETH0->MAC_ADDRESS3_LOW = 0;
745 ETH0->MAC_ADDRESS3_HIGH = 0;
750 if(interface->acceptAllMulticast)
753 ETH0->MAC_FRAME_FILTER = ETH_MAC_FRAME_FILTER_HPF_Msk |
754 ETH_MAC_FRAME_FILTER_PM_Msk;
759 ETH0->MAC_FRAME_FILTER = ETH_MAC_FRAME_FILTER_HPF_Msk |
760 ETH_MAC_FRAME_FILTER_HMC_Msk;
763 ETH0->HASH_TABLE_LOW = hashTable[0];
764 ETH0->HASH_TABLE_HIGH = hashTable[1];
767 TRACE_DEBUG(
" HASH_TABLE_LOW = 0x%08" PRIX32
"\r\n", ETH0->HASH_TABLE_LOW);
768 TRACE_DEBUG(
" HASH_TABLE_HIGH = 0x%08" PRIX32
"\r\n", ETH0->HASH_TABLE_HIGH);
788 config = ETH0->MAC_CONFIGURATION;
793 config |= ETH_MAC_CONFIGURATION_FES_Msk;
797 config &= ~ETH_MAC_CONFIGURATION_FES_Msk;
803 config |= ETH_MAC_CONFIGURATION_DM_Msk;
807 config &= ~ETH_MAC_CONFIGURATION_DM_Msk;
811 ETH0->MAC_CONFIGURATION = config;
835 temp = ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_CR_Msk;
837 temp |= ETH_GMII_ADDRESS_MW_Msk | ETH_GMII_ADDRESS_MB_Msk;
839 temp |= (phyAddr << ETH_GMII_ADDRESS_PA_Pos) & ETH_GMII_ADDRESS_PA_Msk;
841 temp |= (
regAddr << ETH_GMII_ADDRESS_MR_Pos) & ETH_GMII_ADDRESS_MR_Msk;
844 ETH0->GMII_DATA =
data & ETH_GMII_DATA_MD_Msk;
847 ETH0->GMII_ADDRESS = temp;
849 while((ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_MB_Msk) != 0)
878 temp = ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_CR_Msk;
880 temp |= ETH_GMII_ADDRESS_MB_Msk;
882 temp |= (phyAddr << ETH_GMII_ADDRESS_PA_Pos) & ETH_GMII_ADDRESS_PA_Msk;
884 temp |= (
regAddr << ETH_GMII_ADDRESS_MR_Pos) & ETH_GMII_ADDRESS_MR_Msk;
887 ETH0->GMII_ADDRESS = temp;
889 while((ETH0->GMII_ADDRESS & ETH_GMII_ADDRESS_MB_Msk) != 0)
894 data = ETH0->GMII_DATA & ETH_GMII_DATA_MD_Msk;
922 p = (uint8_t *)
data;
927 for(i = 0; i <
length; i++)
930 for(j = 0; j < 8; j++)
933 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
935 crc = (crc << 1) ^ 0x04C11DB7;