📄 mci_lpc23xx.txt
字号:
000504 e59f0834 LDR r0,|L1.3392|
000508 e59000c4 LDR r0,[r0,#0xc4]
00050c e3800203 ORR r0,r0,#0x30000000
000510 e59f1828 LDR r1,|L1.3392|
000514 e58100c4 STR r0,[r1,#0xc4]
;;;64
;;;65 /* MCIPWR pin is active high. */
;;;66 /* Required for the silicon rev. 'B' and later. */
;;;67 SCS |= 0x08;
000518 e1a00001 MOV r0,r1
00051c e59001a0 LDR r0,[r0,#0x1a0]
000520 e3800008 ORR r0,r0,#8
000524 e58101a0 STR r0,[r1,#0x1a0]
;;;68
;;;69 /* Enable MCI Pins on P0,P2. */
;;;70 PINSEL1 &= ~0x00003FC0;
000528 e241081d SUB r0,r1,#0x1d0000
00052c e5900004 LDR r0,[r0,#4]
000530 e3c00dff BIC r0,r0,#0x3fc0
000534 e241181d SUB r1,r1,#0x1d0000
000538 e5810004 STR r0,[r1,#4]
;;;71 PINSEL1 |= 0x00002A80;
00053c e1a00001 MOV r0,r1
000540 e5900004 LDR r0,[r0,#4]
000544 e3800daa ORR r0,r0,#0x2a80
000548 e5810004 STR r0,[r1,#4]
;;;72 PINSEL4 &= ~0x0FC00000;
00054c e1a00001 MOV r0,r1
000550 e5900010 LDR r0,[r0,#0x10]
000554 e3c0053f BIC r0,r0,#0xfc00000
000558 e5810010 STR r0,[r1,#0x10]
;;;73 PINSEL4 |= 0x0A800000;
00055c e1a00001 MOV r0,r1
000560 e5900010 LDR r0,[r0,#0x10]
000564 e380052a ORR r0,r0,#0xa800000
000568 e5810010 STR r0,[r1,#0x10]
;;;74
;;;75 /* Clear all pending interrupts. */
;;;76 MCI_COMMAND = 0;
00056c e3a00000 MOV r0,#0
000570 e2811806 ADD r1,r1,#0x60000
000574 e581000c STR r0,[r1,#0xc]
;;;77 MCI_DATA_CTRL = 0;
000578 e581002c STR r0,[r1,#0x2c]
;;;78 MCI_CLEAR = 0x7FF;
00057c e59f07a8 LDR r0,|L1.3372|
000580 e5810038 STR r0,[r1,#0x38]
;;;79
;;;80 /* Power up, switch on VCC for the Flash Card. */
;;;81 MCI_POWER = 0x02;
000584 e3a00002 MOV r0,#2
000588 e5810000 STR r0,[r1,#0]
;;;82 for (i = 0; i < 50000; i++);
00058c e3a05000 MOV r5,#0
000590 ea000000 B |L1.1432|
|L1.1428|
000594 e2855001 ADD r5,r5,#1
|L1.1432|
000598 e59f07a4 LDR r0,|L1.3396|
00059c e1550000 CMP r5,r0
0005a0 3afffffb BCC |L1.1428|
;;;83
;;;84 mci_set_speed (LOW_SPEED);
0005a4 e3a00000 MOV r0,#0
0005a8 ebfffffe BL mci_set_speed
;;;85
;;;86 /* Power on the Flash Card. */
;;;87 MCI_POWER |= 0x01;
0005ac e59f0774 LDR r0,|L1.3368|
0005b0 e5900000 LDR r0,[r0,#0]
0005b4 e3800001 ORR r0,r0,#1
0005b8 e59f1768 LDR r1,|L1.3368|
0005bc e5810000 STR r0,[r1,#0]
;;;88 for (i = 0; i < 50000; i++);
0005c0 e3a05000 MOV r5,#0
0005c4 ea000000 B |L1.1484|
|L1.1480|
0005c8 e2855001 ADD r5,r5,#1
|L1.1484|
0005cc e59f0770 LDR r0,|L1.3396|
0005d0 e1550000 CMP r5,r0
0005d4 3afffffb BCC |L1.1480|
;;;89
;;;90 /* Reset the card, send CMD0. */
;;;91 mci_command (GO_IDLE_STATE, 0, RESP_NONE, NULL);
0005d8 e3a03000 MOV r3,#0
0005dc e1a02003 MOV r2,r3
0005e0 e1a01003 MOV r1,r3
0005e4 e1a00003 MOV r0,r3
0005e8 ebfffffe BL mci_command
;;;92
;;;93 /* Set Open Drain output control for MMC */
;;;94 mci_bus_mode (OPEN_DRAIN_MODE);
0005ec e3a00000 MOV r0,#0
0005f0 ebfffffe BL mci_bus_mode
;;;95
;;;96 CardType = CARD_NONE;
0005f4 e3a00000 MOV r0,#0
0005f8 e59f1730 LDR r1,|L1.3376|
0005fc e5c10000 STRB r0,[r1,#0] ; CardType
;;;97 /* First try MMC, send CMD1. */
;;;98 for (i = 0; i < 100; i++) {
000600 e3a05000 MOV r5,#0
000604 ea00000f B |L1.1608|
|L1.1544|
;;;99 rstat = mci_command (SEND_OP_COND, OCR_INDEX, RESP_SHORT, &rval[0]);
000608 e28d3000 ADD r3,sp,#0
00060c e3a02001 MOV r2,#1
000610 e59f1730 LDR r1,|L1.3400|
000614 e1a00002 MOV r0,r2
000618 ebfffffe BL mci_command
00061c e1a04000 MOV r4,r0
;;;100 if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
000620 e3140004 TST r4,#4
000624 1a000006 BNE |L1.1604|
000628 e59d0000 LDR r0,[sp,#0]
00062c e3100102 TST r0,#0x80000000
000630 0a000003 BEQ |L1.1604|
;;;101 CardType = CARD_MMC;
000634 e3a00001 MOV r0,#1
000638 e59f16f0 LDR r1,|L1.3376|
00063c e5c10000 STRB r0,[r1,#0] ; CardType
;;;102 break;
000640 ea000002 B |L1.1616|
|L1.1604|
000644 e2855001 ADD r5,r5,#1 ;98
|L1.1608|
000648 e3550064 CMP r5,#0x64 ;98
00064c 3affffed BCC |L1.1544|
|L1.1616|
000650 e1a00000 MOV r0,r0
;;;103 }
;;;104 }
;;;105
;;;106 if (CardType == CARD_NONE) {
000654 e59f06d4 LDR r0,|L1.3376|
000658 e5d00000 LDRB r0,[r0,#0] ; CardType
00065c e3500000 CMP r0,#0
000660 1a000019 BNE |L1.1740|
;;;107 /* Check for SD card, clear Open Drain output control. */
;;;108 mci_bus_mode (PUSH_PULL_MODE);
000664 e3a00001 MOV r0,#1
000668 ebfffffe BL mci_bus_mode
;;;109 for (i = 0; i < 500; i++) {
00066c e3a05000 MOV r5,#0
000670 ea000012 B |L1.1728|
|L1.1652|
;;;110 if (mci_send_acmd () == __TRUE) {
000674 ebfffffe BL mci_send_acmd
000678 e3500001 CMP r0,#1
00067c 1a00000e BNE |L1.1724|
;;;111 rstat = mci_command (SEND_APP_OP_COND,
000680 e28d3000 ADD r3,sp,#0
000684 e3a02001 MOV r2,#1
000688 e59f16b8 LDR r1,|L1.3400|
00068c e3a00029 MOV r0,#0x29
000690 ebfffffe BL mci_command
000694 e1a04000 MOV r4,r0
;;;112 OCR_INDEX, RESP_SHORT, &rval[0]);
;;;113 if (!(rstat & MCI_CMD_TIMEOUT) && rval[0] & 0x80000000) {
000698 e3140004 TST r4,#4
00069c 1a000006 BNE |L1.1724|
0006a0 e59d0000 LDR r0,[sp,#0]
0006a4 e3100102 TST r0,#0x80000000
0006a8 0a000003 BEQ |L1.1724|
;;;114 /* OK, SD card initialized. */
;;;115 CardType = CARD_SD;
0006ac e3a00002 MOV r0,#2
0006b0 e59f1678 LDR r1,|L1.3376|
0006b4 e5c10000 STRB r0,[r1,#0] ; CardType
;;;116 break;
0006b8 ea000002 B |L1.1736|
|L1.1724|
0006bc e2855001 ADD r5,r5,#1 ;109
|L1.1728|
0006c0 e3550f7d CMP r5,#0x1f4 ;109
0006c4 3affffea BCC |L1.1652|
|L1.1736|
0006c8 e1a00000 MOV r0,r0
|L1.1740|
;;;117 }
;;;118 }
;;;119 }
;;;120 }
;;;121 if (CardType == CARD_NONE) {
0006cc e59f065c LDR r0,|L1.3376|
0006d0 e5d00000 LDRB r0,[r0,#0] ; CardType
0006d4 e3500000 CMP r0,#0
0006d8 1a000000 BNE |L1.1760|
;;;122 /* Failed, no card found. */
;;;123 goto fail;
0006dc ea000029 B |L1.1928|
|L1.1760|
;;;124 }
;;;125
;;;126 /* Initialize the Card to SD/MMC mode. */
;;;127 if (mci_read_cid () == __FALSE) {
0006e0 ebfffffe BL mci_read_cid
0006e4 e3500000 CMP r0,#0
0006e8 1a000000 BNE |L1.1776|
;;;128 goto fail;
0006ec ea000025 B |L1.1928|
|L1.1776|
;;;129 }
;;;130 if (mci_set_address () == __FALSE) {
0006f0 ebfffffe BL mci_set_address
0006f4 e3500000 CMP r0,#0
0006f8 1a000000 BNE |L1.1792|
;;;131 goto fail;
0006fc ea000021 B |L1.1928|
|L1.1792|
;;;132 }
;;;133
;;;134 /* Disable Open Drain mode for MMC. */
;;;135 if (CardType == CARD_MMC) {
000700 e59f0628 LDR r0,|L1.3376|
000704 e5d00000 LDRB r0,[r0,#0] ; CardType
000708 e3500001 CMP r0,#1
00070c 1a000001 BNE |L1.1816|
;;;136 mci_bus_mode (PUSH_PULL_MODE);
000710 e3a00001 MOV r0,#1
000714 ebfffffe BL mci_bus_mode
|L1.1816|
;;;137 }
;;;138
;;;139 /* Data Transfer Mode, end of Card-Identification Mode. */
;;;140 mci_set_speed (HIGH_SPEED);
000718 e3a00001 MOV r0,#1
00071c ebfffffe BL mci_set_speed
;;;141
;;;142 if (mci_select_card () == __FALSE) {
000720 ebfffffe BL mci_select_card
000724 e3500000 CMP r0,#0
000728 1a000000 BNE |L1.1840|
;;;143 goto fail;
00072c ea000015 B |L1.1928|
|L1.1840|
;;;144 }
;;;145
;;;146 if (CardType == CARD_SD) {
000730 e59f05f8 LDR r0,|L1.3376|
000734 e5d00000 LDRB r0,[r0,#0] ; CardType
000738 e3500002 CMP r0,#2
00073c 1a00000d BNE |L1.1912|
;;;147 /* Use wide 4-bit bus for SD */
;;;148 MCI_CLOCK |= 0x0800;
000740 e59f05e0 LDR r0,|L1.3368|
000744 e5900004 LDR r0,[r0,#4]
000748 e3800b02 ORR r0,r0,#0x800
00074c e59f15d4 LDR r1,|L1.3368|
000750 e5810004 STR r0,[r1,#4]
;;;149 for (i = 0; i < 100; i++);
000754 e3a05000 MOV r5,#0
000758 ea000000 B |L1.1888|
|L1.1884|
00075c e2855001 ADD r5,r5,#1
|L1.1888|
000760 e3550064 CMP r5,#0x64
000764 3afffffc BCC |L1.1884|
;;;150 if (mci_set_bus_4bit () == __FALSE) {
000768 ebfffffe BL mci_set_bus_4bit
00076c e3500000 CMP r0,#0
000770 1a000000 BNE |L1.1912|
;;;151 /* Failed to enable 4-bit bus. */
;;;152 goto fail;
000774 ea000003 B |L1.1928|
|L1.1912|
;;;153 }
;;;154 }
;;;155 /* Set block length to 512 bytes. */
;;;156 if (mci_set_block_len () == __FALSE) {
000778 ebfffffe BL mci_set_block_len
00077c e3500000 CMP r0,#0
000780 1a000006 BNE |L1.1952|
;;;157 fail: MCI_POWER = 0x00;
000784 e1a00000 MOV r0,r0
|L1.1928|
000788 e3a00000 MOV r0,#0
00078c e59f1594 LDR r1,|L1.3368|
000790 e5810000 STR r0,[r1,#0]
|L1.1940|
;;;158 return (__FALSE);
000794 e28dd010 ADD sp,sp,#0x10
000798 e8bd4030 POP {r4,r5,lr}
;;;159 }
;;;160
;;;161 /* Success, card initialized. */
;;;162 return (__TRUE);
;;;163 }
00079c e12fff1e BX lr
|L1.1952|
0007a0 e3a00001 MOV r0,#1 ;162
0007a4 eafffffa B |L1.1940|
;;;164
ENDP
mci_cmd_read_block PROC
;;;336
;;;337 static BOOL mci_cmd_read_block (U32 block, U32 cnt) {
0007a8 e92d41f8 PUSH {r3-r8,lr}
0007ac e1a04000 MOV r4,r0
0007b0 e1a05001 MOV r5,r1
;;;338 /* Send a command to Read Single/Multiple blocks. */
;;;339 U32 i,rstat,rval;
;;;340 U8 cmd;
;;;341
;;;342 cmd = READ_BLOCK;
0007b4 e3a08011 MOV r8,#0x11
;;;343 if (cnt > 1) {
0007b8 e3550001 CMP r5,#1
0007bc 9a000000 BLS |L1.1988|
;;;344 cmd = READ_MULT_BLOCK;
0007c0 e3a08012 MOV r8,#0x12
|L1.1988|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -