📄 mci_lpc23xx.txt
字号:
;;;345 }
;;;346 block *= 512;
0007c4 e1a04484 LSL r4,r4,#9
;;;347 for (i = 0; i < 20; i++) {
0007c8 e3a06000 MOV r6,#0
0007cc ea00000f B |L1.2064|
|L1.2000|
;;;348 rstat = mci_command (cmd, block, RESP_SHORT, &rval);
0007d0 e28d3000 ADD r3,sp,#0
0007d4 e3a02001 MOV r2,#1
0007d8 e1a01004 MOV r1,r4
0007dc e1a00008 MOV r0,r8
0007e0 ebfffffe BL mci_command
0007e4 e1a07000 MOV r7,r0
;;;349 if (rstat == 0 && (rval & 0x0F00) == 0x0900) {
0007e8 e3570000 CMP r7,#0
0007ec 1a000006 BNE |L1.2060|
0007f0 e59d0000 LDR r0,[sp,#0]
0007f4 e2000c0f AND r0,r0,#0xf00
0007f8 e3500c09 CMP r0,#0x900
0007fc 1a000002 BNE |L1.2060|
;;;350 /* Ready and in TRAN state. */
;;;351 return (__TRUE);
000800 e3a00001 MOV r0,#1
|L1.2052|
000804 e8bd41f8 POP {r3-r8,lr}
;;;352 }
;;;353 }
;;;354 return (__FALSE);
;;;355 }
000808 e12fff1e BX lr
|L1.2060|
00080c e2866001 ADD r6,r6,#1 ;347
|L1.2064|
000810 e3560014 CMP r6,#0x14 ;347
000814 3affffed BCC |L1.2000|
000818 e3a00000 MOV r0,#0 ;354
00081c eafffff8 B |L1.2052|
;;;356
ENDP
mci_cmd_write_block PROC
;;;359
;;;360 static BOOL mci_cmd_write_block (U32 block, U32 cnt) {
000820 e92d41f8 PUSH {r3-r8,lr}
000824 e1a04000 MOV r4,r0
000828 e1a05001 MOV r5,r1
;;;361 /* Send a command to Write Single/Multiple block. */
;;;362 U32 i,rstat,rval;
;;;363 U8 cmd;
;;;364
;;;365 cmd = WRITE_BLOCK;
00082c e3a08018 MOV r8,#0x18
;;;366 if (cnt > 1) {
000830 e3550001 CMP r5,#1
000834 9a000000 BLS |L1.2108|
;;;367 cmd = WRITE_MULT_BLOCK;
000838 e3a08019 MOV r8,#0x19
|L1.2108|
;;;368 }
;;;369 block *= 512;
00083c e1a04484 LSL r4,r4,#9
;;;370 for (i = 0; i < 20; i++) {
000840 e3a06000 MOV r6,#0
000844 ea00000f B |L1.2184|
|L1.2120|
;;;371 rstat = mci_command (cmd, block, RESP_SHORT, &rval);
000848 e28d3000 ADD r3,sp,#0
00084c e3a02001 MOV r2,#1
000850 e1a01004 MOV r1,r4
000854 e1a00008 MOV r0,r8
000858 ebfffffe BL mci_command
00085c e1a07000 MOV r7,r0
;;;372 if (rstat == 0 && (rval & 0x0F00) == 0x0900) {
000860 e3570000 CMP r7,#0
000864 1a000006 BNE |L1.2180|
000868 e59d0000 LDR r0,[sp,#0]
00086c e2000c0f AND r0,r0,#0xf00
000870 e3500c09 CMP r0,#0x900
000874 1a000002 BNE |L1.2180|
;;;373 /* Ready and in TRAN state. */
;;;374 return (__TRUE);
000878 e3a00001 MOV r0,#1
|L1.2172|
00087c e8bd41f8 POP {r3-r8,lr}
;;;375 }
;;;376 }
;;;377 return (__FALSE);
;;;378 }
000880 e12fff1e BX lr
|L1.2180|
000884 e2866001 ADD r6,r6,#1 ;370
|L1.2184|
000888 e3560014 CMP r6,#0x14 ;370
00088c 3affffed BCC |L1.2120|
000890 e3a00000 MOV r0,#0 ;377
000894 eafffff8 B |L1.2172|
;;;379
ENDP
mci_read_status PROC
;;;382
;;;383 static U32 mci_read_status (void) {
000898 e92d4078 PUSH {r3-r6,lr}
;;;384 /* Read the status of Flash Card. */
;;;385 U32 i,arg,rstat,rval;
;;;386
;;;387 arg = 0x00010000;
00089c e3a06801 MOV r6,#0x10000
;;;388 if (CardType == CARD_SD) {
0008a0 e59f0488 LDR r0,|L1.3376|
0008a4 e5d00000 LDRB r0,[r0,#0] ; CardType
0008a8 e3500002 CMP r0,#2
0008ac 1a000002 BNE |L1.2236|
;;;389 /* Use address from SET_RELATIVE_ADDR. */
;;;390 arg = CardRCA << 16;
0008b0 e59f047c LDR r0,|L1.3380|
0008b4 e1d000b0 LDRH r0,[r0,#0] ; CardRCA
0008b8 e1a06800 LSL r6,r0,#16
|L1.2236|
;;;391 }
;;;392
;;;393 for (i = 0; i < 200; i++) {
0008bc e3a04000 MOV r4,#0
0008c0 ea00000e B |L1.2304|
|L1.2244|
;;;394 rstat = mci_command (SEND_STATUS, arg, RESP_SHORT, &rval);
0008c4 e28d3000 ADD r3,sp,#0
0008c8 e3a02001 MOV r2,#1
0008cc e1a01006 MOV r1,r6
0008d0 e3a0000d MOV r0,#0xd
0008d4 ebfffffe BL mci_command
0008d8 e1a05000 MOV r5,r0
;;;395 if (rstat == 0 && (rval & 0x0100)) {
0008dc e3550000 CMP r5,#0
0008e0 1a000005 BNE |L1.2300|
0008e4 e59d0000 LDR r0,[sp,#0]
0008e8 e3100c01 TST r0,#0x100
0008ec 0a000002 BEQ |L1.2300|
;;;396 /* The Ready bit should be set, state TRAN or RCV. */
;;;397 return (rval);
0008f0 e59d0000 LDR r0,[sp,#0]
|L1.2292|
0008f4 e8bd4078 POP {r3-r6,lr}
;;;398 }
;;;399 }
;;;400 return (MCI_RESP_INVALID);
;;;401 }
0008f8 e12fff1e BX lr
|L1.2300|
0008fc e2844001 ADD r4,r4,#1 ;393
|L1.2304|
000900 e35400c8 CMP r4,#0xc8 ;393
000904 3affffee BCC |L1.2244|
000908 e3e00000 MVN r0,#0 ;400
00090c eafffff8 B |L1.2292|
;;;402
ENDP
mci_send_stop PROC
;;;405
;;;406 static BOOL mci_send_stop (void) {
000910 e92d4038 PUSH {r3-r5,lr}
;;;407 /* Stop transmission, Flash Card is in wrong state. */
;;;408 U32 i,rstat,rval;
;;;409
;;;410 for (i = 0; i < 20; i++) {
000914 e3a05000 MOV r5,#0
000918 ea00000e B |L1.2392|
|L1.2332|
;;;411 rstat = mci_command (STOP_TRANSMISSION, 0, RESP_SHORT, &rval);
00091c e28d3000 ADD r3,sp,#0
000920 e3a02001 MOV r2,#1
000924 e3a01000 MOV r1,#0
000928 e3a0000c MOV r0,#0xc
00092c ebfffffe BL mci_command
000930 e1a04000 MOV r4,r0
;;;412 if (rstat == 0 && (rval & 0x0100)) {
000934 e3540000 CMP r4,#0
000938 1a000005 BNE |L1.2388|
00093c e59d0000 LDR r0,[sp,#0]
000940 e3100c01 TST r0,#0x100
000944 0a000002 BEQ |L1.2388|
;;;413 /* The Ready bit should be set. */
;;;414 return (__TRUE);
000948 e3a00001 MOV r0,#1
|L1.2380|
00094c e8bd4038 POP {r3-r5,lr}
;;;415 }
;;;416 }
;;;417 return (__FALSE);
;;;418 }
000950 e12fff1e BX lr
|L1.2388|
000954 e2855001 ADD r5,r5,#1 ;410
|L1.2392|
000958 e3550014 CMP r5,#0x14 ;410
00095c 3affffee BCC |L1.2332|
000960 e3a00000 MOV r0,#0 ;417
000964 eafffff8 B |L1.2380|
;;;419
ENDP
mci_wait_for_tran PROC
;;;422
;;;423 static BOOL mci_wait_for_tran (void) {
000968 e92d4010 PUSH {r4,lr}
;;;424 /* Wait for Card state TRAN. */
;;;425 U32 i;
;;;426
;;;427 for (i = WR_TOUT; i; i--) {
00096c e59f43d8 LDR r4,|L1.3404|
000970 ea000005 B |L1.2444|
|L1.2420|
;;;428 /* Wait for Card state TRAN to continue. */
;;;429 if ((mci_read_status () & 0x0F00) == 0x0900) {
000974 ebfffffe BL mci_read_status
000978 e2000c0f AND r0,r0,#0xf00
00097c e3500c09 CMP r0,#0x900
000980 1a000000 BNE |L1.2440|
;;;430 break;
000984 ea000002 B |L1.2452|
|L1.2440|
000988 e2444001 SUB r4,r4,#1 ;427
|L1.2444|
00098c e3540000 CMP r4,#0 ;427
000990 1afffff7 BNE |L1.2420|
|L1.2452|
000994 e1a00000 MOV r0,r0
;;;431 }
;;;432 }
;;;433 if (i == 0) {
000998 e3540000 CMP r4,#0
00099c 1a000003 BNE |L1.2480|
;;;434 /* Previous request has Failed. */
;;;435 mci_send_stop ();
0009a0 ebfffffe BL mci_send_stop
;;;436 return (__FALSE);
0009a4 e3a00000 MOV r0,#0
|L1.2472|
0009a8 e8bd4010 POP {r4,lr}
;;;437 }
;;;438 return (__TRUE);
;;;439 }
0009ac e12fff1e BX lr
|L1.2480|
0009b0 e3a00001 MOV r0,#1 ;438
0009b4 eafffffb B |L1.2472|
;;;440
ENDP
mci_dma_start PROC
;;;517
;;;518 if (mode == DMA_READ) {
0009b8 e3500000 CMP r0,#0
0009bc 1a000009 BNE |L1.2536|
;;;519 /* Transfer from MCI-FIFO to memory. */
;;;520 GPDMA_CH0_SRC = (U32)&MCI_FIFO;
0009c0 e59f2388 LDR r2,|L1.3408|
0009c4 e59f3388 LDR r3,|L1.3412|
0009c8 e5832100 STR r2,[r3,#0x100]
;;;521 GPDMA_CH0_DEST = (U32)buf;
0009cc e00327c2 AND r2,r3,r2,ASR #15
0009d0 e5821104 STR r1,[r2,#0x104]
;;;522 /* The burst size set to 8, transfer size 512 bytes. */
;;;523 GPDMA_CH0_CTRL = (512 >> 2) | (0x02 << 12) | (0x02 << 15) |
0009d4 e59f237c LDR r2,|L1.3416|
0009d8 e583210c STR r2,[r3,#0x10c]
;;;524 (0x02 << 18) | (0x02 << 21) | (1 << 27) | (1u << 31);
;;;525 GPDMA_CH0_CFG = 0x10001 | (0x04 << 1) | (0x00 << 6) | (0x06 << 11);
0009dc e59f2378 LDR r2,|L1.3420|
0009e0 e5832110 STR r2,[r3,#0x110]
0009e4 ea000008 B |L1.2572|
|L1.2536|
;;;526 }
;;;527 else {
;;;528 /* Transfer from memory to MCI-FIFO. */
;;;529 GPDMA_CH0_SRC = (U32)buf;
0009e8 e59f2364 LDR r2,|L1.3412|
0009ec e5821100 STR r1,[r2,#0x100]
;;;530 GPDMA_CH0_DEST = (U32)&MCI_FIFO;
0009f0 e59f2358 LDR r2,|L1.3408|
0009f4 e59f3358 LDR r3,|L1.3412|
0009f8 e5832104 STR r2,[r3,#0x104]
;;;531 /* The burst size set to 8, transfer size 512 bytes. */
;;;532 GPDMA_CH0_CTRL = (512 >> 2) | (0x02 << 12) | (0x02 << 15) |
0009fc e59f235c LDR r2,|L1.3424|
000a00 e583210c STR r2,[r3,#0x10c]
;;;533 (0x02 << 18) | (0x02 << 21) | (1 << 26) | (1u << 31);
;;;534 GPDMA_CH0_CFG = 0x10001 | (0x00 << 1) | (0x04 << 6) | (0x05 << 11);
000a04 e59f2358 LDR r2,|L1.3428|
000a08 e5832110 STR r2,[r3,#0x110]
|L1.2572|
;;;535 }
;;;536 /* Enable DMA channels, little endian */
;;;537 GPDMA_INT_TCCLR = 0x01;
000a0c e3a02001 MOV r2,#1
000a10 e59f333c LDR r3,|L1.3412|
000a14 e5832008 STR r2,[r3,#8]
;;;538 GPDMA_CONFIG = 0x01;
000a18 e5832030 STR r2,[r3,#0x30]
;;;539 }
000a1c e12fff1e BX lr
;;;540
ENDP
mmc_read_sect PROC
;;;543
;;;544 BOOL mci_read_sect (U32 sect, U8 *buf, U32 cnt) {
000a20 e92d40f0 PUSH {r4-r7,lr}
000a24 e1a04000 MOV r4,r0
000a28 e1a05001 MOV r5,r1
000a2c e1a06002 MOV r6,r2
;;;545 /* Read one or more 512 byte sectors from Flash Card. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -