📄 rtl8019.c
字号:
#include "RTL8019a.h"
#include "string.h"
#include "common.h"
#include "cpu_reg.h"
#define QICKREQUEST 5000
unsigned int dat_type,broad_enable,frame=0;
unsigned int scramble_ptr=0,syn_count=0;
unsigned short isr,send=0,nextpage;
unsigned short curr,bnry,x1,x2,IP_id;
unsigned short sendbuf[TALK_SIZE+40];
unsigned short recbuf[1080/2];
unsigned int out_wptr,out_rptr;
unsigned short header1,header2,header3,header4,property,talk_flag;
struct ipaddr server_ipaddr,nod_ipaddr,r_ipaddr;
struct iphdr t_iphdr;
struct igmphdr t_igmphdr;
struct udphdr t_udphdr;
struct pre_udphdr pre_udphdr1;
struct mac MAC_server,MAC_broad,MAC_rec;
struct mac MAC_self,MAC_nod;
struct arp arp1;
unsigned int member_num ;
int member_flag=0;
extern unsigned short IP;
extern unsigned int DA_wptr,DA_rptr,ms;
extern int *videobuf,*pcmbuf;
extern int request_pack,arp_ack,request_type;
extern unsigned short scramble_tab[1176];
extern int bitrate,status,request_time,req_gaptime;
extern int talkbuf[TALK_SIZE*2];
extern unsigned int rec_pack,link_time;
extern int group_member[MEMBER_NUM];
extern int ADbuf[2][TALK_SIZE],stero_num ;
extern long sum[TALK_SIZE];
extern int readmenup,success,request_flag,AD_rptr;
Uint16 RxEthnetFrameBuffer[1518/2];
//==============================================================================
/**********************************************************************
**函数原型: void page(uchar pagenumber)
**入口参数: Uint16 pagenumber: 要切换的页
**出口参数: 无
**返 回 值: 无
**说 明: 选择页,可选择0,1,2三页,第四页ne000兼容芯片保留
************************************************************************/
void page(Uint16 pagenumber)
{
Uint16 temp;
temp = Reg00; //command register
temp = temp & 0x3B ; //注意txp位不能要
pagenumber=pagenumber <<6;
temp=temp | pagenumber;
Reg00=temp;
}
Uint16 SwapByte(Uint16 value)
{
Uint16 temp;
temp=(value<<8)|(value>>8);
return(temp);
}
/**********************************************************************
**函数原型: void Init8019()
**入口参数: 无
**出口参数: 无
**返 回 值: 无
**说 明: 对芯片的工作寄存器进行设置,各个寄存器的用法可参考文档和
** 络芯片的数据手册
************************************************************************/
void Init8019()
{
init_protocal();
// ms =0;
// while(ms<100);
delay(10000);
/**********************************************************************
1.Reg00命令寄存器: CR,命令寄存器,地址偏移量00H,为一个字节
位: 7 6 5 4 3 2 1 0
名字: PS1 PS0 RD2 RD1 RD0 TXP STA STP
//============================================
2.
RD2,RD1,RD0: 这3个位代表要执行的功能。
0 0 1 : 读网卡内存
0 1 0 : 写网卡内存
0 1 1 : 发送网卡数据包
1 * * : 完成或结束DMA的读写操作
//============================================
3.TXP位置1时发送数据包,发完自动清零
//============================================
4.
STA,STP: 这两个位用来启动命令或停止命令
1 0 启动命令
0 1 停止命令
//============================================
********************************************************/
Reg00=0x21; //使芯片处于停止模式,这时进行寄存器设置
// ms = 0;
// while(ms<100); //延时100毫秒,确保芯片进入停止模式
delay(10000);
page(0);
delay(10);
Reg0a= 0x00; //清rbcr0
delay(1);
Reg0b= 0x00; //清rbcr1
delay(1);
Reg0c= 0xe0; //RCR,监视模式,不接收数据包
delay(1);
Reg0d= 0xe2; //TCR,loop back模式
delay(1);
Reg01= 0x4c; //pstart = 0x4c
delay(1);
Reg02= 0x80; //pstop = 0x80
delay(1);
Reg03= 0x4c; //bnry = 4c
delay(1);
Reg04= 0x40; //TPSR,发送起始页寄存器
delay(1);
Reg07= 0xff; //清除所有中断标志位,中断状态寄存器
delay(1);
Reg0f= 0x00; //中断屏蔽寄存器清0,禁止中断
delay(1);
Reg0e= 0xc9; // 数据配置寄存器,16位dma方式
page(1);
delay(10);
Reg07= 0x4d; //4d
delay(1);
Reg08= 0x00;
delay(1);
Reg09= 0x00;
delay(1);
Reg0a= 0x00;
delay(1);
Reg0b= 0x00;
delay(1);
Reg0c= 0x00;
delay(1);
Reg0d= 0x00;
delay(1);
Reg0e= 0x00;
delay(1);
Reg0f= 0x00;
Reg01=0x02;
delay(1);
Reg02=0xE0;
delay(1);
Reg03=0x4C;
delay(1);
Reg04=0xA0;
delay(1);
Reg05=0x7E;
delay(1);
Reg06=0x7A;
delay(1);
page(3);
delay(10);
Reg01 = 0x30;
delay(1);
Reg04 = 0x80;
delay(1);
page(0);
delay(10);
Reg0c= 0xce; //将芯片设置成正常模式,跟外部网络连接
delay(1);
Reg0d= 0xe0;
delay(1);
Reg00= 0x22; //启动芯片开始工作
//-----------------------------------
Reg07= 0xff; //清除所有中断标志位
// ms = 0;
// while(ms<100);
delay(10000);
}
void init_protocal()
{
/* server_ip=192.168.1.40 */
server_ipaddr.addr2_1 =192;
server_ipaddr.addr2_1 +=(unsigned short)168<<8;
server_ipaddr.addr4_3 =1;
server_ipaddr.addr4_3 +=(unsigned short)SERVER_IP<<8;
nod_ipaddr.addr2_1 =192;
nod_ipaddr.addr2_1 +=(unsigned short)168<<8;
nod_ipaddr.addr4_3 =1;
nod_ipaddr.addr4_3 +=(IP<<8);
t_iphdr.tos_version =69;
t_iphdr.tos_version +=(unsigned short)0<<8; //usally not use
t_iphdr.id =20; //++IP_id;
t_iphdr.id +=(unsigned short)52<<8;
t_iphdr.frag_off =0;
t_iphdr.protocal_ttl =128; //usally 32 or 64
t_iphdr.protocal_ttl +=(unsigned short)17<<8;
t_iphdr.saddr =nod_ipaddr;
t_iphdr.daddr =server_ipaddr;
//UDP PORT
t_udphdr.sport =ORDERPORT+(IP<<8); //1*256+0x08,9801
t_udphdr.dport =ORDERPORT+(IP<<8); //1*256+0x07,9801
pre_udphdr1.saddr=t_iphdr.saddr;
pre_udphdr1.daddr=t_iphdr.daddr;
pre_udphdr1.protocal_value =0;
pre_udphdr1.protocal_value +=17<<8; //UDP
MAC_broad.addr2_1 =255;
MAC_broad.addr2_1 +=(unsigned short)255<<8;
MAC_broad.addr4_3 =255;
MAC_broad.addr4_3 +=(unsigned short)255<<8;
MAC_broad.addr6_5 =255;
MAC_broad.addr6_5 +=(unsigned short)255<<8;
MAC_self.addr2_1 =IP<<1;
MAC_self.addr2_1 +=(unsigned short)224<<8;
MAC_self.addr4_3 =76;
MAC_self.addr4_3 +=(unsigned short)160<<8;
MAC_self.addr6_5 =126;
MAC_self.addr6_5 +=(unsigned short)122<<8;
MAC_nod.addr2_1 =0;
MAC_nod.addr2_1 +=(unsigned short)224<<8;
MAC_nod.addr4_3 =76;
MAC_nod.addr4_3 +=(unsigned short)160<<8;
MAC_nod.addr6_5 =126;
MAC_nod.addr6_5 +=(unsigned short)122<<8;
}
void load_ip(unsigned short *buf,unsigned short *length)
{
unsigned short tempbuf[1240/2];
memcpy(tempbuf,buf,*length);
memcpy(buf,&t_iphdr,sizeof(t_iphdr));
memcpy(buf+sizeof(t_iphdr),tempbuf,*length);
*length=*length+10;
}
void load_udp(unsigned short *buf,unsigned short *length)
{
unsigned short tempbuf[1240/2];
t_udphdr.chksum =0;
t_udphdr.length =change_byte((*length+4)<<1);
pre_udphdr1.length=t_udphdr.length;
pre_udphdr1.daddr= t_iphdr.daddr;
memcpy(tempbuf,&pre_udphdr1,sizeof(pre_udphdr1));
memcpy(tempbuf+sizeof(pre_udphdr1),&t_udphdr,sizeof(t_udphdr));
memcpy(tempbuf+sizeof(pre_udphdr1)+sizeof(t_udphdr),buf,*length);
t_udphdr.chksum =checksum(tempbuf,*length+10);
memcpy(tempbuf,buf,*length);
memcpy(buf,&t_udphdr,sizeof(t_udphdr));
memcpy(buf+sizeof(t_udphdr),tempbuf,*length);
*length=*length+4;
}
void send_frame(unsigned short *buf,unsigned short MAC_type,unsigned short PROTO_type,unsigned short length)
{
unsigned short x;
unsigned short i;
unsigned char h,l;
unsigned short tempbuf[1240/2];
memcpy(tempbuf,buf,length); //暂时保存在tempbuf
if(length<46/2)
{
for(i=length;i<46/2;i++)
tempbuf[i]=0;
length=46/2;
}
if(MAC_type==0) //添加MAC地址
memcpy(buf,&MAC_server,3);
else if(MAC_type==BROADCAST)
memcpy(buf,&MAC_broad,3);
else if(MAC_type==REC_ARP)
memcpy(buf,&MAC_broad,3);
else if(MAC_type==NOD)
memcpy(buf,&MAC_nod,3);
memcpy(buf+3,&MAC_self,3); //添加源MAC地址
if(PROTO_type==UDP) //协议类型
*(buf+6)=8+(0<<8);
else if(PROTO_type==ARP)
*(buf+6)=8+(6<<8);
else if(PROTO_type==LSS) //协议类型
*(buf+6)=8+(8<<8);
memcpy(buf+7,tempbuf,length);
length+=7;
length=length<<1;
h=length>>8;
l=length&0xff;
page(0);
Reg09 = 0x40;
delay(1);
Reg08 = 0x00;
delay(1);
Reg0b = h;
delay(1);
Reg0a = l;
delay(1);
Reg00 = 0x12;
delay(1);
for(x=0;x<length/2;x++)
{
delay(1);
Reg10 = buf[x];
}
Reg0b=0x00;
delay(1);
Reg0a=0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -