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

📄 ne2000.c

📁 为pci接口的RTL8029AS网卡的单片机程序
💻 C
字号:
/*****************************
netcard driver  for rtl8029as chip 
copyright by laogu http://www.laogu.com
VER 2.0
Last Update 2001.12.3
主程序,为pci接口的RTL8029AS网卡的单片机程序
  串口工作在中断方式的接收和发送,
*******************************/
#include <my.h>  //头文件定义,包含很多用到的宏的定义
union u {unsigned int word;
         struct{unsigned char high;unsigned char low;}bytes;//字节顺序为高位在前的2byte结构
		 };
union v { unsigned int word;
                struct{unsigned char low;unsigned char high;}bytes;  /* 发送顺序为低位在前,高位在后    8019网卡的长度*/
              } ;
union w { ulong dwords;
          struct {unsigned int high;unsigned int low;}words;
		  struct {unsigned char byte3;unsigned char byte2;unsigned char byte1;unsigned char byte0;}bytes;
       };
union ethernet_address_type{
                      unsigned int words[3];
					  unsigned char bytes[6];

                      };
union ip_address_type{
                      unsigned long dwords;
                      unsigned int words[2];
					  unsigned char bytes[4];
                      };

union arp_table_type {
                      unsigned char bytes[12];
                      unsigned int words[6];
                      struct{unsigned char status;unsigned char ttl;unsigned int ip_address[2];unsigned int ethernet_address[3];
                                    //状态,生存时间,ip地址,以太网地址
                             }arp;
                        

                     };
     /*以太网帧*/
                  
 struct  ethernet { unsigned char status;   /*接收状态*/
                    unsigned char nextpage;        /*下一个页*/
                    unsigned int length;           /*以太网长度,以字节为单位,*/
                    unsigned int destnodeid[3];    /*目的网卡地址*/
                    unsigned int sourcenodeid[3];   /*源网卡地址*/
                    unsigned int protocal;          /*下一层协议 */
                    unsigned char packet[1518];      /*包的内容*/
                   }  ;
 struct  retransmit { unsigned char status;   /*重发缓冲区状态*/
                    unsigned char timeout;        /*超时时间值,单位为10毫秒,最大2.55秒*/
                    unsigned int length;           /*以太网长度,以字节为单位,*/
                    unsigned int destnodeid[3];    /*目的网卡地址*/
                    unsigned int sourcenodeid[3];   /*源网卡地址*/
                    unsigned int protocal;          /*下一层协议 */
                    unsigned char packet[1518];      /*包的内容*/
                   }  ;  

    /*IP包   仅当IHL=5时用 当不=5时作转换*/
  struct ip  { unsigned int head[9];          /*以太网包头*/
                    unsigned char verandihl;        /*版本与头长度*/
                    unsigned char typeofserver;     /*服务类型*/
                    unsigned int totallength;      /*总长度*/
                    unsigned int frameindex;       /*IP帧序号*/
                    unsigned int segment;          /*分段标志*/
                    unsigned char ttl;             /*生存时间*/
                    unsigned char protocal;        /*下一层协议*/
                    unsigned int crc;              /*校验和*/
                    unsigned int sourceip[2];      /*源IP*/
                    unsigned int destip[2];        /*目的IP*/
                    unsigned char packet[1498];     /*IP包的内容*/

                   };
     struct ippacket  { unsigned int head[9];          /*以太网包头*/
                        unsigned int ippacket[720];     /*IP包的内容*/
                       };
                
   struct arp  { unsigned int head[9];  /*以太网头  */
               
                                     /*arp报文的内容总长28字节*/
                 unsigned int harewaretype;   /*以太网为0x0001*/
                 unsigned int protocaltype;    /*ip 为0X0800*/
                 unsigned char halength;        /*=0X06*/
                 unsigned char palength;         /*=0X04*/
                 unsigned int operation;         /*操作  0X0001为请求   0X0002为应答  */
                                         /*0X0003为反向地址请求 0X0004为反向地址应答*/
                 unsigned int sourcenodeid[3];   /*源网卡地址*/
                 unsigned int sourceip[2];       /*源IP地址*/
                 unsigned int destnodeid[3];      /*目的网卡地址*/
                 unsigned int destip[2];          /*目的IP地址*/
                



                }; 
  struct icmp {/*包含在IP包中,是IP的上层为0X01的应用*/
                unsigned int head[9];     /*以太网头*/
                unsigned int iphead[10];  /*IP头*/
                unsigned char type;  /*0X08 PING请求 0X00 PING应答*/
                unsigned char option; /*0X00 PING*/
                unsigned int crc;      
                unsigned int id;
                unsigned int seq;
                unsigned char icmpdata[1478];


              };
  struct tcp { unsigned int head[9];
               unsigned int iphead[10];
               unsigned int sourceport; /*源端口*/
               unsigned int destport;   /*目的端口*/
               unsigned long seqnumber; /*顺序号*/
               unsigned long acknumber;  /*确认号*/
               unsigned char offset;       /*数据偏移量*/
               unsigned char control;     /*连接控制*/
               unsigned int window;      /*流控*/
               unsigned int crc;        /*校验和 ,包括伪头部,TCP头部,数据*/
               unsigned int urg;         /*紧急指针*/
               unsigned char tcpdata[1478];    /*TCP数据*/
             };
  struct udp { unsigned int head[9];
               unsigned int iphead[10];
               unsigned int sourceport; /*源端口*/
               unsigned int destport;   /*目的端口*/
               unsigned int length;    
               unsigned int crc;        /*校验和 ,包括伪头部,udp头部,数据*/
               unsigned char udpdata[1478];    /*udp数据*/

             };
             
     /*所有协议的共用体*/
