?? 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 + -