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

📄 m500auc.lst

📁 51+rc500阅读器源码程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.06   M500AUC                                                               03/16/2008 20:55:11 PAGE 10  

 552   1          char idata status = MI_OK;
 553   1              
 554   1          M500PcdSetTmo(3);
 555   1          WriteIO(RegChannelRedundancy,0x03);
 556   1          ClearBitMask(RegControl,0x08);
 557   1          WriteIO(RegBitFraming,0x07);     
 558   1          SetBitMask(RegTxControl,0x03);     
 559   1          ResetInfo(MInfo);
 560   1          SerBuffer[0] = req_code;
 561   1          MInfo.nBytesToSend = 1;   
 562   1          
 563   1          status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 564   1          if (status)     
 565   1          {
 566   2              *atq = 0;
 567   2          } 
 568   1          else 
 569   1          {
 570   2              if (MInfo.nBitsReceived != 16) 
 571   2              {
 572   3                  *atq = 0;
 573   3                  status = MI_BITCOUNTERR;
 574   3              } 
 575   2              else 
 576   2              {
 577   3                  status = MI_OK;
 578   3                  memcpy(atq,SerBuffer,2);
 579   3              }
 580   2          }
 581   1          return status; 
 582   1      }
 583          
 584          ///////////////////////////////////////////////////////////////////
 585          // Cascaded Anti-Collision Command defined in ISO14443(MIFARE)
 586          // 防冲突 读卡的系列号 MLastSelectedSnr
 587          ///////////////////////////////////////////////////////////////////
 588          char M500PiccCascAnticoll (unsigned char bcnt,unsigned char *snr)       
 589          {
 590   1          char idata status = MI_OK;
 591   1          char idata snr_in[4];    
 592   1          char idata nbytes = 0;
 593   1          char idata nbits = 0;
 594   1          char idata complete = 0;
 595   1          char idata i        = 0;
 596   1          char idata byteOffset = 0;
 597   1          unsigned char dummyShift1;       
 598   1          unsigned char dummyShift2;      
 599   1          
 600   1          M500PcdSetTmo(106);
 601   1          memcpy(snr_in,snr,4);   
 602   1         
 603   1          WriteIO(RegDecoderControl,0x28); 
 604   1          ClearBitMask(RegControl,0x08);   
 605   1          complete = 0;
 606   1          while (!complete && (status == MI_OK) )
 607   1          {
 608   2              ResetInfo(MInfo);           
 609   2              WriteIO(RegChannelRedundancy,0x03);
 610   2              nbits = bcnt % 8;  
 611   2              if(nbits)
 612   2              {
 613   3                  WriteIO(RegBitFraming,nbits << 4 | nbits); 
C51 COMPILER V7.06   M500AUC                                                               03/16/2008 20:55:11 PAGE 11  

 614   3                  nbytes = bcnt / 8 + 1;   
 615   3                  if (nbits == 7)
 616   3                  {
 617   4                      MInfo.cmd = PICC_ANTICOLL1;  
 618   4                      WriteIO(RegBitFraming,nbits); 
 619   4                  }
 620   3              }  
 621   2              else
 622   2              {
 623   3                  nbytes = bcnt / 8;
 624   3              }
 625   2              SerBuffer[0] = 0x93;
 626   2              SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
 627   2                     
 628   2              for (i = 0; i < nbytes; i++)  
 629   2              {
 630   3                  SerBuffer[i + 2] = snr_in[i];
 631   3              }
 632   2              MInfo.nBytesToSend   = 2 + nbytes;   
 633   2       
 634   2              status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 635   2              if (nbits == 7)
 636   2              {
 637   3                  dummyShift1 = 0x00;
 638   3                  for (i = 0; i < MInfo.nBytesReceived; i++)
 639   3                  {
 640   4                      dummyShift2 = SerBuffer[i];
 641   4                      SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
 642   4                      dummyShift1 = dummyShift2;
 643   4                  }
 644   3                  MInfo.nBitsReceived -= MInfo.nBytesReceived;       
 645   3                  if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
 646   3              }
 647   2              if ( status == MI_OK || status == MI_COLLERR)    
 648   2              {
 649   3                  if ( MInfo.nBitsReceived != (40 - bcnt) )
 650   3                  {
 651   4                      status = MI_BITCOUNTERR; 
 652   4                  } 
 653   3                  else 
 654   3                  {
 655   4                      byteOffset = 0;
 656   4                      if( nbits != 0 ) 
 657   4                      {
 658   5                          snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
 659   5                          byteOffset = 1;
 660   5                      }
 661   4      
 662   4                      for ( i =0; i < (4 - nbytes); i++)     
 663   4                      {
 664   5                          snr_in[nbytes + i] = SerBuffer[i + byteOffset];
 665   5                      }
 666   4        
 667   4                      if (status != MI_COLLERR ) 
 668   4                      {
 669   5                          dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
 670   5                          dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
 671   5                          if (dummyShift2 != dummyShift1)
 672   5                          {
 673   6                              status = MI_SERNRERR;
 674   6                          } 
 675   5                          else   
C51 COMPILER V7.06   M500AUC                                                               03/16/2008 20:55:11 PAGE 12  

 676   5                          {
 677   6                              complete = 1;
 678   6                          }
 679   5                      }
 680   4                      else                 
 681   4                      {
 682   5                          bcnt = bcnt + MInfo.collPos - nbits;
 683   5                          status = MI_OK;
 684   5                      }
 685   4                  }
 686   3              }
 687   2          }
 688   1          if (status == MI_OK)
 689   1          {
 690   2              memcpy(snr,snr_in,4);
 691   2          }
 692   1          else
 693   1          {
 694   2              memcpy(snr,"0000",4);
 695   2          }
 696   1          ClearBitMask(RegDecoderControl,0x20); 
 697   1         
 698   1          return status;  
 699   1      }
 700          
 701          //////////////////////////////////////////////////////////////////
 702          // Cascaded Select command defined in ISO14443(MIFARE)
 703          // 选择卡 Select Card
 704          //////////////////////////////////////////////////////////////////
 705          char M500PiccCascSelect(unsigned char *snr,unsigned char *sak)
 706          {
 707   1          char idata status = MI_OK; 
 708   1       
 709   1          M500PcdSetTmo(106);
 710   1              
 711   1          WriteIO(RegChannelRedundancy,0x0F); 
 712   1          ClearBitMask(RegControl,0x08);    
 713   1          ResetInfo(MInfo);   
 714   1          SerBuffer[0] = 0x93;
 715   1          SerBuffer[1] = 0x70;        
 716   1         
 717   1          memcpy(SerBuffer + 2,snr,4);
 718   1          SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
 719   1          MInfo.nBytesToSend   = 7;
 720   1          status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 721   1      
 722   1          *sak = 0;   
 723   1          if (status == MI_OK)  
 724   1          {
 725   2              if (MInfo.nBitsReceived != 8)   
 726   2              {
 727   3                  status = MI_BITCOUNTERR;
 728   3              }
 729   2              else
 730   2              {
 731   3                      *sak = SerBuffer[0];
 732   3              }       
 733   2          }
 734   1          return status;
 735   1      }
 736          
 737          ///////////////////////////////////////////////////////////////////////
C51 COMPILER V7.06   M500AUC                                                               03/16/2008 20:55:11 PAGE 13  

 738          // Key loading into the MF RC500's EEPROM
 739          // 校验卡密码(E2)
 740          ///////////////////////////////////////////////////////////////////////
 741          char M500PiccAuthE2( unsigned char auth_mode,unsigned char *snr,      
 742                               unsigned char keynr,unsigned char block)     
 743                                                        
 744          {
 745   1          char idata status = MI_OK;
 746   1          unsigned int e2addr = 0x80 + keynr * 0x18;
 747   1          //unsigned char *e2addrbuf = (unsigned char*)&e2addr;
 748   1          unsigned char *e2addrbuf;
 749   1          
 750   1          e2addrbuf = (unsigned char *)&e2addr;
 751   1          if (auth_mode == PICC_AUTHENT1B)
 752   1          {
 753   2              e2addr += 12; 
 754   2          }
 755   1          FlushFIFO();    
 756   1          ResetInfo(MInfo);
 757   1      
 758   1          memcpy(SerBuffer,e2addrbuf,2); 
 759   1          SerBuffer[2] = SerBuffer[0];      
 760   1          SerBuffer[0] = SerBuffer[1]; 
 761   1          SerBuffer[1] = SerBuffer[2];
 762   1          MInfo.nBytesToSend   = 2;
 763   1          if ((status=M500PcdCmd(PCD_LOADKEYE2,SerBuffer,&MInfo)) == MI_OK)
 764   1          {  
 765   2              status = M500PiccAuthState(auth_mode,snr,block);  //11.9
 766   2          }
 767   1          return status;
 768   1      }                        
 769          
 770          ///////////////////////////////////////////////////////////////////////
 771          // Authentication key coding
 772          ///////////////////////////////////////////////////////////////////////
 773          char M500HostCodeKey(  unsigned char *uncoded, unsigned char *coded)   
 774          {
 775   1          char idata status = MI_OK;
 776   1          unsigned char idata cnt = 0;
 777   1          unsigned char idata ln  = 0;     
 778   1          unsigned char idata hn  = 0;      
 779   1          for (cnt = 0; cnt < 6; cnt++)
 780   1          {
 781   2              ln = uncoded[cnt] & 0x0F;
 782   2              hn = uncoded[cnt] >> 4;
 783   2              coded[cnt * 2 + 1] = (~ln << 4) | ln;
 784   2              coded[cnt * 2 ] = (~hn << 4) | hn;
 785   2          }
 786   1          return MI_OK;
 787   1      }
 788          
 789          ///////////////////////////////////////////////////////////////////
 790          // Authentication with direct key loading from the uC
 791          // 直接校验密码
 792          //////////////////////////////////////////////////////////////////
 793          char M500PiccAuthKey(  unsigned char auth_mode,
 794                                 unsigned char *snr,       
 795                                 unsigned char *keys,      
 796                                 unsigned char block)      
 797          {
 798   1          char idata status = MI_OK;
 799   1          //PcdSetTmo(2);
C51 COMPILER V7.06   M500AUC                                                               03/16/2008 20:55:11 PAGE 14  

 800   1          FlushFIFO();   
 801   1          ResetInfo(MInfo);
 802   1          memcpy(SerBuffer,keys,12);                 
 803   1          MInfo.nBytesToSend = 12;
 804   1          if ((status=M500PcdCmd(PCD_LOADKEY,SerBuffer,&MInfo)) == MI_OK)
 805   1          {      
 806   2              status = M500PiccAuthState(auth_mode,snr,block); 
 807   2          }
 808   1          return status;
 809   1      }
 810          
 811          ///////////////////////////////////////////////////////////////////////
 812          ///////////////////////////////////////////////////////////////////////
 813          char M500PiccAuthState( unsigned char auth_mode,unsigned char *snr,unsigned char block)
 814          {
 815   1          char idata status = MI_OK;
 816   1          unsigned char idata i = 0;
 817   1         
 818   1          status = ReadIO(RegErrorFlag);                                     
 819   1          if (status != MI_OK)
 820   1          {
 821   2              if (status & 0x40)           
 822   2              {
 823   3                  status = MI_KEYERR;
 824   3              }
 825   2              else
 826   2              {
 827   3                  status = MI_AUTHERR;    
 828   3              }
 829   2          }

⌨️ 快捷键说明

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