📄 rtl8019as.c
字号:
#include "main.h"
#include "rtl8019as.h"
#include "arp.h"
#include "ip.h"
#include "icmp.h"
#include "udp.h"
unsigned int count;//需要读或写的字节数
unsigned char tempmac_d5;
unsigned char tempmac_d4;
unsigned char tempmac_d3;
unsigned char tempmac_d2;
unsigned char tempmac_d1;
unsigned char tempmac_d0;
extern unsigned char tempip_d3;
extern unsigned char tempip_d2;
extern unsigned char tempip_d1;
extern unsigned char tempip_d0;
extern unsigned int ip_id;
void rtl8019_reset(void)
{
unsigned char temp=0;
RTLRST_SET;
delay_100ms();
RTLRST_CLR;
delay_100ms();
temp=reg_1f;//读网卡的复位端口
delay_100ms();
reg_1f=temp; //写网卡的复位端口
delay_100ms();
}
void rtl8019_hotreset(void)
{
unsigned char temp=0;
temp=reg_1f;//读网卡的复位端口
reg_1f=temp; //写网卡的复位端口
}
void rtl8019_page(unsigned char pagenumber)
{
unsigned char temp;
temp=reg_00;
temp=temp&0x3B; //TXP位要置为0.
pagenumber=pagenumber<<6;
temp=temp|pagenumber;
reg_00=temp;
}
void rtl8019_init(void)
{
//rtl8019_page(0); //选择页0的寄存器
reg_00=0x21; //选择页0的寄存器,网卡停止运行。
reg_01=0x4d; //寄存器Pstart
reg_02=0x80; //Pstop
reg_03=0x4c; //BNRY
reg_04=0x40; //TPSR
reg_05=0xfe; //TBCR0
reg_06=0x00; //TBCR1
reg_07=0xFF; //ISR
reg_0c=0xcc; //RCR
reg_0d=0xe0; //TCR
reg_0e=0xc8; //DCR 数据配置寄存器 8位数据dma
reg_0f=0xff; //IMR all interrupt
rtl8019_page(1); //选择页1的寄存器
reg_07=0x4d; //CURR
reg_08=0x00; //MAR0
reg_09=0x41; //MAR1
reg_0a=0x00; //MAR2
reg_0b=0x80; //MAR3
reg_0c=0x00; //MAR4
reg_0d=0x00; //MAR5
reg_0e=0x00; //MAR6
reg_0f=0x00; //MAR7
//rtl8019_page(0);
reg_00=0x22; //选择页0寄存器,网卡执行命令。
}
void rtl8019_writemynodeid(void)
{
rtl8019_page(1);
reg_01=mynodeid_0; //PAR0
reg_02=mynodeid_1; //PAR1
reg_03=mynodeid_2; //PAR2
reg_04=mynodeid_3; //PAR3
reg_05=mynodeid_4; //PAR4
reg_06=mynodeid_5; //PAR5
}
unsigned char rtl_status(void)
{
rtl8019_page(0);
return reg_0c;
}
unsigned char rtl_isrstatus(void)
{
unsigned char rtlisrstatus;
rtl8019_page(0);
rtlisrstatus=reg_07;
reg_07=0xFF;
return rtlisrstatus;
}
unsigned char rtl_readcurr(void)
{
rtl8019_page(1); //选择页1的寄存器
return reg_07; //CURR
}
void rtl_setcurr(void)
{
reg_00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。
reg_03=0x4c; //bnry
reg_00=0x22; //选择页0寄存器,网卡执行命令。
//rtl8019_page(1); //选择页1的寄存器
//reg_07=0x4e; //CURR
}
void rtl8019_write(unsigned int addr,unsigned int count,unsigned char offset)
{
//addr为要写入到网卡里的ram的起始地址,count为要连续写入的字节数
unsigned int i=offset;
rtl8019_page(0);
reg_09=addr>>8;//address high
reg_08=addr&0xff;//address low
reg_0b=count>>8; //write count high
reg_0a=count&0xff;//write count low
reg_00=0x12 ;//dma write
count+=offset;
for(;i<count;i++)
{
reg_10=buffer[i];
}
reg_0b=0; // count high 中止DMA操作
reg_0a=0;// count low
reg_00=0x22;//abort/complete dma page 0
}
void rtl8019_read(unsigned int addr,unsigned int count)
{
//address为网卡里的ram的起始地址,count为要连续读取的字节数
unsigned int i=0;
rtl8019_page(0);
reg_09=addr>>8;//address high
reg_08=addr&0xff;//address low
reg_0b=count>>8; //write count high
reg_0a=count&0xff;//write count low
reg_00=0x0a ;//dma read
for(;i<count;i++)
{
buffer[i]=reg_10;
}
reg_0b=0; // count high 中止DMA操作
reg_0a=0;// count low
reg_00=0x22;//abort/complete dma page 0
}
void rtl8019_sendpack(unsigned int len,unsigned char offset)
{
reg_00=0x21; //选择页0的寄存器,网卡停止运行
reg_04=0x40; //TPSR
rtl8019_write(0x4000,len,offset);
reg_00=0x21;
reg_04=0x40; //TPSR
reg_05=len&0xff; //TBCR0
reg_06=len>>8; //TBCR1
reg_00=0x1E;
}
void buildpack(unsigned char mac_d5,
unsigned char mac_d4,
unsigned char mac_d3,
unsigned char mac_d2,
unsigned char mac_d1,
unsigned char mac_d0,
unsigned char mac_s5,
unsigned char mac_s4,
unsigned char mac_s3,
unsigned char mac_s2,
unsigned char mac_s1,
unsigned char mac_s0,
unsigned int len)
{
buffer[0]=mac_d5;
buffer[1]=mac_d4;
buffer[2]=mac_d3;
buffer[3]=mac_d2;
buffer[4]=mac_d1;
buffer[5]=mac_d0;
buffer[6]=mac_s5;
buffer[7]=mac_s4;
buffer[8]=mac_s3;
buffer[9]=mac_s2;
buffer[10]=mac_s1;
buffer[11]=mac_s0;
buffer[13]=len&0xFF;
buffer[12]=len>>8;
}
void rtl_packhandle(void)
{
unsigned int packlen=0; //包长度
unsigned int packtyp=0; //包类型
unsigned char mac_des[6]; //目的地址
unsigned char mac_sou[6]; //源地址
unsigned int i=0;
mac_des[5]=buffer[4];
mac_des[4]=buffer[5];
mac_des[3]=buffer[6];
mac_des[2]=buffer[7];
mac_des[1]=buffer[8];
mac_des[0]=buffer[9];
mac_sou[5]=buffer[10];
mac_sou[4]=buffer[11];
mac_sou[3]=buffer[12];
mac_sou[2]=buffer[13];
mac_sou[1]=buffer[14];
mac_sou[0]=buffer[15];
tempmac_d5=mac_sou[5];
tempmac_d4=mac_sou[4];
tempmac_d3=mac_sou[3];
tempmac_d2=mac_sou[2];
tempmac_d1=mac_sou[1];
tempmac_d0=mac_sou[0];
if(((buffer[0]&0x01)==0))//如果数据包无效则不作处理
{
return;
}
packlen=buffer[3]; //获取数据长度,包括4字节校验码
packlen<<=8;
packlen|=buffer[2];
packtyp=buffer[16]; //获取数据类型
packtyp<<=8;
packtyp|=buffer[17];
switch(packtyp)
{
case 0x0806: //ARP数据包
arp_response(&buffer[18]);
break;
case 0x0800: //IP数据包
switch(ip_packhandle(&buffer[18]))
{
case 1://ICMP包处理
buffer[4]=mac_sou[5];
buffer[5]=mac_sou[4];
buffer[6]=mac_sou[3];
buffer[7]=mac_sou[2];
buffer[8]=mac_sou[1];
buffer[9]=mac_sou[0];
buffer[10]=mac_des[5];
buffer[11]=mac_des[4];
buffer[12]=mac_des[3];
buffer[13]=mac_des[2];
buffer[14]=mac_des[1];
buffer[15]=mac_des[0];
rtl8019_sendpack(packlen,4);
break;
case 17://UDP包处理
break;
default:break;
}
break;
default:break;
}
return;
}
unsigned int tsum(unsigned int *buffer,unsigned int size) //校验和的求法
{
unsigned long cksum=0x0;
unsigned char *tempp;
if(size&0x01)
{
tempp=(unsigned char *)buffer;
tempp+=size;
size++;
*tempp=0;
}
while(size>0) //各位求和
{
cksum=cksum+(*buffer++);
size-=2;
}
cksum=(unsigned int)cksum+(cksum>>16);
return(~cksum); //再取反
}
void send_ippack(unsigned int len,unsigned int packtype,unsigned char protocol)
{
buildpack(tempmac_d5,
tempmac_d4,
tempmac_d3,
tempmac_d2,
tempmac_d1,
tempmac_d0,
mynodeid_0,
mynodeid_1,
mynodeid_2,
mynodeid_3,
mynodeid_4,
mynodeid_5,
packtype);
ip_buildpack(&buffer[14],(len-14),ip_id,protocol,tempip_d3,tempip_d2,tempip_d1,tempip_d0);
if(len<64){rtl8019_sendpack(64,0);}
else rtl8019_sendpack(len,0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -