📄 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,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;
void init_8019()
{
init_protocal();
asm(" ssbx xf ");
ms=0;
// while(ms<10)
delay(1000);
asm(" rsbx xf ");
ms=0;
// while(ms<100); //it is important 100ms
delay(10000);
ms=CRD0 ;
ms=0;
CR=0x40;
delay(10);
PAR0=MAC_self.addr2_1;
PAR1=MAC_self.addr2_1>>8;
PAR2=MAC_self.addr4_3;
PAR3=MAC_self.addr4_3>>8;
PAR4=MAC_self.addr6_5;
PAR5=MAC_self.addr6_5>>8;
CURR=PAGE;
MAR0=0x00;
MAR1=0x00;
MAR2=0x00;
MAR3=0x00;
MAR4=0x00;
MAR5=0x00;
MAR6=0x00;
MAR7=0x00;
CR=0x00;
delay(10);
IMRR=0x00;
delay(1);
DCR=0xf9; //important
delay(1);
TCR=0xf0;
delay(1);
RCR=0xcc; //只接收广播地址和PAR0-5的地址
delay(1);
ISR=0xff; //复位中断标志
delay(1);
PSTART=PAGE; //4000H-7fffH
delay(1);
PSTOP =0x7f;
delay(1);
BNRY =PAGE;
delay(1000);
}
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;
CR=0x00; //activate remote DMA write
delay(1);
RSAR0=0X00;
delay(1);
RSAR1=0X40;
delay(1);
RBCR0= l;
delay(1);
RBCR1= h;
delay(1);
CR=0x10; //remote write
for(x=0;x<length/2;x++)
{
delay(1);
DMA=buf[x];
}
delay(1);
TPSR=0x40; //activate DMA send
delay(1);
TBCR0= l;
delay(1);
TBCR1= h;
delay(1);
CR=0x04;
}
unsigned short checksum(unsigned short *buffer, short size)
{
unsigned long cksum;
unsigned short sum;
cksum=0;
while(size >0)
{
sum=(*buffer<<8)+(*buffer>>8);
buffer++;
cksum+=sum;
size --;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16); //cksum maybe +1
sum=(unsigned short)(~cksum);
sum=(sum<<8)+(sum>>8);
return (sum);
}
void send_udp(unsigned short *buf,unsigned short length)
{
unsigned short temp;
unsigned short tempbuf[1240/2];
for(temp=0;temp<length;temp++)
buf[temp]=change_byte(buf[temp]);
load_udp(buf,&length);
t_iphdr.protocal_ttl =128; //usally 32 or 64
t_iphdr.protocal_ttl +=(unsigned short)17<<8; //17=UDP
t_iphdr.saddr =nod_ipaddr;
t_iphdr.tol_len =change_byte((length+10)<<1);
t_iphdr.chksum=0; //it is important
memcpy(tempbuf,&t_iphdr,sizeof(t_iphdr));
t_iphdr.chksum=checksum(tempbuf,10);
load_ip(sendbuf,&length);
if((t_iphdr.daddr.addr4_3&0xff01)==0xff01) //是广播地址
temp=BROADCAST;
else
temp=0;
send_frame(sendbuf,temp,UDP, length);
}
void send_arp(struct ipaddr *ip,unsigned short arp_type)
{
unsigned short temp;
arp1.hard_type =(unsigned short)1<<8;
arp1.proto_type =(unsigned short)((2048<<8)+(2048>>8));
arp1.proto_hard_length =6;
arp1.proto_hard_length +=(unsigned short)4<<8;
arp1.op_code =arp_type<<8;
arp1.send_macaddr =MAC_self;
arp1.send_ipaddr =nod_ipaddr;
if(arp_type==1) //请示对方 fill MAC
{
arp1.rec_macaddr.addr2_1 =0;
arp1.rec_macaddr.addr4_3 =0;
arp1.rec_macaddr.addr6_5 =0;
temp=BROADCAST;
}
else //应答对方 fill MAC
{
arp1.rec_macaddr=MAC_rec;
temp=REC_ARP;
}
arp1.rec_ipaddr =*ip;
memcpy(sendbuf,&arp1,sizeof(arp1));
send_frame(sendbuf,temp,ARP,sizeof(arp1));
}
void nic_recieve()
{
unsigned int x,length ;
unsigned int temp ;
// unsigned short recbuf[1240/2];
if(ISR&0x01)
{
IMRR=0;
CR=0x40;
delay(1);
curr=CURR;
CR=0; //it is need
do{
CR=0x18; //自动读
delay(1);
temp=DMA;
nextpage=temp>>8;
length=DMA;
if((length>1517)||(length<64)) goto out;
length=(length+1)/2;
for(x=0;x<length;x++)
recbuf[x]=DMA;
temp=recbuf[6];
if(temp==((0<<0)+8))
{
if(recbuf[18]==DATAPORT) //有四个字节的头,1000字节的数据
{
header1=recbuf[21]&0x00ff; //low byte
header2=recbuf[21]>>8;
header3=recbuf[22]&0x00ff;
header4=recbuf[22]>>8;
getorder();
if(header2==MPEG1)
{
for(x=21+2;x<(21+2+FRAMESIZE);x++)
{
if(header1==PROGRAM)
{
DA_wptr++;
if(DA_wptr>=(unsigned int)PCMSIZE)
DA_wptr=0;
videobuf[DA_wptr]=recbuf[x];
// videobuf[DA_wptr]=change_byte(recbuf[x]);
}
}
if(header1==PROGRAM) //video
request_pack++;
}
else if(header2==MPEG1)
{
*(IMR)|=0x0800; //开接收1中断
}
}
}
else if(temp==((6<<8)+8)) //ARP
{
for(x=7;x<length;x++)
recbuf[x-7]=recbuf[x];
memcpy(&r_ipaddr,recbuf+12,2);
if(nod_ipaddr.addr2_1==r_ipaddr.addr2_1)
if(nod_ipaddr.addr4_3==r_ipaddr.addr4_3)
{
if(recbuf[3]==0x01<<8) //自已请求,对方ARP应答
{
memcpy(&MAC_rec,recbuf+4,3); //复制对方的MAC
memcpy(&r_ipaddr,recbuf+7,2); //复制对方的IP
send_arp(&r_ipaddr,2);
}
if(recbuf[3]==0x02<<8) //自已请求,对方ARP应答
{
memcpy(&MAC_server,recbuf+4,3);
arp_ack=1;
}
}
}
}while(nextpage!=curr);
out:
delay(1);
ISR=0xff;
}
}
unsigned short change_byte(unsigned short value)
{
unsigned short temp;
temp=(value<<8)|(value>>8);
return(temp);
}
void getorder( )
{
if(header1==PROGRAM)
{
dat_type=MP3_DAT;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -