32 #define TRACE_LEVEL NIC_TRACE_LEVEL
44 #if defined(__ICCARM__)
47 #pragma data_alignment = 4
50 #pragma data_alignment = 4
53 #pragma data_alignment = 4
56 #pragma data_alignment = 4
119 TRACE_INFO(
"Initializing GD32F5 Ethernet MAC...\r\n");
122 nicDriverInterface = interface;
128 rcu_periph_clock_enable(RCU_ENET);
129 rcu_periph_clock_enable(RCU_ENETTX);
130 rcu_periph_clock_enable(RCU_ENETRX);
133 rcu_periph_reset_enable(RCU_ENETRST);
134 rcu_periph_reset_disable(RCU_ENETRST);
137 ENET_DMA_BCTL |= ENET_DMA_BCTL_SWR;
139 while((ENET_DMA_BCTL & ENET_DMA_BCTL_SWR) != 0)
144 ENET_MAC_PHY_CTL = ENET_MDC_HCLK_DIV62;
147 if(interface->phyDriver != NULL)
150 error = interface->phyDriver->init(interface);
152 else if(interface->switchDriver != NULL)
155 error = interface->switchDriver->init(interface);
170 ENET_MAC_CFG = ENET_MAC_CFG_ROD;
173 ENET_MAC_ADDR0L = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
174 ENET_MAC_ADDR0H = interface->macAddr.w[2] | ENET_MAC_ADDR0H_MO;
189 ENET_MAC_FRMF = ENET_MAC_FRMF_HPFLT | ENET_MAC_FRMF_HMF;
193 ENET_DMA_CTL = ENET_DMA_CTL_RSFD | ENET_DMA_CTL_TSFD;
196 ENET_DMA_BCTL = ENET_DMA_BCTL_AA | ENET_DMA_BCTL_UIP | ENET_RXDP_32BEAT |
197 ENET_ARBITRATION_RXTX_1_1 | ENET_PGBL_32BEAT | ENET_DMA_BCTL_DFM;
204 ENET_MSC_TINTMSK = ENET_MSC_TINTMSK_TGFIM | ENET_MSC_TINTMSK_TGFMSCIM |
205 ENET_MSC_TINTMSK_TGFSCIM;
209 ENET_MSC_RINTMSK = ENET_MSC_RINTMSK_RGUFIM | ENET_MSC_RINTMSK_RFAEIM |
210 ENET_MSC_RINTMSK_RFCEIM;
213 ENET_MAC_INTMSK = ENET_MAC_INTMSK_TMSTIM | ENET_MAC_INTMSK_WUMIM;
215 ENET_DMA_INTEN = ENET_DMA_INTEN_NIE | ENET_DMA_INTEN_RIE | ENET_DMA_INTEN_TIE;
225 ENET_MAC_CFG |= ENET_MAC_CFG_TEN | ENET_MAC_CFG_REN;
227 ENET_DMA_CTL |= ENET_DMA_CTL_STE | ENET_DMA_CTL_SRE;
245 #if defined(USE_GD32F527I_EVAL)
247 rcu_periph_clock_enable(RCU_SYSCFG);
250 rcu_periph_clock_enable(RCU_GPIOA);
251 rcu_periph_clock_enable(RCU_GPIOC);
252 rcu_periph_clock_enable(RCU_GPIOG);
255 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
256 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_8);
257 gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_8);
260 rcu_ckout0_config(RCU_CKOUT0SRC_PLLP, RCU_CKOUT0_DIV4);
263 syscfg_enet_phy_interface_config(SYSCFG_ENET_PHY_RMII);
266 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
267 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_1);
268 gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_1);
271 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2);
272 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_2);
273 gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_2);
276 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
277 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_7);
278 gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_7);
281 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
282 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_1);
283 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1);
286 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
287 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_4);
288 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4);
291 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
292 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_5);
293 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5);
296 gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
297 gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_11);
298 gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_11);
301 gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13);
302 gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_13);
303 gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_13);
306 gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);
307 gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_14);
308 gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_14);
326 txDmaDesc[i].tdes0 = ENET_TDES0_INTC | ENET_TDES0_TCHM;
390 if(interface->phyDriver != NULL)
393 interface->phyDriver->tick(interface);
395 else if(interface->switchDriver != NULL)
398 interface->switchDriver->tick(interface);
415 NVIC_EnableIRQ(ENET_IRQn);
418 if(interface->phyDriver != NULL)
421 interface->phyDriver->enableIrq(interface);
423 else if(interface->switchDriver != NULL)
426 interface->switchDriver->enableIrq(interface);
443 NVIC_DisableIRQ(ENET_IRQn);
446 if(interface->phyDriver != NULL)
449 interface->phyDriver->disableIrq(interface);
451 else if(interface->switchDriver != NULL)
454 interface->switchDriver->disableIrq(interface);
479 status = ENET_DMA_STAT;
482 if((status & ENET_DMA_STAT_TS) != 0)
485 ENET_DMA_STAT = ENET_DMA_STAT_TS;
488 if((txCurDmaDesc->
tdes0 & ENET_TDES0_DAV) == 0)
496 if((status & ENET_DMA_STAT_RS) != 0)
499 ENET_DMA_STAT = ENET_DMA_STAT_RS;
502 nicDriverInterface->nicEvent =
TRUE;
508 ENET_DMA_STAT = ENET_DMA_STAT_NI;
563 if((txCurDmaDesc->
tdes0 & ENET_TDES0_DAV) != 0)
574 txCurDmaDesc->
tdes0 |= ENET_TDES0_LSG | ENET_TDES0_FSG;
576 txCurDmaDesc->
tdes0 |= ENET_TDES0_DAV;
582 ENET_DMA_STAT = ENET_DMA_STAT_TBU;
590 if((txCurDmaDesc->
tdes0 & ENET_TDES0_DAV) == 0)
614 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_DAV) == 0)
617 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_FDES) != 0 &&
618 (rxCurDmaDesc->
rdes0 & ENET_RDES0_LDES) != 0)
621 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_ERRS) == 0)
624 n = (rxCurDmaDesc->
rdes0 & ENET_RDES0_FRML) >> 16;
651 rxCurDmaDesc->
rdes0 = ENET_RDES0_DAV;
662 ENET_DMA_STAT = ENET_DMA_STAT_RBU;
683 uint32_t hashTable[2];
691 ENET_MAC_ADDR0L = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
692 ENET_MAC_ADDR0H = interface->macAddr.w[2] | ENET_MAC_ADDR0H_MO;
708 entry = &interface->macAddrFilter[i];
721 k = (crc >> 26) & 0x3F;
724 hashTable[k / 32] |= (1 << (k % 32));
732 unicastMacAddr[j++] = entry->
addr;
742 ENET_MAC_ADDR1L = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
743 ENET_MAC_ADDR1H = unicastMacAddr[0].w[2] | ENET_MAC_ADDR1H_AFE;
756 ENET_MAC_ADDR2L = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
757 ENET_MAC_ADDT2H = unicastMacAddr[1].w[2] | ENET_MAC_ADDR2H_AFE;
770 ENET_MAC_ADDR3L = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
771 ENET_MAC_ADDR3H = unicastMacAddr[2].w[2] | ENET_MAC_ADDR3H_AFE;
781 ENET_MAC_HLL = hashTable[0];
782 ENET_MAC_HLH = hashTable[1];
785 TRACE_DEBUG(
" ENET_MAC_HLL = %08" PRIX32
"\r\n", ENET_MAC_HLL);
786 TRACE_DEBUG(
" ENET_MAC_HLH = %08" PRIX32
"\r\n", ENET_MAC_HLH);
804 config = ENET_MAC_CFG;
809 config |= ENET_MAC_CFG_SPD;
813 config &= ~ENET_MAC_CFG_SPD;
819 config |= ENET_MAC_CFG_DPM;
823 config &= ~ENET_MAC_CFG_DPM;
827 ENET_MAC_CFG = config;
851 temp = ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_CLR;
853 temp |= ENET_MAC_PHY_CTL_PW | ENET_MAC_PHY_CTL_PB;
855 temp |= MAC_PHY_CTL_PA(phyAddr);
857 temp |= MAC_PHY_CTL_PR(
regAddr);
860 ENET_MAC_PHY_DATA =
data & ENET_MAC_PHY_DATA_PD;
863 ENET_MAC_PHY_CTL = temp;
865 while((ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB) != 0)
894 temp = ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_CLR;
896 temp |= ENET_MAC_PHY_CTL_PB;
898 temp |= MAC_PHY_CTL_PA(phyAddr);
900 temp |= MAC_PHY_CTL_PR(
regAddr);
903 ENET_MAC_PHY_CTL = temp;
905 while((ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB) != 0)
910 data = ENET_MAC_PHY_DATA & ENET_MAC_PHY_DATA_PD;
938 p = (uint8_t *)
data;
943 for(i = 0; i <
length; i++)
946 for(j = 0; j < 8; j++)
949 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
951 crc = (crc << 1) ^ 0x04C11DB7;