www.pudn.com > wavDEMO.zip > RTL8019.C


/************************************* 
  Copyright 2001 by Haia Tech 
  海佳科技有限公司 
  www.haia2004.com 
  Email:haia2004@vip.sina.com 
  Tel:0731-4552122 4553216 
*************************************/      
#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); 
    asm(" rsbx xf "); 
 
    ms=0; 
    while(ms<100);  //it is important 100ms 
 
    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;x0) 
   {   
     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>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,i,j ; 
    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>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>8); 
    return(temp); 
} 
 
 
void getorder( ) 
{ 
 
       if(header1==PROGRAM) 
       { 
          dat_type=MP3_DAT; 
       } 
 
}