📄 eth.lst
字号:
179 1 else
C51 COMPILER V7.20 ETH 03/07/2006 14:49:09 PAGE 4
180 1 reg04=0x46; //txd packet start;
181 1 reg06=len>>8; //high byte counter
182 1 reg05=len&0xff; //low byte counter
183 1 reg07=0xff;
184 1 reg00=0x3e; //to sendpacket;
185 1 free(outbuf);
186 1 }
187
188 //------------------------------------------------------------------------
189 // This functions checks the 8019 receive event status
190 // word to see if an ethernet frame has arrived. If so,
191 // set EVENT_ETH_ARRIVED bit in global event_word
192 //------------------------------------------------------------------------
193 void query_8019(void)
194 {
195 1 char bnry,curr;
196 1 page(0);
197 1 bnry=reg03; //bnry page have read 读页指针
198 1 page(1);
199 1 curr=reg07; //curr writepoint 8019写页指针
200 1 page(0);
201 1 if ((curr==0)) return;
202 1 bnry=bnry++;
203 1 if (bnry>0x7f) bnry=0x4c;
204 1 if (bnry!=curr) //此时表示有新的数据包在缓冲区里
205 1 {
206 2 EA = 0;
207 2 event_word |= EVENT_ETH_ARRIVED;
208 2 EA = 1;
209 2 }
210 1 reg0b=0x00; reg0a=0x00; reg00=0x22;//complete dma page 0
211 1 }
212
213 //------------------------------------------------------------------------
214 // This function gets an incoming Ethernet frame from the 8019.
215 // There may be more than 1 waiting but just allocate memory for
216 // one and read one in. Use the 8019 to queue incoming packets.
217 //------------------------------------------------------------------------
218 UCHAR xdata * rcve_frame(void)//如果收到一个有效的数据包,返回收到的数据,否则返回NULL
219 {
220 1 UCHAR bnry,curr,next_page;
221 1
222 1 UINT len, ii;
223 1 UCHAR temp;
224 1 UCHAR xdata * buf;
225 1
226 1 page(0);
227 1 bnry=reg03; //bnry page have read 读页指针
228 1 page(1);
229 1 curr=reg07; //curr writepoint 8019写页指针
230 1 page(0);
231 1 if ((curr==0)) return NULL; //读的过程出错
232 1 next_page=bnry;
233 1 bnry=bnry++;
234 1 if (bnry>0x7f) bnry=0x4c;
235 1 if (bnry!=curr) //此时表示有新的数据包在缓冲区里
236 1 {
237 2 //读取一包的前4个字节:4字节的8019头部
238 2 page(0);
239 2 reg09=bnry; //read page address high
240 2 reg08=0x00; //read page address low
241 2 reg0b=0x00; //read count high
C51 COMPILER V7.20 ETH 03/07/2006 14:49:09 PAGE 5
242 2 reg0a=4; //read count low;
243 2 reg00=0x0a; //read dma
244 2
245 2 temp = reg10; temp = reg10;
246 2 next_page = temp-1; //next page start-1
247 2 len = reg10; temp = reg10;
248 2 len += temp<<8;
249 2 reg0b=0x00; reg0a=0x00; reg00=0x22;//complete dma page 0
250 2
251 2 // Allocate enough memory to hold the incoming frame
252 2 buf = (UCHAR xdata *)malloc(len);
253 2 if (buf == NULL)
254 2 {
255 3 // out of RAM
256 3 // Tell 8019 to skip the frame
257 3 page(1);
258 3 curr=reg07; //page1
259 3 page(0); //切换回page0
260 3 bnry = curr -1;
261 3 if (bnry < 0x4c) bnry =0x7f;
262 3 reg03=bnry; //write to bnry
263 3 reg07=0xff; //清除中断状态可以不用
264 3 return NULL;
265 3 }
266 2 // This flag keeps track of allocated rcve memory
267 2 rcve_buf_allocated = TRUE;
268 2 // Call the assembler function to get the incoming frame
269 2 reg09=bnry; //read page address high
270 2 reg08=4; //read page address low
271 2 reg0b=len>>8; //read count high
272 2 reg0a=len&0xff; //read count low;
273 2 reg00=0x0a; //read dma
274 2 for(ii=0;ii<len;ii++)
275 2 {
276 3 buf[ii]=reg10;
277 3 }
278 2 reg0b=0x00; reg0a=0x00; reg00=0x22; //dma complete page0
279 2 // Return pointer to start of buffer
280 2 bnry=next_page;
281 2 if (bnry<0x4c) bnry=0x7f;
282 2 reg03=bnry; //write to bnry
283 2 reg07=0xff;
284 2 return (buf);
285 2 }
286 1 return NULL;
287 1 }
288
289 void eth_send(UCHAR xdata * outbuf, UCHAR * hwaddr, UINT ptype, UINT len)
290 {
291 1 ETH_HEADER xdata * eth;
292 1
293 1 eth = (ETH_HEADER xdata *)outbuf;
294 1
295 1 // Add 14 byte Ethernet header
296 1 memcpy(eth->dest_hwaddr, hwaddr, 6);
297 1 memcpy(eth->source_hwaddr, my_hwaddr, 6);
298 1 eth->frame_type = ptype;
299 1
300 1 // We just added 14 bytes to length
301 1 send_frame(outbuf, len + 14);
302 1 }
303
C51 COMPILER V7.20 ETH 03/07/2006 14:49:09 PAGE 6
304 //------------------------------------------------------------------------
305 // This is the handler for incoming Ethernet frames
306 // This is designed to handle standard Ethernet (RFC 893) frames
307 // See "TCP/IP Illustrated, Volume 1" Sect 2.2
308 //------------------------------------------------------------------------
309 void eth_rcve(UCHAR xdata * inbuf)
310 {
311 1 ETH_HEADER xdata * eth;
312 1
313 1 eth = (ETH_HEADER xdata *)inbuf;
314 1
315 1 // Reject frames in IEEE 802 format where Eth type field
316 1 // is used for length. Todo: Make it handle this format
317 1 if (eth->frame_type < 1520)
318 1 {
319 2 if (debug) SendCommString("ETH: IEEE 802 pkt rejected\r");
320 2 return;
321 2 }
322 1
323 1 // Figure out what type of frame it is from Eth header
324 1 // Call appropriate handler and supply address of buffer
325 1 switch (eth->frame_type)
326 1 {
327 2 case ARP_PACKET://是arp包
328 2 arp_rcve(inbuf);
329 2 break;
330 2
331 2 case IP_PACKET://是ip包
332 2 ip_rcve(inbuf);
333 2 break;
334 2
335 2 case RARP_PACKET:////是rarp包
336 2 if(debug) SendCommString("not use RARP_PACEDT");
337 2 break;
338 2
339 2 default:
340 2 if (debug) SendCommString("Error: Unknown pkt rcvd\r");
341 2 break;
342 2 }
343 1 }
344
345
346
347
348
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 957 ----
CONSTANT SIZE = 74 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 26
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -