32 #define TRACE_LEVEL NIC_TRACE_LEVEL
44 #if defined(__ICCARM__)
47 #pragma data_alignment = 4
48 #pragma location = STM32H7XX_ETH1_RAM_SECTION
51 #pragma data_alignment = 4
52 #pragma location = STM32H7XX_ETH1_RAM_SECTION
55 #pragma data_alignment = 4
56 #pragma location = STM32H7XX_ETH1_RAM_SECTION
59 #pragma data_alignment = 4
60 #pragma location = STM32H7XX_ETH1_RAM_SECTION
123 TRACE_INFO(
"Initializing GD32H7 Ethernet MAC (ENET0)...\r\n");
126 nicDriverInterface = interface;
132 rcu_periph_clock_enable(RCU_ENET0);
133 rcu_periph_clock_enable(RCU_ENET0TX);
134 rcu_periph_clock_enable(RCU_ENET0RX);
137 rcu_periph_reset_enable(RCU_ENET0RST);
138 rcu_periph_reset_disable(RCU_ENET0RST);
141 ENET_DMA_BCTL(ENET0) |= ENET_DMA_BCTL_SWR;
143 while((ENET_DMA_BCTL(ENET0) & ENET_DMA_BCTL_SWR) != 0)
148 ENET_MAC_PHY_CTL(ENET0) = ENET_MDC_HCLK_DIV62;
151 if(interface->phyDriver != NULL)
154 error = interface->phyDriver->init(interface);
156 else if(interface->switchDriver != NULL)
159 error = interface->switchDriver->init(interface);
174 ENET_MAC_CFG(ENET0) = ENET_MAC_CFG_ROD;
177 ENET_MAC_ADDR0L(ENET0) = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
178 ENET_MAC_ADDR0H(ENET0) = interface->macAddr.w[2] | ENET_MAC_ADDR0H_MO;
181 ENET_MAC_ADDR1L(ENET0) = 0;
182 ENET_MAC_ADDR1H(ENET0) = 0;
183 ENET_MAC_ADDR2L(ENET0) = 0;
184 ENET_MAC_ADDT2H(ENET0) = 0;
185 ENET_MAC_ADDR3L(ENET0) = 0;
186 ENET_MAC_ADDR3H(ENET0) = 0;
189 ENET_MAC_HLL(ENET0) = 0;
190 ENET_MAC_HLH(ENET0) = 0;
193 ENET_MAC_FRMF(ENET0) = ENET_MAC_FRMF_HPFLT | ENET_MAC_FRMF_HMF;
195 ENET_MAC_FCTL(ENET0) = 0;
197 ENET_DMA_CTL(ENET0) = ENET_DMA_CTL_RSFD | ENET_DMA_CTL_TSFD;
200 ENET_DMA_BCTL(ENET0) = ENET_DMA_BCTL_AA | ENET_DMA_BCTL_UIP | ENET_RXDP_32BEAT |
201 ENET_ARBITRATION_RXTX_1_1 | ENET_PGBL_32BEAT | ENET_DMA_BCTL_DFM;
208 ENET_MSC_TINTMSK(ENET0) = ENET_MSC_TINTMSK_TGFIM | ENET_MSC_TINTMSK_TGFMSCIM |
209 ENET_MSC_TINTMSK_TGFSCIM;
213 ENET_MSC_RINTMSK(ENET0) = ENET_MSC_RINTMSK_RGUFIM | ENET_MSC_RINTMSK_RFAEIM |
214 ENET_MSC_RINTMSK_RFCEIM;
217 ENET_MAC_INTMSK(ENET0) = ENET_MAC_INTMSK_TMSTIM | ENET_MAC_INTMSK_WUMIM;
219 ENET_DMA_INTEN(ENET0) = ENET_DMA_INTEN_NIE | ENET_DMA_INTEN_RIE | ENET_DMA_INTEN_TIE;
229 ENET_MAC_CFG(ENET0) |= ENET_MAC_CFG_TEN | ENET_MAC_CFG_REN;
231 ENET_DMA_CTL(ENET0) |= ENET_DMA_CTL_STE | ENET_DMA_CTL_SRE;
249 #if defined(USE_GD32H759I_EVAL)
251 rcu_periph_clock_enable(RCU_SYSCFG);
254 rcu_periph_clock_enable(RCU_GPIOA);
255 rcu_periph_clock_enable(RCU_GPIOB);
256 rcu_periph_clock_enable(RCU_GPIOC);
257 rcu_periph_clock_enable(RCU_GPIOG);
260 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
261 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8);
262 gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_8);
265 rcu_ckout0_config(RCU_CKOUT0SRC_PLL0P, RCU_CKOUT0_DIV12);
268 syscfg_enet_phy_interface_config(ENET0, SYSCFG_ENET_PHY_RMII);
271 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
272 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1);
273 gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_1);
276 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2);
277 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_12MHZ, GPIO_PIN_2);
278 gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_2);
281 gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
282 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7);
283 gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_7);
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_100_220MHZ, GPIO_PIN_12);
288 gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_12);
291 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);
292 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_12MHZ, GPIO_PIN_1);
293 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1);
296 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
297 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_4);
298 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4);
301 gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
302 gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_5);
303 gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5);
306 gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
307 gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11);
308 gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_11);
311 gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);
312 gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12);
313 gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_12);
331 txDmaDesc[i].tdes0 = ENET_TDES0_INTC | ENET_TDES0_TCHM;
377 ENET_DMA_TDTADDR(ENET0) = (uint32_t)
txDmaDesc;
379 ENET_DMA_RDTADDR(ENET0) = (uint32_t)
rxDmaDesc;
395 if(interface->phyDriver != NULL)
398 interface->phyDriver->tick(interface);
400 else if(interface->switchDriver != NULL)
403 interface->switchDriver->tick(interface);
420 NVIC_EnableIRQ(ENET0_IRQn);
423 if(interface->phyDriver != NULL)
426 interface->phyDriver->enableIrq(interface);
428 else if(interface->switchDriver != NULL)
431 interface->switchDriver->enableIrq(interface);
448 NVIC_DisableIRQ(ENET0_IRQn);
451 if(interface->phyDriver != NULL)
454 interface->phyDriver->disableIrq(interface);
456 else if(interface->switchDriver != NULL)
459 interface->switchDriver->disableIrq(interface);
484 status = ENET_DMA_STAT(ENET0);
487 if((status & ENET_DMA_STAT_TS) != 0)
490 ENET_DMA_STAT(ENET0) = ENET_DMA_STAT_TS;
493 if((txCurDmaDesc->
tdes0 & ENET_TDES0_DAV) == 0)
501 if((status & ENET_DMA_STAT_RS) != 0)
504 ENET_DMA_STAT(ENET0) = ENET_DMA_STAT_RS;
507 nicDriverInterface->nicEvent =
TRUE;
513 ENET_DMA_STAT(ENET0) = ENET_DMA_STAT_NI;
568 if((txCurDmaDesc->
tdes0 & ENET_TDES0_DAV) != 0)
579 txCurDmaDesc->
tdes0 |= ENET_TDES0_LSG | ENET_TDES0_FSG;
581 txCurDmaDesc->
tdes0 |= ENET_TDES0_DAV;
587 ENET_DMA_STAT(ENET0) = ENET_DMA_STAT_TBU;
589 ENET_DMA_TPEN(ENET0) = 0;
595 if((txCurDmaDesc->
tdes0 & ENET_TDES0_DAV) == 0)
619 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_DAV) == 0)
622 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_FDES) != 0 &&
623 (rxCurDmaDesc->
rdes0 & ENET_RDES0_LDES) != 0)
626 if((rxCurDmaDesc->
rdes0 & ENET_RDES0_ERRS) == 0)
629 n = (rxCurDmaDesc->
rdes0 & ENET_RDES0_FRML) >> 16;
656 rxCurDmaDesc->
rdes0 = ENET_RDES0_DAV;
667 ENET_DMA_STAT(ENET0) = ENET_DMA_STAT_RBU;
669 ENET_DMA_RPEN(ENET0) = 0;
688 uint32_t hashTable[2];
696 ENET_MAC_ADDR0L(ENET0) = interface->macAddr.w[0] | (interface->macAddr.w[1] << 16);
697 ENET_MAC_ADDR0H(ENET0) = interface->macAddr.w[2] | ENET_MAC_ADDR0H_MO;
713 entry = &interface->macAddrFilter[i];
726 k = (crc >> 26) & 0x3F;
729 hashTable[k / 32] |= (1 << (k % 32));
737 unicastMacAddr[j++] = entry->
addr;
747 ENET_MAC_ADDR1L(ENET0) = unicastMacAddr[0].w[0] | (unicastMacAddr[0].w[1] << 16);
748 ENET_MAC_ADDR1H(ENET0) = unicastMacAddr[0].w[2] | ENET_MAC_ADDR1H_AFE;
753 ENET_MAC_ADDR1L(ENET0) = 0;
754 ENET_MAC_ADDR1H(ENET0) = 0;
761 ENET_MAC_ADDR2L(ENET0) = unicastMacAddr[1].w[0] | (unicastMacAddr[1].w[1] << 16);
762 ENET_MAC_ADDT2H(ENET0) = unicastMacAddr[1].w[2] | ENET_MAC_ADDR2H_AFE;
767 ENET_MAC_ADDR2L(ENET0) = 0;
768 ENET_MAC_ADDT2H(ENET0) = 0;
775 ENET_MAC_ADDR3L(ENET0) = unicastMacAddr[2].w[0] | (unicastMacAddr[2].w[1] << 16);
776 ENET_MAC_ADDR3H(ENET0) = unicastMacAddr[2].w[2] | ENET_MAC_ADDR3H_AFE;
781 ENET_MAC_ADDR3L(ENET0) = 0;
782 ENET_MAC_ADDR3H(ENET0) = 0;
786 ENET_MAC_HLL(ENET0) = hashTable[0];
787 ENET_MAC_HLH(ENET0) = hashTable[1];
790 TRACE_DEBUG(
" ENET_MAC_HLL = %08" PRIX32
"\r\n", ENET_MAC_HLL(ENET0));
791 TRACE_DEBUG(
" ENET_MAC_HLH = %08" PRIX32
"\r\n", ENET_MAC_HLH(ENET0));
809 config = ENET_MAC_CFG(ENET0);
814 config |= ENET_MAC_CFG_SPD;
818 config &= ~ENET_MAC_CFG_SPD;
824 config |= ENET_MAC_CFG_DPM;
828 config &= ~ENET_MAC_CFG_DPM;
832 ENET_MAC_CFG(ENET0) = config;
856 temp = ENET_MAC_PHY_CTL(ENET0) & ENET_MAC_PHY_CTL_CLR;
858 temp |= ENET_MAC_PHY_CTL_PW | ENET_MAC_PHY_CTL_PB;
860 temp |= MAC_PHY_CTL_PA(phyAddr);
862 temp |= MAC_PHY_CTL_PR(
regAddr);
865 ENET_MAC_PHY_DATA(ENET0) =
data & ENET_MAC_PHY_DATA_PD;
868 ENET_MAC_PHY_CTL(ENET0) = temp;
870 while((ENET_MAC_PHY_CTL(ENET0) & ENET_MAC_PHY_CTL_PB) != 0)
899 temp = ENET_MAC_PHY_CTL(ENET0) & ENET_MAC_PHY_CTL_CLR;
901 temp |= ENET_MAC_PHY_CTL_PB;
903 temp |= MAC_PHY_CTL_PA(phyAddr);
905 temp |= MAC_PHY_CTL_PR(
regAddr);
908 ENET_MAC_PHY_CTL(ENET0) = temp;
910 while((ENET_MAC_PHY_CTL(ENET0) & ENET_MAC_PHY_CTL_PB) != 0)
915 data = ENET_MAC_PHY_DATA(ENET0) & ENET_MAC_PHY_DATA_PD;
943 p = (uint8_t *)
data;
948 for(i = 0; i <
length; i++)
951 for(j = 0; j < 8; j++)
954 if((((crc >> 31) ^ (
p[i] >> j)) & 0x01) != 0)
956 crc = (crc << 1) ^ 0x04C11DB7;