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 GD32F4XX 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_GD32F470I_EVAL) || defined(USE_GD32F470Z_EVAL)
247 rcu_periph_clock_enable(RCU_SYSCFG);
250 rcu_periph_clock_enable(RCU_GPIOA);
251 rcu_periph_clock_enable(RCU_GPIOB);
252 rcu_periph_clock_enable(RCU_GPIOC);
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(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
282 gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_11);
283 gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_11);
286 gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);
287 gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_12);
288 gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_12);
291 gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13);
292 gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_13);
293 gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_13);
296 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
297 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_1);
298 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1);
301 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
302 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_4);
303 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4);
306 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
307 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_5);
308 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5);
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;
579 ENET_DMA_STAT = ENET_DMA_STAT_TBU;
587 if((txCurDmaDesc->
tdes0 & ENET_TDES0_DAV) == 0)
611 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_DAV) == 0)
614 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_FDES) != 0 &&
615 (rxCurDmaDesc->
rdes0 & ENET_RDES0_LDES) != 0)
618 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_ERRS) == 0)
621 n = (rxCurDmaDesc->
rdes0 & ENET_RDES0_FRML) >> 16;
648 rxCurDmaDesc->
rdes0 = ENET_RDES0_DAV;
659 ENET_DMA_STAT = ENET_DMA_STAT_RBU;
680 uint32_t hashTable[2];
688 ENET_MAC_ADDR0L = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
689 ENET_MAC_ADDR0H = interface->macAddr.w[2] | ENET_MAC_ADDR0H_MO;
705 entry = &interface->macAddrFilter[i];
718 k = (crc >> 26) & 0x3F;
721 hashTable[k / 32] |= (1 << (k % 32));
729 unicastMacAddr[j++] = entry->
addr;
739 ENET_MAC_ADDR1L = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
740 ENET_MAC_ADDR1H = unicastMacAddr[0].w[2] | ENET_MAC_ADDR1H_AFE;
753 ENET_MAC_ADDR2L = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
754 ENET_MAC_ADDT2H = unicastMacAddr[1].w[2] | ENET_MAC_ADDR2H_AFE;
767 ENET_MAC_ADDR3L = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
768 ENET_MAC_ADDR3H = unicastMacAddr[2].w[2] | ENET_MAC_ADDR3H_AFE;
778 ENET_MAC_HLL = hashTable[0];
779 ENET_MAC_HLH = hashTable[1];
782 TRACE_DEBUG(
" ENET_MAC_HLL = %08" PRIX32
"\r\n", ENET_MAC_HLL);
783 TRACE_DEBUG(
" ENET_MAC_HLH = %08" PRIX32
"\r\n", ENET_MAC_HLH);
801 config = ENET_MAC_CFG;
806 config |= ENET_MAC_CFG_SPD;
810 config &= ~ENET_MAC_CFG_SPD;
816 config |= ENET_MAC_CFG_DPM;
820 config &= ~ENET_MAC_CFG_DPM;
824 ENET_MAC_CFG = config;
848 temp = ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_CLR;
850 temp |= ENET_MAC_PHY_CTL_PW | ENET_MAC_PHY_CTL_PB;
852 temp |= MAC_PHY_CTL_PA(phyAddr);
854 temp |= MAC_PHY_CTL_PR(
regAddr);
857 ENET_MAC_PHY_DATA =
data & ENET_MAC_PHY_DATA_PD;
860 ENET_MAC_PHY_CTL = temp;
862 while((ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB) != 0)
891 temp = ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_CLR;
893 temp |= ENET_MAC_PHY_CTL_PB;
895 temp |= MAC_PHY_CTL_PA(phyAddr);
897 temp |= MAC_PHY_CTL_PR(
regAddr);
900 ENET_MAC_PHY_CTL = temp;
902 while((ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB) != 0)
907 data = ENET_MAC_PHY_DATA & ENET_MAC_PHY_DATA_PD;
935 p = (uint8_t *)
data;
940 for(i = 0; i <
length; i++)
943 for(j = 0; j < 8; j++)
946 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
948 crc = (crc << 1) ^ 0x04C11DB7;