nim_ethernet.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * nim_ethernet.c
  3. * 配置以太网
  4. * Created on: 2025年7月25日
  5. * Author: wulianwei
  6. */
  7. #include "nim_config.h"
  8. #include "hw_emac.h"
  9. #include "emac.h"
  10. #include "lwiplib.h"
  11. #define PINMUX4_MDIO_ENABLE (SYSCFG_PINMUX4_PINMUX4_7_4_MDIO_D << \
  12. SYSCFG_PINMUX4_PINMUX4_7_4_SHIFT) | \
  13. (SYSCFG_PINMUX4_PINMUX4_3_0_MDIO_CLK << \
  14. SYSCFG_PINMUX4_PINMUX4_3_0_SHIFT)
  15. #define PINMUX2_EMAC_ENABLE (SYSCFG_PINMUX2_PINMUX2_31_28_MII_TXD0 << \
  16. SYSCFG_PINMUX2_PINMUX2_31_28_SHIFT) | \
  17. (SYSCFG_PINMUX2_PINMUX2_27_24_MII_TXD1 << \
  18. SYSCFG_PINMUX2_PINMUX2_27_24_SHIFT) | \
  19. (SYSCFG_PINMUX2_PINMUX2_23_20_MII_TXD2 << \
  20. SYSCFG_PINMUX2_PINMUX2_23_20_SHIFT) | \
  21. (SYSCFG_PINMUX2_PINMUX2_19_16_MII_TXD3 << \
  22. SYSCFG_PINMUX2_PINMUX2_19_16_SHIFT) | \
  23. (SYSCFG_PINMUX2_PINMUX2_15_12_MII_COL << \
  24. SYSCFG_PINMUX2_PINMUX2_15_12_SHIFT) | \
  25. (SYSCFG_PINMUX2_PINMUX2_11_8_MII_TXCLK << \
  26. SYSCFG_PINMUX2_PINMUX2_11_8_SHIFT) | \
  27. (SYSCFG_PINMUX2_PINMUX2_7_4_MII_TXEN << \
  28. SYSCFG_PINMUX2_PINMUX2_7_4_SHIFT)
  29. #define PINMUX3_EMAC_ENABLE (SYSCFG_PINMUX3_PINMUX3_31_28_MII_RXD0 << \
  30. SYSCFG_PINMUX3_PINMUX3_31_28_SHIFT) | \
  31. (SYSCFG_PINMUX3_PINMUX3_27_24_MII_RXD1 << \
  32. SYSCFG_PINMUX3_PINMUX3_27_24_SHIFT) | \
  33. (SYSCFG_PINMUX3_PINMUX3_23_20_MII_RXD2 << \
  34. SYSCFG_PINMUX3_PINMUX3_23_20_SHIFT) | \
  35. (SYSCFG_PINMUX3_PINMUX3_19_16_MII_RXD3 << \
  36. SYSCFG_PINMUX3_PINMUX3_19_16_SHIFT) | \
  37. (SYSCFG_PINMUX3_PINMUX3_15_12_MII_CRS << \
  38. SYSCFG_PINMUX3_PINMUX3_15_12_SHIFT) | \
  39. (SYSCFG_PINMUX3_PINMUX3_11_8_MII_RXER << \
  40. SYSCFG_PINMUX3_PINMUX3_11_8_SHIFT) | \
  41. (SYSCFG_PINMUX3_PINMUX3_7_4_MII_RXDV << \
  42. SYSCFG_PINMUX3_PINMUX3_7_4_SHIFT) | \
  43. (SYSCFG_PINMUX3_PINMUX3_3_0_MII_RXCLK << \
  44. SYSCFG_PINMUX3_PINMUX3_3_0_SHIFT)
  45. static void EMACPinMuxSetup(void);
  46. static void EMACInterruptInit(void);
  47. /**
  48. * 以太网模块初始化
  49. */
  50. void EthernetInit()
  51. {
  52. PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EMAC, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);//模块上电
  53. EMACPinMuxSetup();//配置管脚
  54. EMACInterruptInit();
  55. }
  56. /****************************************************************************/
  57. /* */
  58. /* 管脚复用配置,使用MII接口 */
  59. /* */
  60. /****************************************************************************/
  61. static void EMACPinMuxSetup(void)
  62. {
  63. unsigned int savePinMux = 0;
  64. savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & \
  65. ~(SYSCFG_PINMUX4_PINMUX4_3_0 | \
  66. SYSCFG_PINMUX4_PINMUX4_7_4);
  67. HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = \
  68. (PINMUX4_MDIO_ENABLE | savePinMux);
  69. savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) & \
  70. ~(SYSCFG_PINMUX2_PINMUX2_31_28 | \
  71. SYSCFG_PINMUX2_PINMUX2_27_24 | \
  72. SYSCFG_PINMUX2_PINMUX2_23_20 | \
  73. SYSCFG_PINMUX2_PINMUX2_19_16 | \
  74. SYSCFG_PINMUX2_PINMUX2_15_12 | \
  75. SYSCFG_PINMUX2_PINMUX2_11_8 | \
  76. SYSCFG_PINMUX2_PINMUX2_7_4);
  77. HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) = \
  78. (PINMUX2_EMAC_ENABLE | savePinMux);
  79. savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) & \
  80. ~(SYSCFG_PINMUX3_PINMUX3_31_28 | \
  81. SYSCFG_PINMUX3_PINMUX3_27_24 | \
  82. SYSCFG_PINMUX3_PINMUX3_23_20 | \
  83. SYSCFG_PINMUX3_PINMUX3_19_16 | \
  84. SYSCFG_PINMUX3_PINMUX3_15_12 | \
  85. SYSCFG_PINMUX3_PINMUX3_11_8 | \
  86. SYSCFG_PINMUX3_PINMUX3_7_4 | \
  87. SYSCFG_PINMUX3_PINMUX3_3_0);
  88. HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) = \
  89. (PINMUX3_EMAC_ENABLE | savePinMux);
  90. // 使能 MII 模式
  91. HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP3) &= ~(SYSCFG_CFGCHIP3_RMII_SEL);
  92. }
  93. /****************************************************************************/
  94. /* */
  95. /* EMAC中断设置 */
  96. /* */
  97. /****************************************************************************/
  98. /****************************************************************************/
  99. /* */
  100. /* EMAC接收中断 */
  101. /* */
  102. /****************************************************************************/
  103. static void EMACCore0RxIsr(void)
  104. {
  105. IntEventClear(SYS_INT_EMAC_C0RX);
  106. lwIPRxIntHandler(0);
  107. }
  108. /****************************************************************************/
  109. /* */
  110. /* EMAC发送中断 */
  111. /* */
  112. /****************************************************************************/
  113. static void EMACCore0TxIsr(void)
  114. {
  115. IntEventClear(SYS_INT_EMAC_C0TX);
  116. lwIPTxIntHandler(0);
  117. }
  118. static void EMACInterruptInit(void)
  119. {
  120. // Register the ISR in the Interrupt Vector Table
  121. IntRegister(C674X_MASK_INT6, EMACCore0RxIsr);
  122. IntRegister(C674X_MASK_INT7, EMACCore0TxIsr);
  123. // Map the system interrupt to the DSP maskable interrupt
  124. IntEventMap(C674X_MASK_INT6, SYS_INT_EMAC_C0RX);
  125. IntEventMap(C674X_MASK_INT7, SYS_INT_EMAC_C0TX);
  126. // Enable DSP maskable interrupt
  127. IntEnable(C674X_MASK_INT6);
  128. IntEnable(C674X_MASK_INT7);
  129. }