📄 m500auc.lst
字号:
562
563 ///////////////////////////////////////////////////////////////////////
564 // Request Command defined in ISO14443(MIFARE)
565 // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
566 // 寻卡,防冲突,选择卡 返回卡类型(2 bytes)+ 卡系列号(4 bytes)
567 // req_code: Requset All or Request Std( PICC_REQALL,PICC_REQSTD )
568 // atq: 16 bit answer to request( ATO)
569 ///////////////////////////////////////////////////////////////////////
570 char M500PiccCommonRequest(unsigned char req_code,unsigned char *atq)
571 {
572 1 char idata status = MI_OK;
573 1
574 1 M500PcdSetTmo(3);
575 1 WriteIO(RegChannelRedundancy,0x03);
576 1 ClearBitMask(RegControl,0x08);
577 1 WriteIO(RegBitFraming,0x07);
578 1 SetBitMask(RegTxControl,0x03);
579 1 ResetInfo(MInfo);
580 1 SerBuffer[0] = req_code;
581 1 MInfo.nBytesToSend = 1;
582 1
583 1 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
584 1 if (status)
585 1 {
586 2 *atq = 0;
587 2 }
588 1 else
589 1 {
590 2 if (MInfo.nBitsReceived != 16)
591 2 {
592 3 *atq = 0;
593 3 status = MI_BITCOUNTERR;
594 3 }
595 2 else
596 2 {
597 3 status = MI_OK;
598 3 memcpy(atq,SerBuffer,2);
599 3 }
600 2 }
601 1 return status;
602 1 }
603
604 ///////////////////////////////////////////////////////////////////
605 // Cascaded Anti-Collision Command defined in ISO14443(MIFARE)
606 // 防冲突 读卡的系列号 MLastSelectedSnr
607 // bcnt: SNR-bits number( 0~32)
608 // snr: 4 Bytes serial number
609 ///////////////////////////////////////////////////////////////////
610 char M500PiccCascAnticoll (unsigned char bcnt,unsigned char *snr)
611 {
612 1 char idata status = MI_OK;
613 1 char idata snr_in[4];
C51 COMPILER V6.02 M500AUC 02/09/2006 13:25:02 PAGE 11
614 1 char idata nbytes = 0;
615 1 char idata nbits = 0;
616 1 char idata complete = 0;
617 1 char idata i = 0;
618 1 char idata byteOffset = 0;
619 1 unsigned char dummyShift1;
620 1 unsigned char dummyShift2;
621 1
622 1 M500PcdSetTmo(106);
623 1 memcpy(snr_in,snr,4);
624 1
625 1 WriteIO(RegDecoderControl,0x28);
626 1 ClearBitMask(RegControl,0x08);
627 1 complete = 0;
628 1 while (!complete && (status == MI_OK) )
629 1 {
630 2 ResetInfo(MInfo);
631 2 WriteIO(RegChannelRedundancy,0x03);
632 2 nbits = bcnt % 8;
633 2 if(nbits)
634 2 {
635 3 WriteIO(RegBitFraming,nbits << 4 | nbits);
636 3 nbytes = bcnt / 8 + 1;
637 3 if (nbits == 7)
638 3 {
639 4 MInfo.cmd = PICC_ANTICOLL1;
640 4 WriteIO(RegBitFraming,nbits);
641 4 }
642 3 }
643 2 else
644 2 {
645 3 nbytes = bcnt / 8;
646 3 }
647 2 SerBuffer[0] = 0x93;
648 2 SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
649 2
650 2 for (i = 0; i < nbytes; i++)
651 2 {
652 3 SerBuffer[i + 2] = snr_in[i];
653 3 }
654 2 MInfo.nBytesToSend = 2 + nbytes;
655 2
656 2 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
657 2 if (nbits == 7)
658 2 {
659 3 dummyShift1 = 0x00;
660 3 for (i = 0; i < MInfo.nBytesReceived; i++)
661 3 {
662 4 dummyShift2 = SerBuffer[i];
663 4 SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
664 4 dummyShift1 = dummyShift2;
665 4 }
666 3 MInfo.nBitsReceived -= MInfo.nBytesReceived;
667 3 if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
668 3 }
669 2 if ( status == MI_OK || status == MI_COLLERR)
670 2 {
671 3 if ( MInfo.nBitsReceived != (40 - bcnt) )
672 3 {
673 4 status = MI_BITCOUNTERR;
674 4 }
675 3 else
C51 COMPILER V6.02 M500AUC 02/09/2006 13:25:02 PAGE 12
676 3 {
677 4 byteOffset = 0;
678 4 if( nbits != 0 )
679 4 {
680 5 snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
681 5 byteOffset = 1;
682 5 }
683 4
684 4 for ( i =0; i < (4 - nbytes); i++)
685 4 {
686 5 snr_in[nbytes + i] = SerBuffer[i + byteOffset];
687 5 }
688 4
689 4 if (status != MI_COLLERR )
690 4 {
691 5 dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
692 5 dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
693 5 if (dummyShift2 != dummyShift1)
694 5 {
695 6 status = MI_SERNRERR;
696 6 }
697 5 else
698 5 {
699 6 complete = 1;
700 6 }
701 5 }
702 4 else
703 4 {
704 5 bcnt = bcnt + MInfo.collPos - nbits;
705 5 status = MI_OK;
706 5 }
707 4 }
708 3 }
709 2 }
710 1 if (status == MI_OK)
711 1 {
712 2 memcpy(snr,snr_in,4);
713 2 }
714 1 else
715 1 {
716 2 memcpy(snr,"0000",4);
717 2 }
718 1 ClearBitMask(RegDecoderControl,0x20);
719 1
720 1 return status;
721 1 }
722
723 //////////////////////////////////////////////////////////////////
724 // Cascaded Select command defined in ISO14443(MIFARE)
725 // 选择卡 Select Card
726 // snr: PICC's 4 Bytes serial number
727 // sak: 1 Byte select acknowledge
728 //////////////////////////////////////////////////////////////////
729 char M500PiccCascSelect(unsigned char *snr,unsigned char *sak)
730 {
731 1 char idata status = MI_OK;
732 1
733 1 M500PcdSetTmo(106);
734 1
735 1 WriteIO(RegChannelRedundancy,0x0F);
736 1 ClearBitMask(RegControl,0x08);
737 1 ResetInfo(MInfo);
C51 COMPILER V6.02 M500AUC 02/09/2006 13:25:02 PAGE 13
738 1 SerBuffer[0] = 0x93;
739 1 SerBuffer[1] = 0x70;
740 1
741 1 memcpy(SerBuffer + 2,snr,4);
742 1 SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
743 1 MInfo.nBytesToSend = 7;
744 1 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
745 1
746 1 *sak = 0;
747 1 if (status == MI_OK)
748 1 {
749 2 if (MInfo.nBitsReceived != 8)
750 2 {
751 3 status = MI_BITCOUNTERR;
752 3 }
753 2 else
754 2 {
755 3 *sak = SerBuffer[0];
756 3 }
757 2 }
758 1 return status;
759 1 }
760
761 ///////////////////////////////////////////////////////////////////////
762 // Key loading into the MF RC500's EEPROM
763 // 校验卡密码(E2)
764 // auth_mode:选择keyA 还是keyB
765 // snr: 4 Bytes,代表卡的序列号(Serial Number)
766 // key: 12 Bytes,认证的密码
767 // block: 所需要认证的块的地址
768 ///////////////////////////////////////////////////////////////////////
769 /*
770 char M500PiccAuthE2( unsigned char auth_mode,unsigned char *snr,
771 unsigned char keynr,unsigned char block)
772
773 {
774 char idata status = MI_OK;
775 unsigned int e2addr = 0x80 + keynr * 0x18;
776 //unsigned char *e2addrbuf = (unsigned char*)&e2addr;
777 unsigned char *e2addrbuf;
778
779 e2addrbuf = (unsigned char *)&e2addr;
780 if (auth_mode == PICC_AUTHENT1B)
781 {
782 e2addr += 12;
783 }
784 FlushFIFO();
785 ResetInfo(MInfo);
786
787 memcpy(SerBuffer,e2addrbuf,2);
788 SerBuffer[2] = SerBuffer[0];
789 SerBuffer[0] = SerBuffer[1];
790 SerBuffer[1] = SerBuffer[2];
791 MInfo.nBytesToSend = 2;
792 if ((status=M500PcdCmd(PCD_LOADKEYE2,SerBuffer,&MInfo)) == MI_OK)
793 {
794 status = M500PiccAuthState(auth_mode,snr,block); //11.9
795 }
796 return status;
797 }
798 */
799 ///////////////////////////////////////////////////////////////////////
C51 COMPILER V6.02 M500AUC 02/09/2006 13:25:02 PAGE 14
800 // Authentication key coding
801 // uncoded: 6 Bytes uncoded authentication key
802 // coded: 12 Bytes coded authentication key
803 ///////////////////////////////////////////////////////////////////////
804 /*
805 char M500HostCodeKey( unsigned char *uncoded, unsigned char *coded)
806 {
807 char idata status = MI_OK;
808 unsigned char idata cnt = 0;
809 unsigned char idata ln = 0;
810 unsigned char idata hn = 0;
811 for (cnt = 0; cnt < 6; cnt++)
812 {
813 ln = uncoded[cnt] & 0x0F;
814 hn = uncoded[cnt] >> 4;
815 coded[cnt * 2 + 1] = (~ln << 4) | ln;
816 coded[cnt * 2 ] = (~hn << 4) | hn;
817 }
818 return MI_OK;
819 }
820 */
821 ///////////////////////////////////////////////////////////////////
822 // Authentication with direct key loading from the uC
823 // 直接校验密码
824 // auth_mode:选择keyA 还是keyB
825 // snr: 4 Bytes,代表卡的序列号(Serial Number)
826 // key: 12 Bytes,认证的密码
827 // block: 所需要认证的块的地址
828 //////////////////////////////////////////////////////////////////
829 /*
830 char M500PiccAuthKey( unsigned char auth_mode,
831 unsigned char *snr,
832 unsigned char *keys,
833 unsigned char block)
834 {
835 char idata status = MI_OK;
836 //PcdSetTmo(2);
837 FlushFIFO();
838 ResetInfo(MInfo);
839 memcpy(SerBuffer,keys,12);
840 MInfo.nBytesToSend = 12;
841 if ((status=M500PcdCmd(PCD_LOADKEY,SerBuffer,&MInfo)) == MI_OK)
842 {
843 status = M500PiccAuthState(auth_mode,snr,block);
844 }
845 return status;
846 }
847
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -