#include "gd32f30x_enet.h" #include "hd_eth.h" #include "main.h" #include "lwip/netif.h" #include "lwip/dhcp.h" #include "tcpip.h" #include "lwip/netif.h" volatile uint32_t EthStatus = 0; static void enet_gpio_config(void); static void enet_mac_dma_config(void); static void nvic_configuration(void); void eth_link_callback(struct netif *netif); /*! \brief setup ethernet system(GPIOs, clocks, MAC, DMA, systick) \param[in] none \param[out] none \retval none */ void enet_system_setup(void) { nvic_configuration(); /* configure the GPIO ports for ethernet pins */ enet_gpio_config(); /* configure the ethernet MAC/DMA */ enet_mac_dma_config(); enet_interrupt_enable(ENET_DMA_INT_NIE); enet_interrupt_enable(ENET_DMA_INT_RIE); } /*! \brief configures the ethernet interface \param[in] none \param[out] none \retval none */ static void enet_mac_dma_config(void) { ErrStatus reval_state = ERROR; /* enable ethernet clock */ rcu_periph_clock_enable(RCU_ENET); rcu_periph_clock_enable(RCU_ENETTX); rcu_periph_clock_enable(RCU_ENETRX); /* reset ethernet on AHB bus */ enet_deinit(); reval_state = enet_software_reset(); if(ERROR == reval_state){ while(1){ } } /* configure the parameters which are usually less cared for enet initialization */ // enet_initpara_config(HALFDUPLEX_OPTION, ENET_CARRIERSENSE_ENABLE|ENET_RECEIVEOWN_ENABLE|ENET_RETRYTRANSMISSION_DISABLE|ENET_BACKOFFLIMIT_10|ENET_DEFERRALCHECK_DISABLE); enet_initpara_config(DMA_OPTION, ENET_FLUSH_RXFRAME_ENABLE|ENET_SECONDFRAME_OPT_ENABLE|ENET_NORMAL_DESCRIPTOR); #ifdef CHECKSUM_BY_HARDWARE if( enet_init(ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS)) { EthStatus = ETH_INIT_FLAG; } else { EthStatus = 0; } #else if( enet_init(ENET_AUTO_NEGOTIATION, ENET_NO_AUTOCHECKSUM, ENET_BROADCAST_FRAMES_PASS))EthStatus = ETH_INIT_FLAG; esle EthStatus = 0; #endif /* CHECKSUM_BY_HARDWARE */ } /*! \brief configures the nested vectored interrupt controller \param[in] none \param[out] none \retval none */ static void nvic_configuration(void) { nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x0); nvic_irq_enable(ENET_IRQn, 2, 0); } /*! \brief configures the different GPIO ports \param[in] none \param[out] none \retval none */ static void enet_gpio_config(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_GPIOC); rcu_periph_clock_enable(RCU_AF); gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_8); #ifdef MII_MODE #ifdef PHY_CLOCK_MCO /* output HXTAL clock (25MHz) on CKOUT0 pin(PA8) to clock the PHY */ rcu_ckout0_config(RCU_CKOUT0SRC_HXTAL); #endif /* PHY_CLOCK_MCO */ gpio_ethernet_phy_select(GPIO_ENET_PHY_MII); #elif defined RMII_MODE /* choose PLL2 to get 50MHz from 25/5*10 on CKOUT0 pin (PA8) to clock the PHY */ rcu_pll2_config(RCU_PLL2_MUL10); rcu_osci_on(RCU_PLL2_CK); rcu_osci_stab_wait(RCU_PLL2_CK); rcu_ckout0_config(RCU_CKOUT0SRC_CKPLL2); gpio_ethernet_phy_select(GPIO_ENET_PHY_RMII); #endif /* MII_MODE */ #ifdef MII_MODE /* PA0: ETH_MII_CRS */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_0); /* PA1: ETH_MII_RX_CLK */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_1); /* PA2: ETH_MDIO */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_2); /* PA3: ETH_MII_COL */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_3); /* PA7: ETH_MII_RX_DV */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_7); /* PB0: ETH_MII_RXD2 */ gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_0); /* PB1: ETH_MII_RXD3 */ gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_1); /* PB8: ETH_MII_TXD3 */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_8); /* PB10: ETH_MII_RX_ER */ gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_10); /* PB11: ETH_MII_TX_EN */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_11); /* PB12: ETH_MII_TXD0 */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_12); /* PB13: ETH_MII_TXD1 */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_13); /* PC1: ETH_MDC */ gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_1); /* PC2: ETH_MII_TXD2 */ gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_2); /* PC3: ETH_MII_TX_CLK */ gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_3); /* PC4: ETH_MII_RXD0 */ gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_4); /* PC5: ETH_MII_RXD1 */ gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_5); #elif defined RMII_MODE /* PA1: ETH_RMII_REF_CLK */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_1); /* PA2: ETH_MDIO */ gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_2); /* PA7: ETH_RMII_CRS_DV */ gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_7); /* PB11: ETH_RMII_TX_EN */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_11); /* PB12: ETH_RMII_TXD0 */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_12); /* PB13: ETH_RMII_TXD1 */ gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_13); /* PC1: ETH_MDC */ gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_1); /* PC4: ETH_RMII_RXD0 */ gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_4); /* PC5: ETH_RMII_RXD1 */ gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_5); #endif /* MII_MODE */ }