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

📄 udp.c

📁 S3C2440驱动DM9000A的裸机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "MyLib.h"
#define UpdateRam8  ((U8*)0xA0500000)
U32 code_len,code_sum;
U8 update_done;
U32 b_change;
U8 *P;/////

extern UploadTmp comtmp;
const U8 wrt[17]={" Writing Flash! "};
const U8 wait[17]={" Please  Wait ! "};
const U8 suc[17]={"Update Succeeded"};
const U8 sta[17]={"Please Restart! "};
const U8 fal[17]={" Update False ! "};
const U8 sen[17]={"Copy Data to RAM"};
const U8 try[17]={"Please Try Again"};

void EnOrDisable_RealTime(U8 mode);
extern U8 b_sendrealtime;
void Read_UserAcc(U8 mode);
void Set_UserAcc(U8 mode);
void Set_TZGRP(U8 mode);
void Read_TZGRP(U8 mode);
void Set_TimeZone(U8 mode);
void Read_TimeZone(U8 mode)	;
void Read_Comb(U8 mode);
void Set_Comb(U8 mode);
void Read_LockTime(U8 mode);
void Set_LockTime(U8 mode);


void IP_sendrealtime(U8 *buf, U8 *ipaddr, U8 proto_id, U32 len)//len是上一级的长度
{
	U8 *hwaddr;
	U32 sum;
	U8 hw[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
	buf[0x0E]=0x45;							// IPv4 with 20 byte header
    buf[0x0F]=0;								// Type_of_service
    buf[0x10]=(len+20)/256;  buf[0x11]=(len+20)%256;	// Total_length
	buf[0x12]=gIP_ident/256;  buf[0x13]=gIP_ident%256;  gIP_ident++;
	buf[0x14]=buf[0x15]=0;					// Fragment_info=0(not fragmented)
	buf[0x16]=0x80;							// Time to live
	buf[0x17]=proto_id;						// Protocol id
	buf[0x18]=buf[0x19]=0;					// Header checksum
	MyMemcpy(buf+0x1A, gMyIP, 4);			// Source IP
	MyMemcpy(buf+0x1E, ipaddr, 4);		// Dest IP
	sum=Calc_checksum(buf+14, 20);
	buf[0x18]=sum/256;  buf[0x19]=sum%256;
	hwaddr=Arp_resolve(ipaddr);//查找目标网卡物理地址
	if(hwaddr==NULL){							// 无效IP地址
		hwaddr=hw;
		
	}
	MyMemcpy(buf, hwaddr, 6);				// 目的网卡MAC地址
	MyMemcpy(buf+6, gMyPhy, 6);			// 发送网卡MAC地址
	buf[0x0C]=0x08;  buf[0x0D]=0x00;		// IP_Packet
	DM9000_SendBuf(buf, len+34);
}

void UDP_Sendrealtime(U8* buf, U8* destIP, U32 len)
{
	U32 sum;
	buf[34]=buf[36]=gUDP_Port/256;  buf[35]=buf[37]=gUDP_Port%256;
	buf[38]=len/256;  buf[39]=len%256;	// len=整个UDP数据包的长度=1028+8
	buf[40]=buf[41]=0;					// UDP校验和=0(无校验)
	MyMemcpy(buf+26, gMyIP, 4);
	MyMemcpy(buf+30,destIP, 4);
	sum=0xFFFF-Calc_checksum(buf+26, len+8);
	sum+=(len+0x11);
	sum=(sum&0xFFFF)+(sum>>16);
	sum=0xFFFF-sum;
	buf[40]=sum/256;  buf[41]=sum%256;
	IP_sendrealtime(buf, destIP, UDP_TYPE, len);
}

void UDP_Send(U8* buf, U8* destIP, U32 len)
{
	U32 sum;
	buf[34]=buf[36]=gUDP_Port/256;  buf[35]=buf[37]=gUDP_Port%256;
	buf[38]=len/256;  buf[39]=len%256;	// len=整个UDP数据包的长度=1028+8
	buf[40]=buf[41]=0;					// UDP校验和=0(无校验)
	MyMemcpy(buf+26, gMyIP, 4);
	MyMemcpy(buf+30,destIP, 4);
	sum=0xFFFF-Calc_checksum(buf+26, len+8);
	sum+=(len+0x11);
	sum=(sum&0xFFFF)+(sum>>16);
	sum=0xFFFF-sum;
	buf[40]=sum/256;  buf[41]=sum%256;
	IP_send(buf, destIP, UDP_TYPE, len);
}


void UDP_SendImg(U8* destIP)
{
	U32 Frame;
	U8 SendBuf[1600];
#ifdef	OV7620
	for(Frame=0; Frame<103; Frame++){
		SendBuf[42]=DeviceNO;SendBuf[43]=0xfe; SendBuf[44]=0; SendBuf[45]=Frame;
		MyMemcpy(SendBuf+46, gImgBuf+Frame*1024, 1024);		
		UDP_Send(SendBuf, destIP, 1038);//send 1030B(data)+8B(UDP包头)
	}
#else
	for(Frame=0; Frame<300; Frame++){
		SendBuf[42]=DeviceNO;SendBuf[43]=0xfe;
		SendBuf[44]=Frame%256;  SendBuf[45]=Frame/256;
		MyMemcpy(SendBuf+46, gImgBuf+Frame*1024, 1024);		
		UDP_Send(SendBuf, destIP, 1038);
	}
#endif
}


void Del_programe(void)
{
	b_change=0x12345678;
	Flash_SectorErase(0);
	Flash_SectorErase(0x2000);
	Flash_SectorErase(0x3000);
	Flash_SectorErase(0x4000);
    Flash_SectorErase(0x8000);
    Flash_SectorErase(0x10000);  
    b_change=0;   
}
void Write_Code(U32 len,U32 sum)
{
	U32 i;
	U16 dat;
	U32 c_sum=0;
	for(i=0;i<len;i++){
		c_sum+=UpdateRam8[i];
	}
	if(c_sum==sum){
		LCD_clear();//清屏
		LCD_wrstr(2,0,(U8*)wrt,0);
		LCD_wrstr(4,0,(U8*)wait,0);
		Del_programe();
		dat=len&0xFFFF;
		b_change=0x12345678;			
		for(i=0;i<(len+1)/2;i++){
			dat=UpdateRam8[i*2]+UpdateRam8[i*2+1]*0x100;
			Flash_WriteWordPC(i,dat);		
		}
		b_change=0;
		LCD_clear();//清屏
		LCD_wrstr(2,0,(U8*)suc,0);
		LCD_wrstr(4,0,(U8*)sta,0);			
	}else{
		LCD_clear();//清屏
		LCD_wrstr(2,0,(U8*)fal,0);
		LCD_wrstr(4,0,(U8*)try,0);
	}
}
//下载用户记录和指纹数据,返回长度为68字节。
void UDPdownload_user(U16 id,U8* destIP)
{
	U32 F_addr,R_addr;
	U8 temp;
	U8 sbuf[100];
	U16 *p_u;
	U16 j;
	U32 addr,addr1;
	sbuf[42]=DeviceNO;
	sbuf[43]=15;
	sbuf[44]=0xF1;	
	temp=Find_ID_addr(id,&R_addr,&F_addr);			//查找ID号,有则返回对应的用户信息和指纹信息
	if(temp==0){
		sbuf[45]=id&0xFF;
		sbuf[46]=(id>>8)&0xFF;
		sbuf[47]=0;
		sbuf[48]=0;
		UDP_Send(sbuf, destIP, 76);
		return;
	}
	if((temp==1)||(temp==2)){									
		if(temp==1){
			p_u=RAM_user;							//一般用户
		}else{
			p_u=RAM_admin;							//管理者用户
		}
		sbuf[45]=id&0xFF;
		sbuf[46]=(id>>8)&0xFF;
		sbuf[47]=1;
		for(j=0;j<4;j++){
			if((p_u[R_addr+8+j*2]==0xFFFF)&&(p_u[R_addr+8+j*2+1]==0xFFFF)){
				break;
			}
			addr1=addr=(p_u[R_addr+8+j*2]&0xFF)*0x10000+p_u[R_addr+8+j*2+1];
			addr=addr*2;
			sbuf[49+5*j]=(addr>>16)&0xFF;
			sbuf[49+5*j+1]=(addr>>8)&0xFF;
			sbuf[49+5*j+2]=addr&0xFF;
			sbuf[49+5*j+3]=RAM_finger[addr1]&0xFF;
			sbuf[49+5*j+4]=(RAM_finger[addr1]>>8)&0xFF;
		}		
		sbuf[48]=j;
		UDP_Send(sbuf, destIP, 76);	
	}
}

U8 net_dis[][17]={"Read Data...","write Data...","Clear Data...","read image...","write keyfun...","Read Info...","SynichronizeTime"};
U8 CHnet_dis[][17]={"读系统数据...","写系统数据...","清除数据...","采图像...","写功能键...","读系统信息...","同步时间..."};
U8 (*Pnet_dis)[17];
extern void Syn_Time(void);///PCcom.c
extern U8  FF232_rbuf[45];
extern U8  FF232_sbuf[45];
extern U8 disable_shotdown;
extern U8 work[2][12];
U32 Write_fprint(U8 *p_fprint);//写指纹数据
void UDP_receive(U8 *buf, U32 len)//buf[34]开始为UDP数据//len=UDP包头(8B)+UDP数据
{
	U32 tmp,addr,i;
	U8 k,type;
	U16 id;
	U8 temp;
	U8 infbuf[32];
	U32 R_addr,F_addr;
	U32 faddr1,faddr2;
	U16 *p,pkey[Max_index];
	U8 SendBuf[1600],*p1;
	if(!Language){
	    Pnet_dis=net_dis;
	}else  Pnet_dis=CHnet_dis;
	if(*(U16*)(buf+0x24)==gUDP_Port&&buf[42]== DeviceNO&&buf[43]+buf[44]==0xff){// 本机UDP端口号和机号和命令校验
		if(len==1040){							// 1KB数据写入FLASH
			if(buf[43]==4&&netlock){					// 写FLASH
				addr=buf[47]+buf[46]*0x100+buf[45]*0x10000;
				if(addr<=0x1f0000){//&&addr>=0x30000
					tmp=buf[48]*256+buf[49];//写FLASH 的有效字节数
					if(tmp<=1024){
						tmp=(tmp+1)/2;//WORD
						addr=addr/2;p=(U16*)(&buf[50]);
						for(i=0;i<tmp;i++,addr++)
							Flash_WriteWordPC(addr,p[i]);
						MyMemcpy(SendBuf+42,buf+42,68);
						UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据	
					}					
				}
			}else if((buf[43]==0x5A)&&netlock&&(update_done==1)){
				k=buf[45];						//更新程序时第几包数据,
				LCD_clear();//清屏
				LCD_wrstr(3,0,(U8*)sen,0);
				MyMemcpy(UpdateRam8+k*1024,buf+50,1024);
				MyMemcpy(SendBuf+42,buf+42,68);
				UDP_Send(SendBuf, buf+26, 76);  //76包含UDP包头(8B)+UDP数据
				if(k==code_len/1024){
					Write_Code(code_len,code_sum);
					update_done=0x00;
				}			
			}
		}else if(len==76){					// 读FLASH或执行命令(rlen=110)else if(len==76)
			switch(buf[43]){
			case 1:					//lock device
				 if(netlock==0){
				 	if(MCU_para[Compwd_index]==0xffff){
						if(MyMemcmp(&buf[45],"888888",6))return;
					}else{
						if(MyMemcmp(&buf[45],&MCU_para[Compwd_index],6))return;
					}						
				 	netlock=1;
				 	MyMemcpy(SendBuf+42,buf+42,68);
				 	UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据	
				}
				break;
			case 2:			//unlock device	
				if(netlock){
					netlock=gSendUDP=0;
					MyMemcpy(SendBuf+42,buf+42,68);	
					UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据								
				}
				break;
			case 3:	// FLASH擦除, 第1字节=要擦除的扇区号(0-34)(64KB为单位)
				if(netlock){
					addr=buf[45]*0x10000;
					if(addr>=0x30000&&addr<=0x1f0000){//addr>=0x30000&&
						Flash_SectorErase(addr/2);
						MyMemcpy(SendBuf+42,buf+42,68);
						UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据					
					}				
				}
				break;
			case 5:		//read flash
				if(netlock){
					addr=buf[47]+buf[46]*0x100+buf[45]*0x10000;
					if(addr<=0x200000){
						addr=0xff800000+addr;
						MyMemcpy(SendBuf+42,buf+42,6);
						MyMemcpy(SendBuf+48,(U8*)addr,1024);
						UDP_Send(SendBuf, buf+26, 1038);						
					}
				}				
				break;
			case 6:               //count user
				if(netlock){
					MyMemcpy(SendBuf+42,buf+42,68);
				    FLASH_init();
					tmp=WF.user_cnt+WF.admin_cnt;					
					SendBuf[46]=tmp&0xff;
					SendBuf[45]=(tmp>>8)&0xff;	
					SendBuf[48]=p_record&0xff;
					SendBuf[47]=(p_record>>8)&0xff;
					SendBuf[50]=WF.fprint_cnt&0xff;
					SendBuf[49]=(WF.fprint_cnt>>8)&0xff;
					SendBuf[53]	=(WF.user_addr)&0xFF;
					SendBuf[52]=(WF.user_addr>>8)&0xFF;	
					SendBuf[51]=(WF.user_addr>>16)&0xFF;
					SendBuf[55]=WF.admin_addr&0xFF;
					SendBuf[54]=(WF.admin_addr>>8)&0xFF;
					SendBuf[58]=WF.fprint_addr&0xFF;
					SendBuf[57]=(WF.fprint_addr>>8)&0xFF;
					SendBuf[56]=(WF.fprint_addr>>16)&0xFF;
					SendBuf[60]=WF.user_cnt&0xFF;
					SendBuf[59]=(WF.user_cnt>>8)&0xFF;	
					SendBuf[62]=WF.admin_cnt&0xFF;	
					SendBuf[61]=(WF.admin_cnt>>8)&0xFF;	
					UDP_Send(SendBuf, buf+26, 76);//76包含UDP包头(8B)+UDP数据
				}
				break;

⌨️ 快捷键说明

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