📄 msd.txt
字号:
;;;240 rvalue = MSD_RESPONSE_FAILURE;
;;;241 }
;;;242 }
;;;243
;;;244 /* MSD chip select high */
;;;245 MSD_CS_HIGH();
;;;246 /* Send dummy byte: 8 Clock pulses of delay */
;;;247 MSD_WriteByte(DUMMY);
;;;248 /* Returns the reponse */
;;;249 return rvalue;
;;;250 }
000036 e8bd87f0 POP {r4-r10,pc}
|L11.58|
00003a f7fffffe BL MSD_WriteByte
00003e 20fe MOVS r0,#0xfe ;217
000040 f7fffffe BL MSD_WriteByte
000044 2400 MOVS r4,#0 ;219
000046 f44f7800 MOV r8,#0x200 ;219
|L11.74|
00004a 7828 LDRB r0,[r5,#0] ;222
00004c f7fffffe BL MSD_WriteByte
000050 1c6d ADDS r5,r5,#1 ;224
000052 1c64 ADDS r4,r4,#1 ;219
000054 4544 CMP r4,r8 ;219
000056 d3f8 BCC |L11.74|
000058 f5067600 ADD r6,r6,#0x200 ;227
00005c f7fffffe BL MSD_ReadByte
000060 f7fffffe BL MSD_ReadByte
000064 f7fffffe BL MSD_GetDataResponse
000068 2805 CMP r0,#5 ;232
00006a d101 BNE |L11.112|
00006c 2400 MOVS r4,#0 ;235
00006e e000 B |L11.114|
|L11.112|
000070 24ff MOVS r4,#0xff ;240
|L11.114|
000072 1e7f SUBS r7,r7,#1 ;204
000074 d2d2 BCS |L11.28|
000076 2108 MOVS r1,#8 ;245
000078 4650 MOV r0,r10 ;245
00007a f7fffffe BL GPIO_SetBits
00007e 20ff MOVS r0,#0xff ;247
000080 f7fffffe BL MSD_WriteByte
000084 4620 MOV r0,r4 ;249
000086 e7d6 B |L11.54|
;;;251
ENDP
|L11.136|
000088 40011800 DCD 0x40011800
AREA ||i.MSD_ReadBuffer||, CODE, READONLY, ALIGN=2
MSD_ReadBuffer PROC
;;;263 u8 MSD_ReadBuffer(u8* pBuffer, u32 ReadAddr, u32 NumByteToRead)
;;;264 {
000000 e92d47f0 PUSH {r4-r10,lr}
;;;265 u32 i = 0, NbrOfBlock = 0, Offset = 0;
;;;266 u8 rvalue = MSD_RESPONSE_FAILURE;
;;;267
;;;268 /* Calculate number of blocks to read */
;;;269 NbrOfBlock = NumByteToRead / BLOCK_SIZE;
;;;270 /* MSD chip select low */
;;;271 MSD_CS_LOW();
000004 f8dfa074 LDR r10,|L12.124|
000008 4605 MOV r5,r0 ;264
00000a 4689 MOV r9,r1 ;264
00000c 2600 MOVS r6,#0 ;265
00000e 24ff MOVS r4,#0xff ;266
000010 0a57 LSRS r7,r2,#9 ;269
000012 2108 MOVS r1,#8
000014 4650 MOV r0,r10
000016 f7fffffe BL GPIO_ResetBits
00001a f44f7800 MOV r8,#0x200
00001e e021 B |L12.100|
|L12.32|
;;;272
;;;273 /* Data transfer */
;;;274 while (NbrOfBlock --)
;;;275 {
;;;276 /* Send CMD17 (MSD_READ_SINGLE_BLOCK) to read one block */
;;;277 MSD_SendCmd (MSD_READ_SINGLE_BLOCK, ReadAddr + Offset, 0xFF);
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,|L12.58|
;;;280 {
;;;281 return MSD_RESPONSE_FAILURE;
000034 20ff MOVS r0,#0xff
|L12.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}
|L12.58|
00003a 20fe MOVS r0,#0xfe ;284
00003c f7fffffe BL MSD_GetResponse
000040 b978 CBNZ r0,|L12.98|
000042 2400 MOVS r4,#0 ;287
|L12.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 |L12.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 |L12.100|
|L12.98|
000062 24ff MOVS r4,#0xff ;305
|L12.100|
000064 1e7f SUBS r7,r7,#1 ;274
000066 d2db BCS |L12.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 |L12.54|
;;;316
ENDP
00007a 0000 DCW 0x0000
|L12.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,|L13.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,|L13.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,|L13.60|
00002e 466e MOV r6,sp
|L13.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 |L13.48|
|L13.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
|L13.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]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -