📄 ls_net.c
字号:
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 + -