📄 mci_lpc23xx.txt
字号:
000284 e3a02001 MOV r2,#1
000288 e3a0100a MOV r1,#0xa
00028c e3a00006 MOV r0,#6
000290 ebfffffe BL mci_command
000294 e1a04000 MOV r4,r0
;;;308 if (rstat == 0 && (rval & 0x0F00) == 0x0900) {
000298 e3540000 CMP r4,#0
00029c 1a000006 BNE |L1.700|
0002a0 e59d0000 LDR r0,[sp,#0]
0002a4 e2000c0f AND r0,r0,#0xf00
0002a8 e3500c09 CMP r0,#0x900
0002ac 1a000002 BNE |L1.700|
;;;309 /* Response is back and correct. */
;;;310 return (__TRUE);
0002b0 e3a00001 MOV r0,#1
|L1.692|
0002b4 e8bd4038 POP {r3-r5,lr}
;;;311 }
;;;312 }
;;;313 return (__FALSE);
;;;314 }
0002b8 e12fff1e BX lr
|L1.700|
0002bc e1a00000 MOV r0,r0 ;304
|L1.704|
0002c0 e2855001 ADD r5,r5,#1 ;302
|L1.708|
0002c4 e3550014 CMP r5,#0x14 ;302
0002c8 3affffe8 BCC |L1.624|
0002cc e3a00000 MOV r0,#0 ;313
0002d0 eafffff7 B |L1.692|
;;;315
ENDP
mci_select_card PROC
;;;273
;;;274 static BOOL mci_select_card (void) {
0002d4 e92d4078 PUSH {r3-r6,lr}
;;;275 /* Select the Card, send CMD7 after CMD9, inter-change state */
;;;276 /* between STBY and TRANS after this command. */
;;;277 U32 i,arg,rstat,rval;
;;;278
;;;279 arg = 0x00010000;
0002d8 e3a06801 MOV r6,#0x10000
;;;280 if (CardType == CARD_SD) {
0002dc e59f0a4c LDR r0,|L1.3376|
0002e0 e5d00000 LDRB r0,[r0,#0] ; CardType
0002e4 e3500002 CMP r0,#2
0002e8 1a000002 BNE |L1.760|
;;;281 /* Use address from SET_RELATIVE_ADDR. */
;;;282 arg = CardRCA << 16;
0002ec e59f0a40 LDR r0,|L1.3380|
0002f0 e1d000b0 LDRH r0,[r0,#0] ; CardRCA
0002f4 e1a06800 LSL r6,r0,#16
|L1.760|
;;;283 }
;;;284
;;;285 for (i = 0; i < 200; i++) {
0002f8 e3a04000 MOV r4,#0
0002fc ea00000f B |L1.832|
|L1.768|
;;;286 rstat = mci_command (SELECT_CARD, arg, RESP_SHORT, &rval);
000300 e28d3000 ADD r3,sp,#0
000304 e3a02001 MOV r2,#1
000308 e1a01006 MOV r1,r6
00030c e3a00007 MOV r0,#7
000310 ebfffffe BL mci_command
000314 e1a05000 MOV r5,r0
;;;287 if (rstat == 0 && (rval & 0x0F00) == 0x0700) {
000318 e3550000 CMP r5,#0
00031c 1a000006 BNE |L1.828|
000320 e59d0000 LDR r0,[sp,#0]
000324 e2000c0f AND r0,r0,#0xf00
000328 e3500c07 CMP r0,#0x700
00032c 1a000002 BNE |L1.828|
;;;288 /* Should be in STBY state now and ready. */
;;;289 return (__TRUE);
000330 e3a00001 MOV r0,#1
|L1.820|
000334 e8bd4078 POP {r3-r6,lr}
;;;290 }
;;;291 }
;;;292 return (__FALSE);
;;;293 }
000338 e12fff1e BX lr
|L1.828|
00033c e2844001 ADD r4,r4,#1 ;285
|L1.832|
000340 e35400c8 CMP r4,#0xc8 ;285
000344 3affffed BCC |L1.768|
000348 e3a00000 MOV r0,#0 ;292
00034c eafffff8 B |L1.820|
;;;294
ENDP
mci_set_speed PROC
;;;171
;;;172 if (speed == HIGH_SPEED) {
000350 e3500001 CMP r0,#1
000354 1a000001 BNE |L1.864|
;;;173 /* Max. 25 MBit used for Data Transfer. */
;;;174 clkdiv = 0;
000358 e3a02000 MOV r2,#0
00035c ea000000 B |L1.868|
|L1.864|
;;;175 }
;;;176 else {
;;;177 /* Max. 400 kBit used in Card Initialization. */
;;;178 clkdiv = 240;
000360 e3a020f0 MOV r2,#0xf0
|L1.868|
;;;179 }
;;;180 MCI_CLOCK = (MCI_CLOCK & ~0xFF) | 0x300 | clkdiv;
000364 e59f39bc LDR r3,|L1.3368|
000368 e5933004 LDR r3,[r3,#4]
00036c e3c330ff BIC r3,r3,#0xff
000370 e3833c03 ORR r3,r3,#0x300
000374 e1833002 ORR r3,r3,r2
000378 e59fc9a8 LDR r12,|L1.3368|
00037c e58c3004 STR r3,[r12,#4]
;;;181
;;;182 /* delay 3MCLK + 2PCLK before next write */
;;;183 for ( i = 0; i < 100; i++ );
000380 e3a01000 MOV r1,#0
000384 ea000000 B |L1.908|
|L1.904|
000388 e2811001 ADD r1,r1,#1
|L1.908|
00038c e3510064 CMP r1,#0x64
000390 3afffffc BCC |L1.904|
;;;184 }
000394 e12fff1e BX lr
;;;185
ENDP
mci_bus_mode PROC
;;;192
;;;193 if (mode == OPEN_DRAIN_MODE) {
000398 e3500000 CMP r0,#0
00039c 1a000005 BNE |L1.952|
;;;194 MCI_POWER |= 0x40;
0003a0 e59f2980 LDR r2,|L1.3368|
0003a4 e5922000 LDR r2,[r2,#0]
0003a8 e3822040 ORR r2,r2,#0x40
0003ac e59f3974 LDR r3,|L1.3368|
0003b0 e5832000 STR r2,[r3,#0]
0003b4 ea000004 B |L1.972|
|L1.952|
;;;195 }
;;;196 else {
;;;197 MCI_POWER &= ~0x40;
0003b8 e59f2968 LDR r2,|L1.3368|
0003bc e5922000 LDR r2,[r2,#0]
0003c0 e3c22040 BIC r2,r2,#0x40
0003c4 e59f395c LDR r3,|L1.3368|
0003c8 e5832000 STR r2,[r3,#0]
|L1.972|
;;;198 }
;;;199 /* A small delay after switching mode. */
;;;200 for (i = 0; i < 100; i++);
0003cc e3a01000 MOV r1,#0
0003d0 ea000000 B |L1.984|
|L1.980|
0003d4 e2811001 ADD r1,r1,#1
|L1.984|
0003d8 e3510064 CMP r1,#0x64
0003dc 3afffffc BCC |L1.980|
;;;201 }
0003e0 e12fff1e BX lr
;;;202
ENDP
mci_set_address PROC
;;;224
;;;225 static BOOL mci_set_address (void) {
0003e4 e92d4078 PUSH {r3-r6,lr}
;;;226 /* Set Relative Address, send CMD3 after CMD2. */
;;;227 U32 i,arg,rstat,rval;
;;;228
;;;229 arg = 0;
0003e8 e3a06000 MOV r6,#0
;;;230 if (CardType == CARD_MMC) {
0003ec e59f093c LDR r0,|L1.3376|
0003f0 e5d00000 LDRB r0,[r0,#0] ; CardType
0003f4 e3500001 CMP r0,#1
0003f8 1a000000 BNE |L1.1024|
;;;231 /* Fix the RCA address for MMC card. */
;;;232 arg = 0x00010000;
0003fc e3a06801 MOV r6,#0x10000
|L1.1024|
;;;233 }
;;;234
;;;235 for (i = 0; i < 20; i++) {
000400 e3a04000 MOV r4,#0
000404 ea000014 B |L1.1116|
|L1.1032|
;;;236 rstat = mci_command (SET_RELATIVE_ADDR, arg, RESP_SHORT, &rval);
000408 e28d3000 ADD r3,sp,#0
00040c e3a02001 MOV r2,#1
000410 e1a01006 MOV r1,r6
000414 e3a00003 MOV r0,#3
000418 ebfffffe BL mci_command
00041c e1a05000 MOV r5,r0
;;;237 if (!(rstat & MCI_CMD_TIMEOUT) && (rval & 0x0F00) == 0x0500) {
000420 e3150004 TST r5,#4
000424 1a00000b BNE |L1.1112|
000428 e59d0000 LDR r0,[sp,#0]
00042c e2000c0f AND r0,r0,#0xf00
000430 e3500c05 CMP r0,#0x500
000434 1a000007 BNE |L1.1112|
;;;238 /* Response is back and correct. */
;;;239 CardRCA = rval >> 16;
000438 e59d0000 LDR r0,[sp,#0]
00043c e59f18f4 LDR r1,|L1.3384|
000440 e0010820 AND r0,r1,r0,LSR #16
000444 e59f18e8 LDR r1,|L1.3380|
000448 e1c100b0 STRH r0,[r1,#0] ; CardRCA
;;;240 return (__TRUE);
00044c e3a00001 MOV r0,#1
|L1.1104|
000450 e8bd4078 POP {r3-r6,lr}
;;;241 }
;;;242 }
;;;243 return (__FALSE);
;;;244 }
000454 e12fff1e BX lr
|L1.1112|
000458 e2844001 ADD r4,r4,#1 ;235
|L1.1116|
00045c e3540014 CMP r4,#0x14 ;235
000460 3affffe8 BCC |L1.1032|
000464 e3a00000 MOV r0,#0 ;243
000468 eafffff8 B |L1.1104|
;;;245
ENDP
mci_read_cid PROC
;;;248
;;;249 static BOOL mci_read_cid (void) {
00046c e92d403f PUSH {r0-r5,lr}
;;;250 /* Check CID, send CMD2 after CMD1 (MMC) or ACMD41 (SD). */
;;;251 U32 i,rstat,rval[4];
;;;252
;;;253 for (i = 0; i < 20; i++) {
000470 e3a05000 MOV r5,#0
000474 ea00001d B |L1.1264|
|L1.1144|
;;;254 rstat = mci_command (ALL_SEND_CID, 0, RESP_LONG, &rval[0]);
000478 e28d3000 ADD r3,sp,#0
00047c e3a02002 MOV r2,#2
000480 e3a01000 MOV r1,#0
000484 e1a00002 MOV r0,r2
000488 ebfffffe BL mci_command
00048c e1a04000 MOV r4,r0
;;;255 if (!(rstat & MCI_CMD_TIMEOUT)) {
000490 e3140004 TST r4,#4
000494 1a000014 BNE |L1.1260|
;;;256 /* Response is back and correct. */
;;;257 if (CardType == CARD_SD) {
000498 e59f0890 LDR r0,|L1.3376|
00049c e5d00000 LDRB r0,[r0,#0] ; CardType
0004a0 e3500002 CMP r0,#2
0004a4 1a000006 BNE |L1.1220|
;;;258 /* Serial Number for SD Card. */
;;;259 sernum = (rval[2] << 8) | (rval[3] >> 24);
0004a8 e59d0008 LDR r0,[sp,#8]
0004ac e1a00400 LSL r0,r0,#8
0004b0 e59d100c LDR r1,[sp,#0xc]
0004b4 e1800c21 ORR r0,r0,r1,LSR #24
0004b8 e59f187c LDR r1,|L1.3388|
0004bc e5810000 STR r0,[r1,#0] ; sernum
0004c0 ea000005 B |L1.1244|
|L1.1220|
;;;260 }
;;;261 else {
;;;262 /* Serial Number for MMC Card. */
;;;263 sernum = (rval[2] << 16) | (rval[3] >> 16);
0004c4 e59d0008 LDR r0,[sp,#8]
0004c8 e1a00800 LSL r0,r0,#16
0004cc e59d100c LDR r1,[sp,#0xc]
0004d0 e1800821 ORR r0,r0,r1,LSR #16
0004d4 e59f1860 LDR r1,|L1.3388|
0004d8 e5810000 STR r0,[r1,#0] ; sernum
|L1.1244|
;;;264 }
;;;265 return (__TRUE);
0004dc e3a00001 MOV r0,#1
|L1.1248|
0004e0 e28dd010 ADD sp,sp,#0x10
0004e4 e8bd4030 POP {r4,r5,lr}
;;;266 }
;;;267 }
;;;268 return (__FALSE);
;;;269 }
0004e8 e12fff1e BX lr
|L1.1260|
0004ec e2855001 ADD r5,r5,#1 ;253
|L1.1264|
0004f0 e3550014 CMP r5,#0x14 ;253
0004f4 3affffdf BCC |L1.1144|
0004f8 e3a00000 MOV r0,#0 ;268
0004fc eafffff7 B |L1.1248|
;;;270
ENDP
mmc_init PROC
;;;57
;;;58 BOOL mci_init (void) {
000500 e92d403f PUSH {r0-r5,lr}
;;;59 /* Initialize and enable the Flash Card. */
;;;60 U32 i,rstat,rval[4];
;;;61
;;;62 /* Power Up the MCI and DMA controller. */
;;;63 PCONP |= 0x30000000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -