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

📄 tftp_8900.h

📁 arm上实现tftp源代码
💻 H
字号:

/******************************

	交换高低字节

********************************/

int low2high(int i)
{
return ((i>>8)&0x00ff)+((i<<8)&0xff00);
}

/******************************

	将数据报读取到packetRAM[]中

********************************/

static void readpacket(int i)
{
		packetRAM[i]=low2high(CS8900_RTDATA);
}

/******************************

	交换以太头地址

********************************/

void EthResp()
{
	packetRAM[1]=packetRAM[4];//packetRAM[pktDest12]=packetRAM[pktSrc12];
	packetRAM[2]=packetRAM[5];//packetRAM[pktDest34]=packetRAM[pktSrc34];
	packetRAM[3]=packetRAM[6];//packetRAM[pktDest56]=packetRAM[pktSrc56];

	packetRAM[4]=0x0123;
	packetRAM[5]=0x4567;
	packetRAM[6]=0x89AB;

}
/******************************

	发送数据报文的函数

********************************/
void sendpacket()
{
	//写发送命令字

	//CS8900_PP_TxCommand=0x00C0;
	io_write(IO_BASE+IO_TX_COMMAND, TxStart | TxCMD_LOW);//TxStart	=(3<<6),TxCMD_LOW=(0x09),command=c9h
	
	//写入发送数据报文的长度

	//CS8900_PP_TxLength=packetRAM[pktLen];pktLen=0,读取数组中首地址中的值
	io_write(IO_BASE+IO_TX_LENGTH, packetRAM[0]);
	//CS8900_TxLEN=packetRAM[pktLen];
	//等待线路空闲的时候发送while(!(get_reg(PP_BusSTAT)&PP_BusSTAT_TxRDY));

	while(!(reg_read(0x0138)&0x0100));//PP_BusSTAT_TxRDY=0x0100  // Ready for Tx data

	//写入需要发送的数据

	for(i=1;i<=packetRAM[pktLen]/2;i++)
		//CS8900_(PP_TxBASE+2*i-2)=low2high(packetRAM[i]);
		CS8900_RTDATA=low2high(packetRAM[i]);
}
//
void receive()
{
for(;;)
{
	while( reg_read(0x0124)&0x0100)//pp_rer为接收帧状态寄存器,此句为检测数据无错接收
	{
		packetRAM[0]=reg_read(0x0402);//rxlength为接收长,只读寄存器,当RXOK置位时自动生成接收帧长度,但注意包不包括CRC的长度
		//收取前面的74个字节,如果是ICMP正好包括了最后一个字符 14+20+8+32

		for (i=1;i<=23; i++)//pktDest12=1,目的地址
		{
		     readpacket(i);
				//packetRAM[i]=low2high(CS8900_RTDATA);//交换CS8900_RTDATA即为PORT0口的高低字节,PORT0在16位模式下存放CPU和8900交换的数据帧	
		}//交换是因为大小断不一样
		
		//检查帧的类型 如果是 0806 表示arp

		if (packetRAM[7]==0x0806)//pktType 	=7	帧类型	 0800 IP	0806 ARP
		{
			//*******************************
			
			//发现ARP数据报文就开始发送RARP

			//*********************************
			

			//判断arp是否合法
			/*	
			if (packetRAM[arp_hwtype]!=0x0001)
			return;
			if (packetRAM[arp_prtype]!=0x0800)
			return;
			if (packetRAM[arp_hwlen]!=0x0604)
			return;
			if (packetRAM[arp_op]!=0x0001)
			return;
			if (packetRAM[arp_tpa]!=IP12)
			return;
			if (packetRAM[arp_tpa+1]!=IP34)
			return;
			*/
			//判断结束 如果没有返回说明需要发送RARP			
			//******************************

			//		发送arp request

			//********************************

			//修改arp操作码为rarp

			packetRAM[11]=0x0002;	//arp_op=11	,arp 操作码 00 01 表示Request 00 02 表示Reply
			
			//交换以太Mac
			
			EthResp();						
			
			//源mac 写到目的mac

			packetRAM[17]=packetRAM[12];//packetRAM[arp_tha]=packetRAM[arp_sha];
			packetRAM[18]=packetRAM[12+1];//packetRAM[arp_tha+1]=packetRAM[arp_sha+1];
			packetRAM[19]=packetRAM[12+2];//packetRAM[arp_tha+2]=packetRAM[arp_sha+2];
			
			//源ip 写到目的ip

			packetRAM[20]=packetRAM[15];//packetRAM[arp_tpa]=packetRAM[arp_spa];
			packetRAM[20+1]=packetRAM[15+1];//packetRAM[arp_tpa+1]=packetRAM[arp_spa+1];
			
			//重写源mac

			packetRAM[12]=0x0123;//packetRAM[arp_sha]=MAC12;
			packetRAM[12+1]=0x4567;//packetRAM[arp_sha+1]=MAC34;
			packetRAM[12+2]=0x89AB;//packetRAM[arp_sha+2]=MAC56;
			
			//重写源IP

			packetRAM[15]=0xCA71;
			packetRAM[15+1]=0x1824;
			
			//发送rarp报文

			sendpacket();
		
		}

		

	}
}
}

⌨️ 快捷键说明

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