sys_arch_init.c

来自「RT-Thread是发展中的下一代微内核嵌入式实时操作系统」· C语言 代码 · 共 235 行

C
235
字号
/*
 * sys_arch_init.c
 * init file for lwip.
 */

//#include <stdio.h>
#include "lwip/debug.h"
#include "lwip/mem.h"
#include "lwip/memp.h"
#include "lwip/sys.h"
#include "lwip/stats.h"
#include "lwip/tcpip.h"
#include "lwip/ip_addr.h"

#include "net/ethernetif.h"
#include "netif/etharp.h"

//#include <net/netintf.h>
#include <rtconfig.h>

//#define RTL8139
//#define S3C4510
#define RTL8019

#ifdef RTL8019
struct netif rtl8019if;
	extern struct ifnet rtl8019_ifnet;
#endif

extern err_t ethernetif_input(struct pbuf *p, struct netif *netif);
extern err_t ethernetif_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);

	sys_sem_t sem;
	
void tcpip_init_done(void *arg)
{
	rt_sem_t sem;
	sem = arg;
	sys_sem_signal(sem);
}

static void arp_timer(void *arg)
{
	etharp_tmr();
	sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler)arp_timer, NULL);
}

#ifdef RTL8019
static err_t lwip_rtl8019_linkoutput(struct netif* netif, struct pbuf* p)
{
	rtl8019_ifnet.if_send(0, p, 0);

	return ERR_OK;
}

err_t lwip_rtl8019_init(struct netif *netif)
{
	extern struct ifnet rtl8019_ifnet;
	
	netif->state = (void *)&rtl8019_ifnet;
	netif->name[0] = 'e';
	netif->name[1] = '0';
	netif->hwaddr_len = 6;
	netif->output = ethernetif_output;
	netif->linkoutput = lwip_rtl8019_linkoutput;
	rtl8019_ifnet.if_ioctl(0, NIOCTL_GADDR, netif->hwaddr);

	netif_set_up(netif);

	return ERR_OK;
}
#endif

/*
 * lwip system initial entry
 */
void lwip_sys_init()
{
	// struct ip_addr ipaddr, netmask, gw;
	struct ip_addr ipaddr, netmask, gw;

	#ifdef STATS
	stats_init();
	#endif /* STATS */

	sys_init();

	mem_init();
	memp_init();
	pbuf_init();
    
	IP4_ADDR(&gw, 0,0,0,0);
	IP4_ADDR(&ipaddr, 192,168,0,20);
	IP4_ADDR(&netmask, 255,255,255,0);

#if 1

#ifdef RTL8019
	netif_add(&rtl8019if, &ipaddr, &netmask, &gw, NULL, 
		lwip_rtl8019_init, ethernetif_input);
	netif_set_default(&rtl8019if);
#endif
#endif

	etharp_init();
	sys_timeout(ARP_TMR_INTERVAL, (sys_timeout_handler)arp_timer, NULL);
	sem = sys_sem_new(0);
  	tcpip_init(tcpip_init_done, sem);
	sys_sem_wait(sem);
	sys_sem_free(sem);
}

#ifdef SHELL_COMMAND
#include <shell.h>

/*
 * set netif ip address
 */
int netif_ip_set(struct shell_session *ss, int argc, char **argv)
{
	char *pip, *pmask;
	u_long ip, mask;

	pip = argv[3];
	pmask = argv[4];
	ip = inet_addr(pip);
	mask = inet_addr(pmask);
	netif_set_ipaddr(netif_default, (struct ip_addr *)&ip);
	netif_set_netmask(netif_default, (struct ip_addr *)&mask);
	
	return ROK;
}

/*
 * show netif ip address
 */
int netif_ip_show(struct shell_session *ss, int argc, char **argv)
{
	u_long ip, mask;
	u_char *pip, *pmask;

	ip = netif_default->ip_addr.addr;
	mask = netif_default->netmask.addr;
	pip = (u_char *)&ip;
	pmask = (u_char *)&mask;
	
	ss->output(" netif ip address: %u.%u.%u.%u\n", pip[0], pip[1], pip[2], pip[3]);
	ss->output(" netif net mask: %u.%u.%u.%u\n", pmask[0], pmask[1], pmask[2], pmask[3]);
	
	return ROK;
}
#endif /* SHELL_COMMAND */

/* networking command */
#include <finsh/finsh.h>
#define CMD_DEFINE(name, ...)    __d_cmd_##name(__VA_ARGS__)
void CMD_DEFINE(ifsetip, char* name, char* ip, char* netmask, char* gw)
{
	if (name == RT_NULL || ip == RT_NULL || gw == RT_NULL) return; 

	struct netif *netif;
	u_long ipaddr;

	netif = netif_find(name);
	if (netif == NULL)
	{
		rt_kprintf("Can't find netif:%s\n", name);
		return;
	}

	ipaddr = inet_addr(ip);
	netif_set_ipaddr(netif, (struct ip_addr *)&ipaddr);
	ipaddr = inet_addr(netmask);
	netif_set_netmask(netif, (struct ip_addr *)&ipaddr);
	ipaddr = inet_addr(gw);
	netif_set_gw(netif, (struct ip_addr *)&ipaddr);

	netif_set_default(netif);
	netif_set_up(netif);
}

void CMD_DEFINE(ifup, char* name)
{
	if (name == RT_NULL) return; 

	struct netif *netif;

	netif = netif_find(name);
	if (netif == NULL)
	{
		rt_kprintf("Can't find netif:%s\n", name);
		return;
	}

	netif_set_up(netif);
}

void CMD_DEFINE(ifdown, char* name)
{
	if (name == RT_NULL) return; 

	struct netif *netif;

	netif = netif_find(name);
	if (netif == NULL)
	{
		rt_kprintf("Can't find netif:%s\n", name);
		return;
	}

	netif_set_down(netif);
}

int CMD_DEFINE(ifshow, void)
{
	struct netif *netif;
	u_char *ip, *nm, *gw;
	extern struct netif *netif_list;

	for (netif = netif_list; netif != NULL; netif = netif->next)
	{
		ip = (u_char*) &netif->ip_addr.addr;
		nm = (u_char*) &netif->netmask.addr;
		gw = (u_char*) &netif->gw.addr;
	
		rt_kprintf("--------\n");
		rt_kprintf("netif  : %c%c%d\n", netif->name[0], netif->name[1], netif->num);
		rt_kprintf("ip     : %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]);
		rt_kprintf("netmask: %u.%u.%u.%u\n", nm[0], nm[1], nm[2], nm[3]);
		rt_kprintf("gw     : %u.%u.%u.%u\n", gw[0], gw[1], gw[2], gw[3]);
	}

	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?