⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ls_net.c

📁 5402控制88796网卡的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
void delay(void)
{word tmp;
for (tmp=0;tmp<400;tmp++);
}                      
///////////////////////////////////
void page(word num)
{word tmp;
tmp=NCR&0x3f;
 tmp=tmp|num<<6;
NCR=tmp;                           
}
///////////////////////////////////////////////                       
//////////////////////////////////////////////////
//      模块名称:get_ip_address(ip_table *p)
//      模块功能:发送的ARP数据包,得到目的ip的硬件地址,
//                如没有将发送arp包,得到硬件地址,2s内无回应
//                返回0,
//      入口参数:发送的arp包的ip地址
//      返回参数:0联络超时,1设置成功
//      版本序号:ver 1.0
//      测试日期:2003.3.10
//////////////////////////////////////////////////
word get_ip_address(ip_table *p)
{word tmp,send_time;                
 
for (send_time=0;send_time<5;send_time++)
{copy_mem(arp_data,(word *)&uip->hd.dhd_address,21);
 //flash_copy(371,(word *)&uip->hd.dhd_address);
 sur_ip.hd_address[0]=0xbbaa;
 copy_mem((word *)&sur_ip.ip_address,(word *)&sur_ip.hd_address[1],2);
 copy_mem((word *)&sur_ip.hd_address,(word *)&uip->hd.shd_address,3);
 copy_mem((word *)&sur_ip.hd_address,(word *)&uip->thd.arp.shd_address,3);
 copy_mem((word *)&sur_ip.ip_address,(word *)&uip->thd.arp.sip_address,2);
 copy_mem((word *)&p->ip_address,(word *)&uip->thd.arp.dip_address,2);
 net_send_dma(0x4000,(word *)&uip->hd.dhd_address,42);

 net_send_option(0x40,42);      

 for (tmp=0;tmp<0xff;tmp++)
 {if (compare_mem((word *)&uip->thd.arp.dip_address,(word *)&des_ip.ip_address,2)==1)
    if (set.save_des==1)return 1;
   delay(); 
   
  };
 };//endfor 
return 0; 
}
//////////////////////////////////////////////////
//      模块名称:net_read_incept_state
//      模块功能:监测接收缓冲区net_buff的数据状态
//                后台命令直接处理
//      入口参数:无
//      返回参数:1 有数据 0:无数据
//      版本序号:ver 1.0
//      测试日期:2003.3.13
//////////////////////////////////////////////////
word net_read_incept_state(void) 
{
//sys_read_state();           
if (net_receive==0) return 0;
else  {net_receive=0;return 1;};

}
//////////////////////////////////////////////////
//      模块名称:net_receive_dma
//      模块功能:接收数据到缓冲区
//      入口参数:dma_address DMA地址,*pdata数据指针,lg数据长度
//      返回参数:无
//      版本序号:
//      测试日期:
//////////////////////////////////////////////////
void net_receive_dma(word dma_address,word *pdata,word lg)
{word tmp,*p;

//asm("	ssbx intm");
p=pdata;
RSAR0=dma_address;
RSAR1=dma_address>>8;
RBCR0=lg;
RBCR1=lg>>8;
NCR=0x0a;
for (tmp=0;tmp<lg/2;tmp++)
   *p++=DMA;    
//asm("	rsbx intm");   
NCR=0x22;
} 
/*              
//////////////////////////////////////////////////
//      模块名称:void net_move_add(word dma_address,word *pdata,word lg)
//      模块功能:接收数据到缓冲区,应将两个缓冲区的数字相加
//      入口参数:dma_address DMA地址,*pdata数据指针,lg数据长度
//      返回参数:无
//      版本序号:
//      测试日期:
//////////////////////////////////////////////////
void net_move_add(word dma_address,word *pdata,word lg)
{word tmp;
unsigned long int tmp1;
//asm("	ssbx intm");
RSAR0=dma_address;
RSAR1=dma_address>>8;
RBCR0=lg;
RBCR1=lg>>8;
NCR=0x0a;
for (tmp=0;tmp<lg/2;tmp++)
 { tmp1=*pdata+DMA;
  if (tmp1>0xffff) tmp1=sound_sum;
  else
    sound_sum=(word)tmp1;
 *pdata++=(word)tmp1; 
 };              
//asm("	rsbx intm"); 
}               

*/
//////////////////////////////////////////////////
//      模块名称:net_send_data
//      模块功能:发送数据到缓冲区
//      入口参数:dma_address DMA地址,*pdata数据指针,lg数据长度
//      返回参数:无
//      版本序号:
//      测试日期:
//////////////////////////////////////////////////
void net_send_dma(word dma_address,word *pdata,word lg)
{word tmp;       
//asm("	ssbx intm");  
//page(0);
RSAR0=dma_address;
RSAR1=dma_address>>8;
RBCR0=lg;
RBCR1=lg>>8;
NCR=0x12;             
for (tmp=0;tmp<lg/2;tmp++)
      DMA=*pdata++;
//asm("	rsbx intm"); 
NCR=0x22;                
}                                                                
//////////////////////////////////////////////////
//      模块名称:net_send_option
//      模块功能:发送数据
//      入口参数:无
//      返回参数:无
//      版本序号:ver 1.0
//      测试日期:2003.3.11
//////////////////////////////////////////////////
void net_send_option(word dma_address,word lg)
{word tmp;
//asm("	ssbx intm");     
//net_receive_dma(0x4000,use_receive_buff,512);

if (lg<0x40) lg=0x40;
NCR=0x22;
ISR=0x2;        
TPSR=dma_address;
TBCR0=lg;
TBCR1=lg>>8;   

NCR=0x26; 
tmp=0xff;
do{              

}while(((NCR&0x4)==0x4)&&(tmp--!=0)); 
//if ((ISR&0x4)!=0) {ISR=0x04;goto repeat1;}
//else
ISR=0x02;
NCR=0x22;
}
//////////////////////////////////////////////////
//      模块名称:net_set_dma
//      模块功能:设置dma参数
//      入口参数:无
//      返回参数:无
//      版本序号:ver 1.0
//      测试日期:2003.3.11
//////////////////////////////////////////////////
void net_set_dma(word dma_address,word lg)
{
asm("	ssbx intm");
RSAR0=dma_address;
RSAR1=dma_address>>8;
RBCR0=lg;
RBCR1=lg>>8;
NCR=0x12;        
asm("	rsbx intm");     
}
/////////////////////////////////////////////////
word swap(word val)
{word tmp;
tmp=((val>>8)&0xff)+((val<<8)&0xff00);
return tmp;
}
/////////////////////////////////////////////////
void net_buff_full(word dma_address,word val,word lg)
{word tmp;       
asm("	ssbx intm");
RSAR0=dma_address;
RSAR1=dma_address>>8;
RBCR0=lg;
RBCR1=lg>>8;
NCR=0x12;             
  for (tmp=0;tmp<lg/2;tmp++)
    DMA=val;     
asm("	rsbx intm");  
NCR=0x22;               
}
//////////////////////////////////////////////////
//      模块名称:set_udp_ip(xip_type *udp_ip)
//      模块功能:设置发送的ip数据头,得到目的ip的硬件地址,
//                如没有将发送arp包,得到硬件地址,2s内无回应
//                返回0,
//      入口参数:udp_ip 发送的udp包的ip地址
//                dnumber 目的端口号 
//                snumber 源端口号
//      返回参数:0联络超时,1设置成功
//      版本序号:ver 1.0
//      测试日期:2003.3.10
//////////////////////////////////////////////////
word set_udp_ip(xip_type *udp_ip)
{
	
	uip=(sum_type *)uxp;
	full_mem(uxp,0,35);        
	if (compare_mem((word *)&udp_ip->ip_address,(word *)&des_ip.ip_address,2)==1) 
 	{
 		if (set.save_des!=1) 
    		if (get_ip_address(&des_ip)!=1) 
    			return 0;                        
  		full_mem(uxp,0,35);
  		copy_mem((word *)&des_ip.hd_address,(word *)&uip->hd.dhd_address,3);
  		copy_mem((word *)&des_ip.ip_address,(word *)&uip->thd.ip_head.ip.dip_address,2);   
 	} 
/*	else if (compare_mem((word *)&udp_ip->ip_address,(word *)&sev_ip.ip_address,2)==1) 
   	{
   		if (set.save_sev!=1) 
      		if (get_ip_address(&sev_ip)!=1) 
      			return 0;
    	full_mem(uxp,0,35);
    	copy_mem((word *)&sev_ip.hd_address,(word *)&uip->hd.dhd_address,3);
    	copy_mem((word *)&sev_ip.ip_address,(word *)&uip->thd.ip_head.ip.dip_address,2);   
  	} 
  	else
  	{
  		if ((udp_ip->ip_address[0]==0xffff)||(udp_ip->ip_address[1]==0xffff))
  		{
  			copy_mem((word *)&udp_ip->ip_address,(word *)&uip->thd.ip_head.ip.dip_address,2);
   			uip->hd.dhd_address[0]=0xffff;                   
  			uip->hd.dhd_address[1]=0xffff;                   
   			uip->hd.dhd_address[2]=0xffff;                   
   		}
   		else
  		{    
  			stu_ip.ip_address[0] = udp_ip->ip_address[0];
  			stu_ip.ip_address[1] = udp_ip->ip_address[1];
  			stu_ip.hd_address[0] = 0xffff; 
  			stu_ip.hd_address[1] = 0xffff;
  			stu_ip.hd_address[2] = 0xffff;
  			
  			if (get_ip_address(&stu_ip)!=1) 
      			return 0; 
      		copy_mem((word *)&stu_ip.hd_address,(word *)&uip->hd.dhd_address,3);
  			copy_mem((word *)&stu_ip.ip_address,(word *)&uip->thd.ip_head.ip.dip_address,2);
   		
   		};
  	}; */
 
uxp[8]=0x0008;
uxp[9]=0x0045;
uxp[10]=0x1c02;
uxp[13]=0x1120;

copy_mem((word *)&sur_ip.ip_address,(word *)&uip->thd.ip_head.ip.sip_address,2);
uip->hd.shd_address[0]=0xbbaa;
copy_mem((word *)&sur_ip.ip_address,(word *)&uip->hd.shd_address[1],2);    
uip->thd.ip_head.pr.udp.snumber=udp_ip->snumber;
uip->thd.ip_head.pr.udp.dnumber=udp_ip->dnumber;
//uip->thd.ip_head.pr.udp.lg=0x0802;
uxp[21]=0x0802;
uxp[23]=0x5aaa;
uxp[24]=0xa5aa;
uxp[25]=sur_ip.ip_address[0];
uxp[26]=sur_ip.ip_address[1];
uxp[27]=0x1100;
uxp[28]=0x0802;         
uip->thd.ip_head.ip.sum=0;
uip->thd.ip_head.ip.sum=~net_sum((word *)&uip->thd.ip_head.ip.ver,9);
return 1;
}
//////////////////////////////////////////////////
//      模块名称

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -