📄 mmc_sd.txt
字号:
000768 e2820001 ADD r0,r2,#1 ;395
00076c e3c02801 BIC r2,r0,#0x10000 ;395
000770 e3520c02 CMP r2,#0x200 ;395
000774 3afffff9 BCC |L1.1888|
;;;398 }
;;;399
;;;400 SPI_WriteByte(0xff); //dummy crc
000778 e3a000ff MOV r0,#0xff
00077c ebfffffe BL SPI_WriteByte
;;;401 SPI_WriteByte(0xff);
000780 e3a000ff MOV r0,#0xff
000784 ebfffffe BL SPI_WriteByte
;;;402
;;;403 r1 = SPI_WriteByte(0xff);
000788 e3a000ff MOV r0,#0xff
00078c ebfffffe BL SPI_WriteByte
;;;404
;;;405 if( (r1&0x1f) != 0x05)//等待是否成功 //judge if it successful
000790 e200101f AND r1,r0,#0x1f
000794 e3510005 CMP r1,#5
;;;406 {
;;;407 SPI_CS_Deassert;
000798 15931004 LDRNE r1,[r3,#4]
00079c 13811602 ORRNE r1,r1,#0x200000
0007a0 15831004 STRNE r1,[r3,#4]
;;;408 return r1;
0007a4 1a000012 BNE |L1.2036|
0007a8 ea000007 B |L1.1996|
|L1.1964|
;;;409 }
;;;410 //等待操作完 //wait no busy
;;;411 while(!SPI_WriteByte(0xff))if(retry++ > ACCESS_TIMEOUT){SPI_CS_Deassert;return 1;}
0007ac e1a00004 MOV r0,r4
0007b0 e3500807 CMP r0,#0x70000
0007b4 25930004 LDRCS r0,[r3,#4]
0007b8 e2844001 ADD r4,r4,#1
0007bc 23800602 ORRCS r0,r0,#0x200000
0007c0 25830004 STRCS r0,[r3,#4]
0007c4 23a00001 MOVCS r0,#1
0007c8 2a000009 BCS |L1.2036|
|L1.1996|
0007cc e3a000ff MOV r0,#0xff
0007d0 ebfffffe BL SPI_WriteByte
0007d4 e3500000 CMP r0,#0
0007d8 0afffff3 BEQ |L1.1964|
;;;412
;;;413 SPI_CS_Deassert;
0007dc e5930004 LDR r0,[r3,#4]
0007e0 e3800602 ORR r0,r0,#0x200000
0007e4 e5830004 STR r0,[r3,#4]
;;;414 SPI_WriteByte(0xff);// extra 8 CLK
0007e8 e3a000ff MOV r0,#0xff
0007ec ebfffffe BL SPI_WriteByte
;;;415
;;;416 return 0;
0007f0 e3a00000 MOV r0,#0
|L1.2036|
0007f4 e8bd4030 POP {r4,r5,lr}
;;;417 }
0007f8 e12fff1e BX lr
;;;418
ENDP
MMC_SD_ReadCapacity PROC
;;;421 uint32 MMC_SD_ReadCapacity()
;;;422 {
0007fc e92d401f PUSH {r0-r4,lr}
;;;423 uint8 r1;
;;;424 uint16 i;
;;;425 uint16 temp;
;;;426 uint8 buffer[16];
;;;427 uint32 Capacity;
;;;428 uint32 retry =0;
000800 e3a04000 MOV r4,#0
;;;429 //uint8 retry=0;
;;;430
;;;431 //if(address_mode==BLOCK_MODE) return 0; /*currently I do not have the spec. so do not kown how to calculate the capacity*/
;;;432
;;;433 //SPI_High(); /* Use High Speed SPI*/
;;;434
;;;435 r1 = MMC_SD_SendCommandCRC_NoDeassert(9, 0,0);//写命令 //send command //READ CSD
000804 e1a02004 MOV r2,r4
000808 e1a01004 MOV r1,r4
00080c e3a00009 MOV r0,#9
000810 ebfffffe BL MMC_SD_SendCommandCRC_NoDeassert
;;;436 if(r1 != 0x00)
000814 e3500000 CMP r0,#0
000818 1a000053 BNE |L1.2412|
;;;437 return r1;
;;;438
;;;439 SPI_CS_Assert;
00081c e51f32c0 LDR r3,|L1.1380|
000820 e593000c LDR r0,[r3,#0xc]
000824 e3800602 ORR r0,r0,#0x200000
000828 e583000c STR r0,[r3,#0xc]
;;;440 while(SPI_WriteByte(0xff) != 0xfe)if(retry++ > ACCESS_TIMEOUT){SPI_CS_Deassert;return 1;}
00082c ea000007 B |L1.2128|
|L1.2096|
000830 e1a00004 MOV r0,r4
000834 e3500807 CMP r0,#0x70000
000838 25930004 LDRCS r0,[r3,#4]
00083c e2844001 ADD r4,r4,#1
000840 23800602 ORRCS r0,r0,#0x200000
000844 25830004 STRCS r0,[r3,#4]
000848 23a00001 MOVCS r0,#1
00084c 2a000046 BCS |L1.2412|
|L1.2128|
000850 e3a000ff MOV r0,#0xff
000854 ebfffffe BL SPI_WriteByte
000858 e35000fe CMP r0,#0xfe
00085c 1afffff3 BNE |L1.2096|
;;;441
;;;442
;;;443 for(i=0;i<16;i++)
000860 e3a02000 MOV r2,#0
000864 e28dc000 ADD r12,sp,#0
|L1.2152|
;;;444 {
;;;445 buffer[i]=SPI_WriteByte(0xff);
000868 e3a000ff MOV r0,#0xff
00086c ebfffffe BL SPI_WriteByte
000870 e7cc0002 STRB r0,[r12,r2]
000874 e2820001 ADD r0,r2,#1 ;443
000878 e3c02801 BIC r2,r0,#0x10000 ;443
00087c e3520010 CMP r2,#0x10 ;443
000880 3afffff8 BCC |L1.2152|
;;;446 }
;;;447
;;;448 SPI_WriteByte(0xff);
000884 e3a000ff MOV r0,#0xff
000888 ebfffffe BL SPI_WriteByte
;;;449 SPI_WriteByte(0xff);
00088c e3a000ff MOV r0,#0xff
000890 ebfffffe BL SPI_WriteByte
;;;450
;;;451 SPI_WriteByte(0xff);
000894 e3a000ff MOV r0,#0xff
000898 ebfffffe BL SPI_WriteByte
;;;452
;;;453 SPI_CS_Deassert;
00089c e5930004 LDR r0,[r3,#4]
0008a0 e3800602 ORR r0,r0,#0x200000
0008a4 e5830004 STR r0,[r3,#4]
;;;454
;;;455 SPI_WriteByte(0xff);// extra 8 CLK
0008a8 e3a000ff MOV r0,#0xff
0008ac ebfffffe BL SPI_WriteByte
;;;456
;;;457 if((buffer[0]&0xc0)==0x40)
0008b0 e5dd0000 LDRB r0,[sp,#0]
0008b4 e20000c0 AND r0,r0,#0xc0
0008b8 e3500040 CMP r0,#0x40
;;;458 {
;;;459 Capacity = (((uint32)buffer[8])<<8 + (uint32)buffer[9] +1)*(uint32)1024;
0008bc 05dd1009 LDRBEQ r1,[sp,#9]
0008c0 05dd0008 LDRBEQ r0,[sp,#8]
0008c4 02811009 ADDEQ r1,r1,#9
0008c8 01a00110 LSLEQ r0,r0,r1
0008cc 01a00500 LSLEQ r0,r0,#10
;;;460 return Capacity;
0008d0 0a000025 BEQ |L1.2412|
;;;461 }
;;;462
;;;463 /*********************************/
;;;464 // C_SIZE
;;;465 i = buffer[6]&0x03;
0008d4 e5dd0006 LDRB r0,[sp,#6]
;;;466 i<<=8;
0008d8 e3a01cff MOV r1,#0xff00
;;;467 i += buffer[7];
;;;468 i<<=2;
;;;469 i += ((buffer[8]&0xc0)>>6);
;;;470
;;;471 /**********************************/
;;;472 // C_SIZE_MULT
;;;473
;;;474 r1 = buffer[9]&0x03;
;;;475 r1<<=1;
;;;476 r1 += ((buffer[10]&0x80)>>7);
;;;477
;;;478
;;;479 /**********************************/
;;;480 // BLOCKNR
;;;481
;;;482 r1+=2;
;;;483
;;;484 temp = 1;
0008dc e3e02801 MVN r2,#0x10000
0008e0 e2000003 AND r0,r0,#3 ;465
0008e4 e0010400 AND r0,r1,r0,LSL #8 ;466
0008e8 e5dd1007 LDRB r1,[sp,#7] ;467
0008ec e0800001 ADD r0,r0,r1 ;467
0008f0 e3e01803 MVN r1,#0x30000 ;468
0008f4 e0010100 AND r0,r1,r0,LSL #2 ;468
0008f8 e5dd1008 LDRB r1,[sp,#8] ;469
0008fc e20110c0 AND r1,r1,#0xc0 ;469
000900 e0803321 ADD r3,r0,r1,LSR #6 ;469
000904 e5dd0009 LDRB r0,[sp,#9] ;474
000908 e5dd100a LDRB r1,[sp,#0xa] ;476
00090c e1a00f00 LSL r0,r0,#30 ;474
000910 e1a00ea0 LSR r0,r0,#29 ;475
000914 e2011080 AND r1,r1,#0x80 ;476
000918 e08003a1 ADD r0,r0,r1,LSR #7 ;476
00091c e2800002 ADD r0,r0,#2 ;482
000920 e3a01001 MOV r1,#1
|L1.2340|
;;;485 while(r1)
000924 e3500000 CMP r0,#0
;;;486 {
;;;487 temp*=2;
;;;488 r1--;
000928 12400001 SUBNE r0,r0,#1
00092c 10021081 ANDNE r1,r2,r1,LSL #1 ;487
000930 120000ff ANDNE r0,r0,#0xff
000934 1afffffa BNE |L1.2340|
;;;489 }
;;;490
;;;491 Capacity = ((uint32)(i+1))*((uint32)temp);
000938 e2830001 ADD r0,r3,#1
00093c e0030190 MUL r3,r0,r1
;;;492
;;;493 /////////////////////////
;;;494 // READ_BL_LEN
;;;495
;;;496 i = buffer[5]&0x0f;
000940 e5dd0005 LDRB r0,[sp,#5]
;;;497
;;;498 /*************************/
;;;499 //BLOCK_LEN
;;;500
;;;501 temp = 1;
000944 e3a01001 MOV r1,#1
000948 e200000f AND r0,r0,#0xf ;496
|L1.2380|
;;;502 while(i)
00094c e3500000 CMP r0,#0
;;;503 {
;;;504 temp*=2;
;;;505 i--;
000950 12400001 SUBNE r0,r0,#1
000954 11a00800 LSLNE r0,r0,#16
000958 10021081 ANDNE r1,r2,r1,LSL #1 ;504
00095c 11a00820 LSRNE r0,r0,#16
000960 1afffff9 BNE |L1.2380|
;;;506 }
;;;507 /************************/
;;;508
;;;509
;;;510 /************** formula of the capacity ******************/
;;;511 //
;;;512 // memory capacity = BLOCKNR * BLOCK_LEN
;;;513 //
;;;514 // BLOCKNR = (C_SIZE + 1)* MULT
;;;515 //
;;;516 // C_SIZE_MULT+2
;;;517 // MULT = 2
;;;518 //
;;;519 // READ_BL_LEN
;;;520 // BLOCK_LEN = 2
;;;521 /**********************************************/
;;;522
;;;523 //The final result
;;;524
;;;525 Capacity *= (uint32)temp;
000964 e0000193 MUL r0,r3,r1
;;;526 return Capacity/512;
000968 e1a004a0 LSR r0,r0,#9
|L1.2412|
00096c e28dd010 ADD sp,sp,#0x10
000970 e8bd4010 POP {r4,lr}
;;;527 }
000974 e12fff1e BX lr
;;;528
ENDP
AREA ||.data||, DATA, ALIGN=0
address_mode
000000 00 DCB 0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -