/* * nim_ethernet.c * 配置以太网 * Created on: 2025年7月25日 * Author: wulianwei */ #include "nim_config.h" #include "hw_emac.h" #include "emac.h" #include "lwiplib.h" #define PINMUX4_MDIO_ENABLE (SYSCFG_PINMUX4_PINMUX4_7_4_MDIO_D << \ SYSCFG_PINMUX4_PINMUX4_7_4_SHIFT) | \ (SYSCFG_PINMUX4_PINMUX4_3_0_MDIO_CLK << \ SYSCFG_PINMUX4_PINMUX4_3_0_SHIFT) #define PINMUX2_EMAC_ENABLE (SYSCFG_PINMUX2_PINMUX2_31_28_MII_TXD0 << \ SYSCFG_PINMUX2_PINMUX2_31_28_SHIFT) | \ (SYSCFG_PINMUX2_PINMUX2_27_24_MII_TXD1 << \ SYSCFG_PINMUX2_PINMUX2_27_24_SHIFT) | \ (SYSCFG_PINMUX2_PINMUX2_23_20_MII_TXD2 << \ SYSCFG_PINMUX2_PINMUX2_23_20_SHIFT) | \ (SYSCFG_PINMUX2_PINMUX2_19_16_MII_TXD3 << \ SYSCFG_PINMUX2_PINMUX2_19_16_SHIFT) | \ (SYSCFG_PINMUX2_PINMUX2_15_12_MII_COL << \ SYSCFG_PINMUX2_PINMUX2_15_12_SHIFT) | \ (SYSCFG_PINMUX2_PINMUX2_11_8_MII_TXCLK << \ SYSCFG_PINMUX2_PINMUX2_11_8_SHIFT) | \ (SYSCFG_PINMUX2_PINMUX2_7_4_MII_TXEN << \ SYSCFG_PINMUX2_PINMUX2_7_4_SHIFT) #define PINMUX3_EMAC_ENABLE (SYSCFG_PINMUX3_PINMUX3_31_28_MII_RXD0 << \ SYSCFG_PINMUX3_PINMUX3_31_28_SHIFT) | \ (SYSCFG_PINMUX3_PINMUX3_27_24_MII_RXD1 << \ SYSCFG_PINMUX3_PINMUX3_27_24_SHIFT) | \ (SYSCFG_PINMUX3_PINMUX3_23_20_MII_RXD2 << \ SYSCFG_PINMUX3_PINMUX3_23_20_SHIFT) | \ (SYSCFG_PINMUX3_PINMUX3_19_16_MII_RXD3 << \ SYSCFG_PINMUX3_PINMUX3_19_16_SHIFT) | \ (SYSCFG_PINMUX3_PINMUX3_15_12_MII_CRS << \ SYSCFG_PINMUX3_PINMUX3_15_12_SHIFT) | \ (SYSCFG_PINMUX3_PINMUX3_11_8_MII_RXER << \ SYSCFG_PINMUX3_PINMUX3_11_8_SHIFT) | \ (SYSCFG_PINMUX3_PINMUX3_7_4_MII_RXDV << \ SYSCFG_PINMUX3_PINMUX3_7_4_SHIFT) | \ (SYSCFG_PINMUX3_PINMUX3_3_0_MII_RXCLK << \ SYSCFG_PINMUX3_PINMUX3_3_0_SHIFT) static void EMACPinMuxSetup(void); static void EMACInterruptInit(void); /** * 以太网模块初始化 */ void EthernetInit() { PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EMAC, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);//模块上电 EMACPinMuxSetup();//配置管脚 EMACInterruptInit(); } /****************************************************************************/ /* */ /* 管脚复用配置,使用MII接口 */ /* */ /****************************************************************************/ static void EMACPinMuxSetup(void) { unsigned int savePinMux = 0; savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) & \ ~(SYSCFG_PINMUX4_PINMUX4_3_0 | \ SYSCFG_PINMUX4_PINMUX4_7_4); HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(4)) = \ (PINMUX4_MDIO_ENABLE | savePinMux); savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) & \ ~(SYSCFG_PINMUX2_PINMUX2_31_28 | \ SYSCFG_PINMUX2_PINMUX2_27_24 | \ SYSCFG_PINMUX2_PINMUX2_23_20 | \ SYSCFG_PINMUX2_PINMUX2_19_16 | \ SYSCFG_PINMUX2_PINMUX2_15_12 | \ SYSCFG_PINMUX2_PINMUX2_11_8 | \ SYSCFG_PINMUX2_PINMUX2_7_4); HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(2)) = \ (PINMUX2_EMAC_ENABLE | savePinMux); savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) & \ ~(SYSCFG_PINMUX3_PINMUX3_31_28 | \ SYSCFG_PINMUX3_PINMUX3_27_24 | \ SYSCFG_PINMUX3_PINMUX3_23_20 | \ SYSCFG_PINMUX3_PINMUX3_19_16 | \ SYSCFG_PINMUX3_PINMUX3_15_12 | \ SYSCFG_PINMUX3_PINMUX3_11_8 | \ SYSCFG_PINMUX3_PINMUX3_7_4 | \ SYSCFG_PINMUX3_PINMUX3_3_0); HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(3)) = \ (PINMUX3_EMAC_ENABLE | savePinMux); // 使能 MII 模式 HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_CFGCHIP3) &= ~(SYSCFG_CFGCHIP3_RMII_SEL); } /****************************************************************************/ /* */ /* EMAC中断设置 */ /* */ /****************************************************************************/ /****************************************************************************/ /* */ /* EMAC接收中断 */ /* */ /****************************************************************************/ static void EMACCore0RxIsr(void) { IntEventClear(SYS_INT_EMAC_C0RX); lwIPRxIntHandler(0); } /****************************************************************************/ /* */ /* EMAC发送中断 */ /* */ /****************************************************************************/ static void EMACCore0TxIsr(void) { IntEventClear(SYS_INT_EMAC_C0TX); lwIPTxIntHandler(0); } static void EMACInterruptInit(void) { // Register the ISR in the Interrupt Vector Table IntRegister(C674X_MASK_INT6, EMACCore0RxIsr); IntRegister(C674X_MASK_INT7, EMACCore0TxIsr); // Map the system interrupt to the DSP maskable interrupt IntEventMap(C674X_MASK_INT6, SYS_INT_EMAC_C0RX); IntEventMap(C674X_MASK_INT7, SYS_INT_EMAC_C0TX); // Enable DSP maskable interrupt IntEnable(C674X_MASK_INT6); IntEnable(C674X_MASK_INT7); }