📄 m500auc.lst
字号:
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 + -