📄 msd.txt
字号:
;;;440
;;;441 /* MSD chip select low */
;;;442 MSD_CS_LOW();
000004 4f3e LDR r7,|L13.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,|L13.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,|L13.60|
00002e 466e MOV r6,sp
|L13.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 |L13.48|
|L13.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
|L13.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
|L13.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,|L14.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
|L14.56|
000038 40011800 DCD 0x40011800
AREA ||i.Get_Medium_Characteristics||, CODE, READONLY, ALIGN=2
Get_Medium_Characteristics PROC
;;;792 void Get_Medium_Characteristics(void)
;;;793 {
000000 b510 PUSH {r4,lr}
;;;794 u32 temp1 = 0;
;;;795 u32 temp2 = 0;
;;;796
;;;797 MSD_GetCSDRegister(&MSD_csd);
000002 480a LDR r0,|L15.44|
000004 f7fffffe BL MSD_GetCSDRegister
;;;798
;;;799 temp1 = MSD_csd.DeviceSize + 1;
000008 4b08 LDR r3,|L15.44|
00000a 89d8 LDRH r0,[r3,#0xe] ; MSD_csd
;;;800 temp2 = 1 << (MSD_csd.DeviceSizeMul + 2);
00000c 7d1c LDRB r4,[r3,#0x14] ; MSD_csd
00000e 1c40 ADDS r0,r0,#1 ;799
000010 1ca4 ADDS r4,r4,#2
000012 2101 MOVS r1,#1
000014 fa01f204 LSL r2,r1,r4
;;;801
;;;802 Mass_Block_Count = temp1 * temp2;
000018 4350 MULS r0,r2,r0
00001a 4a05 LDR r2,|L15.48|
;;;803
;;;804 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
;;;805
;;;806 Mass_Memory_Size = (Mass_Block_Count * Mass_Block_Size);
000022 4348 MULS r0,r1,r0
;;;807
;;;808 }
000024 e9c21001 STRD r1,r0,[r2,#4]
000028 bd10 POP {r4,pc}
;;;809
ENDP
00002a 0000 DCW 0x0000
|L15.44|
00002c 00000000 DCD ||.bss||
|L15.48|
000030 00000000 DCD ||.data||
AREA ||i.SPI_Config||, CODE, READONLY, ALIGN=2
SPI_Config PROC
000000 b510 PUSH {r4,lr}
000002 b086 SUB sp,sp,#0x18
000004 2101 MOVS r1,#1
000006 2044 MOVS r0,#0x44
000008 f7fffffe BL RCC_APB2PeriphClockCmd
00000c 2101 MOVS r1,#1
00000e 0308 LSLS r0,r1,#12
000010 f7fffffe BL RCC_APB2PeriphClockCmd
000014 20e0 MOVS r0,#0xe0
000016 f8ad0014 STRH r0,[sp,#0x14]
00001a 2403 MOVS r4,#3
00001c f88d4016 STRB r4,[sp,#0x16]
000020 2018 MOVS r0,#0x18
000022 f88d0017 STRB r0,[sp,#0x17]
000026 a905 ADD r1,sp,#0x14
000028 4819 LDR r0,|L16.144|
00002a f7fffffe BL GPIO_Init
00002e 2008 MOVS r0,#8
000030 f8ad0014 STRH r0,[sp,#0x14]
000034 f88d4016 STRB r4,[sp,#0x16]
000038 2010 MOVS r0,#0x10
00003a f88d0017 STRB r0,[sp,#0x17]
00003e a905 ADD r1,sp,#0x14
000040 4814 LDR r0,|L16.148|
000042 f7fffffe BL GPIO_Init
000046 2000 MOVS r0,#0
000048 f8ad0000 STRH r0,[sp,#0]
00004c f44f7182 MOV r1,#0x104
000050 f8ad1002 STRH r1,[sp,#2]
000054 f8ad0004 STRH r0,[sp,#4]
000058 2102 MOVS r1,#2
00005a f8ad1006 STRH r1,[sp,#6]
00005e 2101 MOVS r1,#1
000060 f8ad1008 STRH r1,[sp,#8]
000064 0249 LSLS r1,r1,#9
000066 f8ad100a STRH r1,[sp,#0xa]
00006a 2120 MOVS r1,#0x20
00006c f8ad100c STRH r1,[sp,#0xc]
000070 f8ad000e STRH r0,[sp,#0xe]
000074 2007 MOVS r0,#7
000076 4c08 LDR r4,|L16.152|
000078 f8ad0010 STRH r0,[sp,#0x10]
00007c 4669 MOV r1,sp
00007e 4620 MOV r0,r4
000080 f7fffffe BL SPI_Init
000084 2101 MOVS r1,#1
000086 4620 MOV r0,r4
000088 f7fffffe BL SPI_Cmd
00008c b006 ADD sp,sp,#0x18
00008e bd10 POP {r4,pc}
ENDP
|L16.144|
000090 40010800 DCD 0x40010800
|L16.148|
000094 40011800 DCD 0x40011800
|L16.152|
000098 40013000 DCD 0x40013000
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 + -