📄 smartcard.txt
字号:
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\smartcard.o --depend=.\Obj\smartcard.d --device=DARMSTM --apcs=interwork -O3 -I..\..\include -I..\..\..\FWLib\library\inc -I..\..\..\USBLib\library\inc -I..\..\Config -I..\..\GUI\Core -I..\..\GUI\Font -I..\..\GUI\ConvertColor -I..\..\GUI\AntiAlias -I..\..\GUI\ConvertMono -I..\..\GUI\JPEG -I..\..\GUI\MemDev -I..\..\GUI\MultiLayer -I..\..\GUI\Widget -I..\..\GUI\WM -IC:\Keil\ARM\INC\ST\STM32F10x ..\..\source\smartcard.c]
THUMB
AREA ||i.SC_AnswerReq||, CODE, READONLY, ALIGN=1
SC_AnswerReq PROC
;;;482 *******************************************************************************/
;;;483 static void SC_AnswerReq(SC_State *SCstate, u8 *card, u8 length)
000000 e92d43f8 PUSH {r3-r9,lr}
;;;484 {
000004 4607 MOV r7,r0
;;;485 u8 Data = 0;
000006 2000 MOVS r0,#0
;;;486 u32 i = 0;
000008 4605 MOV r5,r0
;;;487
;;;488 switch(*SCstate)
00000a 9000 STR r0,[sp,#0]
00000c 7838 LDRB r0,[r7,#0]
00000e 460c MOV r4,r1 ;484
000010 4616 MOV r6,r2 ;484
000012 f04f0903 MOV r9,#3
;;;489 {
;;;490 case SC_RESET_LOW:
;;;491 /* Check responce with reset low ---------------------------------------*/
;;;492 for (i = 0; i < length; i++)
;;;493 {
;;;494 if((USART_ByteReceive(&Data, SC_Receive_Timeout)) == SUCCESS)
000016 f44f4880 MOV r8,#0x4000
00001a 2801 CMP r0,#1 ;488
00001c d018 BEQ |L1.80|
00001e 2802 CMP r0,#2 ;488
000020 d022 BEQ |L1.104|
000022 2803 CMP r0,#3 ;488
000024 d008 BEQ |L1.56|
000026 2805 CMP r0,#5 ;488
;;;495 {
;;;496 card[i] = Data;
;;;497 }
;;;498 }
;;;499 if(card[0])
;;;500 {
;;;501 (*SCstate) = SC_ACTIVE;
;;;502 SC_Reset(Bit_SET);
;;;503 }
;;;504 else
;;;505 {
;;;506 (*SCstate) = SC_RESET_HIGH;
;;;507 }
;;;508 break;
;;;509
;;;510 case SC_RESET_HIGH:
;;;511 /* Check responce with reset high --------------------------------------*/
;;;512 SC_Reset(Bit_SET); /* Reset High */
;;;513
;;;514 while(length--)
;;;515 {
;;;516 if((USART_ByteReceive(&Data, SC_Receive_Timeout)) == SUCCESS)
;;;517 {
;;;518 *card++ = Data; /* Receive data for timeout = SC_Receive_Timeout */
;;;519 }
;;;520 }
;;;521 if(card[0])
;;;522 {
;;;523 (*SCstate) = SC_ACTIVE;
;;;524 }
;;;525 else
;;;526 {
;;;527 (*SCstate) = SC_POWER_OFF;
;;;528 }
;;;529 break;
;;;530
;;;531 case SC_ACTIVE:
;;;532 break;
;;;533
;;;534 case SC_POWER_OFF:
;;;535 /* Close Connection if no answer received ------------------------------*/
;;;536 SC_Reset(Bit_SET); /* Reset high - a bit is used as level shifter from 3.3 to 5 V */
;;;537 SC_PowerCmd(DISABLE);
;;;538 break;
;;;539
;;;540 default:
;;;541 (*SCstate) = SC_RESET_LOW;
000028 f04f0001 MOV r0,#1
00002c d137 BNE |L1.158|
00002e f7fffffe BL SC_Reset
000032 2000 MOVS r0,#0 ;537
000034 f7fffffe BL SC_PowerCmd
|L1.56|
;;;542 }
;;;543 }
000038 e8bd83f8 POP {r3-r9,pc}
|L1.60|
00003c 4641 MOV r1,r8 ;494
00003e 4668 MOV r0,sp ;494
000040 f7fffffe BL USART_ByteReceive
000044 2801 CMP r0,#1 ;494
000046 d102 BNE |L1.78|
000048 f89d0000 LDRB r0,[sp,#0] ;496
00004c 5560 STRB r0,[r4,r5] ;496
|L1.78|
00004e 1c6d ADDS r5,r5,#1 ;492
|L1.80|
000050 42b5 CMP r5,r6 ;492
000052 d3f3 BCC |L1.60|
000054 7820 LDRB r0,[r4,#0] ;499
000056 b128 CBZ r0,|L1.100|
000058 f8879000 STRB r9,[r7,#0] ;501
00005c 2001 MOVS r0,#1 ;502
00005e f7fffffe BL SC_Reset
000062 e7e9 B |L1.56|
|L1.100|
000064 2002 MOVS r0,#2 ;506
000066 e016 B |L1.150|
|L1.104|
000068 2001 MOVS r0,#1 ;512
00006a f7fffffe BL SC_Reset
00006e 4645 MOV r5,r8 ;494
000070 e009 B |L1.134|
|L1.114|
000072 4629 MOV r1,r5 ;516
000074 4668 MOV r0,sp ;516
000076 f7fffffe BL USART_ByteReceive
00007a 2801 CMP r0,#1 ;516
00007c d103 BNE |L1.134|
00007e f89d0000 LDRB r0,[sp,#0] ;518
000082 f8040b01 STRB r0,[r4],#1 ;518
|L1.134|
000086 0030 MOVS r0,r6 ;514
000088 f1a60601 SUB r6,r6,#1 ;514
00008c b2f6 UXTB r6,r6 ;514
00008e d1f0 BNE |L1.114|
000090 7820 LDRB r0,[r4,#0] ;521
000092 b110 CBZ r0,|L1.154|
000094 4648 MOV r0,r9 ;523
|L1.150|
000096 7038 STRB r0,[r7,#0] ;506
000098 e7ce B |L1.56|
|L1.154|
00009a 2005 MOVS r0,#5 ;527
00009c e7fb B |L1.150|
|L1.158|
00009e e7fa B |L1.150|
;;;544
ENDP
AREA ||i.SC_Handler||, CODE, READONLY, ALIGN=2
SC_Handler PROC
;;;61 *******************************************************************************/
;;;62 void SC_Handler(SC_State *SCState, SC_ADPU_Commands *SC_ADPU, SC_ADPU_Responce *SC_Response)
000000 e92d41f0 PUSH {r4-r8,lr}
;;;63 {
000004 4605 MOV r5,r0
000006 4608 MOV r0,r1
000008 4611 MOV r1,r2
;;;64 u32 i = 0;
;;;65
;;;66 switch(*SCState)
00000a 782a LDRB r2,[r5,#0]
00000c 2400 MOVS r4,#0 ;64
00000e 2605 MOVS r6,#5
000010 4f33 LDR r7,|L2.224|
000012 2a06 CMP r2,#6
000014 d262 BCS |L2.220|
000016 e8dff002 TBB [pc,r2]
00001a 0323 DCB 0x03,0x23
00001c 61384246 DCB 0x61,0x38,0x42,0x46
;;;67 {
;;;68 case SC_POWER_ON:
;;;69 if (SC_ADPU->Header.INS == SC_GET_A2R)
000020 7840 LDRB r0,[r0,#1]
000022 2800 CMP r0,#0
000024 d12f BNE |L2.134|
;;;70 {
;;;71 /* Smartcard intialization ------------------------------------------*/
;;;72 SC_Init();
000026 f7fffffe BL SC_Init
;;;73
;;;74 /* Reset Data from SC buffer -----------------------------------------*/
;;;75 for (i = 0; i < 40; i++)
;;;76 {
;;;77 SC_ATR_Table[i] = 0;
00002a 482e LDR r0,|L2.228|
00002c 2100 MOVS r1,#0 ;64
|L2.46|
00002e 5501 STRB r1,[r0,r4]
000030 1c64 ADDS r4,r4,#1 ;75
000032 2c28 CMP r4,#0x28 ;75
000034 d3fb BCC |L2.46|
;;;78 }
;;;79
;;;80 /* Reset SC_A2R Structure --------------------------------------------*/
;;;81 SC_A2R.TS = 0;
000036 4a2b LDR r2,|L2.228|
000038 3a2c SUBS r2,r2,#0x2c
00003a 7011 STRB r1,[r2,#0]
;;;82 SC_A2R.T0 = 0;
00003c 7051 STRB r1,[r2,#1]
;;;83 for (i = 0; i < SETUP_LENGTH; i++)
00003e 2000 MOVS r0,#0
|L2.64|
;;;84 {
;;;85 SC_A2R.T[i] = 0;
000040 1813 ADDS r3,r2,r0
000042 1c40 ADDS r0,r0,#1 ;83
000044 7099 STRB r1,[r3,#2]
000046 2814 CMP r0,#0x14 ;83
000048 d3fa BCC |L2.64|
;;;86 }
;;;87 for (i = 0; i < HIST_LENGTH; i++)
00004a 2000 MOVS r0,#0
|L2.76|
;;;88 {
;;;89 SC_A2R.H[i] = 0;
00004c 1813 ADDS r3,r2,r0
00004e 1c40 ADDS r0,r0,#1 ;87
000050 7599 STRB r1,[r3,#0x16]
000052 2814 CMP r0,#0x14 ;87
000054 d3fa BCC |L2.76|
;;;90 }
;;;91 SC_A2R.Tlength = 0;
000056 f8021f2a STRB r1,[r2,#0x2a]!
;;;92 SC_A2R.Hlength = 0;
00005a 7051 STRB r1,[r2,#1]
;;;93
;;;94 /* Next State --------------------------------------------------------*/
;;;95 *SCState = SC_RESET_LOW;
00005c 2001 MOVS r0,#1
00005e e01c B |L2.154|
;;;96 }
;;;97 break;
;;;98
;;;99 case SC_RESET_LOW:
;;;100 if(SC_ADPU->Header.INS == SC_GET_A2R)
000060 7840 LDRB r0,[r0,#1]
000062 2800 CMP r0,#0
000064 d10f BNE |L2.134|
000066 2180 MOVS r1,#0x80
000068 4638 MOV r0,r7
00006a f7fffffe BL GPIO_ReadInputDataBit
;;;101 {
;;;102 /* If card is detected then Power ON, Card Reset and wait for an answer) */
;;;103 if (SC_Detect())
00006e b3a8 CBZ r0,|L2.220|
000070 e004 B |L2.124|
|L2.114|
;;;104 {
;;;105 while(((*SCState) != SC_POWER_OFF) && ((*SCState) != SC_ACTIVE))
;;;106 {
;;;107 SC_AnswerReq(SCState, &SC_ATR_Table[0], 40); /* Check for answer to reset */
000072 2228 MOVS r2,#0x28
000074 491b LDR r1,|L2.228|
000076 4628 MOV r0,r5
000078 f7fffffe BL SC_AnswerReq
|L2.124|
00007c 7828 LDRB r0,[r5,#0] ;105
00007e 2805 CMP r0,#5 ;105
000080 d001 BEQ |L2.134|
000082 2803 CMP r0,#3 ;105
000084 d1f5 BNE |L2.114|
|L2.134|
;;;108 }
;;;109 }
;;;110 else
;;;111 {
;;;112 (*SCState) = SC_POWER_OFF;
;;;113 }
;;;114 }
;;;115 break;
;;;116
;;;117 case SC_ACTIVE:
;;;118 if (SC_ADPU->Header.INS == SC_GET_A2R)
;;;119 {
;;;120 if(SC_decode_Answer2reset(&SC_ATR_Table[0]) == T0_PROTOCOL)
;;;121 {
;;;122 (*SCState) = SC_ACTIVE_ON_T0;
;;;123 }
;;;124 else
;;;125 {
;;;126 (*SCState) = SC_POWER_OFF;
;;;127 }
;;;128 }
;;;129 break;
;;;130
;;;131 case SC_ACTIVE_ON_T0:
;;;132 SC_SendData(SC_ADPU, SC_Response);
;;;133 break;
;;;134
;;;135 case SC_POWER_OFF:
;;;136 SC_DeInit(); /* Disable Smartcard interface */
;;;137 break;
;;;138
;;;139 default: (*SCState) = SC_POWER_OFF;
;;;140 }
;;;141 }
000086 e8bd81f0 POP {r4-r8,pc}
00008a 7840 LDRB r0,[r0,#1] ;118
00008c 2800 CMP r0,#0 ;118
00008e d1fa BNE |L2.134|
000090 4814 LDR r0,|L2.228|
000092 f7fffffe BL SC_decode_Answer2reset
000096 bb08 CBNZ r0,|L2.220|
000098 2004 MOVS r0,#4 ;122
|L2.154|
00009a 7028 STRB r0,[r5,#0] ;95
00009c e7f3 B |L2.134|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -