hd_eth.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include "gd32f30x_enet.h"
  2. #include "hd_eth.h"
  3. #include "main.h"
  4. #include "lwip/netif.h"
  5. #include "lwip/dhcp.h"
  6. #include "tcpip.h"
  7. #include "lwip/netif.h"
  8. #include "led.h"
  9. #include "delay.h"
  10. volatile uint32_t EthStatus = 0;
  11. static void enet_gpio_config(void);
  12. static void enet_mac_dma_config(void);
  13. static void nvic_configuration(void);
  14. void eth_link_callback(struct netif *netif);
  15. /*!
  16. \brief setup ethernet system(GPIOs, clocks, MAC, DMA, systick)
  17. \param[in] none
  18. \param[out] none
  19. \retval none
  20. */
  21. void enet_system_setup(void)
  22. {
  23. nvic_configuration();
  24. /* configure the GPIO ports for ethernet pins */
  25. enet_gpio_config();
  26. /* configure the ethernet MAC/DMA */
  27. enet_mac_dma_config();
  28. enet_interrupt_enable(ENET_DMA_INT_NIE);
  29. enet_interrupt_enable(ENET_DMA_INT_RIE);
  30. }
  31. /*!
  32. \brief configures the ethernet interface
  33. \param[in] none
  34. \param[out] none
  35. \retval none
  36. */
  37. static void enet_mac_dma_config(void)
  38. {
  39. ErrStatus reval_state = ERROR;
  40. /* enable ethernet clock */
  41. rcu_periph_clock_enable(RCU_ENET);
  42. rcu_periph_clock_enable(RCU_ENETTX);
  43. rcu_periph_clock_enable(RCU_ENETRX);
  44. /* reset ethernet on AHB bus */
  45. enet_deinit();
  46. reval_state = enet_software_reset();
  47. if(ERROR == reval_state){
  48. while(1){
  49. }
  50. }
  51. /* configure the parameters which are usually less cared for enet initialization */
  52. // enet_initpara_config(HALFDUPLEX_OPTION, ENET_CARRIERSENSE_ENABLE|ENET_RECEIVEOWN_ENABLE|ENET_RETRYTRANSMISSION_DISABLE|ENET_BACKOFFLIMIT_10|ENET_DEFERRALCHECK_DISABLE);
  53. enet_initpara_config(DMA_OPTION, ENET_FLUSH_RXFRAME_ENABLE|ENET_SECONDFRAME_OPT_ENABLE|ENET_NORMAL_DESCRIPTOR);
  54. #ifdef CHECKSUM_BY_HARDWARE
  55. if( enet_init(ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS))
  56. {
  57. EthStatus = ETH_INIT_FLAG;
  58. }
  59. else
  60. {
  61. EthStatus = 0;
  62. }
  63. #else
  64. if( enet_init(ENET_AUTO_NEGOTIATION, ENET_NO_AUTOCHECKSUM, ENET_BROADCAST_FRAMES_PASS))EthStatus = ETH_INIT_FLAG;
  65. esle EthStatus = 0;
  66. #endif /* CHECKSUM_BY_HARDWARE */
  67. }
  68. /*!
  69. \brief configures the nested vectored interrupt controller
  70. \param[in] none
  71. \param[out] none
  72. \retval none
  73. */
  74. static void nvic_configuration(void)
  75. {
  76. nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x0);
  77. nvic_irq_enable(ENET_IRQn, 2, 0);
  78. }
  79. /*!
  80. \brief configures the different GPIO ports
  81. \param[in] none
  82. \param[out] none
  83. \retval none
  84. */
  85. static void enet_gpio_config(void)
  86. {
  87. rcu_periph_clock_enable(RCU_GPIOA);
  88. rcu_periph_clock_enable(RCU_GPIOB);
  89. rcu_periph_clock_enable(RCU_GPIOC);
  90. rcu_periph_clock_enable(RCU_AF);
  91. // gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_8);
  92. #ifdef MII_MODE
  93. #ifdef PHY_CLOCK_MCO
  94. /* output HXTAL clock (25MHz) on CKOUT0 pin(PA8) to clock the PHY */
  95. rcu_ckout0_config(RCU_CKOUT0SRC_HXTAL);
  96. #endif /* PHY_CLOCK_MCO */
  97. gpio_ethernet_phy_select(GPIO_ENET_PHY_MII);
  98. #elif defined RMII_MODE
  99. /* choose PLL2 to get 50MHz from 25/5*10 on CKOUT0 pin (PA8) to clock the PHY */
  100. rcu_pll2_config(RCU_PLL2_MUL10);
  101. rcu_osci_on(RCU_PLL2_CK);
  102. rcu_osci_stab_wait(RCU_PLL2_CK);
  103. rcu_ckout0_config(RCU_CKOUT0SRC_CKPLL2);
  104. gpio_ethernet_phy_select(GPIO_ENET_PHY_RMII);
  105. #endif /* MII_MODE */
  106. #ifdef MII_MODE
  107. /* PA0: ETH_MII_CRS */
  108. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_0);
  109. /* PA1: ETH_MII_RX_CLK */
  110. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_1);
  111. /* PA2: ETH_MDIO */
  112. gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_2);
  113. /* PA3: ETH_MII_COL */
  114. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_3);
  115. /* PA7: ETH_MII_RX_DV */
  116. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_7);
  117. /* PB0: ETH_MII_RXD2 */
  118. gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_0);
  119. /* PB1: ETH_MII_RXD3 */
  120. gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_1);
  121. /* PB8: ETH_MII_TXD3 */
  122. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_8);
  123. /* PB10: ETH_MII_RX_ER */
  124. gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_10);
  125. /* PB11: ETH_MII_TX_EN */
  126. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_11);
  127. /* PB12: ETH_MII_TXD0 */
  128. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_12);
  129. /* PB13: ETH_MII_TXD1 */
  130. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_13);
  131. /* PC1: ETH_MDC */
  132. gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_1);
  133. /* PC2: ETH_MII_TXD2 */
  134. gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_2);
  135. /* PC3: ETH_MII_TX_CLK */
  136. gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_3);
  137. /* PC4: ETH_MII_RXD0 */
  138. gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_4);
  139. /* PC5: ETH_MII_RXD1 */
  140. gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_5);
  141. #elif defined RMII_MODE
  142. /* PA1: ETH_RMII_REF_CLK */
  143. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_1);
  144. /* PA2: ETH_MDIO */
  145. gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_2);
  146. /* PA7: ETH_RMII_CRS_DV */
  147. gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_7);
  148. /* PB11: ETH_RMII_TX_EN */
  149. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_11);
  150. /* PB12: ETH_RMII_TXD0 */
  151. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_12);
  152. /* PB13: ETH_RMII_TXD1 */
  153. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_13);
  154. /* PC1: ETH_MDC */
  155. gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_MAX, GPIO_PIN_1);
  156. /* PC4: ETH_RMII_RXD0 */
  157. gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_4);
  158. /* PC5: ETH_RMII_RXD1 */
  159. gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_MAX, GPIO_PIN_5);
  160. #endif /* MII_MODE */
  161. }