⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tftpmain.c

📁 ljd-44b0DVK-I
💻 C
字号:
#include "def.h"
#include "44b.h"
#include "option.h"
#include "skbuff.h"
#include "eth.h"
#include "arp.h"
#include "ip.h"
#include "udp.h"
#include "utils.h"

char TftpLoadEnd;
char TftpPutBegin;
char TftpPutMark;

int net_handle(void)
{
	struct sk_buff *skb;
	struct ethhdr *eth_hdr;		
	
	skb = alloc_skb(ETH_FRAME_LEN);

	if (eth_rcv(skb) != -1) {

		eth_hdr = (struct ethhdr *)(skb->data);					
		skb_pull(skb, ETH_HLEN);

/*	{
		int i;
		char *p = (char *)eth_hdr;
		
		for(i=0; i<32; i++)
			printf("%x,", p[i]);
		printf("\n----%x", eth_hdr->h_proto);
				
	}*/
		if (ntohs(eth_hdr->h_proto) == ETH_P_ARP)
			arp_rcv_packet(skb);

		else if(ntohs(eth_hdr->h_proto) == ETH_P_IP)						
		 	ip_rcv_packet(skb);
	 	
	}

	free_skb(skb);

	return 0;
}

extern U32 default_ip_addr;

void Test_tftp(void)
{
	unsigned char eth_addr[ETH_ALEN];
	unsigned char *s = (unsigned char *)&default_ip_addr;	

	rNCACHBE1 = ((unsigned int)(download_addr>>12)<<16)|(0xc700000>>12);
	//CacheFlush();		//clean DCache
	//CacheDisable();		//Disable DCache
	
	printf("Mini TFTP Server 1.0 (IP : %d.%d.%d.%d PORT: %d)\n", s[3], s[2], s[1], s[0], TFTP);		
	printf("Type tftp -i %d.%d.%d.%d put filename at the host PC\n", s[3], s[2], s[1], s[0]);
	puts("Press ESC key to exit\n");

	eth_init();
	if(eth_lnk_stat())
		return;
		
	eth_get_addr(eth_addr);		
	ip_init(default_ip_addr);
		
	arp_add_entry(eth_addr, default_ip_addr);	

	TftpLoadEnd  = 0;
	TftpPutMark  = 0;
	TftpPutBegin = 0;
	
	while ((getkey()!=ESC_KEY)&&!TftpLoadEnd) {		
		net_handle();
		if(TftpPutBegin) {
			puts("Starting the TFTP download...\n");
			TftpPutBegin = 0;
		}
		if(TftpPutMark) {
			putch('.');
			TftpPutMark = 0;
		}
	}
	
	if(TftpLoadEnd) {
		printf("\nReceived 0x%x Bytes\n", download_len);
		printf("Press ESC key to exit\n");
		while(getkey()!=ESC_KEY);
	}

	rNCACHBE1 = ((unsigned int)(Non_Cache_End1>>12)<<16)|(Non_Cache_Start1>>12);
	//CacheFlush();		//clean DCache
	//CacheEnable();		//Disable DCache
}

void Net_Load_Run(void)
{
	unsigned char eth_addr[ETH_ALEN];
	unsigned char *s = (unsigned char *)&default_ip_addr;	
	void (*fp)( U32 ) = (void (*)( U32 ))(0x0c300000);
	
	download_addr = 0x0c300000;
	rNCACHBE1 = ((unsigned int)(download_addr>>12)<<16)|(0xc700000>>12);
	
	printf("Mini TFTP Server 1.0 (IP : %d.%d.%d.%d PORT: %d)\n", s[3], s[2], s[1], s[0], TFTP);		
	printf("Type tftp -i %d.%d.%d.%d put filename at the host PC\n", s[3], s[2], s[1], s[0]);
	puts("Press ESC key to exit\n");

	eth_init();
	if(eth_lnk_stat())
		return;
		
	eth_get_addr(eth_addr);		
	ip_init(default_ip_addr);
	
	arp_add_entry(eth_addr, default_ip_addr);	

	TftpLoadEnd  = 0;
	TftpPutMark  = 0;
	TftpPutBegin = 0;
	
	while ((getkey()!=ESC_KEY)&&!TftpLoadEnd) 
	{		
		net_handle();
		if(TftpPutBegin) 
		{
			puts("Starting the TFTP download...");
			TftpPutBegin = 0;
		}
		
		if(TftpPutMark) 
		{
			putch('.');
			TftpPutMark = 0;
		}
	}
	
	if(TftpLoadEnd)
		printf("\nReceived 0x%x Bytes\n", download_len);

	CacheFlush();		//clean DCache
	CacheDisable();		//Disable DCache
//	memcpy((char *)(0xc008000), (char *)(download_addr), download_len );
	
	(*fp)(0);
}

static char title[] = "网口下载文件";
static char tip[]   = "测试网络接口,通过TFTP下载文件来进行测试,启动程序后可在PC端执行\"tftp -i 开发板IP地址 put 文件名\"传送文件到板上,或者直接ping开发板的IP地址,传送结束或按ESC键可以退出";

//Test_tftpItem 在 prog_entry.c 里被引用
TEST_PROGRAM_ITEM Test_tftpItem = {
				(TEST_PROGRAM)Test_tftp,	//入口地址
				title,						//显示名称
				tip, 						//帮助或提示信息,可为NULL
				1};							//使用printf,puts,putch等函数时在LCD上也显示输出字符(串)

static char title1[] = "网口下载运行";
static char tip1[]   = "通过网络接口用TFTP下载目标代码并运行,启动程序后可在PC端执行\"tftp -i 开发板IP地址 put 文件名\"传送文件到板上,传送结束自动运行,按ESC键可以退出";

//Test_tftpItem 在 prog_entry.c 里被引用
TEST_PROGRAM_ITEM Test_Net_Load_RunItem = {
				(TEST_PROGRAM)Net_Load_Run,	//入口地址
				title1,						//显示名称
				tip1, 						//帮助或提示信息,可为NULL
				1};							//使用printf,puts,putch等函数时在LCD上也显示输出字符(串)

⌨️ 快捷键说明

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