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