⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ne2000.lst

📁 51单片机控制网卡实现上网程序代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 277   2              myoutportb(CR, 0x12);
 278   2              }
 279   1          else {
 280   2              myoutportb(CR, 0x0A);
 281   2              }
 282   1          }
 283          
 284          // ********************************************************
 285          void read_phy_addr(void) {
 286   1          u16_t ignore;
 287   1      
 288   1          remote_dma_setup(FALSE, 0x0000);
 289   1      
 290   1          physical_address[0] = myinportb(NIC_DATA);
 291   1          ignore = myinportb(NIC_DATA);
 292   1          physical_address[1] = myinportb(NIC_DATA);
 293   1          ignore = myinportb(NIC_DATA);
 294   1          physical_address[2] = myinportb(NIC_DATA);
 295   1          ignore = myinportb(NIC_DATA);
 296   1          physical_address[3] = myinportb(NIC_DATA);
 297   1          ignore = myinportb(NIC_DATA);
 298   1          physical_address[4] = myinportb(NIC_DATA);
 299   1          ignore = myinportb(NIC_DATA);
 300   1          physical_address[5] = myinportb(NIC_DATA);
 301   1          ignore = myinportb(NIC_DATA);
 302   1      
 303   1          ignore=ignore;
C51 COMPILER V7.09   NE2000                                                                03/27/2005 16:17:14 PAGE 6   

 304   1      
 305   1          }
 306          
 307          // ********************************************************
 308          short poll_nic(void) {
 309   1      
 310   1          u16_t in, out;
 311   1          u16_t i;
 312   1          u16_t status, next_ptr;
 313   1          u16_t type;
 314   1          u16_t kind;
 315   1      
 316   1      
 317   1      
 318   1          myoutportb(CR, 0x62);                       // Page 1
 319   1          in = myinportb(CURR);                       // Get the current input pointer
 320   1          myoutportb(CR, 0x22);                       // Page 0
 321   1          out = myinportb(BNDRY);                 // Get the current output pointer
 322   1      
 323   1          if (in != out) {
 324   2      
 325   2              // *** Data is present so we better retrieve it
 326   2              remote_dma_setup(READ, (u16_t)out<<8);
 327   2      
 328   2              /*status = */
 329   2              myinportb(NIC_DATA);
 330   2              next_ptr = myinportb(NIC_DATA);
 331   2      
 332   2              // *** Clear out the byte count and dest address
 333   2              for (i=0 ; i<8 ; i++)
 334   2                  myinportb(NIC_DATA);
 335   2      
 336   2              // *** Retrieve source hardware address
 337   2              for (i=0 ; i<6 ; i++)
 338   2                  source_address[i] = myinportb(NIC_DATA);
 339   2      
 340   2              // *** Retrieve ethernet message type
 341   2              type = (u16_t)myinportb(NIC_DATA)<<8;
 342   2              type = type + myinportb(NIC_DATA);
 343   2      
 344   2              switch (type) {
 345   3      
 346   3                  case ARP:
 347   3      
 348   3                      #if DEBUG == 1
 349   3                          trans_str("ARP");
 350   3                      #endif
 351   3      
 352   3                      // discard unneeded bytes (address space, protocol address space,
 353   3                      //                          length of hardware address, length of
 354   3                      //                          protocol address, opcode)
 355   3      
 356   3                      for (i=0; i<8 ; i++)
 357   3                          myinportb(NIC_DATA);
 358   3      
 359   3                      // discard source hardware address (we already have it)
 360   3      
 361   3                      for (i=0; i<6 ; i++)
 362   3                          myinportb(NIC_DATA);
 363   3      
 364   3                      // get ip address of packet source
 365   3      
C51 COMPILER V7.09   NE2000                                                                03/27/2005 16:17:14 PAGE 7   

 366   3                      for (i=0; i<4 ; i++)
 367   3                          source_ip[i] = myinportb(NIC_DATA);
 368   3      
 369   3                      // discard target hardware address (probably not valid anyway)
 370   3      
 371   3                      for (i=0; i<6 ; i++)
 372   3                          myinportb(NIC_DATA);
 373   3      
 374   3                      // get ip address of destination
 375   3      
 376   3                      for (i=0; i<4 ; i++)
 377   3                          dest_ip[i] = myinportb(NIC_DATA);
 378   3      
 379   3                      #if DEBUG == 1
 380   3                          sprintf(tmpstr,"ARP source ip %d.%d.%d.%d\n", (uint)source_ip[0], (uint)source_ip[1]
 381   3                                                                , (uint)source_ip[2], (uint)source_ip[3]);
 382   3                                              trans_str(tmpstr);
 383   3                          sprintf(tmpstr,"ARP dest   ip %d.%d.%d.%d\n", (uint)dest_ip[0], (uint)dest_ip[1]
 384   3                                                                , (uint)dest_ip[2], (uint)dest_ip[3]);
 385   3                                              trans_str(tmpstr);
 386   3                      #endif
 387   3      
 388   3                      if (dest_ip[0] == my_ip[0] && dest_ip[1] == my_ip[1] &&
 389   3                           dest_ip[2] == my_ip[2] && dest_ip[3] == my_ip[3]) {
 390   4      
 391   4                          // The ARP was for us, so let's respond
 392   4      
 393   4                          arp_response();
 394   4      
 395   4                          }
 396   3                      break;
 397   3      
 398   3                  case IP:
 399   3                      #if DEBUG == 1
 400   3                          trans_str("IP");
 401   3                      #endif
 402   3      
 403   3                      // Recieve IP Header
 404   3      
 405   3                      version = myinportb(NIC_DATA);
 406   3                      hdr_len = (version & 0x0F) << 2;
 407   3                      opt_len = hdr_len - 20;
 408   3                      version = version >> 4 ;
 409   3      
 410   3      //              if (hdr_len < 0)
 411   3      //                  break;
 412   3      
 413   3                      // discard type of service
 414   3      
 415   3                      myinportb(NIC_DATA);
 416   3      
 417   3                      // IP packet length
 418   3      
 419   3                      IP_length = myinportb(NIC_DATA) << 8;
 420   3                      IP_length += myinportb(NIC_DATA);
 421   3      
 422   3                      // Identification
 423   3      
 424   3                      identification = myinportb(NIC_DATA) << 8;
 425   3                      identification += myinportb(NIC_DATA);
 426   3      
 427   3                      // Fragment
C51 COMPILER V7.09   NE2000                                                                03/27/2005 16:17:14 PAGE 8   

 428   3      
 429   3                      fragment = myinportb(NIC_DATA) << 8;
 430   3                      fragment += myinportb(NIC_DATA);
 431   3      
 432   3                      // dicard time to live (the packets already here)
 433   3      
 434   3                      myinportb(NIC_DATA);
 435   3      
 436   3                      // IP Protocol
 437   3      
 438   3                      IP_protocol = myinportb(NIC_DATA);
 439   3      
 440   3                      // get header checksum
 441   3      
 442   3                      chksum = myinportb(NIC_DATA)<<8;
 443   3                      chksum += myinportb(NIC_DATA);
 444   3      
 445   3                      // get ip address of packet source
 446   3      
 447   3                      for (i=0; i<4 ; i++)
 448   3                          source_ip[i] = myinportb(NIC_DATA);
 449   3      
 450   3                      // get ip address of destination
 451   3      
 452   3                      for (i=0; i<4 ; i++)
 453   3                          dest_ip[i] = myinportb(NIC_DATA);
 454   3      
 455   3                      trans_str("\n");
 456   3      
 457   3                      for (i=0; i<4 ; i++)
 458   3                      {
 459   4                          sprintf(tmpstr,"%d.",(uint)source_ip[i]);
 460   4                                              trans_str(tmpstr);
 461   4                      }
 462   3                      trans_str("\n->");
 463   3                      for (i=0; i<4 ; i++)
 464   3                      {
 465   4                          sprintf(tmpstr,"%d.",(uint)dest_ip[i]);
 466   4                                              trans_str(tmpstr);
 467   4                      }
 468   3                      trans_str("\n");
 469   3                      // discard options if any
 470   3      
 471   3                      for (i=0; i<opt_len ; i++)
 472   3                          myinportb(NIC_DATA);
 473   3      
 474   3                      #if DEBUG == 1
 475   3                          sprintf(tmpstr,"Option length = %d\n",(uint)opt_len);
 476   3                                              trans_str(tmpstr);
 477   3                      #endif
 478   3      
 479   3                      switch (IP_protocol) {
 480   4      
 481   4                          case ICMP:
 482   4      
 483   4                              #if DEBUG == 1
 484   4                                  trans_str("-ICMP");
 485   4                              #endif
 486   4      
 487   4                              icmp_type = myinportb(NIC_DATA);
 488   4      
 489   4                              if (icmp_type == ECHO) {
C51 COMPILER V7.09   NE2000                                                                03/27/2005 16:17:14 PAGE 9   

 490   5      
 491   5                                  #if DEBUG == 1
 492   5                                      trans_str("--PING");
 493   5                                  #endif
 494   5      
 495   5                                  // This is a PING
 496   5      
 497   5                                  // retrieve 'code'
 498   5                                  icmp_code = myinportb(NIC_DATA);
 499   5      
 500   5                                  // retrieve 'checksum'
 501   5                                  icmp_checksum = myinportb(NIC_DATA)<<8;
 502   5                                  icmp_checksum += myinportb(NIC_DATA);
 503   5      
 504   5                                  // retrieve 'identifier'
 505   5                                  icmp_identifier = myinportb(NIC_DATA)<<8;
 506   5                                  icmp_identifier += myinportb(NIC_DATA);
 507   5      
 508   5                                  // retrieve 'sequence'
 509   5                                  icmp_sequence = myinportb(NIC_DATA)<<8;
 510   5                                  icmp_sequence += myinportb(NIC_DATA);
 511   5                                                          
 512   5                                  ping_response();
 513   5                              }
 514   4                              // Add other ICMP types here
 515   4                              
 516   4                              break;
 517   4      
 518   4                          case TCP:
 519   4                              
 520   4                              #if DEBUG == 1
 521   4                                  trans_str("-TCP");
 522   4                              #endif
 523   4      
 524   4                              // retrieve 'source port'
 525   4                              tcp_source_port = myinportb(NIC_DATA)<<8;
 526   4                              tcp_source_port += myinportb(NIC_DATA);
 527   4      
 528   4                              // retrieve 'destination port'
 529   4                              tcp_dest_port = myinportb(NIC_DATA)<<8;
 530   4                              tcp_dest_port += myinportb(NIC_DATA);
 531   4      
 532   4                              // We only respond to port 80 (HTML requests)
 533   4                              if (tcp_dest_port != 80) break;
 534   4      
 535   4                              // retrieve sequence number
 536   4                              seq[0]=myinportb(NIC_DATA)<<8;
 537   4                              seq[0]+=myinportb(NIC_DATA);
 538   4                              seq[1]=myinportb(NIC_DATA)<<8;
 539   4                              seq[1]+=myinportb(NIC_DATA);
 540   4      
 541   4                              // retrieve acknowlegment number
 542   4                              ack[0]=myinportb(NIC_DATA)<<8;
 543   4                              ack[0]+=myinportb(NIC_DATA);
 544   4                              ack[1]=myinportb(NIC_DATA)<<8;
 545   4                              ack[1]+=myinportb(NIC_DATA);
 546   4      
 547   4                              // retrieve offset
 548   4                              offset=(myinportb(NIC_DATA) & 0xF0) >> 2;
 549   4                              tcp_options = (offset - 20);
 550   4      
 551   4                              // retrieve flags
C51 COMPILER V7.09   NE2000                                                                03/27/2005 16:17:14 PAGE 10  

 552   4                              flags=myinportb(NIC_DATA) & 0x3F;
 553   4      
 554   4                              if ((flags & TCP_SYN) == TCP_SYN) max_seg=0;
 555   4      
 556   4                              // retrieve windows
 557   4                              window0=myinportb(NIC_DATA) << 8;
 558   4                              window0+=myinportb(NIC_DATA);
 559   4      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -