📄 smartcard.txt
字号:
00002e 5501 STRB r1,[r0,r4]
000030 1c64 ADDS r4,r4,#1 ;75
000032 2c28 CMP r4,#0x28 ;75
000034 d3fb BCC |L7.46|
;;;78 }
;;;79
;;;80 /* Reset SC_A2R Structure --------------------------------------------*/
;;;81 SC_A2R.TS = 0;
000036 4a2b LDR r2,|L7.228|
000038 3a2c SUBS r2,r2,#0x2c
00003a 7011 STRB r1,[r2,#0] ; SC_A2R
;;;82 SC_A2R.T0 = 0;
00003c 7051 STRB r1,[r2,#1] ; SC_A2R
;;;83 for (i = 0; i < SETUP_LENGTH; i++)
00003e 2000 MOVS r0,#0
|L7.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 |L7.64|
;;;86 }
;;;87 for (i = 0; i < HIST_LENGTH; i++)
00004a 2000 MOVS r0,#0
|L7.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 |L7.76|
;;;90 }
;;;91 SC_A2R.Tlength = 0;
000056 f802f802 STRB r1,[r2,#0x2a]! ; SC_A2R
;;;92 SC_A2R.Hlength = 0;
00005a 7051 STRB r1,[r2,#1] ; SC_A2R
;;;93
;;;94 /* Next State --------------------------------------------------------*/
;;;95 *SCState = SC_RESET_LOW;
00005c 2001 MOVS r0,#1
00005e e01c B |L7.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 |L7.134|
000066 2180 MOVS r1,#0x80
000068 4638 MOV r0,r7
00006a f7fff7ff 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,|L7.220|
000070 e004 B |L7.124|
|L7.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,|L7.228|
000076 4628 MOV r0,r5
000078 f7fff7ff BL SC_AnswerReq
|L7.124|
00007c 7828 LDRB r0,[r5,#0] ;105
00007e 2805 CMP r0,#5 ;105
000080 d001 BEQ |L7.134|
000082 2803 CMP r0,#3 ;105
000084 d1f5 BNE |L7.114|
|L7.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 e8bde8bd POP {r4-r8,pc}
00008a 7840 LDRB r0,[r0,#1] ;118
00008c 2800 CMP r0,#0 ;118
00008e d1fa BNE |L7.134|
000090 4814 LDR r0,|L7.228|
000092 f7fff7ff BL SC_decode_Answer2reset
000096 bb08 CBNZ r0,|L7.220|
000098 2004 MOVS r0,#4 ;122
|L7.154|
00009a 7028 STRB r0,[r5,#0] ;95
00009c e7f3 B |L7.134|
00009e e8bde8bd POP {r4-r8,lr} ;132
0000a2 f7fff7ff B.W SC_SendData
0000a6 2001 MOVS r0,#1 ;132
0000a8 f7fff7ff BL SC_PowerCmd
0000ac 480e LDR r0,|L7.232|
0000ae f7fff7ff BL USART_DeInit
0000b2 4c0e LDR r4,|L7.236|
0000b4 4620 MOV r0,r4 ;132
0000b6 f7fff7ff BL GPIO_DeInit
0000ba 4620 MOV r0,r4 ;132
0000bc f7fff7ff BL GPIO_DeInit
0000c0 4638 MOV r0,r7 ;132
0000c2 f7fff7ff BL GPIO_DeInit
0000c6 2100 MOVS r1,#0 ;132
0000c8 2018 MOVS r0,#0x18 ;132
0000ca f7fff7ff BL RCC_APB2PeriphClockCmd
0000ce e8bde8bd POP {r4-r8,lr} ;132
0000d2 2100 MOVS r1,#0 ;132
0000d4 f44ff44f MOV r0,#0x40000 ;132
0000d8 f7fff7ff B.W RCC_APB1PeriphClockCmd
|L7.220|
0000dc 702e STRB r6,[r5,#0] ;139
0000de e7d2 B |L7.134|
;;;142
ENDP
|L7.224|
0000e0 40011000 DCD 0x40011000
|L7.228|
0000e4 0000002c DCD ||.bss||+0x2c
|L7.232|
0000e8 40004800 DCD 0x40004800
|L7.236|
0000ec 40010c00 DCD 0x40010c00
AREA ||i.SC_ParityErrorHandler||, CODE, READONLY, ALIGN=2
SC_ParityErrorHandler PROC
;;;187 void SC_ParityErrorHandler(void)
;;;188 {
000000 b510 PUSH {r4,lr}
;;;189 USART_SendData(USART3, SCData);
000002 4806 LDR r0,|L8.28|
000004 7801 LDRB r1,[r0,#0] ; SCData
000006 4c06 LDR r4,|L8.32|
000008 4620 MOV r0,r4
00000a f7fff7ff BL USART_SendData
|L8.14|
;;;190 while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
00000e 2140 MOVS r1,#0x40
000010 4620 MOV r0,r4
000012 f7fff7ff BL USART_GetFlagStatus
000016 2800 CMP r0,#0
000018 d0f9 BEQ |L8.14|
;;;191 {
;;;192 }
;;;193 }
00001a bd10 POP {r4,pc}
;;;194
ENDP
|L8.28|
00001c 00000000 DCD ||.data||
|L8.32|
000020 40004800 DCD 0x40004800
AREA ||i.SC_PTSConfig||, CODE, READONLY, ALIGN=2
SC_PTSConfig PROC
;;;202 void SC_PTSConfig(void)
;;;203 {
000000 e92de92d PUSH {r4-r9,lr}
000004 b08d SUB sp,sp,#0x34
;;;204 RCC_ClocksTypeDef RCC_ClocksStatus;
;;;205 u32 workingbaudrate = 0, apbclock = 0;
;;;206 u8 locData = 0, PTSConfirmStatus = 1;
000006 2600 MOVS r6,#0
000008 2401 MOVS r4,#1
;;;207 USART_InitTypeDef USART_InitStructure;
;;;208 USART_ClockInitTypeDef USART_ClockInitStructure;
;;;209
;;;210 /* Reconfigure the USART Baud Rate -------------------------------------------*/
;;;211 RCC_GetClocksFreq(&RCC_ClocksStatus);
00000a a808 ADD r0,sp,#0x20
00000c 9607 STR r6,[sp,#0x1c]
00000e f7fff7ff BL RCC_GetClocksFreq
;;;212 apbclock = RCC_ClocksStatus.PCLK1_Frequency;
000012 4961 LDR r1,|L9.408|
;;;213 apbclock /= ((USART3->GTPR & (u16)0x00FF) * 2);
000014 980a LDR r0,[sp,#0x28]
000016 8809 LDRH r1,[r1,#0]
;;;214
;;;215 /* Enable the DMA Receive (Set DMAR bit only) to enable interrupt generation
;;;216 in case of a framing error FE */
;;;217 USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
000018 f8dff8df LDR r9,|L9.408|
00001c 0609 LSLS r1,r1,#24 ;213
00001e 0dc9 LSRS r1,r1,#23 ;213
000020 fbb0fbb0 UDIV r5,r0,r1 ;213
000024 f1a9f1a9 SUB r9,r9,#0x18
000028 2201 MOVS r2,#1
00002a 2140 MOVS r1,#0x40
00002c 4648 MOV r0,r9
00002e f7fff7ff BL USART_DMACmd
;;;218
;;;219 if((SC_A2R.T0 & (u8)0x10) == 0x10)
000032 4f5a LDR r7,|L9.412|
000034 7878 LDRB r0,[r7,#1] ; SC_A2R
000036 06c0 LSLS r0,r0,#27
000038 d57e BPL |L9.312|
;;;220 {
;;;221 if(SC_A2R.T[0] != 0x11)
00003a 78b8 LDRB r0,[r7,#2] ; SC_A2R
00003c 2811 CMP r0,#0x11
00003e d07b BEQ |L9.312|
;;;222 {
;;;223 /* Send PTSS */
;;;224 SCData = 0xFF;
000040 f8dff8df LDR r8,|L9.416|
000044 20ff MOVS r0,#0xff
000046 f888f888 STRB r0,[r8,#0] ; SCData
;;;225 USART_SendData(USART3, SCData);
00004a f898f898 LDRB r1,[r8,#0] ; SCData
00004e 4648 MOV r0,r9
000050 f7fff7ff BL USART_SendData
|L9.84|
;;;226 while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
000054 2140 MOVS r1,#0x40
000056 4648 MOV r0,r9
000058 f7fff7ff BL USART_GetFlagStatus
00005c 2800 CMP r0,#0
00005e d0f9 BEQ |L9.84|
;;;227 {
;;;228 }
;;;229
;;;230 /* Send PTS0 */
;;;231 SCData = 0x10;
000060 2010 MOVS r0,#0x10
000062 f888f888 STRB r0,[r8,#0] ; SCData
;;;232 USART_SendData(USART3, SCData);
000066 f898f898 LDRB r1,[r8,#0] ; SCData
00006a 4648 MOV r0,r9
00006c f7fff7ff BL USART_SendData
|L9.112|
;;;233 while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
000070 2140 MOVS r1,#0x40
000072 4648 MOV r0,r9
000074 f7fff7ff BL USART_GetFlagStatus
000078 2800 CMP r0,#0
00007a d0f9 BEQ |L9.112|
;;;234 {
;;;235 }
;;;236
;;;237 /* Send PTS1 */
;;;238 SCData = SC_A2R.T[0];
00007c 78b8 LDRB r0,[r7,#2] ; SC_A2R
00007e f888f888 STRB r0,[r8,#0] ; SCData
;;;239 USART_SendData(USART3, SCData);
000082 f898f898 LDRB r1,[r8,#0] ; SCData
000086 4648 MOV r0,r9
000088 f7fff7ff BL USART_SendData
|L9.140|
;;;240 while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET)
00008c 2140 MOVS r1,#0x40
00008e 4648 MOV r0,r9
000090 f7fff7ff BL USART_GetFlagStatus
000094 2800 CMP r0,#0
000096 d0f9 BEQ |L9.140|
;;;241 {
;;;242 }
;;;243
;;;244 /* Send PCK */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -