亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rtl8019.c

?? 5402 IP源程序
?? C
字號:
#include	"cpu_reg.h"
#include	"RTL8019.h"

struct	ipaddr   	server_ipaddr,nod_ipaddr,r_ipaddr;
struct 	mac      	MAC_server,MAC_broad,MAC_rec;
struct 	mac      	MAC_self,MAC_nod;
struct 	iphdr    	t_iphdr;
struct 	igmphdr  	t_igmphdr;
struct 	udphdr   	t_udphdr;
struct 	pre_udphdr  pre_udphdr1;

Uint16	TxNetBuf[1518/2];
Uint16	RxNetBuf[1518/2];
Uint16	TxBufFlag;
Uint16	bnry,curr;

extern	Uint16	ms;

void	InitProtocal(void);

/**********************************************************************
**函數原型:    void  	delay_ms(uint ms_number)
**入口參數:		ms_number: 延時的毫秒數
**出口參數:		無
**返 回 值:	無      
**說    明:	延時預定的時間,延時時間與特定的處理器有關
************************************************************************/
void	Delay_MS(Uint16	ms_number)
		{
			Uint16 i,j;
			for (i=0;i<ms_number;i++)
				{
					for(j = 0;j < ms_number;j++) { ; }
				}	
		}



//==============================================================================
/**********************************************************************
**函數原型:    void  page(uchar pagenumber)
**入口參數:   	Uint16	pagenumber: 要切換的頁
**出口參數:		無
**返 回 值:	無      
**說    明:	選擇頁,可選擇0,1,2三頁,第四頁ne000兼容芯片保留 
************************************************************************/
void	page(Uint16 pagenumber)
		{
			Uint16	temp;
			temp = Reg00;				//command register
			temp = temp&0x3B ; 			//注意txp位不能要
			pagenumber=pagenumber <<6;
			temp=temp | pagenumber;
			Reg00=temp;
		}

/**********************************************************************
**函數原型:     void 	Init8019()
**入口參數:		無
**出口參數:		無
**返 回 值:		無              
**說    明:		對芯片的工作寄存器進行設置,各個寄存器的用法可參考文檔和
**				絡芯片的數據手冊
************************************************************************/
void	Init8019()
		{
			Delay_MS(10);
/**********************************************************************

1.Reg00命令寄存器: CR,命令寄存器,地址偏移量00H,為一個字節
  位:  7   6   5   4   3   2   1   0 
名字: PS1 PS0 RD2 RD1 RD0 TXP STA STP 
//============================================
2.
RD2,RD1,RD0: 這3個位代表要執行的功能。
 0   0   1 : 讀網卡內存
 0   1   0 : 寫網卡內存
 0   1   1 : 發送網卡數據包
 1   *   * : 完成或結束DMA的讀寫操作
//============================================
3.TXP位置1時發送數據包,發完自動清零
//============================================
4.
STA,STP:	這兩個位用來啟動命令或停止命令
 1   0 		啟動命令
 0   1 		停止命令
//============================================
********************************************************/
			Reg00=0x21;   //使芯片處于停止模式,這時進行寄存器設置
			InitProtocal();
			
			Delay_MS(10); //延時10毫秒,確保芯片進入停止模式
			page(0);
			Reg0a= 0x00;   //清rbcr0
			Reg0b= 0x00;   //清rbcr1
			Reg0c= 0xe0;  //RCR,監視模式,不接收數據包
			Reg0d= 0xe2;  //TCR,loop back模式
			Reg01= 0x4c;   //pstart = 0x4c
			Reg02= 0x80;   //pstop = 0x80
			Reg03= 0x4c;   //bnry = 4c
			Reg04= 0x40;  //TPSR,發送起始頁寄存器
			Reg07= 0xff;  //清除所有中斷標志位,中斷狀態寄存器
			Reg0f= 0x00;  //中斷屏蔽寄存器清0,禁止中斷
			Reg0e= 0xc9;  // 數據配置寄存器,16位dma方式
			page(1);
			Reg07= 0x4d;
			Reg08= 0x00;
			Reg09= 0x00;
			Reg0a= 0x00;
			Reg0b= 0x00;
			Reg0c= 0x00;
			Reg0d= 0x00;
			Reg0e= 0x00;
			Reg0f= 0x00;

    		Reg01= MAC_self.addr2_1;
    		Reg02= MAC_self.addr2_1>>8;
    		Reg03= MAC_self.addr4_3;
    		Reg04= MAC_self.addr4_3>>8;
    		Reg05= MAC_self.addr6_5;
    		Reg06= MAC_self.addr6_5>>8;

			page(0);
			Reg0c= 0xce;  //將芯片設置成正常模式,跟外部網絡連接
			Reg0d= 0xe0;
			Reg00= 0x22;  //啟動芯片開始工作
//-----------------------------------
			Reg07= 0xff;  //清除所有中斷標志位
			
		}

void 	InitProtocal(void)
		{
/*  server_ip=192.168.1.40  */

    		server_ipaddr.addr2_1  =192;
    		server_ipaddr.addr2_1 +=(Uint16)168<<8;
    		server_ipaddr.addr4_3  =1;
    		server_ipaddr.addr4_3 +=(Uint16)40<<8;

//192.168.1.1    
    		nod_ipaddr.addr2_1     =192;
    		nod_ipaddr.addr2_1    +=(Uint16)168<<8;
    		nod_ipaddr.addr4_3     =1;
    		nod_ipaddr.addr4_3    +=(1<<8);
    
    		t_iphdr.tos_version    =69;
    		t_iphdr.tos_version   +=(Uint16)0<<8;      //usally not use
    		t_iphdr.id =20;  //++IP_id;
    		t_iphdr.id +=(Uint16)52<<8;
    
    		t_iphdr.frag_off =0;
    		t_iphdr.protocal_ttl   =128;       //usally 32 or 64
    		t_iphdr.protocal_ttl +=(Uint16)17<<8;
    		t_iphdr.saddr =nod_ipaddr;
    		t_iphdr.daddr =server_ipaddr;
    //UDP PORT
    		t_udphdr.sport =1024; //1*256+0x08,9901
    		t_udphdr.dport =1025; //1*256+0x07,9901
    
    		pre_udphdr1.saddr=t_iphdr.saddr;
    		pre_udphdr1.daddr=t_iphdr.daddr;
    		pre_udphdr1.protocal_value  =0;
    		pre_udphdr1.protocal_value +=17<<8;  //UDP
// FF-FF-FF-FF-FF-FF    
    		MAC_broad.addr2_1   =255;
    		MAC_broad.addr2_1  +=(Uint16)255<<8;
    		MAC_broad.addr4_3   =255;
    		MAC_broad.addr4_3  +=(Uint16)255<<8;
    		MAC_broad.addr6_5   =255;
    		MAC_broad.addr6_5  +=(Uint16)255<<8;
    
//	02-E0-4C-A0-7E-7A    
    		MAC_self.addr2_1  =1<<1;
    		MAC_self.addr2_1  +=(Uint16)224<<8;
    		MAC_self.addr4_3  =76;
    		MAC_self.addr4_3  +=(Uint16)160<<8;
    		MAC_self.addr6_5  =126;
    		MAC_self.addr6_5  +=(Uint16)122<<8;

//  00-E0-4C-A0-7E-7A	    
	    	MAC_nod.addr2_1  =0;
    		MAC_nod.addr2_1  +=(Uint16)224<<8;
    		MAC_nod.addr4_3  =76;
    		MAC_nod.addr4_3  +=(Uint16)160<<8;
    		MAC_nod.addr6_5  =126;
    		MAC_nod.addr6_5  +=(Uint16)122<<8;
	}


//=============================================================================
/**********************************************************************
**函數原型:    void 		SendFrame(Uint16 *TxdNetBuff,Uint16  length)
**入口參數:		Uint16    	*TxdNetBuff	:指向發送緩沖區
**              uint length					:發送數據包的長度
**出口參數:		無
**返 回 值:	無              
**說    明:	發送數據包,以太網底層驅動程序,所有的數據發送都要通過該程序
************************************************************************/
void	SendFrame(Uint16 *TxdNetBuff,Uint16 length)
		{
			Uint16	i,ii;
		   	if(length<46/2)
       			{
          			for(i=length;i<60/2;i++)	TxNetBuf[i]=0;
          			length=60/2;
       			}
			
			page(0);						//切換至第0頁
			length = length <<1;
			TxBufFlag=!TxBufFlag;			//設置兩個發緩區,提高發送效率
			if(TxBufFlag)
				{Reg09=0x40 ;}				//設置發送頁地址
			else
				{Reg09=0x46 ;}				//設置發送頁地址
    
			Reg08=0x00; 					//read page address low
			Reg0b = length >>8;				//寫發送長度高位
			Reg0a = length & 0x00ff;        //寫發送長度低位  
			Reg00=0x12;						//write dma, page0

			for(i=0;i<length/2;i++)
				{
					Reg10 = TxNetBuf[i];
   				}
/***************************************/
//以下為終止DMA操作
			Reg0b=0x00; 
			Reg0a=0x00;
			Reg00=0x22;			//結束或放棄DMA操作
/***************************************/

			for(i=0;i<6;i++)	//最多重發6次
				{
					for(ii=0;ii<1000;ii++)
    					{//檢查CR寄存器的txp位是否為低,為1說明正在發送,為0說明發完或出錯放棄
        					if((Reg00&0x04)==0)  
        						{ break; }
        				}
					if((Reg04&0x01)!=0)//表示發送成功,判斷發送狀態寄存器TSR,決定是否出錯
						{break;};
					Reg00=0x3e;
				}

			Reg07=0xff;
			if(TxBufFlag)
				{
  					Reg04=0x40;   //txd packet start;
  				}
			else
				{
     				Reg04=0x46;  //txd packet start;
    			}
			Reg06=length>>8;  //high byte counter
			Reg05=length&0xff;//low byte counter
			Reg07=0xff;
			Reg00=0x3e;       //to sendpacket;
	}

/**********************************************************************
**函數原型:    Uint16        Rec_NewPacket()
**入口參數:		無
**出口參數:		無
**返 回 值:	0          沒有新數據包
**              1          接收到新數據包
**說    明:	查詢是否有新數據包并接收進緩沖區
************************************************************************/
Uint16	RecFrame()
		{
			Uint16	i,ii;
			Uint16	Temp,length;
			union{
					Uint16	total;	
					struct{
							Uint16	high:8;
							Uint16	low:8;
						  }e;
				 }d;
				 		  		
			page(0);
			bnry = Reg03;				//bnry page have read 讀頁指針
			bnry = bnry & 0x00FF;
			page(1);
			curr = Reg07;				//curr writepoint 8019寫頁指針
			curr = curr & 0x00FF;
			page(0);
			if((curr==0))return(0);	//讀的過程出錯
			bnry++;
			if(bnry>0x7f)	bnry=0x4c;
			if(bnry!=curr)			//此時表示有新的數據包在緩沖區里
    			{					//在任何操作都最好返回page0
     				page(0);
     //=======================================
     				Reg09=bnry;		//讀頁地址的高字節
     				Reg08=0x00; 	//讀頁地址的低字節
     				Reg0b=0x00;		//讀取字節計數高字節
     				Reg0a=18;       //讀取字節計數高字節
     				Reg00=0x0a;     //啟動Remote DMA讀操作
	 
	 
     				for(i=0;i<9;i++)	//讀取一包的前18個字節:4字節的8019頭部,6字節目的地址,6字節原地址,2字節協議
                    	{
                       		RxNetBuf[i]=Reg10;
                      	}
 //=======================================中止DMA操作
     				Reg0b=0x00;	//
     				Reg0a=0x00;	//
     				Reg00=0x22;	//結束或放棄DMA操作
 //=======================================
					
					d.total = RxNetBuf[0];
					length = RxNetBuf[1];
     				if(((d.e.high & 0x01)==0)||(d.e.low > 0x7f) || (d.e.low < 0x4c)||( length > 1517))
    					{//接收狀態錯誤或下一數據包的起始頁地址錯誤或接收的數據包長度>1500字節
       						page(1);
							curr=Reg07; 	//page1
							page(0);		//切換回page0
        					bnry = curr -1;
        					if(bnry < 0x4c) 	bnry =0x7f;
        					Reg03=bnry; 	//write to bnry     
        					Reg07=0xff;
							return(0);
              			}
//=============================================
            
     				else//表示數據包是完好的.讀取剩下的數據
     					{
     						Temp = SwapByte(RxNetBuf[8]);		
        					if((Temp == IP_FRAME)||(Temp == ARP_FRAME))
								{ //協議為IP或ARP才接收
                					Reg09 = bnry;   				//read page address high
                					Reg08 = 4;      				//read page address low
                					Reg0b = length>>8;  //read count high
                					Reg0a = length & 0xff;//read count low;
                					
                					Reg00=0x0a;                             //read dma
						        	length=(length+1)/2;
                					for(ii=2;ii<length+2;ii++)
                						{
                							RxNetBuf[ii]=Reg10;
                						}
                        			//================終止DMA操作
                        			Reg0b=0x00;			//read count high   
                        			Reg0a=0x00;			//read count low;
                        			Reg00=0x22;			//結束或放棄DMA
                        			//============================
                        		}
                        		//=========================================
                        	d.total = RxNetBuf[0];
                        	bnry = d.e.low - 1;	
                			if(bnry<0x4c)	bnry=0x7f;
                			page(0);
	        				Reg03=bnry;      //write to bnry
                			Reg07=0xff;
                			return(1);   //have new packet
               			}
   				}
			else	
				return(0);
		}



//============================================================
void	LoadEnetHrd(Uint16	MAC_type,Uint16	PROTO_type)
		{       
       		if(MAC_type==0)              		//添加目的MAC地址
         		memcpy(TxNetBuf,&MAC_server,3);
       		else if(MAC_type==BroadCast)
         		memcpy(TxNetBuf,&MAC_broad,3);
       		else if(MAC_type==RequestArp)
         		memcpy(TxNetBuf,&MAC_broad,3);
         	else if(MAC_type==AnswerArp)
         		memcpy(TxNetBuf,&MAC_rec,3);	
       		else if(MAC_type==Nod)
         		memcpy(TxNetBuf,&MAC_nod,3);
         
       		memcpy(TxNetBuf+3,&MAC_self,3);   //添加源MAC地址

       		if(PROTO_type==UDP)          	  //協議類型
         		*(TxNetBuf+6)=8+(0<<8);   
       		else if(PROTO_type==ARP)
         		*(TxNetBuf+6)=8+(6<<8);   
       		else if(PROTO_type==LSS)          //協議類型
         		*(TxNetBuf+6)=8+(8<<8);   
		}
			
void	LoadArp(struct	ipaddr	*ip,Uint16	type)
		{
			struct 	arp  arp1;
         	arp1.hard_type  = (Uint16)1<<8;
         	arp1.proto_type = (Uint16)((2048<<8)+(2048>>8));
         	arp1.proto_hard_length = 6;
         	arp1.proto_hard_length += (Uint16)4<<8;
         
         	arp1.send_macaddr =MAC_self;
         	arp1.send_ipaddr  =nod_ipaddr;

			if (type==RequestArp)
				{
		           	arp1.op_code = 0x01<<8;
   					arp1.rec_macaddr.addr2_1  =0;
		   			arp1.rec_macaddr.addr4_3  =0;
   					arp1.rec_macaddr.addr6_5  =0;
         		}
         	else{
         			arp1.op_code = 0x02<<8;
		   			arp1.rec_macaddr =MAC_rec; 			
         		}	
         	arp1.rec_ipaddr   =*ip;         
         	memcpy(TxNetBuf+7,&arp1,sizeof(arp1));
		
		}
		
void	LoadIp(struct	ipaddr	*ip,Uint16	protocal)
		{
			struct	iphdr	tip;
    		tip.tos_version = 0x45;
    		tip.tos_version += (Uint16)0<<8;      //usally not use
    		tip.id =20;  //++IP_id;
    		tip.id +=(Uint16)52<<8;
    
    		tip.frag_off =0;
    		tip.protocal_ttl   =128;       //usally 32 or 64
    		tip.saddr =nod_ipaddr;
    		tip.daddr = *ip;
			if	(protocal==TCP)
  		  		t_iphdr.protocal_ttl +=(Uint16)6<<8;
  		  	else if (protocal==UDP)
  		  		t_iphdr.protocal_ttl +=(Uint16)17<<8;	
			else if (protocal==ICMP)
	    		t_iphdr.protocal_ttl +=(Uint16)1<<8;
			else if (protocal==IGMP)
	    		t_iphdr.protocal_ttl +=(Uint16)2<<8;
         	memcpy(TxNetBuf+7,&tip,sizeof(tip));	    		
		}
		
				
void	ArpRequest(struct	ipaddr *ip)
		{
			LoadEnetHrd(RequestArp,ARP);         	
			LoadArp(ip,RequestArp);
         	SendFrame(TxNetBuf,30);
		}

void	ArpAnswer(struct	ipaddr *ip)
		{
			LoadEnetHrd(AnswerArp,ARP);         	
			LoadArp(ip,AnswerArp);
         	SendFrame(TxNetBuf,30);
		}

Uint16	SwapByte(Uint16	value)
		{
    		Uint16	temp;
    		temp=(value<<8)|(value>>8);
    		return(temp);
		}								

		
//======================= END ===============================

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久夜精品精品免费| 国产精品免费看片| 国产精品久99| 成人午夜精品在线| 中文字幕免费在线观看视频一区| 蜜桃视频免费观看一区| 欧美日韩国产系列| 亚洲国产精品人人做人人爽| 91久久精品一区二区三| 无码av免费一区二区三区试看| 欧美亚州韩日在线看免费版国语版| 亚洲图片另类小说| 色综合天天综合| 亚洲女同一区二区| 制服视频三区第一页精品| 亚洲成人在线观看视频| 成人午夜看片网址| 亚洲成在人线在线播放| 欧美一区二区性放荡片| 国产ts人妖一区二区| 国产精品天干天干在观线| 日本道精品一区二区三区| 亚洲一区二区三区自拍| 国产成人一区在线| 麻豆成人av在线| 久久久久久久久伊人| 99久久精品久久久久久清纯| 亚洲精品视频免费看| 91精品国产综合久久香蕉麻豆| 另类小说色综合网站| 久久久久久久久一| 欧美在线不卡一区| 日本麻豆一区二区三区视频| 欧美不卡视频一区| 不卡一卡二卡三乱码免费网站| 亚洲视频免费在线| 日韩欧美第一区| 国产91丝袜在线播放| 亚洲不卡一区二区三区| 久久只精品国产| 99久久99久久精品免费观看| 日av在线不卡| 国产亚洲欧美日韩在线一区| 欧美精品电影在线播放| 国产精品99久久不卡二区| 亚洲电影一级黄| 久久综合国产精品| 成人av电影在线网| 日本亚洲视频在线| 中文字幕在线视频一区| 日韩免费在线观看| 91视频一区二区三区| 国产乱一区二区| 亚洲一区二区欧美| 日韩一区中文字幕| 日韩免费一区二区| 91丨九色丨蝌蚪丨老版| 三级在线观看一区二区| 2014亚洲片线观看视频免费| 91免费视频大全| 夜夜精品浪潮av一区二区三区 | 久久精品国内一区二区三区| 国产精品网站在线观看| www.欧美日韩| 日韩黄色小视频| 亚洲欧美在线另类| 欧美精品一区二| 欧美专区日韩专区| 成人精品鲁一区一区二区| 亚洲综合久久av| 国产精品美女久久久久久久久久久| 91麻豆精品国产91久久久使用方法| 欧美三级日韩三级| 色婷婷久久久久swag精品| 成人av动漫网站| 国产成人精品一区二| 国产露脸91国语对白| 另类中文字幕网| 久久精品国产第一区二区三区| 午夜激情综合网| 亚洲日本一区二区| 国产欧美一区二区在线观看| 91福利小视频| 欧美在线高清视频| 色视频成人在线观看免| 一本色道久久综合狠狠躁的推荐 | 色老综合老女人久久久| 91在线国产福利| 成人国产精品免费观看| 91毛片在线观看| 一道本成人在线| 欧美日韩免费观看一区三区| 欧美日韩在线播放| 欧美亚日韩国产aⅴ精品中极品| 97久久超碰国产精品| 国产一区不卡精品| 成人97人人超碰人人99| 成年人国产精品| 成人的网站免费观看| 国产成人精品三级| 高清成人在线观看| 国产成人av在线影院| 丁香啪啪综合成人亚洲小说| 成人网在线免费视频| 国产黄色精品网站| 91亚洲精品久久久蜜桃| 91捆绑美女网站| 91 com成人网| 日韩写真欧美这视频| 久久久不卡网国产精品二区| 国产欧美日本一区二区三区| 亚洲人成电影网站色mp4| 亚洲欧美韩国综合色| 蜜乳av一区二区三区| 国产一区二区伦理| 色婷婷综合久久久久中文 | 日韩成人精品在线观看| 黑人巨大精品欧美一区| 成人听书哪个软件好| 欧美日韩亚洲综合在线| 91精品国产麻豆| 国产精品传媒视频| 亚洲午夜电影在线观看| 国产乱人伦偷精品视频免下载 | 97久久超碰国产精品电影| 欧美在线免费观看视频| 久久久综合九色合综国产精品| 国产精品不卡一区二区三区| 一级精品视频在线观看宜春院 | 91一区二区在线| 欧洲亚洲国产日韩| 国产亚洲自拍一区| 亚洲免费观看高清完整版在线| 美女网站视频久久| bt欧美亚洲午夜电影天堂| 日韩欧美精品三级| 国产精品护士白丝一区av| 日本中文在线一区| 成人av网址在线| 久久这里都是精品| 一区二区三区四区五区视频在线观看| 强制捆绑调教一区二区| 国产白丝网站精品污在线入口| 欧美影院精品一区| 国产日产欧美一区| 亚洲午夜久久久| 国产成人免费视频精品含羞草妖精| 91.成人天堂一区| 亚洲视频电影在线| 国产不卡高清在线观看视频| 欧美色精品在线视频| 久久久亚洲精品一区二区三区| 综合久久给合久久狠狠狠97色| 丝袜亚洲精品中文字幕一区| 不卡欧美aaaaa| 国产亚洲污的网站| 午夜精品视频一区| 在线观看日韩毛片| 国产精品黄色在线观看| 成人免费毛片高清视频| 日韩欧美aaaaaa| 久久精品国产色蜜蜜麻豆| 欧美日韩一区二区不卡| 亚洲与欧洲av电影| a美女胸又www黄视频久久| 国产精品欧美精品| 国产精品一二三四区| 久久综合色天天久久综合图片| 日韩中文字幕亚洲一区二区va在线| 欧洲精品一区二区| 伊人性伊人情综合网| 色视频欧美一区二区三区| 国产精品久久看| www.欧美色图| 国产精品高潮久久久久无| 91亚洲永久精品| 国产精品久久久久久妇女6080| 99久久综合精品| 国产精品久久毛片| 成人va在线观看| 国产精品毛片无遮挡高清| 国产老妇另类xxxxx| 欧美一区二区三区播放老司机| 日韩高清不卡在线| 91精品啪在线观看国产60岁| 日韩高清欧美激情| 91成人在线精品| 亚洲国产aⅴ天堂久久| 欧美日韩在线不卡| 午夜伦理一区二区| 9191国产精品| 国产主播一区二区三区| 欧美色精品在线视频| 亚洲另类春色国产| 欧美在线观看一区二区| 亚洲小少妇裸体bbw| 精品久久99ma| 国产精品18久久久久久vr| 欧美激情一区二区三区全黄| 成人午夜视频在线|