?? eth.lst
字號:
C51 COMPILER V7.06 ETH 07/29/2006 13:15:57 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE ETH
OBJECT MODULE PLACED IN Eth.OBJ
COMPILER INVOKED BY: c:\KEIL\C51\BIN\C51.exe Eth.c DB OE
stmt level source
1 //-----------------------------------------------------------------------------
2 // Copyright (c) 2002 Jim Brady
3 // Do not use commercially without author's permission
4 // Last revised August 2002
5 // Net ETH.C
6 //
7 // This module is the Ethernet layer
8 //-----------------------------------------------------------------------------
9 #include <string.h>
10 #include <stdlib.h>
11 #include "C8051f.h"
12 #include "net.h"
13 #include "serial.h"
14 #include "arp.h"
15 #include "ip.h"
16 #include "eth.h"
17
18
19 #define reg00 XBYTE[0x8000] //reg00- 10為isa網卡接口的寄存器地址300-310;
20 #define reg01 XBYTE[0x8001]
21 #define reg02 XBYTE[0x8002]
22 #define reg03 XBYTE[0x8003]
23 #define reg04 XBYTE[0x8004]
24 #define reg05 XBYTE[0x8005]
25 #define reg06 XBYTE[0x8006]
26 #define reg07 XBYTE[0x8007]
27 #define reg08 XBYTE[0x8008]
28 #define reg09 XBYTE[0x8009]
29 #define reg0a XBYTE[0x800a]
30 #define reg0b XBYTE[0x800b]
31 #define reg0c XBYTE[0x800c]
32 #define reg0d XBYTE[0x800d]
33 #define reg0e XBYTE[0x800e]
34 #define reg0f XBYTE[0x800f]
35 #define reg10 XBYTE[0x8010]
36
37 bit txd_buffer_select=0; //選擇網卡的發送緩沖區
38 extern UCHAR idata debug;
39 extern UCHAR xdata arpbuf[];
40 extern UCHAR code my_hwaddr[];
41
42 void Delay1ms(unsigned char T);
43
44 extern UCHAR idata rcve_buf_allocated;
45 extern UINT volatile event_word;
46
47
48
49 #define Rtl8019ResetLow P5 &= ~(0x4); // P52
50 #define Rtl8019ResetHigh P5 |= 0x4; // P52
51
52 //------------------------------------------------------------------------
53 // Initialize the Cirrus Logic 8019 chip
54 //------------------------------------------------------------------------
55
C51 COMPILER V7.06 ETH 07/29/2006 13:15:57 PAGE 2
56 void page(unsigned char pagenumber)
57 {
58 1 unsigned char data temp;
59 1 temp=reg00;
60 1 temp=temp&0x3B ;
61 1 pagenumber=pagenumber <<6;
62 1 temp=temp | pagenumber;
63 1 reg00=temp;
64 1 }
65
66 void Rtl8019AS_Reset() //復位網卡
67 {
68 1 Rtl8019ResetHigh;;
69 1 Delay1ms(200);
70 1 Rtl8019ResetLow;
71 1 Delay1ms(200);
72 1 }
73
74 void ReadRtl8019NodeID(void)//讀出網卡的物理地址存到my_ethernet_address.bytes[6]里
75 {
76 1 unsigned char data i;
77 1 page(0);
78 1 reg09=0; //讀取網卡的ram的地址為0x0000
79 1 reg08=0;
80 1 reg0b=0;
81 1 reg0a=12; //讀取12個字節
82 1 reg00=0x0a; //讀ram
83 1 for (i=0;i<6;i++)
84 1 {
85 2 // my_hwaddr[i]=reg10;
86 2 // my_hwaddr[i]=reg10;
87 2 }
88 1 }
89
90 void WriteRtl8019NodeID()
91 {
92 1 page(1);
93 1 reg01=my_hwaddr[0];
94 1 reg02=my_hwaddr[1];
95 1 reg03=my_hwaddr[2];
96 1 reg04=my_hwaddr[3];
97 1 reg05=my_hwaddr[4];
98 1 reg06=my_hwaddr[5];
99 1 page(0);
100 1 }
101
102 void init_8019(void)
103 {
104 1 Delay1ms(10);
105 1 Rtl8019AS_Reset(); //復位8019
106 1 R8019_CHIP_SELECT;
107 1 reg00=0x21; //使芯片處于停止模式,這時進行寄存器設置 停止模式下,將不會發送和接收數據包
108 1 Delay1ms(10); //延時10毫秒,確保芯片進入停止模式
109 1 page(0);
110 1 reg0a=0x00; reg0b=0x00;
111 1 reg0c= 0xe0; //monitor mode (no packet receive)
112 1 reg0d= 0xe2; //loop back mode 使芯片處于mon和loopback模式,跟外部網絡斷開
113 1 reg01=0x4c; reg02=0x80; reg03=0x4c; reg04=0x40;
114 1 reg07=0xff; //清除所有中斷標志位
115 1 reg0f=0x00; //disable all interrupt
116 1 reg0e=0xc8; //byte dma 8位dma方式
117 1 page(1);
C51 COMPILER V7.06 ETH 07/29/2006 13:15:57 PAGE 3
118 1 reg07=0x4d; reg08=0x00; reg09=0x00; reg0a=0x00; reg0b=0x00;
119 1 reg0c=0x00; reg0d=0x00; reg0e=0x00; reg0f=0x00;
120 1 reg00=0x22; //這時讓芯片開始工作
121 1 ReadRtl8019NodeID(); //讀出網卡的物理地址48位
122 1 WriteRtl8019NodeID(); //將網卡地址寫入到mar寄存器
123 1 page(0);
124 1 reg0c=0xcc; //將網卡設置成正常的模式,跟外部網絡連接
125 1 reg0d=0xe0;
126 1 reg00=0x22; //這時讓芯片開始工作
127 1 reg07=0xff; //清除所有中斷標志位
128 1 }
129
130 //------------------------------------------------------------------------
131 // This functions checks 8019 status then sends an ethernet
132 // frame to it by calling an assembler function.
133 //------------------------------------------------------------------------
134
135 void send_frame(UCHAR xdata * outbuf, UINT len)/*發送一個數據包的命令,長度最小為60字節,最大1514字節*/
136 {
137 1 UCHAR i;
138 1 UINT ii;
139 1 page(0);
140 1 if(len<60)len=60;
141 1 txd_buffer_select=!txd_buffer_select;
142 1 if (txd_buffer_select)
143 1 reg09=0x40 ; //txdwrite highaddress
144 1 else
145 1 reg09=0x46 ; //txdwrite highaddress
146 1 reg08=0x00; //read page address low
147 1 reg0b=len>>8; //read count high
148 1 reg0a=len&0xff; //read count low;
149 1 reg00=0x12; //write dma, page0
150 1 for (ii=0;ii<len;ii++) //for (ii=4;ii<len+4;ii++) //是否加4有待驗證
151 1 {
152 2 reg10=*(outbuf+ii);
153 2 }
154 1
155 1 /* 以下3句為中止dma的操作,可以不要 */
156 1 reg0b=0x00; //read count high 中止DMA操作
157 1 reg0a=0x00; //read count low;
158 1 reg00=0x22; //complete dma page 0
159 1
160 1 for(i=0;i<16;i++) //最多重發16次
161 1 {
162 2 for(ii=0;ii<1000;ii++) //檢查txp為是否為低
163 2 {
164 3 if ((reg00&0x04)==0) break;
165 3 }
166 2 if ((reg04&0x01)!=0) break; //表示發送成功
167 2 reg00=0x3e;
168 2 }
169 1 reg07=0xff;
170 1 if(txd_buffer_select)
171 1 reg04=0x40; //txd packet start;
172 1 else
173 1 reg04=0x46; //txd packet start;
174 1 reg06=len>>8; //high byte counter
175 1 reg05=len&0xff; //low byte counter
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -