📄 tftpmain.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 + -