📄 ne2000.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 + -