hd_eth.c 6.0 KB

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