union netcard {struct {unsigned char  bytebuf[1536];}bytes;
               struct{ unsigned int wordbuf[768];}words;
               struct ethernet etherframe;
			   struct retransmit rtframe;
               struct arp   arpframe;
               struct icmp  icmpframe;
               struct tcp   tcpframe;  
               struct ip   ipframe;
			   struct udp   udpframe;
               struct ippacket ippacket;
              };
struct socket_type{
                   unsigned int my_port; //本机端口
				   unsigned int dest_port;//对方端口
				   unsigned int dest_ip[2];//对方ip
				   unsigned int dest_node_id[3];//对方的以太网地址
				   unsigned long irs;//初始化顺序号
                   unsigned long iss;//我的初始化序列号
                   unsigned long rcv_nxt;//对方的顺序号
				   unsigned long snd_nxt;//我的已经发送顺序号
                   unsigned long snd_una;//我的还没有确认顺序号
				   //unsigned long dest_ack_number;
				   unsigned int rcv_wnd;//对方的window大小
                   unsigned int snd_wnd; //我的window大小
        		   unsigned int dest_max_segment_size;//对方接受的最大的数据包大小MTU
                  unsigned int my_max_segment_size;//我能接受的最大的数据包大小
				  unsigned long my_wl1;//seq
				  unsigned long my_wl2;//ack
                  unsigned char state;//连接状态
				  unsigned char open;
      /* status: tcp_listen=0
	             tcp_syn_receive=1
				 tcp_syn_sent=2
				 tcp_syn_established =3
				 tcp_fin_wait1=4
				 tcp_fin_wait2=5
				 tcp_closing=6
				 tcp_close_wait=7;
				 tcp_last_ack=8;
				 tcp_closed=9
				 tcp_time_wait=10

         */          
                  };
xdata struct socket_type tcp1024;

/*  TCP 状态定义 */
#define TCP_STATE_LISTEN        0
#define tcp_state_syn_rcvd  1
#define tcp_state_syn_sent      2
#define tcp_state_established   3
#define TCP_STATE_FIN_WAIT1     4
#define TCP_STATE_FIN_WAIT2     5
#define TCP_STATE_CLOSING       6
#define tcp_state_close_wait   7
#define tcp_state_last_ack      8
#define TCP_STATE_CLOSED        9
#define tcp_state_time_wait     10

unsigned int frameindex=0;//IP包的序列号 
unsigned int comrxdread=0;      //串口接收读指针
unsigned int comtxdread=0;      //串口发送读指针
unsigned int comrxdwrite=0;     //串口接收写指针
unsigned int comtxdwrite=0;     //串口发送写指针
#define com_rxd_buffer_size 8000    //缓冲区结束
#define com_txd_buffer_size 8000
unsigned char xdata comrxdbuf[com_rxd_buffer_size];  //串口的接收缓冲区
unsigned char xdata comtxdbuf[com_txd_buffer_size];  //串口的发送缓冲区
bit comtxdbufempty=0;   //串口的发送缓冲区空的标志


bit txd_buffer_select=0;        
unsigned char code hex[]={"0123456789ABCDEF"}; //为ascii-》hex的转换表

unsigned char gateway_ip_address_ttl=0 ; //网关的ip地址的以太网地址生存时间 单位分钟
                                       //=0表示还没有解析
									   //  <5分钟时需要刷新
									   //  最大25分钟
unsigned char ping_ip_address_ttl=0;
unsigned char ping_count;//ping的次数
unsigned char tcp_count;//用于telnet连接的次数
unsigned char udp_count;
#define physical_address_register0 0x01
#define physical_address_register1 0x02
#define physical_address_register2 0x03
#define physical_address_register3 0x04
#define physical_address_register4 0x05
#define physical_address_register5 0x06
#define interrupt_status_register 0x07
#define command_register 0x00
#define page_start_register 0x01
#define current_page_register 0x07
#define page_stop_register 0x02
#define boundary_register 0x03
#define transmit_page_start_register 0x04
#define remote_byte_count_register0 0x0a
#define remote_byte_count_register1 0x0b
#define receive_config_register 0x0c
#define transmit_config_register 0x0d

#define data_config_register 0x0e
#define transmit_status_register 0x04  //page 0  read only
#define interrupt_mask_register 0x0f
#define current_page_register 0x07
#define transmit_byte_count_register0 0x05
#define transmit_byte_count_register1 0x06
#define multicast_address_register0 0x08
#define multicast_address_register1 0x09
#define multicast_address_register2 0x0A
#define multicast_address_register3 0x0B
#define multicast_address_register4 0x0C
#define multicast_address_register5 0x0D
#define multicast_address_register6 0x0E
#define multicast_address_register7 0x0F
#define remote_start_address_register0 0x08
#define remote_start_address_register1 0x09
#define remote_dma_port 0x10
#define reset_port 0x1f
#define remote_dma_port_high 0x11
#define config_register3  0x06  //page 3
#define config_register2  0x05  //page 3
#define command_register_93c46 0x01
#define tally_counter0 0x0d  //page0 read
#define tally_counter1 0x0e  //page0 read
#define tally_counter2 0x0f //page0 read
 unsigned char msec=0;//10毫秒钟
 unsigned char sec=0;//秒钟
 unsigned char min=0;//分钟
uchar xdata *read_dma_point;
bit double_second;
#define CR  send_char(0x0d);send_char(0x0a);  //回车换行
bit tcp_time_out=0;
#define fpga_pci_control   XBYTE[0xDFFF]  //addr_F7 复位脚的控制寄存器   只写
#define fpga_pci_address0  XBYTE[0xF3FF]  //addr_FC pci总线的数据0   

⌨️ 快捷键说明

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