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

📄 tftp.c

📁 基于Freescale的MX21处理器的bootloader程序
💻 C
字号:
/* *	Copyright 1994, 1995, 2000 Neil Russell. *	(See License) *	Copyright 2000 DENX Software Engineering, Wolfgang Denk, wd@denx.de */#include <stdio.h>#include <string.h>#include "net.h"#include "tftp.h"#include "console.h"#include "drv_defs.h"/* *	TFTP operations. */#define TFTP_RRQ	1#define TFTP_WRQ	2#define TFTP_DATA	3#define TFTP_ACK	4#define TFTP_ERROR	5#define STATE_RRQ	1#define STATE_DATA	2#define STATE_TOO_LARGE	3#define STATE_BAD_MAGIC	4static int tftp_data_offset; int tftpserver = 0;int tftprecvaddr;extern int processing;int do_flash (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);void tftp_wrq_ok(void){	char buf[ETHER_HDR_SIZE+IP_HDR_SIZE+4],*packet;	IP_t iphead;	tftp_data_offset = 0;		packet = &buf[ETHER_HDR_SIZE+IP_HDR_SIZE];	*(packet) = (TFTP_ACK>>8)&0xff;	*(packet+1) = (TFTP_ACK)&0xff;	*(packet+2) = 0;	*(packet+3) = 0;	NetSetIP((char *)(&iphead), NetServerIP, NetServerPort, LOCAL_TFTP_PORT, 4);	{		char *src = (char *)(&iphead);		char *des = &buf[ETHER_HDR_SIZE];		memcpy(des, src, IP_HDR_SIZE);	}	NetSetEther(&buf[0], NetServerEther, PROT_IP);	NetSendPacket(&buf[0], ETHER_HDR_SIZE+IP_HDR_SIZE+4);}void tftp_recv_block(char *data, int len, unsigned short block){	char buf[ETHER_HDR_SIZE+IP_HDR_SIZE+4],*packet;	char *src, *des;	IP_t iphead;	packet = &buf[ETHER_HDR_SIZE+IP_HDR_SIZE];	*(packet) = (TFTP_ACK>>8)&0xff;	*(packet+1) = (TFTP_ACK)&0xff;	*(packet+2) = (block>>8)&0xff;;	*(packet+3) = (block)&0xff;	NetSetIP((char *)(&iphead), NetServerIP, NetServerPort, LOCAL_TFTP_PORT, 4);	src = (char *)(&iphead);	des = &buf[ETHER_HDR_SIZE];	memcpy(des, src, IP_HDR_SIZE);	NetSetEther(&buf[0], NetServerEther, PROT_IP);	NetSendPacket(&buf[0], ETHER_HDR_SIZE+IP_HDR_SIZE+4);	des	= (char *)(TFTP_DATA_BASE + tftp_data_offset);	tftp_data_offset += len;	if (tftp_data_offset > 0x2000000) tftp_data_offset = 0;	memcpy(des, data, len);	if (len != 512 ) {		printf("\nCompleted, total %d bytes are received.\n", tftp_data_offset);		if (tftprecvaddr != TFTP_DATA_BASE){			if (tftprecvaddr >= FLASH_BASE){				char *argv[4] = {				"flash","p","0x00000000","0x00000001"				};				cmd_tbl_t *cmd = find_cmd("flash");				sprintf(argv[2],"0x%x",tftprecvaddr);				sprintf(argv[3],"0x%x",tftp_data_offset);				do_flash(cmd, 0, 4, argv);			}			else{				memcpy((char *)tftprecvaddr, (char *)TFTP_DATA_BASE, tftp_data_offset);			}		}		processing = 0;	}	else {		if (tftp_data_offset % 10240 == 0){			mputs(".");		}	}}void tftp_handle(volatile char * pkt, int len){	unsigned short opcode, block, *p16;		if (tftpserver == 0) return;		p16 = (unsigned short *)pkt;	opcode = SWAP16(*p16);	switch(opcode){		case TFTP_WRQ:			tftp_wrq_ok();			printf("File [%s] ", (pkt+2));		break;		case TFTP_DATA:			p16 = (unsigned short *)(pkt+2);			block = SWAP16(*p16);			tftp_recv_block((char *)(pkt+4), len-4, block);		default:		break;		}}void tftp_startserv(void){	tftpserver = 1;}void tftp_stopserv(void){	tftpserver = 0;}

⌨️ 快捷键说明

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