📄 msd.txt
字号:
000020 eb090106 ADD r1,r9,r6
000024 22ff MOVS r2,#0xff
000026 2011 MOVS r0,#0x11
000028 f7fffffe BL MSD_SendCmd
;;;278 /* Check if the MSD acknowledged the read block command: R1 response (0x00: no errors) */
;;;279 if (MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
00002c 2000 MOVS r0,#0
00002e f7fffffe BL MSD_GetResponse
000032 b110 CBZ r0,|L11.58|
;;;280 {
;;;281 return MSD_RESPONSE_FAILURE;
000034 20ff MOVS r0,#0xff
|L11.54|
;;;282 }
;;;283 /* Now look for the data token to signify the start of the data */
;;;284 if (!MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ))
;;;285 {
;;;286 /* Read the MSD block data : read NumByteToRead data */
;;;287 for (i = 0; i < BLOCK_SIZE; i++)
;;;288 {
;;;289 /* Read the pointed data */
;;;290 *pBuffer = MSD_ReadByte();
;;;291 /* Point to the next location where the byte read will be saved */
;;;292 pBuffer++;
;;;293 }
;;;294 /* Set next read address*/
;;;295 Offset += 512;
;;;296 /* get CRC bytes (not really needed by us, but required by MSD) */
;;;297 MSD_ReadByte();
;;;298 MSD_ReadByte();
;;;299 /* Set response value to success */
;;;300 rvalue = MSD_RESPONSE_NO_ERROR;
;;;301 }
;;;302 else
;;;303 {
;;;304 /* Set response value to failure */
;;;305 rvalue = MSD_RESPONSE_FAILURE;
;;;306 }
;;;307 }
;;;308
;;;309 /* MSD chip select high */
;;;310 MSD_CS_HIGH();
;;;311 /* Send dummy byte: 8 Clock pulses of delay */
;;;312 MSD_WriteByte(DUMMY);
;;;313 /* Returns the reponse */
;;;314 return rvalue;
;;;315 }
000036 e8bd87f0 POP {r4-r10,pc}
|L11.58|
00003a 20fe MOVS r0,#0xfe ;284
00003c f7fffffe BL MSD_GetResponse
000040 b978 CBNZ r0,|L11.98|
000042 2400 MOVS r4,#0 ;287
|L11.68|
000044 f7fffffe BL MSD_ReadByte
000048 1c64 ADDS r4,r4,#1 ;287
00004a f8050b01 STRB r0,[r5],#1 ;290
00004e 4544 CMP r4,r8 ;287
000050 d3f8 BCC |L11.68|
000052 f5067600 ADD r6,r6,#0x200 ;295
000056 f7fffffe BL MSD_ReadByte
00005a f7fffffe BL MSD_ReadByte
00005e 2400 MOVS r4,#0 ;300
000060 e000 B |L11.100|
|L11.98|
000062 24ff MOVS r4,#0xff ;305
|L11.100|
000064 1e7f SUBS r7,r7,#1 ;274
000066 d2db BCS |L11.32|
000068 2108 MOVS r1,#8 ;310
00006a 4650 MOV r0,r10 ;310
00006c f7fffffe BL GPIO_SetBits
000070 20ff MOVS r0,#0xff ;312
000072 f7fffffe BL MSD_WriteByte
000076 4620 MOV r0,r4 ;314
000078 e7dd B |L11.54|
;;;316
ENDP
00007a 0000 DCW 0x0000
|L11.124|
00007c 40011800 DCD 0x40011800
AREA ||i.MSD_GetCSDRegister||, CODE, READONLY, ALIGN=2
MSD_GetCSDRegister PROC
;;;327 u8 MSD_GetCSDRegister(sMSD_CSD* MSD_csd)
;;;328 {
000000 e92d41ff PUSH {r0-r8,lr}
;;;329 u32 i = 0;
;;;330 u8 rvalue = MSD_RESPONSE_FAILURE;
;;;331 u8 CSD_Tab[16];
;;;332
;;;333 /* MSD chip select low */
;;;334 MSD_CS_LOW();
000004 4f65 LDR r7,|L12.412|
000006 4604 MOV r4,r0 ;328
000008 2500 MOVS r5,#0 ;329
00000a 26ff MOVS r6,#0xff ;330
00000c 2108 MOVS r1,#8
00000e 4638 MOV r0,r7
000010 f7fffffe BL GPIO_ResetBits
;;;335 /* Send CMD9 (CSD register) or CMD10(CSD register) */
;;;336 MSD_SendCmd(MSD_SEND_CSD, 0, 0xFF);
000014 22ff MOVS r2,#0xff
000016 2100 MOVS r1,#0
000018 2009 MOVS r0,#9
00001a f7fffffe BL MSD_SendCmd
;;;337
;;;338 /* Wait for response in the R1 format (0x00 is no errors) */
;;;339 if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
00001e 2000 MOVS r0,#0
000020 f7fffffe BL MSD_GetResponse
000024 b988 CBNZ r0,|L12.74|
;;;340 {
;;;341 if (!MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ))
000026 20fe MOVS r0,#0xfe
000028 f7fffffe BL MSD_GetResponse
00002c b930 CBNZ r0,|L12.60|
00002e 466e MOV r6,sp
|L12.48|
;;;342 {
;;;343 for (i = 0; i < 16; i++)
;;;344 {
;;;345 /* Store CSD register value on CSD_Tab */
;;;346 CSD_Tab[i] = MSD_ReadByte();
000030 f7fffffe BL MSD_ReadByte
000034 5570 STRB r0,[r6,r5]
000036 1c6d ADDS r5,r5,#1 ;343
000038 2d10 CMP r5,#0x10 ;343
00003a d3f9 BCC |L12.48|
|L12.60|
;;;347 }
;;;348 }
;;;349 /* Get CRC bytes (not really needed by us, but required by MSD) */
;;;350 MSD_WriteByte(DUMMY);
00003c 20ff MOVS r0,#0xff
00003e f7fffffe BL MSD_WriteByte
;;;351 MSD_WriteByte(DUMMY);
000042 20ff MOVS r0,#0xff
000044 f7fffffe BL MSD_WriteByte
;;;352 /* Set response value to success */
;;;353 rvalue = MSD_RESPONSE_NO_ERROR;
000048 2600 MOVS r6,#0
|L12.74|
;;;354 }
;;;355
;;;356 /* MSD chip select high */
;;;357 MSD_CS_HIGH();
00004a 2108 MOVS r1,#8
00004c 4638 MOV r0,r7
00004e f7fffffe BL GPIO_SetBits
;;;358 /* Send dummy byte: 8 Clock pulses of delay */
;;;359 MSD_WriteByte(DUMMY);
000052 20ff MOVS r0,#0xff
000054 f7fffffe BL MSD_WriteByte
;;;360
;;;361 /* Byte 0 */
;;;362 MSD_csd->CSDStruct = (CSD_Tab[0] & 0xC0) >> 6;
000058 f89d0000 LDRB r0,[sp,#0]
00005c 0981 LSRS r1,r0,#6
00005e 7021 STRB r1,[r4,#0]
;;;363 MSD_csd->SysSpecVersion = (CSD_Tab[0] & 0x3C) >> 2;
000060 f3c00183 UBFX r1,r0,#2,#4
000064 7061 STRB r1,[r4,#1]
;;;364 MSD_csd->Reserved1 = CSD_Tab[0] & 0x03;
000066 f0000003 AND r0,r0,#3
00006a 70a0 STRB r0,[r4,#2]
;;;365 /* Byte 1 */
;;;366 MSD_csd->TAAC = CSD_Tab[1] ;
00006c f89d0001 LDRB r0,[sp,#1]
000070 70e0 STRB r0,[r4,#3]
;;;367 /* Byte 2 */
;;;368 MSD_csd->NSAC = CSD_Tab[2];
000072 f89d0002 LDRB r0,[sp,#2]
000076 7120 STRB r0,[r4,#4]
;;;369 /* Byte 3 */
;;;370 MSD_csd->MaxBusClkFrec = CSD_Tab[3];
000078 f89d0003 LDRB r0,[sp,#3]
00007c 7160 STRB r0,[r4,#5]
;;;371 /* Byte 4 */
;;;372 MSD_csd->CardComdClasses = CSD_Tab[4] << 4;
00007e f89d0004 LDRB r0,[sp,#4]
000082 0100 LSLS r0,r0,#4
000084 80e0 STRH r0,[r4,#6]
;;;373 /* Byte 5 */
;;;374 MSD_csd->CardComdClasses |= (CSD_Tab[5] & 0xF0) >> 4;
000086 88e1 LDRH r1,[r4,#6]
000088 f89d0005 LDRB r0,[sp,#5]
00008c ea411110 ORR r1,r1,r0,LSR #4
000090 80e1 STRH r1,[r4,#6]
;;;375 MSD_csd->RdBlockLen = CSD_Tab[5] & 0x0F;
000092 f000000f AND r0,r0,#0xf
000096 7220 STRB r0,[r4,#8]
;;;376 /* Byte 6 */
;;;377 MSD_csd->PartBlockRead = (CSD_Tab[6] & 0x80) >> 7;
000098 f89d0006 LDRB r0,[sp,#6]
00009c 09c1 LSRS r1,r0,#7
00009e 7261 STRB r1,[r4,#9]
;;;378 MSD_csd->WrBlockMisalign = (CSD_Tab[6] & 0x40) >> 6;
0000a0 f3c01180 UBFX r1,r0,#6,#1
0000a4 72a1 STRB r1,[r4,#0xa]
;;;379 MSD_csd->RdBlockMisalign = (CSD_Tab[6] & 0x20) >> 5;
0000a6 f3c01140 UBFX r1,r0,#5,#1
0000aa 72e1 STRB r1,[r4,#0xb]
;;;380 MSD_csd->DSRImpl = (CSD_Tab[6] & 0x10) >> 4;
0000ac f3c01100 UBFX r1,r0,#4,#1
0000b0 7321 STRB r1,[r4,#0xc]
;;;381 MSD_csd->Reserved2 = 0; /* Reserved */
0000b2 2100 MOVS r1,#0
0000b4 7361 STRB r1,[r4,#0xd]
;;;382 MSD_csd->DeviceSize = (CSD_Tab[6] & 0x03) << 10;
0000b6 0780 LSLS r0,r0,#30
0000b8 0d00 LSRS r0,r0,#20
0000ba 81e0 STRH r0,[r4,#0xe]
;;;383 /* Byte 7 */
;;;384 MSD_csd->DeviceSize |= (CSD_Tab[7]) << 2;
0000bc 89e0 LDRH r0,[r4,#0xe]
0000be f89d2007 LDRB r2,[sp,#7]
0000c2 ea400082 ORR r0,r0,r2,LSL #2
0000c6 81e0 STRH r0,[r4,#0xe]
;;;385 /* Byte 8 */
;;;386 MSD_csd->DeviceSize |= (CSD_Tab[8] & 0xC0) >> 6;
0000c8 89e2 LDRH r2,[r4,#0xe]
0000ca f89d0008 LDRB r0,[sp,#8]
0000ce ea421290 ORR r2,r2,r0,LSR #6
0000d2 81e2 STRH r2,[r4,#0xe]
;;;387 MSD_csd->MaxRdCurrentVDDMin = (CSD_Tab[8] & 0x38) >> 3;
0000d4 f3c002c2 UBFX r2,r0,#3,#3
0000d8 7422 STRB r2,[r4,#0x10]
;;;388 MSD_csd->MaxRdCurrentVDDMax = (CSD_Tab[8] & 0x07);
0000da f0000007 AND r0,r0,#7
0000de 7460 STRB r0,[r4,#0x11]
;;;389 /* Byte 9 */
;;;390 MSD_csd->MaxWrCurrentVDDMin = (CSD_Tab[9] & 0xE0) >> 5;
0000e0 f89d0009 LDRB r0,[sp,#9]
0000e4 0942 LSRS r2,r0,#5
0000e6 74a2 STRB r2,[r4,#0x12]
;;;391 MSD_csd->MaxWrCurrentVDDMax = (CSD_Tab[9] & 0x1C) >> 2;
0000e8 f3c00282 UBFX r2,r0,#2,#3
0000ec 74e2 STRB r2,[r4,#0x13]
;;;392 MSD_csd->DeviceSizeMul = (CSD_Tab[9] & 0x03) << 1;
0000ee 0780 LSLS r0,r0,#30
0000f0 0f40 LSRS r0,r0,#29
0000f2 7520 STRB r0,[r4,#0x14]
;;;393 /* Byte 10 */
;;;394 MSD_csd->DeviceSizeMul |= (CSD_Tab[10] & 0x80) >> 7;
0000f4 7d22 LDRB r2,[r4,#0x14]
0000f6 f89d000a LDRB r0,[sp,#0xa]
0000fa ea4212d0 ORR r2,r2,r0,LSR #7
0000fe 7522 STRB r2,[r4,#0x14]
;;;395 MSD_csd->EraseGrSize = (CSD_Tab[10] & 0x7C) >> 2;
000100 f3c00284 UBFX r2,r0,#2,#5
000104 7562 STRB r2,[r4,#0x15]
;;;396 MSD_csd->EraseGrMul = (CSD_Tab[10] & 0x03) << 3;
000106 0780 LSLS r0,r0,#30
000108 0ec0 LSRS r0,r0,#27
00010a 75a0 STRB r0,[r4,#0x16]
;;;397 /* Byte 11 */
;;;398 MSD_csd->EraseGrMul |= (CSD_Tab[11] & 0xE0) >> 5;
00010c 7da2 LDRB r2,[r4,#0x16]
00010e f89d000b LDRB r0,[sp,#0xb]
000112 ea421250 ORR r2,r2,r0,LSR #5
000116 75a2 STRB r2,[r4,#0x16]
;;;399 MSD_csd->WrProtectGrSize = (CSD_Tab[11] & 0x1F);
000118 f000001f AND r0,r0,#0x1f
00011c 75e0 STRB r0,[r4,#0x17]
;;;400 /* Byte 12 */
;;;401 MSD_csd->WrProtectGrEnable = (CSD_Tab[12] & 0x80) >> 7;
00011e f89d000c LDRB r0,[sp,#0xc]
000122 09c2 LSRS r2,r0,#7
000124 7622 STRB r2,[r4,#0x18]
;;;402 MSD_csd->ManDeflECC = (CSD_Tab[12] & 0x60) >> 5;
000126 f3c01241 UBFX r2,r0,#5,#2
00012a 7662 STRB r2,[r4,#0x19]
;;;403 MSD_csd->WrSpeedFact = (CSD_Tab[12] & 0x1C) >> 2;
00012c f3c00282 UBFX r2,r0,#2,#3
000130 76a2 STRB r2,[r4,#0x1a]
;;;404 MSD_csd->MaxWrBlockLen = (CSD_Tab[12] & 0x03) << 2;
000132 0780 LSLS r0,r0,#30
000134 0f00 LSRS r0,r0,#28
000136 76e0 STRB r0,[r4,#0x1b]
;;;405 /* Byte 13 */
;;;406 MSD_csd->MaxWrBlockLen |= (CSD_Tab[13] & 0xc0) >> 6;
000138 7ee2 LDRB r2,[r4,#0x1b]
00013a f89d000d LDRB r0,[sp,#0xd]
00013e ea421290 ORR r2,r2,r0,LSR #6
000142 76e2 STRB r2,[r4,#0x1b]
;;;407 MSD_csd->WriteBlockPaPartial = (CSD_Tab[13] & 0x20) >> 5;
000144 f3c01240 UBFX r2,r0,#5,#1
000148 7722 STRB r2,[r4,#0x1c]
;;;408 MSD_csd->Reserved3 = 0;
00014a 7761 STRB r1,[r4,#0x1d]
;;;409 MSD_csd->ContentProtectAppli = (CSD_Tab[13] & 0x01);
00014c f0000001 AND r0,r0,#1
000150 77a0 STRB r0,[r4,#0x1e]
;;;410 /* Byte 14 */
;;;411 MSD_csd->FileFormatGrouop = (CSD_Tab[14] & 0x80) >> 7;
000152 f89d000e LDRB r0,[sp,#0xe]
000156 09c1 LSRS r1,r0,#7
000158 77e1 STRB r1,[r4,#0x1f]
;;;412 MSD_csd->CopyFlag = (CSD_Tab[14] & 0x40) >> 6;
00015a f3c01180 UBFX r1,r0,#6,#1
00015e f8841020 STRB r1,[r4,#0x20]
;;;413 MSD_csd->PermWrProtect = (CSD_Tab[14] & 0x20) >> 5;
000162 f3c01140 UBFX r1,r0,#5,#1
000166 f8841021 STRB r1,[r4,#0x21]
;;;414 MSD_csd->TempWrProtect = (CSD_Tab[14] & 0x10) >> 4;
00016a f3c01100 UBFX r1,r0,#4,#1
00016e f8841022 STRB r1,[r4,#0x22]
;;;415 MSD_csd->FileFormat = (CSD_Tab[14] & 0x0C) >> 2;
000172 f3c00181 UBFX r1,r0,#2,#2
000176 f8841023 STRB r1,[r4,#0x23]
;;;416 MSD_csd->ECC = (CSD_Tab[14] & 0x03);
00017a f0000003 AND r0,r0,#3
00017e f8840024 STRB r0,[r4,#0x24]
;;;417 /* Byte 15 */
;;;418 MSD_csd->CRC_Check = (CSD_Tab[15] & 0xFE) >> 1;
000182 f89d000f LDRB r0,[sp,#0xf]
000186 0840 LSRS r0,r0,#1
000188 f8840025 STRB r0,[r4,#0x25]
;;;419 MSD_csd->Reserved4 = 1;
00018c 2001 MOVS r0,#1
00018e f8840026 STRB r0,[r4,#0x26]
;;;420
;;;421 /* Return the reponse */
;;;422 return rvalue;
000192 4630 MOV r0,r6
;;;423 }
000194 b004 ADD sp,sp,#0x10
000196 e8bd81f0 POP {r4-r8,pc}
;;;424
ENDP
00019a 0000 DCW 0x0000
|L12.412|
00019c 40011800 DCD 0x40011800
AREA ||i.MSD_GetCIDRegister||, CODE, READONLY, ALIGN=2
MSD_GetCIDRegister PROC
;;;435 u8 MSD_GetCIDRegister(sMSD_CID* MSD_cid)
;;;436 {
000000 e92d41ff PUSH {r0-r8,lr}
;;;437 u32 i = 0;
;;;438 u8 rvalue = MSD_RESPONSE_FAILURE;
;;;439 u8 CID_Tab[16];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -