📄 msd.txt
字号:
;;;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
|L13.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];
;;;440
;;;441 /* MSD chip select low */
;;;442 MSD_CS_LOW();
000004 4f3e LDR r7,|L14.256|
000006 4604 MOV r4,r0 ;436
000008 2500 MOVS r5,#0 ;437
00000a 26ff MOVS r6,#0xff ;438
00000c 2108 MOVS r1,#8
00000e 4638 MOV r0,r7
000010 f7fffffe BL GPIO_ResetBits
;;;443 /* Send CMD10 (CID register) */
;;;444 MSD_SendCmd(MSD_SEND_CID, 0, 0xFF);
000014 22ff MOVS r2,#0xff
000016 2100 MOVS r1,#0
000018 200a MOVS r0,#0xa
00001a f7fffffe BL MSD_SendCmd
;;;445
;;;446 /* Wait for response in the R1 format (0x00 is no errors) */
;;;447 if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
00001e 2000 MOVS r0,#0
000020 f7fffffe BL MSD_GetResponse
000024 b988 CBNZ r0,|L14.74|
;;;448 {
;;;449 if (!MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ))
000026 20fe MOVS r0,#0xfe
000028 f7fffffe BL MSD_GetResponse
00002c b930 CBNZ r0,|L14.60|
00002e 466e MOV r6,sp
|L14.48|
;;;450 {
;;;451 /* Store CID register value on CID_Tab */
;;;452 for (i = 0; i < 16; i++)
;;;453 {
;;;454 CID_Tab[i] = MSD_ReadByte();
000030 f7fffffe BL MSD_ReadByte
000034 5570 STRB r0,[r6,r5]
000036 1c6d ADDS r5,r5,#1 ;452
000038 2d10 CMP r5,#0x10 ;452
00003a d3f9 BCC |L14.48|
|L14.60|
;;;455 }
;;;456 }
;;;457 /* Get CRC bytes (not really needed by us, but required by MSD) */
;;;458 MSD_WriteByte(DUMMY);
00003c 20ff MOVS r0,#0xff
00003e f7fffffe BL MSD_WriteByte
;;;459 MSD_WriteByte(DUMMY);
000042 20ff MOVS r0,#0xff
000044 f7fffffe BL MSD_WriteByte
;;;460 /* Set response value to success */
;;;461 rvalue = MSD_RESPONSE_NO_ERROR;
000048 2600 MOVS r6,#0
|L14.74|
;;;462 }
;;;463
;;;464 /* MSD chip select high */
;;;465 MSD_CS_HIGH();
00004a 2108 MOVS r1,#8
00004c 4638 MOV r0,r7
00004e f7fffffe BL GPIO_SetBits
;;;466 /* Send dummy byte: 8 Clock pulses of delay */
;;;467 MSD_WriteByte(DUMMY);
000052 20ff MOVS r0,#0xff
000054 f7fffffe BL MSD_WriteByte
;;;468
;;;469 /* Byte 0 */
;;;470 MSD_cid->ManufacturerID = CID_Tab[0];
000058 f89d0000 LDRB r0,[sp,#0]
00005c 7020 STRB r0,[r4,#0]
;;;471 /* Byte 1 */
;;;472 MSD_cid->OEM_AppliID = CID_Tab[1] << 8;
00005e f89d0001 LDRB r0,[sp,#1]
000062 0200 LSLS r0,r0,#8
000064 8060 STRH r0,[r4,#2]
;;;473 /* Byte 2 */
;;;474 MSD_cid->OEM_AppliID |= CID_Tab[2];
000066 8860 LDRH r0,[r4,#2]
000068 f89d1002 LDRB r1,[sp,#2]
00006c 4308 ORRS r0,r0,r1
00006e 8060 STRH r0,[r4,#2]
;;;475 /* Byte 3 */
;;;476 MSD_cid->ProdName1 = CID_Tab[3] << 24;
000070 f89d0003 LDRB r0,[sp,#3]
000074 0600 LSLS r0,r0,#24
000076 6060 STR r0,[r4,#4]
;;;477 /* Byte 4 */
;;;478 MSD_cid->ProdName1 |= CID_Tab[4] << 16;
000078 6860 LDR r0,[r4,#4]
00007a f89d1004 LDRB r1,[sp,#4]
00007e ea404001 ORR r0,r0,r1,LSL #16
000082 6060 STR r0,[r4,#4]
;;;479 /* Byte 5 */
;;;480 MSD_cid->ProdName1 |= CID_Tab[5] << 8;
000084 6860 LDR r0,[r4,#4]
000086 f89d1005 LDRB r1,[sp,#5]
00008a ea402001 ORR r0,r0,r1,LSL #8
00008e 6060 STR r0,[r4,#4]
;;;481 /* Byte 6 */
;;;482 MSD_cid->ProdName1 |= CID_Tab[6];
000090 6860 LDR r0,[r4,#4]
000092 f89d1006 LDRB r1,[sp,#6]
000096 4308 ORRS r0,r0,r1
000098 6060 STR r0,[r4,#4]
;;;483 /* Byte 7 */
;;;484 MSD_cid->ProdName2 = CID_Tab[7];
00009a f89d0007 LDRB r0,[sp,#7]
00009e 7220 STRB r0,[r4,#8]
;;;485 /* Byte 8 */
;;;486 MSD_cid->ProdRev = CID_Tab[8];
0000a0 f89d0008 LDRB r0,[sp,#8]
0000a4 7260 STRB r0,[r4,#9]
;;;487 /* Byte 9 */
;;;488 MSD_cid->ProdSN = CID_Tab[9] << 24;
0000a6 f89d0009 LDRB r0,[sp,#9]
0000aa 0600 LSLS r0,r0,#24
0000ac 60e0 STR r0,[r4,#0xc]
;;;489 /* Byte 10 */
;;;490 MSD_cid->ProdSN |= CID_Tab[10] << 16;
0000ae 68e0 LDR r0,[r4,#0xc]
0000b0 f89d100a LDRB r1,[sp,#0xa]
0000b4 ea404001 ORR r0,r0,r1,LSL #16
0000b8 60e0 STR r0,[r4,#0xc]
;;;491 /* Byte 11 */
;;;492 MSD_cid->ProdSN |= CID_Tab[11] << 8;
0000ba 68e0 LDR r0,[r4,#0xc]
0000bc f89d100b LDRB r1,[sp,#0xb]
0000c0 ea402001 ORR r0,r0,r1,LSL #8
0000c4 60e0 STR r0,[r4,#0xc]
;;;493 /* Byte 12 */
;;;494 MSD_cid->ProdSN |= CID_Tab[12];
0000c6 68e0 LDR r0,[r4,#0xc]
0000c8 f89d100c LDRB r1,[sp,#0xc]
0000cc 4308 ORRS r0,r0,r1
0000ce 60e0 STR r0,[r4,#0xc]
;;;495 /* Byte 13 */
;;;496 MSD_cid->Reserved1 |= (CID_Tab[13] & 0xF0) >> 4;
0000d0 7c21 LDRB r1,[r4,#0x10]
0000d2 f89d000d LDRB r0,[sp,#0xd]
0000d6 ea411110 ORR r1,r1,r0,LSR #4
0000da 7421 STRB r1,[r4,#0x10]
;;;497 /* Byte 14 */
;;;498 MSD_cid->ManufactDate = (CID_Tab[13] & 0x0F) << 8;
0000dc 0700 LSLS r0,r0,#28
0000de 0d00 LSRS r0,r0,#20
0000e0 8260 STRH r0,[r4,#0x12]
;;;499 /* Byte 15 */
;;;500 MSD_cid->ManufactDate |= CID_Tab[14];
0000e2 8a60 LDRH r0,[r4,#0x12]
0000e4 f89d100e LDRB r1,[sp,#0xe]
0000e8 4308 ORRS r0,r0,r1
0000ea 8260 STRH r0,[r4,#0x12]
;;;501 /* Byte 16 */
;;;502 MSD_cid->CRC_Check = (CID_Tab[15] & 0xFE) >> 1;
0000ec f89d000f LDRB r0,[sp,#0xf]
0000f0 0840 LSRS r0,r0,#1
0000f2 7520 STRB r0,[r4,#0x14]
;;;503 MSD_cid->Reserved2 = 1;
0000f4 2001 MOVS r0,#1
0000f6 7560 STRB r0,[r4,#0x15]
;;;504
;;;505 /* Return the reponse */
;;;506 return rvalue;
0000f8 4630 MOV r0,r6
;;;507 }
0000fa b004 ADD sp,sp,#0x10
0000fc e8bd81f0 POP {r4-r8,pc}
;;;508
ENDP
|L14.256|
000100 40011800 DCD 0x40011800
AREA ||i.MSD_GetStatus||, CODE, READONLY, ALIGN=2
MSD_GetStatus PROC
;;;635 u16 MSD_GetStatus(void)
;;;636 {
000000 b570 PUSH {r4-r6,lr}
;;;637 u16 Status = 0;
;;;638
;;;639 /* MSD chip select low */
;;;640 MSD_CS_LOW();
000002 4d0d LDR r5,|L15.56|
000004 2108 MOVS r1,#8
000006 4628 MOV r0,r5
000008 f7fffffe BL GPIO_ResetBits
;;;641 /* Send CMD13 (MSD_SEND_STATUS) to get MSD status */
;;;642 MSD_SendCmd(MSD_SEND_STATUS, 0, 0xFF);
00000c 22ff MOVS r2,#0xff
00000e 2100 MOVS r1,#0
000010 200d MOVS r0,#0xd
000012 f7fffffe BL MSD_SendCmd
;;;643
;;;644 Status = MSD_ReadByte();
000016 f7fffffe BL MSD_ReadByte
00001a 4604 MOV r4,r0
;;;645 Status |= (u16)(MSD_ReadByte() << 8);
00001c f7fffffe BL MSD_ReadByte
000020 ea442400 ORR r4,r4,r0,LSL #8
;;;646
;;;647 /* MSD chip select high */
;;;648 MSD_CS_HIGH();
000024 2108 MOVS r1,#8
000026 4628 MOV r0,r5
000028 f7fffffe BL GPIO_SetBits
;;;649 /* Send dummy byte 0xFF */
;;;650 MSD_WriteByte(DUMMY);
00002c 20ff MOVS r0,#0xff
00002e f7fffffe BL MSD_WriteByte
;;;651
;;;652 return Status;
000032 4620 MOV r0,r4
;;;653 }
000034 bd70 POP {r4-r6,pc}
;;;654
ENDP
000036 0000 DCW 0x0000
|L15.56|
000038 40011800 DCD 0x40011800
AREA ||i.Get_Medium_Characteristics||, CODE, READONLY, ALIGN=2
Get_Medium_Characteristics PROC
;;;793 void Get_Medium_Characteristics(void)
;;;794 {
000000 b510 PUSH {r4,lr}
;;;795 u32 temp1 = 0;
;;;796 u32 temp2 = 0;
;;;797
;;;798 MSD_GetCSDRegister(&MSD_csd);
000002 480a LDR r0,|L16.44|
000004 f7fffffe BL MSD_GetCSDRegister
;;;799
;;;800 temp1 = MSD_csd.DeviceSize + 1;
000008 4b08 LDR r3,|L16.44|
00000a 89d8 LDRH r0,[r3,#0xe] ; MSD_csd
;;;801 temp2 = 1 << (MSD_csd.DeviceSizeMul + 2);
00000c 7d1c LDRB r4,[r3,#0x14] ; MSD_csd
00000e 1c40 ADDS r0,r0,#1 ;800
000010 1ca4 ADDS r4,r4,#2
000012 2101 MOVS r1,#1
000014 fa01f204 LSL r2,r1,r4
;;;802
;;;803 Mass_Block_Count = temp1 * temp2;
000018 4350 MULS r0,r2,r0
00001a 4a05 LDR r2,|L16.48|
;;;804
;;;805 Mass_Block_Size = 1 << MSD_csd.RdBlockLen;
00001c 6010 STR r0,[r2,#0] ; Mass_Block_Count
00001e 7a1b LDRB r3,[r3,#8] ; MSD_csd
000020 4099 LSLS r1,r1,r3
;;;806
;;;807 Mass_Memory_Size = (Mass_Block_Count * Mass_Block_Size);
000022 4348 MULS r0,r1,r0
;;;808
;;;809 }
000024 e9c21001 STRD r1,r0,[r2,#4]
000028 bd10 POP {r4,pc}
;;;810
ENDP
00002a 0000 DCW 0x0000
|L16.44|
00002c 00000000 DCD ||.bss||
|L16.48|
000030 00000000 DCD ||.data||
AREA ||.data||, DATA, ALIGN=2
Mass_Block_Count
000000 00000000 DCD 0x00000000
Mass_Block_Size
000004 00000000 DCD 0x00000000
Mass_Memory_Size
000008 00000000 DCD 0x00000000
AREA ||.bss||, DATA, NOINIT, ALIGN=1
MSD_csd
% 40
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -