?? rtl8019.c
字號(hào):
{//檢查CR寄存器的txp位是否為低,為1說(shuō)明正在發(fā)送,為0說(shuō)明發(fā)完或出錯(cuò)放棄
if((Reg00&0x04)==0)
{ break; }
}
if((Reg04&0x01)!=0)//表示發(fā)送成功,判斷發(fā)送狀態(tài)寄存器TSR,決定是否出錯(cuò)
{break;};
Reg00=0x3e;
}
delay(1);
Reg07=0xff;
if(TxBufFlag)
{
Reg04=0x40; //txd packet start;
}
else
{
Reg04=0x46; //txd packet start;
}
delay(1);
Reg06=length>>8; //high byte counter
delay(1);
Reg05=length&0xff;//low byte counter
delay(1);
Reg07=0xff;
delay(1);
Reg00=0x3e; //to sendpacket;
}
/**********************************************************************
**函數(shù)原型: Uint16 Rec_NewPacket()
**入口參數(shù): 無(wú)
**出口參數(shù): 無(wú)
**返 回 值: 0 沒有新數(shù)據(jù)包
** 1 接收到新數(shù)據(jù)包
**說(shuō) 明: 查詢是否有新數(shù)據(jù)包并接收進(jìn)緩沖區(qū)
************************************************************************/
Uint16 RecFrame()
{
Uint16 i,ii;
Uint16 Temp,length;
union{
Uint16 total;
struct{
Uint16 high:8;
Uint16 low:8;
}e;
}d;
for(i=0;i<1518/2;i++) RxNetBuf[i] = 0;
page(0);
delay(10);
bnry = Reg03; //bnry page have read 讀頁(yè)指針
bnry = bnry & 0x00FF;
page(1);
delay(10);
curr = Reg07; //curr writepoint 8019寫頁(yè)指針
curr = curr & 0x00FF;
page(0);
delay(10);
if((curr==0))return(0); //讀的過(guò)程出錯(cuò)
bnry++;
if(bnry>0x7f) bnry=0x4c;
if(bnry!=curr) //此時(shí)表示有新的數(shù)據(jù)包在緩沖區(qū)里
{ //在任何操作都最好返回page0
page(0);
delay(10);
//=======================================
Reg09=bnry; //讀頁(yè)地址的高字節(jié)
delay(5);
Reg08=0x00; //讀頁(yè)地址的低字節(jié)
delay(5);
Reg0b=0x00; //讀取字節(jié)計(jì)數(shù)高字節(jié)
delay(5);
Reg0a=18; //讀取字節(jié)計(jì)數(shù)高字節(jié)
delay(5);
Reg00=0x0a; //啟動(dòng)Remote DMA讀操作
delay(5);
for(i=0;i<9;i++) //讀取一包的前18個(gè)字節(jié):4字節(jié)的8019頭部,6字節(jié)目的地址,6字節(jié)原地址,2字節(jié)協(xié)議
{
RxNetBuf[i]=Reg10;
delay(1);
}
//=======================================中止DMA操作
Reg0b=0x00; //
delay(1);
Reg0a=0x00; //
delay(1);
Reg00=0x22; //結(jié)束或放棄DMA操作
delay(1);
//=======================================
d.total = RxNetBuf[0];
length = RxNetBuf[1];
if(((d.e.low & 0x01)==0)||(d.e.high > 0x7f) || (d.e.high < 0x4c)||( length > 1517))
{//接收狀態(tài)錯(cuò)誤或下一數(shù)據(jù)包的起始頁(yè)地址錯(cuò)誤或接收的數(shù)據(jù)包長(zhǎng)度>1500字節(jié)
page(1);
delay(10);
curr=Reg07; //page1
page(0); //切換回page0
delay(10);
bnry = curr -1;
if(bnry < 0x4c) bnry =0x7f;
Reg03=bnry; //write to bnry
delay(1);
Reg07=0xff;
return(0);
}
//=============================================
else//表示數(shù)據(jù)包是完好的.讀取剩下的數(shù)據(jù)
{
Temp = SwapByte(RxNetBuf[8]);
if((Temp == IP_FRAME)||(Temp == ARP_FRAME))
{ //協(xié)議為IP或ARP才接收
Reg09 = bnry; //read page address high
delay(1);
Reg08 = 4; //read page address low
delay(1);
Reg0b = length>>8; //read count high
delay(1);
Reg0a = length & 0xff;//read count low;
delay(1);
Reg00=0x0a; //read dma
delay(1);
length=(length+1)/2;
for(ii=2;ii<length+2;ii++)
{
RxNetBuf[ii]=Reg10;
}
//================終止DMA操作
Reg0b=0x00; //read count high
delay(1);
Reg0a=0x00; //read count low;
delay(1);
Reg00=0x22; //結(jié)束或放棄DMA
delay(1);
//============================
}
//=========================================
d.total = RxNetBuf[0];
bnry = d.e.high - 1;
if(bnry<0x4c) bnry=0x7f;
page(0);
delay(10);
Reg03=bnry; //write to bnry
delay(1);
Reg07=0xff;
return(1); //have new packet
}
}
else
return(0);
}
//============================================================
void LoadEnetHrd(Uint16 MAC_type,Uint16 PROTO_type)
{
if(MAC_type==0) //添加目的MAC地址
memcpy(TxNetBuf,&MAC_server,3);
else if(MAC_type==BroadCast)
memcpy(TxNetBuf,&MAC_broad,3);
else if(MAC_type==RequestArp)
memcpy(TxNetBuf,&MAC_broad,3);
else if(MAC_type==AnswerArp)
memcpy(TxNetBuf,&MAC_rec,3);
else if(MAC_type==Nod)
memcpy(TxNetBuf,&MAC_nod,3);
memcpy(TxNetBuf+3,&MAC_self,3); //添加源MAC地址
if(PROTO_type==UDP) //協(xié)議類型
*(TxNetBuf+6)=8+(0<<8);
else if(PROTO_type==ARP)
*(TxNetBuf+6)=8+(6<<8);
else if(PROTO_type==LSS) //協(xié)議類型
*(TxNetBuf+6)=8+(8<<8);
}
void LoadArp(struct ipaddr *ip,Uint16 type)
{
struct arp arp1;
arp1.hard_type = (Uint16)1<<8;
arp1.proto_type = (Uint16)((2048<<8)+(2048>>8));
arp1.proto_hard_length = 6;
arp1.proto_hard_length += (Uint16)4<<8;
arp1.send_macaddr =MAC_self;
arp1.send_ipaddr =nod_ipaddr;
if (type==RequestArp)
{
arp1.op_code = 0x01<<8;
arp1.rec_macaddr.addr2_1 =0;
arp1.rec_macaddr.addr4_3 =0;
arp1.rec_macaddr.addr6_5 =0;
}
else{
arp1.op_code = 0x02<<8;
arp1.rec_macaddr =MAC_rec;
}
arp1.rec_ipaddr =*ip;
memcpy(TxNetBuf+7,&arp1,sizeof(arp1));
}
void LoadIp(struct ipaddr *ip,Uint16 protocal)
{
struct iphdr tip;
tip.tos_version = 0x45;
tip.tos_version += (Uint16)0<<8; //usally not use
tip.id =20; //++IP_id;
tip.id +=(Uint16)52<<8;
tip.frag_off =0;
tip.protocal_ttl =128; //usally 32 or 64
tip.saddr =nod_ipaddr;
tip.daddr = *ip;
if (protocal==TCP)
t_iphdr.protocal_ttl +=(Uint16)6<<8;
else if (protocal==UDP)
t_iphdr.protocal_ttl +=(Uint16)17<<8;
else if (protocal==ICMP)
t_iphdr.protocal_ttl +=(Uint16)1<<8;
else if (protocal==IGMP)
t_iphdr.protocal_ttl +=(Uint16)2<<8;
memcpy(TxNetBuf+7,&tip,sizeof(tip));
}
void ArpRequest(struct ipaddr *ip)
{
LoadEnetHrd(RequestArp,ARP);
LoadArp(ip,RequestArp);
SendFrame(TxNetBuf,30);
}
void ArpAnswer(struct ipaddr *ip)
{
LoadEnetHrd(AnswerArp,ARP);
LoadArp(ip,AnswerArp);
SendFrame(TxNetBuf,30);
}
Uint16 SwapByte(Uint16 value)
{
Uint16 temp;
temp=(value<<8)|(value>>8);
return(temp);
}
//======================= END ===============================
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -