hd_eth.c 6.1 KB

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