📄 sdcard.txt
字号:
;;;218 SDIO_SendCommand(&SDIO_CmdInitStructure);
000040 e9c7b003 STRD r11,r0,[r7,#0xc]
000044 4638 MOV r0,r7
000046 f7fffffe BL SDIO_SendCommand
00004a f2427a10 MOV r10,#0x2710
00004e f04f092a MOV r9,#0x2a
000052 46d0 MOV r8,r10
000054 e003 B |L4.94|
000056 bf00 NOP
|L4.88|
000058 f1b80801 SUBS r8,r8,#1
00005c d007 BEQ |L4.110|
|L4.94|
00005e 2080 MOVS r0,#0x80
000060 f7fffffe BL SDIO_GetFlagStatus
000064 2800 CMP r0,#0
000066 d0f7 BEQ |L4.88|
000068 f1b80f00 CMP r8,#0
00006c d101 BNE |L4.114|
|L4.110|
00006e 2003 MOVS r0,#3
000070 e004 B |L4.124|
|L4.114|
000072 f24050ff MOV r0,#0x5ff
000076 f7fffffe BL SDIO_ClearFlag
00007a 4648 MOV r0,r9
|L4.124|
;;;219
;;;220 errorstatus = CmdError();
;;;221
;;;222 if (errorstatus != SD_OK)
00007c 282a CMP r0,#0x2a
00007e d178 BNE |L4.370|
;;;223 {
;;;224 /* CMD Response TimeOut (wait for CMDSENT flag) */
;;;225 return(errorstatus);
;;;226 }
;;;227
;;;228 /* CMD8: SEND_IF_COND --------------------------------------------------------*/
;;;229 /* Send CMD8 to verify SD card interface operating condition */
;;;230 /* Argument: - [31:12]: Reserved (shall be set to '0')
;;;231 - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
;;;232 - [7:0]: Check Pattern (recommended 0xAA) */
;;;233 /* CMD Response: R7 */
;;;234 SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
000080 f44f70d5 MOV r0,#0x1aa
;;;235 SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;
000084 6038 STR r0,[r7,#0] ; SDIO_CmdInitStructure
;;;236 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
;;;237 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
;;;238 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
000086 f44f6980 MOV r9,#0x400
;;;239 SDIO_SendCommand(&SDIO_CmdInitStructure);
00008a e9c7b903 STRD r11,r9,[r7,#0xc]
00008e 2008 MOVS r0,#8 ;235
000090 f04f0840 MOV r8,#0x40 ;236
000094 e9c70801 STRD r0,r8,[r7,#4]
000098 4847 LDR r0,|L4.440|
00009a 3018 ADDS r0,r0,#0x18
00009c f7fffffe BL SDIO_SendCommand
0000a0 4650 MOV r0,r10
0000a2 222a MOVS r2,#0x2a
0000a4 f8dfa114 LDR r10,|L4.444|
0000a8 e000 B |L4.172|
|L4.170|
0000aa 1e40 SUBS r0,r0,#1
|L4.172|
0000ac f8da1034 LDR r1,[r10,#0x34]
0000b0 f0110f45 TST r1,#0x45
0000b4 d102 BNE |L4.188|
0000b6 2800 CMP r0,#0
0000b8 d1f7 BNE |L4.170|
0000ba e002 B |L4.194|
|L4.188|
0000bc b108 CBZ r0,|L4.194|
0000be 0748 LSLS r0,r1,#29
0000c0 d506 BPL |L4.208|
|L4.194|
0000c2 2203 MOVS r2,#3
0000c4 2004 MOVS r0,#4
0000c6 9200 STR r2,[sp,#0]
0000c8 f7fffffe BL SDIO_ClearFlag
0000cc 9a00 LDR r2,[sp,#0]
0000ce e002 B |L4.214|
|L4.208|
0000d0 0648 LSLS r0,r1,#25
0000d2 d500 BPL |L4.214|
0000d4 222a MOVS r2,#0x2a
|L4.214|
;;;240
;;;241 errorstatus = CmdResp7Error();
;;;242
;;;243 if (errorstatus == SD_OK)
0000d6 2a2a CMP r2,#0x2a
0000d8 d101 BNE |L4.222|
;;;244 {
;;;245 SDType = SD_HIGH_CAPACITY; /* SD Card 2.0 */
0000da 0755 LSLS r5,r2,#29
0000dc e00d B |L4.250|
|L4.222|
;;;246 }
;;;247 else
;;;248 {
;;;249 /* CMD55 */
;;;250 SDIO_CmdInitStructure.SDIO_Argument = 0x00;
;;;251 SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
0000de 2037 MOVS r0,#0x37
;;;252 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
;;;253 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
0000e0 e9c7b000 STRD r11,r0,[r7,#0]
;;;254 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
;;;255 SDIO_SendCommand(&SDIO_CmdInitStructure);
0000e4 e9c7b903 STRD r11,r9,[r7,#0xc]
0000e8 4833 LDR r0,|L4.440|
0000ea f8c78008 STR r8,[r7,#8] ; SDIO_CmdInitStructure
0000ee 3018 ADDS r0,r0,#0x18
0000f0 f7fffffe BL SDIO_SendCommand
;;;256 errorstatus = CmdResp1Error(SDIO_APP_CMD);
0000f4 2037 MOVS r0,#0x37
0000f6 f7fffffe BL CmdResp1Error
|L4.250|
;;;257 }
;;;258 /* CMD55 */
;;;259 SDIO_CmdInitStructure.SDIO_Argument = 0x00;
0000fa 2000 MOVS r0,#0
;;;260 SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
0000fc 2137 MOVS r1,#0x37
;;;261 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
;;;262 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
0000fe e8870103 STM r7,{r0,r1,r8}
;;;263 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
;;;264 SDIO_SendCommand(&SDIO_CmdInitStructure);
000102 e9c70903 STRD r0,r9,[r7,#0xc]
000106 482c LDR r0,|L4.440|
000108 3018 ADDS r0,r0,#0x18
00010a f7fffffe BL SDIO_SendCommand
;;;265 errorstatus = CmdResp1Error(SDIO_APP_CMD);
00010e 2037 MOVS r0,#0x37
000110 f7fffffe BL CmdResp1Error
000114 4683 MOV r11,r0
;;;266
;;;267 /* If errorstatus is Command TimeOut, it is a MMC card */
;;;268 /* If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
;;;269 or SD card 1.x */
;;;270 if (errorstatus == SD_OK)
000116 282a CMP r0,#0x2a
000118 d14c BNE |L4.436|
00011a e037 B |L4.396|
|L4.284|
;;;271 {
;;;272 /* SD CARD */
;;;273 /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
;;;274 while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
;;;275 {
;;;276
;;;277 /* SEND CMD55 APP_CMD with RCA as 0 */
;;;278 SDIO_CmdInitStructure.SDIO_Argument = 0x00;
00011c 2600 MOVS r6,#0
;;;279 SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
00011e 2037 MOVS r0,#0x37
;;;280 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
;;;281 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
000120 e9c76000 STRD r6,r0,[r7,#0]
;;;282 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
;;;283 SDIO_SendCommand(&SDIO_CmdInitStructure);
000124 e9c76903 STRD r6,r9,[r7,#0xc]
000128 4823 LDR r0,|L4.440|
00012a f8c78008 STR r8,[r7,#8] ; SDIO_CmdInitStructure
00012e 3018 ADDS r0,r0,#0x18
000130 f7fffffe BL SDIO_SendCommand
;;;284
;;;285 errorstatus = CmdResp1Error(SDIO_APP_CMD);
000134 2037 MOVS r0,#0x37
000136 f7fffffe BL CmdResp1Error
;;;286
;;;287 if (errorstatus != SD_OK)
00013a 282a CMP r0,#0x2a
00013c d130 BNE |L4.416|
;;;288 {
;;;289 return(errorstatus);
;;;290 }
;;;291 SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
00013e 4820 LDR r0,|L4.448|
000140 4328 ORRS r0,r0,r5
;;;292 SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_OP_COND;
000142 6038 STR r0,[r7,#0] ; SDIO_CmdInitStructure
;;;293 SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
;;;294 SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
;;;295 SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
;;;296 SDIO_SendCommand(&SDIO_CmdInitStructure);
000144 e9c76903 STRD r6,r9,[r7,#0xc]
000148 2029 MOVS r0,#0x29 ;292
00014a e9c70801 STRD r0,r8,[r7,#4]
00014e 481a LDR r0,|L4.440|
000150 3018 ADDS r0,r0,#0x18
000152 f7fffffe BL SDIO_SendCommand
000156 f04f0b2a MOV r11,#0x2a
00015a bf00 NOP
|L4.348|
00015c f8da0034 LDR r0,[r10,#0x34]
000160 f0100f45 TST r0,#0x45
000164 d0fa BEQ |L4.348|
000166 0740 LSLS r0,r0,#29
000168 d504 BPL |L4.372|
00016a f04f0b03 MOV r11,#3
00016e 2004 MOVS r0,#4
000170 e002 B |L4.376|
|L4.370|
000172 e015 B |L4.416|
|L4.372|
000174 f24050ff MOV r0,#0x5ff
|L4.376|
000178 f7fffffe BL SDIO_ClearFlag
;;;297
;;;298 errorstatus = CmdResp3Error();
;;;299 if (errorstatus != SD_OK)
00017c f1bb0f2a CMP r11,#0x2a
000180 d118 BNE |L4.436|
;;;300 {
;;;301 return(errorstatus);
;;;302 }
;;;303
;;;304 response = SDIO_GetResponse(SDIO_RESP1);
000182 2000 MOVS r0,#0
000184 f7fffffe BL SDIO_GetResponse
;;;305 validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0);
000188 0fc6 LSRS r6,r0,#31
;;;306 count++;
00018a 1c64 ADDS r4,r4,#1
|L4.396|
00018c b91e CBNZ r6,|L4.406|
00018e f64f70ff MOV r0,#0xffff ;274
000192 4284 CMP r4,r0 ;274
000194 d3c2 BCC |L4.284|
|L4.406|
;;;307 }
;;;308 if (count >= SD_MAX_VOLT_TRIAL)
000196 f64f70ff MOV r0,#0xffff
00019a 4284 CMP r4,r0
00019c d302 BCC |L4.420|
;;;309 {
;;;310 errorstatus = SD_INVALID_VOLTRANGE;
00019e 201b MOVS r0,#0x1b
|L4.416|
;;;311 return(errorstatus);
;;;312 }
;;;313
;;;314 if (SDType == SD_HIGH_CAPACITY)
;;;315 {
;;;316 CardType = SDIO_HIGH_CAPACITY_SD_CARD;
;;;317 }
;;;318 else
;;;319 {
;;;320 CardType = SDIO_SECURE_DIGITAL_CARD;
;;;321 }
;;;322 }/* else MMC Card */
;;;323
;;;324 return(errorstatus);
;;;325 }
0001a0 e8bd8ff8 POP {r3-r11,pc}
|L4.420|
0001a4 4807 LDR r0,|L4.452|
0001a6 f1b54f80 CMP r5,#0x40000000 ;314
0001aa d101 BNE |L4.432|
0001ac 2105 MOVS r1,#5 ;316
0001ae e000 B |L4.434|
|L4.432|
0001b0 2101 MOVS r1,#1 ;320
|L4.434|
0001b2 6041 STR r1,[r0,#4] ;316 ; CardType
|L4.436|
0001b4 4658 MOV r0,r11 ;324
0001b6 e7f3 B |L4.416|
;;;326
ENDP
|L4.440|
0001b8 00000020 DCD ||.bss||+0x20
|L4.444|
0001bc 40018000 DCD 0x40018000
|L4.448|
0001c0 80100000 DCD 0x80100000
|L4.452|
0001c4 00000000 DCD ||.data||
AREA ||i.SD_Init||, CODE, READONLY, ALIGN=2
SD_Init PROC
;;;136 SD_Error SD_Init(void)
;;;137 {
000000 b538 PUSH {r3-r5,lr}
000002 2101 MOVS r1,#1
000004 2030 MOVS r0,#0x30
000006 f7fffffe BL RCC_APB2PeriphClockCmd
00000a f44f50f8 MOV r0,#0x1f00
00000e f8ad0000 STRH r0,[sp,#0]
000012 2003 MOVS r0,#3
000014 f88d0002 STRB r0,[sp,#2]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -