📄 ethernet.lst
字号:
C51 COMPILER V6.23a ETHERNET 05/11/2004 18:03:26 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE ETHERNET
OBJECT MODULE PLACED IN ethernet.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ethernet.c LARGE ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "ethernet.h"
2
3 Net_inf_struc net_inf;
4
5
6 #define PSTART_data 0x46
7 #define PSTOP_data 0x60
8 #define TPSR_data 0x40
9
10 //define the register offset of the Ethernet chipset
11 #define CR_Add 0x0
12 #define REMOTE_DMA_PORT 0x10
13 #define RESET_PORT 0x18
14 //Page 0
15 #define CLDA0_Add 0x01
16 #define PSTART_Add 0x01
17 #define CLDA1_Add 0x02
18 #define PSTOP_Add 0x02
19 #define BNRY_Add 0x03
20 #define TSR_Add 0x04
21 #define TPSR_Add 0x04
22 #define NCR_Add 0x05
23 #define TBCR0_Add 0x05
24 #define FIFO_Add 0x06
25 #define TBCR1_Add 0x06
26 #define ISR_Add 0x07
27 #define CRDA0_Add 0x08
28 #define RSAR0_Add 0x08
29 #define CRDA1_Add 0x09
30 #define RSAR1_Add 0x09
31 #define ID0_Add 0x0a
32 #define RBCR0_Add 0x0a
33 #define ID1_Add 0x0b
34 #define RBCR1_Add 0x0b
35 #define RSR_Add 0x0c
36 #define RCR_Add 0x0c
37 #define CNTR0_Add 0x0d
38 #define TCR_Add 0x0d
39 #define CNTR1_Add 0x0e
40 #define DCR_Add 0x0e
41 #define CNTR2_Add 0x0f
42 #define IMR_Add 0x0f
43
44 //Page 1
45 #define PAR_Add 0x01
46 #define CURR_Add 0x07
47 #define MAR_Add 0x08
48
49 #define wrport(x,y) XBYTE[x] = (y)
50 #define rdport(x) XBYTE[x]
51
52 //-----------------------------------------------------------------
53 void ethernet_init(Uint16 base_addr, Uint8 *pMac)
54 {
55 1 Uint8 i;
C51 COMPILER V6.23a ETHERNET 05/11/2004 18:03:26 PAGE 2
56 1 net_inf.net_ifaddr = base_addr;
57 1 if(pMac != NULL)
58 1 memcpy(net_inf.mac,pMac,ETHER_ADDR_LEN);
59 1 //Page 0,Stop command
60 1 wrport(net_inf.net_ifaddr+CR_Add,0x21);
61 1 //Auto-initalize Remote,byte-wide DMA transmit
62 1 wrport(net_inf.net_ifaddr+DCR_Add,0x98);
63 1 //Clear Remote byte count register
64 1 wrport(net_inf.net_ifaddr+RBCR0_Add,0);
65 1 wrport(net_inf.net_ifaddr+RBCR1_Add,0);
66 1 //Config reveive mode
67 1 wrport(net_inf.net_ifaddr+RCR_Add,0xcc);
68 1 //Config transmit mode
69 1 wrport(net_inf.net_ifaddr+TCR_Add,0xe2);
70 1 //Config Receive ring
71 1 wrport(net_inf.net_ifaddr+PSTART_Add,PSTART_data);
72 1 wrport(net_inf.net_ifaddr+PSTOP_Add,PSTOP_data);
73 1 wrport(net_inf.net_ifaddr+BNRY_Add,PSTART_data);
74 1 //clear Isr and no interrupt
75 1 wrport(net_inf.net_ifaddr+ISR_Add,0xff);
76 1 wrport(net_inf.net_ifaddr+IMR_Add,0x0f);
77 1 //Config the transmit page address
78 1 wrport(net_inf.net_ifaddr+TPSR_Add,TPSR_data);
79 1 wrport(net_inf.net_ifaddr+TBCR0_Add,0);
80 1 wrport(net_inf.net_ifaddr+TBCR1_Add,0);
81 1 //Page 1,Stop command
82 1 wrport(net_inf.net_ifaddr+CR_Add,0x61);
83 1 //Config the first reveive buffer page
84 1 wrport(net_inf.net_ifaddr+CURR_Add,PSTART_data+1);
85 1 //Config MAC address
86 1 for(i=0;i<6;i++){
87 2 wrport(net_inf.net_ifaddr+1+i,net_inf.mac[i]);
88 2 }
89 1 //Config transmit mode
90 1 wrport(net_inf.net_ifaddr+CR_Add,0x21);
91 1 wrport(net_inf.net_ifaddr+TCR_Add,0xe0);
92 1 //Page 0,Begin command
93 1 wrport(net_inf.net_ifaddr+CR_Add,0x22);
94 1 }
95
96 //-----------------------------------------------------------------
97 Bool ethernet_send(Uint8 *pbuffer, Uint16 aLength)
98 {
99 1 Uint8 crda0;
100 1 Uint16 i;
101 1 if(rdport(net_inf.net_ifaddr+CR_Add)&0x4)
102 1 return FALSE;
103 1 aLength=Max(64,aLength);
104 1 aLength=Min(ETHER_BUFFER_LEN,aLength);
105 1 //dummy read
106 1 wrport(net_inf.net_ifaddr+RSAR1_Add,TPSR_data);
107 1 wrport(net_inf.net_ifaddr+RSAR0_Add,0);
108 1 wrport(net_inf.net_ifaddr+RBCR1_Add,0);
109 1 wrport(net_inf.net_ifaddr+RBCR0_Add,2);
110 1 crda0 = rdport(net_inf.net_ifaddr+CRDA0_Add);
111 1 wrport(net_inf.net_ifaddr+CR_Add,0x0a);
112 1 for(i=0;i<1000;i++){
113 2 if( crda0 != rdport(net_inf.net_ifaddr+CRDA0_Add))
114 2 break;
115 2 }
116 1 if(i==1000)
117 1 return FALSE;
C51 COMPILER V6.23a ETHERNET 05/11/2004 18:03:26 PAGE 3
118 1 //Ready the packet
119 1 wrport(net_inf.net_ifaddr+RSAR1_Add,TPSR_data);
120 1 wrport(net_inf.net_ifaddr+RSAR0_Add,0);
121 1 wrport(net_inf.net_ifaddr+RBCR1_Add,aLength>>8);
122 1 wrport(net_inf.net_ifaddr+RBCR0_Add,aLength);
123 1 wrport(net_inf.net_ifaddr+CR_Add,0x12);
124 1 for(i=0;i<aLength;i++){
125 2 wrport(net_inf.net_ifaddr+REMOTE_DMA_PORT,*pbuffer++);
126 2 }
127 1 //Transmit the packet
128 1 wrport(net_inf.net_ifaddr+RBCR1_Add,0x0f);
129 1 wrport(net_inf.net_ifaddr+TBCR1_Add,aLength>>8);
130 1 wrport(net_inf.net_ifaddr+TBCR0_Add,aLength);
131 1 wrport(net_inf.net_ifaddr+CR_Add,0x16);
132 1 return TRUE;
133 1 }
134
135 //-----------------------------------------------------------------
136 Uint16 ethernet_receive(Uint8 *pBuffer)
137 {
138 1 Uint16 i,length;
139 1 Uint8 next_pkt,curr,bnry;
140 1 // get packet
141 1 i = rdport(net_inf.net_ifaddr+ISR_Add);
142 1 i = rdport(net_inf.net_ifaddr+CR_Add);
143 1 next_pkt = rdport(net_inf.net_ifaddr+BNRY_Add);
144 1 next_pkt++;
145 1 if(next_pkt>=PSTOP_data)
146 1 next_pkt = PSTART_data;
147 1 //Get curr
148 1 wrport(net_inf.net_ifaddr+CR_Add,0x62);
149 1 curr = rdport(net_inf.net_ifaddr+CURR_Add);
150 1 wrport(net_inf.net_ifaddr+CR_Add,0x22);
151 1 //If has not new packet
152 1 if(next_pkt==curr){
153 2 wrport(net_inf.net_ifaddr+ISR_Add,0x10);
154 2 return 0;
155 2 }
156 1 //read header
157 1 wrport(net_inf.net_ifaddr+RSAR1_Add,next_pkt);
158 1 wrport(net_inf.net_ifaddr+RSAR0_Add,0);
159 1 wrport(net_inf.net_ifaddr+RBCR1_Add,0);
160 1 wrport(net_inf.net_ifaddr+RBCR0_Add,4);
161 1 wrport(net_inf.net_ifaddr+CR_Add,0x0a);
162 1 bnry = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
163 1 bnry = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
164 1 length = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
165 1 i = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
166 1 length |= i<<8;
167 1 length=Min(length,ETHER_BUFFER_LEN);
168 1 //read content
169 1 wrport(net_inf.net_ifaddr+RSAR0_Add,4);
170 1 wrport(net_inf.net_ifaddr+RBCR1_Add,length>>8);
171 1 wrport(net_inf.net_ifaddr+RBCR0_Add,length);
172 1 wrport(net_inf.net_ifaddr+CR_Add,0x0a);
173 1 for(i=0;i<length;i++){
174 2 *pBuffer++ = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
175 2 }
176 1 bnry--;
177 1 if(bnry<PSTART_data)
178 1 bnry=PSTOP_data;
179 1 if(bnry>PSTOP_data)
C51 COMPILER V6.23a ETHERNET 05/11/2004 18:03:26 PAGE 4
180 1 bnry=PSTOP_data;
181 1 wrport(net_inf.net_ifaddr+BNRY_Add,bnry);
182 1 // if(rdport(net_inf.net_ifaddr+ISR_Add)&0x10)
183 1 // wrport(net_inf.net_ifaddr+ISR_Add,0x10);
184 1 return length;
185 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1308 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 28 18
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -