⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mci_lpc23xx.txt

📁 工厂环境污染控制数据采集器
💻 TXT
📖 第 1 页 / 共 5 页
字号:
; 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 + -