📄 mci_lpc23xx.txt
字号:
;;;546 U32 i;
;;;547
;;;548 if (mci_wait_for_tran () == __FALSE) {
000a30 ebfffffe BL mci_wait_for_tran
000a34 e3500000 CMP r0,#0
000a38 1a000002 BNE |L1.2632|
;;;549 /* Card not in TRAN state. */
;;;550 return (__FALSE);
000a3c e3a00000 MOV r0,#0
|L1.2624|
000a40 e8bd40f0 POP {r4-r7,lr}
;;;551 }
;;;552
;;;553 if (mci_cmd_read_block (sect, cnt) == __FALSE) {
;;;554 /* Command Failed. */
;;;555 return (__FALSE);
;;;556 }
;;;557
;;;558 /* Set MCI Transfer registers. */
;;;559 MCI_DATA_TMR = DATA_RD_TOUT_VALUE;
;;;560 MCI_DATA_LEN = cnt * 512;
;;;561
;;;562 /* Start DMA Peripheral to Memory transfer. */
;;;563 mci_dma_start (DMA_READ, buf);
;;;564 MCI_DATA_CTRL = 0x9B;
;;;565
;;;566 for (i = DMA_TOUT; i; i--) {
;;;567 if (GPDMA_RAW_INT_TCSTAT & 0x01) {
;;;568 /* Data transfer finished. */
;;;569 break;
;;;570 }
;;;571 }
;;;572
;;;573 if (i == 0) {
;;;574 /* DMA Transfer timeout. */
;;;575 return (__FALSE);
;;;576 }
;;;577
;;;578 if (cnt > 1) {
;;;579 /* Stop reading Multiple sectors. */
;;;580 mci_send_stop ();
;;;581 }
;;;582 return (__TRUE);
;;;583 }
000a44 e12fff1e BX lr
|L1.2632|
000a48 e1a01006 MOV r1,r6 ;553
000a4c e1a00004 MOV r0,r4 ;553
000a50 ebfffffe BL mci_cmd_read_block
000a54 e3500000 CMP r0,#0 ;553
000a58 1a000001 BNE |L1.2660|
000a5c e3a00000 MOV r0,#0 ;555
000a60 eafffff6 B |L1.2624|
|L1.2660|
000a64 e59f02fc LDR r0,|L1.3432|
000a68 e59f12b8 LDR r1,|L1.3368|
000a6c e5810024 STR r0,[r1,#0x24] ;559
000a70 e1a00486 LSL r0,r6,#9 ;560
000a74 e5810028 STR r0,[r1,#0x28] ;560
000a78 e1a01005 MOV r1,r5 ;563
000a7c e3a00000 MOV r0,#0 ;563
000a80 ebfffffe BL mci_dma_start
000a84 e3a0009b MOV r0,#0x9b ;564
000a88 e59f1298 LDR r1,|L1.3368|
000a8c e581002c STR r0,[r1,#0x2c] ;564
000a90 e59f72d4 LDR r7,|L1.3436|
000a94 ea000005 B |L1.2736|
|L1.2712|
000a98 e59f02b4 LDR r0,|L1.3412|
000a9c e5900014 LDR r0,[r0,#0x14] ;567
000aa0 e3100001 TST r0,#1 ;567
000aa4 0a000000 BEQ |L1.2732|
000aa8 ea000002 B |L1.2744|
|L1.2732|
000aac e2477001 SUB r7,r7,#1 ;566
|L1.2736|
000ab0 e3570000 CMP r7,#0 ;566
000ab4 1afffff7 BNE |L1.2712|
|L1.2744|
000ab8 e1a00000 MOV r0,r0 ;569
000abc e3570000 CMP r7,#0 ;573
000ac0 1a000001 BNE |L1.2764|
000ac4 e3a00000 MOV r0,#0 ;575
000ac8 eaffffdc B |L1.2624|
|L1.2764|
000acc e3560001 CMP r6,#1 ;578
000ad0 9a000000 BLS |L1.2776|
000ad4 ebfffffe BL mci_send_stop
|L1.2776|
000ad8 e3a00001 MOV r0,#1 ;582
000adc eaffffd7 B |L1.2624|
;;;584
ENDP
mmc_write_sect PROC
;;;587
;;;588 BOOL mci_write_sect (U32 sect, U8 *buf, U32 cnt) {
000ae0 e92d41f0 PUSH {r4-r8,lr}
000ae4 e1a04000 MOV r4,r0
000ae8 e1a05001 MOV r5,r1
000aec e1a06002 MOV r6,r2
;;;589 /* Write a 512 byte sector to Flash Card. */
;;;590 U32 i,j;
;;;591
;;;592 if (mci_wait_for_tran () == __FALSE) {
000af0 ebfffffe BL mci_wait_for_tran
000af4 e3500000 CMP r0,#0
000af8 1a000002 BNE |L1.2824|
;;;593 /* Card not in TRAN state. */
;;;594 return (__FALSE);
000afc e3a00000 MOV r0,#0
|L1.2816|
000b00 e8bd41f0 POP {r4-r8,lr}
;;;595 }
;;;596
;;;597 if (mci_cmd_write_block (sect, cnt) == __FALSE) {
;;;598 /* Command Failed. */
;;;599 return (__FALSE);
;;;600 }
;;;601
;;;602 for (j = 0; j < cnt; buf += 512, j++) {
;;;603 /* Set MCI Transfer registers. */
;;;604 MCI_DATA_TMR = DATA_WR_TOUT_VALUE;
;;;605 MCI_DATA_LEN = 512;
;;;606
;;;607 /* Start DMA Memory to Peripheral transfer. */
;;;608 mci_dma_start (DMA_WRITE, buf);
;;;609 MCI_DATA_CTRL = 0x99;
;;;610
;;;611 for (i = DMA_TOUT; i; i--) {
;;;612 if (GPDMA_RAW_INT_TCSTAT & 0x01) {
;;;613 /* Data transfer finished. */
;;;614 break;
;;;615 }
;;;616 }
;;;617
;;;618 if (i == 0) {
;;;619 /* DMA Data Transfer timeout. */
;;;620 mci_send_stop ();
;;;621 /* Write request Failed. */
;;;622 return (__FALSE);
;;;623 }
;;;624
;;;625 if (cnt == 1) {
;;;626 return (__TRUE);
;;;627 }
;;;628
;;;629 /* Wait until Data Block sent to Card. */
;;;630 while (MCI_STATUS != (MCI_DATA_END | MCI_DATA_BLK_END)) {
;;;631 if (MCI_STATUS & (MCI_DATA_CRC_FAIL | MCI_DATA_TIMEOUT)) {
;;;632 /* If error while Data Block sending occured. */
;;;633 mci_send_stop ();
;;;634 /* Write request Failed. */
;;;635 return (__FALSE);
;;;636 }
;;;637 }
;;;638 for (i = WR_TOUT; i; i--) {
;;;639 if ((mci_read_status () & 0x0F00) == 0x0D00) {
;;;640 /* Buffer available for further sending, card state RCV. */
;;;641 break;
;;;642 }
;;;643 }
;;;644 }
;;;645 mci_send_stop ();
;;;646
;;;647 /* Write request Ok. */
;;;648 return (__TRUE);
;;;649 }
000b04 e12fff1e BX lr
|L1.2824|
000b08 e1a01006 MOV r1,r6 ;597
000b0c e1a00004 MOV r0,r4 ;597
000b10 ebfffffe BL mci_cmd_write_block
000b14 e3500000 CMP r0,#0 ;597
000b18 1a000001 BNE |L1.2852|
000b1c e3a00000 MOV r0,#0 ;599
000b20 eafffff6 B |L1.2816|
|L1.2852|
000b24 e3a08000 MOV r8,#0 ;602
000b28 ea000037 B |L1.3084|
|L1.2860|
000b2c e59f023c LDR r0,|L1.3440|
000b30 e59f11f0 LDR r1,|L1.3368|
000b34 e5810024 STR r0,[r1,#0x24] ;604
000b38 e3a00c02 MOV r0,#0x200 ;605
000b3c e5810028 STR r0,[r1,#0x28] ;605
000b40 e1a01005 MOV r1,r5 ;608
000b44 e3a00001 MOV r0,#1 ;608
000b48 ebfffffe BL mci_dma_start
000b4c e3a00099 MOV r0,#0x99 ;609
000b50 e59f11d0 LDR r1,|L1.3368|
000b54 e581002c STR r0,[r1,#0x2c] ;609
000b58 e59f720c LDR r7,|L1.3436|
000b5c ea000005 B |L1.2936|
|L1.2912|
000b60 e59f01ec LDR r0,|L1.3412|
000b64 e5900014 LDR r0,[r0,#0x14] ;612
000b68 e3100001 TST r0,#1 ;612
000b6c 0a000000 BEQ |L1.2932|
000b70 ea000002 B |L1.2944|
|L1.2932|
000b74 e2477001 SUB r7,r7,#1 ;611
|L1.2936|
000b78 e3570000 CMP r7,#0 ;611
000b7c 1afffff7 BNE |L1.2912|
|L1.2944|
000b80 e1a00000 MOV r0,r0 ;614
000b84 e3570000 CMP r7,#0 ;618
000b88 1a000002 BNE |L1.2968|
000b8c ebfffffe BL mci_send_stop
000b90 e3a00000 MOV r0,#0 ;622
000b94 eaffffd9 B |L1.2816|
|L1.2968|
000b98 e3560001 CMP r6,#1 ;625
000b9c 1a000001 BNE |L1.2984|
000ba0 e3a00001 MOV r0,#1 ;626
000ba4 eaffffd5 B |L1.2816|
|L1.2984|
000ba8 ea000006 B |L1.3016|
|L1.2988|
000bac e59f0174 LDR r0,|L1.3368|
000bb0 e5900034 LDR r0,[r0,#0x34] ;631
000bb4 e310000a TST r0,#0xa ;631
000bb8 0a000002 BEQ |L1.3016|
000bbc ebfffffe BL mci_send_stop
000bc0 e3a00000 MOV r0,#0 ;635
000bc4 eaffffcd B |L1.2816|
|L1.3016|
000bc8 e59f0158 LDR r0,|L1.3368|
000bcc e5900034 LDR r0,[r0,#0x34] ;630
000bd0 e3500c05 CMP r0,#0x500 ;630
000bd4 1afffff4 BNE |L1.2988|
000bd8 e59f716c LDR r7,|L1.3404|
000bdc ea000005 B |L1.3064|
|L1.3040|
000be0 ebfffffe BL mci_read_status
000be4 e2000c0f AND r0,r0,#0xf00 ;639
000be8 e3500c0d CMP r0,#0xd00 ;639
000bec 1a000000 BNE |L1.3060|
000bf0 ea000002 B |L1.3072|
|L1.3060|
000bf4 e2477001 SUB r7,r7,#1 ;638
|L1.3064|
000bf8 e3570000 CMP r7,#0 ;638
000bfc 1afffff7 BNE |L1.3040|
|L1.3072|
000c00 e1a00000 MOV r0,r0 ;641
000c04 e2855c02 ADD r5,r5,#0x200 ;602
000c08 e2888001 ADD r8,r8,#1 ;602
|L1.3084|
000c0c e1580006 CMP r8,r6 ;602
000c10 3affffc5 BCC |L1.2860|
000c14 ebfffffe BL mci_send_stop
000c18 e3a00001 MOV r0,#1 ;648
000c1c eaffffb7 B |L1.2816|
;;;650
ENDP
mmc_read_config PROC
;;;653
;;;654 BOOL mci_read_config (MMCFG *cfg) {
000c20 e92d43ff PUSH {r0-r9,lr}
000c24 e1a04000 MOV r4,r0
;;;655 /* Read MMC/SD Card device configuration. */
;;;656 U32 i,rstat,arg,v,m,rval[4];
;;;657
;;;658 /* Wait if potential Write in progress. */
;;;659 mci_wait_for_tran ();
000c28 ebfffffe BL mci_wait_for_tran
;;;660
;;;661 /* Deselect the Card, transit to STBY state. */
;;;662 mci_command (SELECT_CARD, 0, RESP_NONE, NULL);
000c2c e3a03000 MOV r3,#0
000c30 e1a02003 MOV r2,r3
000c34 e1a01003 MOV r1,r3
000c38 e3a00007 MOV r0,#7
000c3c ebfffffe BL mci_command
;;;663
;;;664 /* Read the CID - Card Identification. */
;;;665 cfg->sernum = sernum;
000c40 e59f00f4 LDR r0,|L1.3388|
000c44 e5900000 LDR r0,[r0,#0] ; sernum
000c48 e5840000 STR r0,[r4,#0]
;;;666
;;;667 /* Read the CSD - Card Specific Data. */
;;;668 arg = 0x00010000;
000c4c e3a07801 MOV r7,#0x10000
;;;669 if (CardType == CARD_SD) {
000c50 e59f00d8 LDR r0,|L1.3376|
000c54 e5d00000 LDRB r0,[r0,#0] ; CardType
000c58 e3500002 CMP r0,#2
000c5c 1a000002 BNE |L1.3180|
;;;670 /* Use address from SET_RELATIVE_ADDR. */
;;;671 arg = CardRCA << 16;
000c60 e59f00cc LDR r0,|L1.3380|
000c64 e1d000b0 LDRH r0,[r0,#0] ; CardRCA
000c68 e1a07800 LSL r7,r0,#16
|L1.3180|
;;;672 }
;;;673
;;;674 for (i = 20; i; i--) {
000c6c e3a05014 MOV r5,#0x14
000c70 ea000009 B |L1.3228|
|L1.3188|
;;;675 rstat = mci_command (SEND_CSD, arg, RESP_LONG, &rval[0]);
000c74 e28d3000 ADD r3,sp,#0
000c78 e3a02002 MOV r2,#2
000c7c e1a01007 MOV r1,r7
000c80 e3a00009 MOV r0,#9
000c84 ebfffffe BL mci_command
000c88 e1a06000 MOV r6,r0
;;;676 if (rstat == 0) {
000c8c e3560000 CMP r6,#0
000c90 1a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -