ETH_BSP_Config(); //DP83848 LwIP_Init(); Set_IP4_ADDR(&ipaddr,IMT407G_IP); Set_IP4_ADDR(&netmask, IMT407G_NETMASK); Set_IP4_ADDR(&gw, IMT407G_WG); //添加网络接口 netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input); netif->input = input; //input 就是上面传进来的 ethernet_input //初始化 ethernetif_init(struct netif *netif) //发送函数 netif->output = etharp_output; netif->linkoutput = low_level_output; //初始化 netif 网络接口 low_level_init(netif); //设置MAC地址 /* initialize MAC address in ethernet MAC */ ETH_MACAddressConfig(ETH_MAC_Address0, netif->hwaddr); //设置 DMA 内存地址等信息 /* Initialize Tx Descriptors list: Chain Mode */ ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB); /* Initialize Rx Descriptors list: Chain Mode */ ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB); //接收 //以太网卡有数据,就会有中断 ETH_IRQHandler LwIP_Pkt_Handle(); ethernetif_input(&netif); 把网络数据包放到新的buff里面 p = low_level_input(netif); /* get received frame */ frame = ETH_Get_Received_Frame(); //从DMA 内存地址哪里获取 bufff数据 frame.buffer = DMARxDescToGet->Buffer1Addr; //把数据包送到 LwIP 处理 err = netif->input(p, netif); //input 就是上面传进来的 ethernet_input ethernet_input switch (type) case ETHTYPE_IP: //传到IP层 ip_input(p, netif); case ETHTYPE_ARP: 发送 netif->output = etharp_output; etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest); netif->linkoutput(netif, p) //netif->linkoutput = low_level_output; /* Prepare transmit descriptors to give to DMA*/ //启动DMA传输,让DMA从内存中把数据发送到 ETH 去 ETH_Prepare_Transmit_Descriptors(framelength);