📄 smartcard.txt
字号:
;;;647 /* USART3 configuration ------------------------------------------------------*/
;;;648 /* USART3 configured as follow:
;;;649 - Word Length = 9 Bits
;;;650 - 0.5 Stop Bit
;;;651 - Even parity
;;;652 - BaudRate = 12096 baud
;;;653 - Hardware flow control disabled (RTS and CTS signals)
;;;654 - Tx and Rx enabled
;;;655 - USART Clock enabled
;;;656 */
;;;657
;;;658 /* USART Clock set to 3.6 MHz (PCLK1 (36 MHZ) / 10) */
;;;659 USART_SetPrescaler(USART3, 0x05);
00007a 4f23 LDR r7,|L6.264|
00007c 2105 MOVS r1,#5
00007e 4638 MOV r0,r7
000080 f7fff7ff BL USART_SetPrescaler
;;;660
;;;661 /* USART Guard Time set to 16 Bit */
;;;662 USART_SetGuardTime(USART3, 16);
000084 2110 MOVS r1,#0x10
000086 4638 MOV r0,r7
000088 f7fff7ff BL USART_SetGuardTime
;;;663
;;;664 USART_StructInit(&USART_InitStructure);
00008c a801 ADD r0,sp,#4
00008e f7fff7ff BL USART_StructInit
;;;665 USART_InitStructure.USART_BaudRate = 9677;
000092 f242f242 MOV r0,#0x25cd
;;;666 USART_InitStructure.USART_WordLength = USART_WordLength_9b;
000096 9001 STR r0,[sp,#4]
000098 f8adf8ad STRH r6,[sp,#8]
;;;667 USART_InitStructure.USART_StopBits = USART_StopBits_1_5;
00009c f44ff44f MOV r0,#0x3000
0000a0 f8adf8ad STRH r0,[sp,#0xa]
;;;668 USART_InitStructure.USART_Parity = USART_Parity_Even;
0000a4 f8adf8ad STRH r5,[sp,#0xc]
;;;669 USART_InitStructure.USART_Clock = USART_Clock_Enable;
0000a8 f8adf8ad STRH r4,[sp,#0x12]
;;;670
;;;671 USART_Init(USART3, &USART_InitStructure);
0000ac a901 ADD r1,sp,#4
0000ae 4638 MOV r0,r7
0000b0 f7fff7ff BL USART_Init
;;;672
;;;673 /* Enable the USART3 Parity Error Interrupt */
;;;674 USART_ITConfig(USART3, USART_IT_PE, ENABLE);
0000b4 2201 MOVS r2,#1
0000b6 2128 MOVS r1,#0x28
0000b8 4638 MOV r0,r7
0000ba f7fff7ff BL USART_ITConfig
;;;675
;;;676 /* Enable the USART3 Framing Error Interrupt */
;;;677 USART_ITConfig(USART3, USART_IT_ERR, ENABLE);
0000be 2201 MOVS r2,#1
0000c0 2160 MOVS r1,#0x60
0000c2 4638 MOV r0,r7
0000c4 f7fff7ff BL USART_ITConfig
;;;678
;;;679 /* Enable USART3 */
;;;680 USART_Cmd(USART3, ENABLE);
0000c8 2101 MOVS r1,#1
0000ca 4638 MOV r0,r7
0000cc f7fff7ff BL USART_Cmd
;;;681
;;;682 /* Enable the NACK Transmission */
;;;683 USART_SmartCardNACKCmd(USART3, ENABLE);
0000d0 2101 MOVS r1,#1
0000d2 4638 MOV r0,r7
0000d4 f7fff7ff BL USART_SmartCardNACKCmd
;;;684
;;;685 /* Enable the Smartcard Interface */
;;;686 USART_SmartCardCmd(USART3, ENABLE);
0000d8 2101 MOVS r1,#1
0000da 4638 MOV r0,r7
0000dc f7fff7ff BL USART_SmartCardCmd
;;;687
;;;688 /* Set RSTIN HIGH */
;;;689 SC_Reset(Bit_SET);
0000e0 2001 MOVS r0,#1
0000e2 f7fff7ff BL SC_Reset
0000e6 4621 MOV r1,r4
0000e8 4640 MOV r0,r8
0000ea f7fff7ff BL GPIO_SetBits
;;;690
;;;691 /* Select 5V */
;;;692 SC_VoltageConfig(SC_Voltage_5V);
;;;693
;;;694 /* Disable CMDVCC */
;;;695 SC_PowerCmd(DISABLE);
0000ee 2000 MOVS r0,#0
0000f0 f7fff7ff BL SC_PowerCmd
;;;696 }
0000f4 b008 ADD sp,sp,#0x20
0000f6 e8bde8bd POP {r4-r8,pc}
ENDP
0000fa 0000 DCW 0x0000
|L6.252|
0000fc 40010c00 DCD 0x40010c00
|L6.256|
000100 40011400 DCD 0x40011400
|L6.260|
000104 40011800 DCD 0x40011800
|L6.264|
000108 40004800 DCD 0x40004800
AREA ||i.SC_Handler||, CODE, READONLY, ALIGN=2
SC_Handler PROC
;;;62 void SC_Handler(SC_State *SCState, SC_ADPU_Commands *SC_ADPU, SC_ADPU_Responce *SC_Response)
;;;63 {
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
;;;64 u32 i = 0;
;;;65
;;;66 switch(*SCState)
000004 782b LDRB r3,[r5,#0]
000006 4608 MOV r0,r1
000008 2400 MOVS r4,#0
00000a 2605 MOVS r6,#5
00000c 4611 MOV r1,r2
00000e 2b06 CMP r3,#6
000010 d25e BCS |L7.208|
000012 e8dfe8df TBB [pc,r3]
000016 03235d38 DCB 0x03,0x23,0x5d,0x38
00001a 4246 DCB 0x42,0x46
;;;67 {
;;;68 case SC_POWER_ON:
;;;69 if (SC_ADPU->Header.INS == SC_GET_A2R)
00001c 7840 LDRB r0,[r0,#1]
00001e 2800 CMP r0,#0
000020 d130 BNE |L7.132|
;;;70 {
;;;71 /* Smartcard intialization ------------------------------------------*/
;;;72 SC_Init();
000022 f7fff7ff BL SC_Init
000026 482b LDR r0,|L7.212|
000028 2200 MOVS r2,#0
|L7.42|
;;;73
;;;74 /* Reset Data from SC buffer -----------------------------------------*/
;;;75 for (i = 0; i < 40; i++)
;;;76 {
;;;77 SC_ATR_Table[i] = 0;
00002a 5502 STRB r2,[r0,r4]
00002c 1c64 ADDS r4,r4,#1
00002e 2c28 CMP r4,#0x28
000030 d3fb BCC |L7.42|
;;;78 }
;;;79
;;;80 /* Reset SC_A2R Structure --------------------------------------------*/
;;;81 SC_A2R.TS = 0;
000032 4928 LDR r1,|L7.212|
000034 392c SUBS r1,r1,#0x2c
000036 700a STRB r2,[r1,#0] ; SC_A2R
;;;82 SC_A2R.T0 = 0;
000038 704a STRB r2,[r1,#1] ; SC_A2R
;;;83 for (i = 0; i < SETUP_LENGTH; i++)
00003a 2000 MOVS r0,#0
|L7.60|
;;;84 {
;;;85 SC_A2R.T[i] = 0;
00003c 180b ADDS r3,r1,r0
00003e 1c40 ADDS r0,r0,#1
000040 709a STRB r2,[r3,#2]
000042 2814 CMP r0,#0x14
000044 d3fa BCC |L7.60|
;;;86 }
;;;87 for (i = 0; i < HIST_LENGTH; i++)
000046 2000 MOVS r0,#0
|L7.72|
;;;88 {
;;;89 SC_A2R.H[i] = 0;
000048 180b ADDS r3,r1,r0
00004a 1c40 ADDS r0,r0,#1
00004c 759a STRB r2,[r3,#0x16]
00004e 2814 CMP r0,#0x14
000050 d3fa BCC |L7.72|
;;;90 }
;;;91 SC_A2R.Tlength = 0;
000052 f801f801 STRB r2,[r1,#0x2a]! ; SC_A2R
;;;92 SC_A2R.Hlength = 0;
000056 704a STRB r2,[r1,#1] ; SC_A2R
;;;93
;;;94 /* Next State --------------------------------------------------------*/
;;;95 *SCState = SC_RESET_LOW;
000058 2001 MOVS r0,#1
00005a e01c B |L7.150|
;;;96 }
;;;97 break;
;;;98
;;;99 case SC_RESET_LOW:
;;;100 if(SC_ADPU->Header.INS == SC_GET_A2R)
00005c 7840 LDRB r0,[r0,#1]
00005e 2800 CMP r0,#0
000060 d110 BNE |L7.132|
000062 f44ff44f MOV r1,#0x4000
000066 481c LDR r0,|L7.216|
000068 f7fff7ff BL GPIO_ReadInputDataBit
;;;101 {
;;;102 /* If card is detected then Power ON, Card Reset and wait for an answer) */
;;;103 if (SC_Detect())
00006c b380 CBZ r0,|L7.208|
00006e e004 B |L7.122|
|L7.112|
;;;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 */
000070 2228 MOVS r2,#0x28
000072 4918 LDR r1,|L7.212|
000074 4628 MOV r0,r5
000076 f7fff7ff BL SC_AnswerReq
|L7.122|
00007a 7828 LDRB r0,[r5,#0]
00007c 2805 CMP r0,#5
00007e d001 BEQ |L7.132|
000080 2803 CMP r0,#3
000082 d1f5 BNE |L7.112|
|L7.132|
;;;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 }
000084 bd70 POP {r4-r6,pc}
000086 7840 LDRB r0,[r0,#1]
000088 2800 CMP r0,#0
00008a d1fb BNE |L7.132|
00008c 4811 LDR r0,|L7.212|
00008e f7fff7ff BL SC_decode_Answer2reset
000092 b9e8 CBNZ r0,|L7.208|
000094 2004 MOVS r0,#4
|L7.150|
000096 7028 STRB r0,[r5,#0]
000098 bd70 POP {r4-r6,pc}
00009a e8bde8bd POP {r4-r6,lr}
00009e f7fff7ff B.W SC_SendData
0000a2 2001 MOVS r0,#1
0000a4 f7fff7ff BL SC_PowerCmd
0000a8 480c LDR r0,|L7.220|
0000aa f7fff7ff BL USART_DeInit
0000ae 480c LDR r0,|L7.224|
0000b0 f7fff7ff BL GPIO_DeInit
0000b4 480b LDR r0,|L7.228|
0000b6 f7fff7ff BL GPIO_DeInit
0000ba 2100 MOVS r1,#0
0000bc 2028 MOVS r0,#0x28
0000be f7fff7ff BL RCC_APB2PeriphClockCmd
0000c2 e8bde8bd POP {r4-r6,lr}
0000c6 2100 MOVS r1,#0
0000c8 f44ff44f MOV r0,#0x40000
0000cc f7fff7ff B.W RCC_APB1PeriphClockCmd
|L7.208|
0000d0 702e STRB r6,[r5,#0]
0000d2 bd70 POP {r4-r6,pc}
ENDP
|L7.212|
0000d4 0000002c DCD ||.bss||+0x2c
|L7.216|
0000d8 40011800 DCD 0x40011800
|L7.220|
0000dc 40004800 DCD 0x40004800
|L7.224|
0000e0 40010c00 DCD 0x40010c00
|L7.228|
0000e4 40011400 DCD 0x40011400
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}
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-r8,lr}
000004 b08c SUB sp,sp,#0x30
;;;204 RCC_ClocksTypeDef RCC_ClocksStatus;
;;;205 u32 workingbaudrate = 0, apbclock = 0;
;;;206 u8 locData = 0, PTSConfirmStatus = 1;
000006 2000 MOVS r0,#0
;;;207 USART_InitTypeDef USART_InitStructure;
;;;208
;;;209 /* Reconfigure the USART Baud Rate -------------------------------------------*/
;;;210 RCC_GetClocksFreq(&RCC_ClocksStatus);
000008 9006 STR r0,[sp,#0x18]
00000a 2401 MOVS r4,#1
00000c a807 ADD r0,sp,#0x1c
00000e f7fff7ff BL RCC_GetClocksFreq
;;;211 apbclock = RCC_ClocksStatus.PCLK1_Frequency;
000012 4959 LDR r1,|L9.376|
;;;212 apbclock /= ((USART3->GTPR & (u16)0x00FF) * 2);
000014 9809 LDR r0,[sp,#0x24]
000016 8809 LDRH r1,[r1,#0]
;;;213
;;;214 /* Enable the DMA Receive (Set DMAR bit only) to enable interrupt generation
;;;215 in case of a framing error FE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -