📄 mci_lpc23xx.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 939] for uVision
; commandline ArmCC [--debug -c --asm --interleave -o.\obj\mci_lpc23xx.o --depend=.\obj\mci_lpc23xx.d --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips --omf_browse=.\obj\mci_lpc23xx.crf MCI_LPC23xx.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
mci_command PROC
;;;443
;;;444 static U32 mci_command (U8 cmd, U32 arg, U32 resp_type, U32 *rp) {
000000 e92d4030 PUSH {r4,r5,lr}
000004 e1a0e000 MOV lr,r0
000008 e1a0c003 MOV r12,r3
;;;445 /* Send a Command to Flash card and get a Response. */
;;;446 U32 cmdval,stat;
;;;447
;;;448 cmd &= 0x3F;
00000c e20ee03f AND lr,lr,#0x3f
;;;449 cmdval = 0x400 | cmd;
000010 e38e4b01 ORR r4,lr,#0x400
;;;450 switch (resp_type) {
000014 e3520001 CMP r2,#1
000018 0a000002 BEQ |L1.40|
00001c e3520002 CMP r2,#2
000020 1a000006 BNE |L1.64|
000024 ea000002 B |L1.52|
|L1.40|
;;;451 case RESP_SHORT:
000028 e1a00000 MOV r0,r0
;;;452 cmdval |= 0x40;
00002c e3844040 ORR r4,r4,#0x40
;;;453 break;
000030 ea000002 B |L1.64|
|L1.52|
;;;454 case RESP_LONG:
000034 e1a00000 MOV r0,r0
;;;455 cmdval |= 0xC0;
000038 e38440c0 ORR r4,r4,#0xc0
;;;456 break;
00003c e1a00000 MOV r0,r0
|L1.64|
000040 e1a00000 MOV r0,r0 ;453
;;;457 }
;;;458 /* Send the command. */
;;;459 MCI_ARGUMENT = arg;
000044 e59f0cdc LDR r0,|L1.3368|
000048 e5801008 STR r1,[r0,#8]
;;;460 MCI_COMMAND = cmdval;
00004c e580400c STR r4,[r0,#0xc]
;;;461
;;;462 if (resp_type == RESP_NONE) {
000050 e3520000 CMP r2,#0
000054 1a00000a BNE |L1.132|
;;;463 /* Wait until command finished. */
;;;464 while (MCI_STATUS & MCI_CMD_ACTIVE);
000058 e1a00000 MOV r0,r0
|L1.92|
00005c e59f0cc4 LDR r0,|L1.3368|
000060 e5900034 LDR r0,[r0,#0x34]
000064 e3100b02 TST r0,#0x800
000068 1afffffb BNE |L1.92|
;;;465 MCI_CLEAR = 0x7FF;
00006c e59f0cb8 LDR r0,|L1.3372|
000070 e59f5cb0 LDR r5,|L1.3368|
000074 e5850038 STR r0,[r5,#0x38]
;;;466 return (0);
000078 e3a00000 MOV r0,#0
|L1.124|
00007c e8bd4030 POP {r4,r5,lr}
;;;467 }
;;;468
;;;469 for (;;) {
;;;470 stat = MCI_STATUS;
;;;471 if (stat & MCI_CMD_TIMEOUT) {
;;;472 MCI_CLEAR = stat & MCI_CLEAR_MASK;
;;;473 return (stat);
;;;474 }
;;;475 if (stat & MCI_CMD_CRC_FAIL) {
;;;476 MCI_CLEAR = stat & MCI_CLEAR_MASK;
;;;477 if ((cmd == SEND_OP_COND) ||
;;;478 (cmd == SEND_APP_OP_COND) ||
;;;479 (cmd == STOP_TRANSMISSION)) {
;;;480 MCI_COMMAND = 0;
;;;481 break;
;;;482 }
;;;483 return (stat);
;;;484 }
;;;485 if (stat & MCI_CMD_RESP_END) {
;;;486 MCI_CLEAR = stat & MCI_CLEAR_MASK;
;;;487 break;
;;;488 }
;;;489 }
;;;490 if ((MCI_RESP_CMD & 0x3F) != cmd) {
;;;491 if ((cmd != SEND_OP_COND) &&
;;;492 (cmd != SEND_APP_OP_COND) &&
;;;493 (cmd != ALL_SEND_CID) &&
;;;494 (cmd != SEND_CSD)) {
;;;495 return (MCI_RESP_INVALID);
;;;496 }
;;;497 }
;;;498 if (rp == NULL) {
;;;499 /* Response pointer undefined. */
;;;500 return (MCI_RESP_INVALID);
;;;501 }
;;;502 /* Read MCI response registers */
;;;503 rp[0] = MCI_RESP0;
;;;504 if (resp_type == RESP_LONG) {
;;;505 rp[1] = MCI_RESP1;
;;;506 rp[2] = MCI_RESP2;
;;;507 rp[3] = MCI_RESP3;
;;;508 }
;;;509 return (0);
;;;510 }
000080 e12fff1e BX lr
|L1.132|
000084 e1a00000 MOV r0,r0 ;469
|L1.136|
000088 e59f0c98 LDR r0,|L1.3368|
00008c e5903034 LDR r3,[r0,#0x34] ;470
000090 e3130004 TST r3,#4 ;471
000094 0a000005 BEQ |L1.176|
000098 e1a00a83 LSL r0,r3,#21 ;472
00009c e1a00aa0 LSR r0,r0,#21 ;472
0000a0 e59f5c80 LDR r5,|L1.3368|
0000a4 e5850038 STR r0,[r5,#0x38] ;472
0000a8 e1a00003 MOV r0,r3 ;473
0000ac eafffff2 B |L1.124|
|L1.176|
0000b0 e3130001 TST r3,#1 ;475
0000b4 0a00000f BEQ |L1.248|
0000b8 e1a00a83 LSL r0,r3,#21 ;476
0000bc e1a00aa0 LSR r0,r0,#21 ;476
0000c0 e59f5c60 LDR r5,|L1.3368|
0000c4 e5850038 STR r0,[r5,#0x38] ;476
0000c8 e35e0001 CMP lr,#1 ;477
0000cc 0a000003 BEQ |L1.224|
0000d0 e35e0029 CMP lr,#0x29 ;478
0000d4 0a000001 BEQ |L1.224|
0000d8 e35e000c CMP lr,#0xc ;479
0000dc 1a000003 BNE |L1.240|
|L1.224|
0000e0 e3a00000 MOV r0,#0 ;480
0000e4 e59f5c3c LDR r5,|L1.3368|
0000e8 e585000c STR r0,[r5,#0xc] ;480
0000ec ea000008 B |L1.276|
|L1.240|
0000f0 e1a00003 MOV r0,r3 ;483
0000f4 eaffffe0 B |L1.124|
|L1.248|
0000f8 e3130040 TST r3,#0x40 ;485
0000fc 0affffe1 BEQ |L1.136|
000100 e1a00a83 LSL r0,r3,#21 ;486
000104 e1a00aa0 LSR r0,r0,#21 ;486
000108 e59f5c18 LDR r5,|L1.3368|
00010c e5850038 STR r0,[r5,#0x38] ;486
000110 e1a00000 MOV r0,r0 ;487
|L1.276|
000114 e1a00000 MOV r0,r0 ;481
000118 e59f0c08 LDR r0,|L1.3368|
00011c e5900010 LDR r0,[r0,#0x10] ;490
000120 e200003f AND r0,r0,#0x3f ;490
000124 e150000e CMP r0,lr ;490
000128 0a000009 BEQ |L1.340|
00012c e35e0001 CMP lr,#1 ;491
000130 0a000007 BEQ |L1.340|
000134 e35e0029 CMP lr,#0x29 ;492
000138 0a000005 BEQ |L1.340|
00013c e35e0002 CMP lr,#2 ;493
000140 0a000003 BEQ |L1.340|
000144 e35e0009 CMP lr,#9 ;494
000148 0a000001 BEQ |L1.340|
00014c e3e00000 MVN r0,#0 ;495
000150 eaffffc9 B |L1.124|
|L1.340|
000154 e35c0000 CMP r12,#0 ;498
000158 1a000001 BNE |L1.356|
00015c e3e00000 MVN r0,#0 ;500
000160 eaffffc5 B |L1.124|
|L1.356|
000164 e59f0bbc LDR r0,|L1.3368|
000168 e5900014 LDR r0,[r0,#0x14] ;503
00016c e58c0000 STR r0,[r12,#0] ;503
000170 e3520002 CMP r2,#2 ;504
000174 1a000008 BNE |L1.412|
000178 e59f0ba8 LDR r0,|L1.3368|
00017c e5900018 LDR r0,[r0,#0x18] ;505
000180 e58c0004 STR r0,[r12,#4] ;505
000184 e59f0b9c LDR r0,|L1.3368|
000188 e590001c LDR r0,[r0,#0x1c] ;506
00018c e58c0008 STR r0,[r12,#8] ;506
000190 e59f0b90 LDR r0,|L1.3368|
000194 e5900020 LDR r0,[r0,#0x20] ;507
000198 e58c000c STR r0,[r12,#0xc] ;507
|L1.412|
00019c e3a00000 MOV r0,#0 ;509
0001a0 eaffffb5 B |L1.124|
;;;511
ENDP
mci_set_block_len PROC
;;;318
;;;319 static BOOL mci_set_block_len (void) {
0001a4 e92d4038 PUSH {r3-r5,lr}
;;;320 /* Set block length to 512 bytes. */
;;;321 U32 i,rstat,rval;
;;;322
;;;323 for (i = 0; i < 20; i++) {
0001a8 e3a05000 MOV r5,#0
0001ac ea00000f B |L1.496|
|L1.432|
;;;324 /* Send ACMD6 command to set the bus width. */
;;;325 rstat = mci_command (SET_BLOCK_LEN, 512, RESP_SHORT, &rval);
0001b0 e28d3000 ADD r3,sp,#0
0001b4 e3a02001 MOV r2,#1
0001b8 e3a01c02 MOV r1,#0x200
0001bc e3a00010 MOV r0,#0x10
0001c0 ebfffffe BL mci_command
0001c4 e1a04000 MOV r4,r0
;;;326 if (rstat == 0 && (rval & 0x0F00) == 0x0900) {
0001c8 e3540000 CMP r4,#0
0001cc 1a000006 BNE |L1.492|
0001d0 e59d0000 LDR r0,[sp,#0]
0001d4 e2000c0f AND r0,r0,#0xf00
0001d8 e3500c09 CMP r0,#0x900
0001dc 1a000002 BNE |L1.492|
;;;327 /* Response is back and correct. */
;;;328 return (__TRUE);
0001e0 e3a00001 MOV r0,#1
|L1.484|
0001e4 e8bd4038 POP {r3-r5,lr}
;;;329 }
;;;330 }
;;;331 return (__FALSE);
;;;332 }
0001e8 e12fff1e BX lr
|L1.492|
0001ec e2855001 ADD r5,r5,#1 ;323
|L1.496|
0001f0 e3550014 CMP r5,#0x14 ;323
0001f4 3affffed BCC |L1.432|
0001f8 e3a00000 MOV r0,#0 ;331
0001fc eafffff8 B |L1.484|
;;;333
ENDP
mci_send_acmd PROC
;;;205
;;;206 static BOOL mci_send_acmd (void) {
000200 e92d4038 PUSH {r3-r5,lr}
;;;207 /* Send CMD55 to enable ACMD */
;;;208 U32 arg,rstat,rval;
;;;209
;;;210 arg = 0;
000204 e3a05000 MOV r5,#0
;;;211 if (CardType == CARD_SD) {
000208 e59f0b20 LDR r0,|L1.3376|
00020c e5d00000 LDRB r0,[r0,#0] ; CardType
000210 e3500002 CMP r0,#2
000214 1a000002 BNE |L1.548|
;;;212 /* Use address from SET_RELATIVE_ADDR. */
;;;213 arg = CardRCA << 16;
000218 e59f0b14 LDR r0,|L1.3380|
00021c e1d000b0 LDRH r0,[r0,#0] ; CardRCA
000220 e1a05800 LSL r5,r0,#16
|L1.548|
;;;214 }
;;;215 rstat = mci_command (APP_CMD, arg, RESP_SHORT, &rval);
000224 e28d3000 ADD r3,sp,#0
000228 e3a02001 MOV r2,#1
00022c e1a01005 MOV r1,r5
000230 e3a00037 MOV r0,#0x37
000234 ebfffffe BL mci_command
000238 e1a04000 MOV r4,r0
;;;216 if (rstat == 0 && (rval & STAT_ACMD_ENABLE)) {
00023c e3540000 CMP r4,#0
000240 1a000005 BNE |L1.604|
000244 e59d0000 LDR r0,[sp,#0]
000248 e3100020 TST r0,#0x20
00024c 0a000002 BEQ |L1.604|
;;;217 return (__TRUE);
000250 e3a00001 MOV r0,#1
|L1.596|
000254 e8bd4038 POP {r3-r5,lr}
;;;218 }
;;;219 return (__FALSE);
;;;220 }
000258 e12fff1e BX lr
|L1.604|
00025c e3a00000 MOV r0,#0 ;219
000260 eafffffb B |L1.596|
;;;221
ENDP
mci_set_bus_4bit PROC
;;;297
;;;298 static BOOL mci_set_bus_4bit (void) {
000264 e92d4038 PUSH {r3-r5,lr}
;;;299 /* Select 4-bit bus width for SD Card. */
;;;300 U32 i,rstat,rval;
;;;301
;;;302 for (i = 0; i < 20; i++) {
000268 e3a05000 MOV r5,#0
00026c ea000014 B |L1.708|
|L1.624|
;;;303 if (mci_send_acmd () == __FALSE) {
000270 ebfffffe BL mci_send_acmd
000274 e3500000 CMP r0,#0
000278 1a000000 BNE |L1.640|
;;;304 continue;
00027c ea00000f B |L1.704|
|L1.640|
;;;305 }
;;;306 /* Send ACMD6 command to set the bus width. */
;;;307 rstat = mci_command (SET_ACMD_BUS_WIDTH, BUS_WIDTH_4BITS, RESP_SHORT, &rval);
000280 e28d3000 ADD r3,sp,#0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -