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

📄 tftp.c

📁 裸板的tftp客户端
💻 C
字号:
#include "./include/typedef.h"#include "./include/tftp.h"#include "./include/led.h"#include "./include/web_init.h"#include "./include/myout.h"#include "./include/build_arp.h"#include "./include/build_tftp.h"#include "./include/nand_flash_write.h"U8 	HostMac[6], ClientMac[]={0x00,0x11,0x22,0x33,0x44,0x55} ;U8 	HostIp[]={192,168,0,1}, ClientIp[]={192,168,0,111};U8 	PacketPage[60];U16 HostPort=0, BlockNumber=0;#define rxsave (*(U8 *)0x31000000)extern int eth_send (volatile const void *, int);int eth_rx (U8 *);int Main(){	int totalLen = 0, useLen=0, arpLen=0;	GPACON = (GPACON |1<<14 |1<<9);	eth_init(ClientMac);	InitLed();	LedPlay(0x8);	Delay(5000);	arpLen=BuildARP(PacketPage, ClientMac, ClientIp, HostIp);	if(arpLen>0)		eth_send (PacketPage, arpLen);	while(1){		useLen=eth_rx(&rxsave+totalLen);		if(useLen>0)			totalLen += useLen;		if(useLen < 512 && BlockNumber>0 )//&& useLen>0)			break;	}	MyOut("\n\rtotalLen = %d, total %d packetpage \n\r",totalLen, BlockNumber);	nand_write(0,totalLen,&rxsave);	return 0;}/////////////////////////////// Send a data block via Ethernet. extern int eth_send (volatile const void *packet, int length){	volatile U16 *addr;	U16 s;retry:	// initiate a transmit sequence 	CS8900_TxCMD = PP_TxCmd_TxStart_Full;	CS8900_TxLEN = length;	// Test to see if the chip has allocated memory for the packet /	if ((get_reg (PP_BusSTAT) & PP_BusSTAT_TxRDY) == 0) 	{			MyOut("%s", "cs: unable to send packet; retrying...");		eth_reset ();		eth_reginit ();		goto retry;	}	// Write the contents of the packet 	// assume even number of bytes 	for (addr = (U16 *)packet; length > 0; length -= 2)	{		CS8900_RTDATA = *addr++;	}	// wait for transfer to succeed //	while ((s = get_reg (PP_TER) & ~0x3f) == 0);	// nothing  	if ((s & (PP_TER_CRS | PP_TER_TxOK)) != PP_TER_TxOK) {		MyOut("transmission error %x", s);	}	return 0;}// Get a data block via Ethernet int eth_rx (U8 *start){	#define ProtoP 		12	#define HoMacP    	22	#define SrPortP    	34		#define UsLenP	  	38	#define BlNumberP  	44	#define FirstData (*(volatile U8 *)0x19000300)	int i=0, useLen=0;	U16 txLen=0;	U16 *addr, data;	addr=(U16 *)start;	while ((get_reg(PP_RER) & PP_RER_RxOK) == 0);   // judgement rx status	put_reg (PP_LineCTL, PP_LineCTL_Tx|0x0);	data=CS8900_RTDATA;	data=CS8900_RTDATA;	MyOut("\n\r fifth byte:[%x]...packetpage number:[%d]", FirstData, BlockNumber);	for(i=0;i<45;i+=2)	{		data=CS8900_RTDATA;		PacketPage[i]=data;		PacketPage[i+1]=data>>8;	}	if(PacketPage[ProtoP]==0x08&&PacketPage[ProtoP+1]==0x06)   // arp 	{		i=0;		do{			HostMac[i++]=PacketPage[HoMacP+i];		}while(i<6);		// build request packet		txLen = build_tftp_packet(PacketPage, HostMac, 0, 0, 1);		goto done;	}	else   // get hostport and user data long and packet blocknumber	{		// get pakcetpage blocknumber		BlockNumber = PacketPage[BlNumberP]<<8 | PacketPage[BlNumberP+1];		// if first block get hostport		if(PacketPage[BlNumberP]==0x0&&PacketPage[BlNumberP+1]==0x01)		{			HostPort=PacketPage[SrPortP]<<8 | PacketPage[SrPortP+1];		}		// get user data long		useLen=PacketPage[UsLenP]<<8 |PacketPage[UsLenP+1];		useLen -= 12;		MyOut(", Len=%d", useLen);	}	for(i=0;i < useLen;i+=2)	{		*addr++ = CS8900_RTDATA;	}	if((useLen & 1) != 0)				{		*addr++ = CS8900_RTDATA;	}		txLen = build_tftp_packet(PacketPage, 0, HostPort, BlockNumber, 4);	// build configmation packetdone:	if(txLen>0)	    eth_send (PacketPage, txLen);	// send confirmation packet	put_reg (PP_LineCTL, PP_LineCTL_Tx|PP_LineCTL_Rx);	// enabled recei	return useLen;}/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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