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

📄 mmcoem.cod

📁 ARM对MMC卡的编程文档
💻 COD
📖 第 1 页 / 共 4 页
字号:
  00070	00000000	 DCD       |gSDMMCRegPtr|
  00074		 |$M41576|

			 ENDP  ; |mmc_nop_deselect|

	EXPORT	|MMCReceive|

  00000			 AREA	 |.text| { |MMCReceive| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$MMCReceive|, PDATA, SELECTION=5, ASSOC=|.text| { |MMCReceive| } ; comdat associative
|$T41598| DCD	|MMCReceive|
	DCD	0x40004d01
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |MMCReceive| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |MMCReceive| PROC

; 752  : {

  00000	e92d43f0	 stmdb     sp!, {r4 - r9, lr}
  00004		 |$M41596|
  00004	e1a06000	 mov       r6, r0
  00008	e1a08001	 mov       r8, r1

; 753  :     UINT16  *dBufPtr;
; 754  :     

; 755  :     

; 756  :     UINT16  dLength;
; 757  :     

; 758  : 	UINT16  y,z;
; 759  : 
; 760  :     
; 761  : 	

; 762  :     dBufPtr = (UINT16 *)dBuf;
; 763  :     z = 0;
; 764  :     dLength = dataLength;
; 765  : 
; 766  : 	

; 767  : 	

; 768  : 	while(dLength)

  0000c	e1a00808	 mov       r0, r8, lsl #16
  00010	e3a09000	 mov       r9, #0
  00014	e1b07820	 movs      r7, r0, lsr #16
  00018	0a000040	 beq       |$L41299|
  0001c	e59f510c	 ldr       r5, [pc, #0x10C]
  00020		 |$L41298|

; 769  : 	{
; 770  : 		if(dLength%512==0)

  00020	e1a00447	 mov       r0, r7, asr #8
  00024	e0871ba0	 add       r1, r7, r0, lsr #23
  00028	e1a024c1	 mov       r2, r1, asr #9
  0002c	e0570482	 subs      r0, r7, r2, lsl #9
  00030	1a00001b	 bne       |$L41300|
  00034	e5952000	 ldr       r2, [r5]
  00038	e2821004	 add       r1, r2, #4
  0003c		 |$L41303|

; 771  : 		{
; 772  : 			while(!(READ_REGISTER_ULONG(&gSDMMCRegPtr->STATUS) & FIFO_BUFFER_FULL));  	


  0003c	e5910000	 ldr       r0, [r1]
  00040	e3100080	 tst       r0, #0x80
  00044	0afffffc	 beq       |$L41303|

; 773  : 
; 774  : 			for(y = 0; y<256; y++)

  00048	e1a04009	 mov       r4, r9
  0004c	ea000000	 b         |$L41305|
  00050		 |$L41589|
  00050	e5952000	 ldr       r2, [r5]
  00054		 |$L41305|

; 775  : 			{
; 776  : 				

; 777  : 				*dBufPtr = mmcif_data_swap((UINT16)READ_REGISTER_ULONG(&gSDMMCRegPtr->DATA_FIFO));

  00054	e2820048	 add       r0, r2, #0x48
  00058	e5901000	 ldr       r1, [r0]
  0005c	e1a02801	 mov       r2, r1, lsl #16
  00060	e1a00822	 mov       r0, r2, lsr #16
  00064	eb000000	 bl        mmcif_data_swap
  00068	e0c600b2	 strh      r0, [r6], #2

; 778  : 
; 779  : 				

; 780  : 
; 781  : 				dBufPtr++;
; 782  : 				dLength-=2;

  0006c	e1a00808	 mov       r0, r8, lsl #16
  00070	e1a01820	 mov       r1, r0, lsr #16
  00074	e2812cff	 add       r2, r1, #0xFF, 24
  00078	e28200fe	 add       r0, r2, #0xFE
  0007c	e1a01800	 mov       r1, r0, lsl #16
  00080	e2840001	 add       r0, r4, #1
  00084	e1a08821	 mov       r8, r1, lsr #16
  00088	e1a01800	 mov       r1, r0, lsl #16
  0008c	e1a02821	 mov       r2, r1, lsr #16
  00090	e1a00802	 mov       r0, r2, lsl #16
  00094	e1a04820	 mov       r4, r0, lsr #16
  00098	e3540c01	 cmp       r4, #1, 24
  0009c	3affffeb	 bcc       |$L41589|

; 783  : 			}
; 784  : 		}
; 785  : 		else

  000a0	ea00001b	 b         |$L41314|
  000a4		 |$L41300|

; 786  : 		{ 
; 787  : 			

; 788  : 			WRITE_REGISTER_ULONG(&gSDMMCRegPtr->BUF_PART_FULL, BUFF_PARTIAL_FULL);

  000a4	e5950000	 ldr       r0, [r5]
  000a8	e3a02001	 mov       r2, #1
  000ac	e280104c	 add       r1, r0, #0x4C

; 789  : 
; 790  : 			for(y = 0; y<dLength/2; y++)

  000b0	e3c70001	 bic       r0, r7, #1
  000b4	e5812000	 str       r2, [r1]
  000b8	e3500000	 cmp       r0, #0
  000bc	9a000014	 bls       |$L41314|
  000c0	e1a04009	 mov       r4, r9
  000c4		 |$L41312|

; 791  : 			{
; 792  : 				

; 793  : 				*dBufPtr = mmcif_data_swap((UINT16)READ_REGISTER_ULONG(&gSDMMCRegPtr->DATA_FIFO));

  000c4	e5950000	 ldr       r0, [r5]
  000c8	e2801048	 add       r1, r0, #0x48
  000cc	e5912000	 ldr       r2, [r1]
  000d0	e1a00802	 mov       r0, r2, lsl #16
  000d4	e1a00820	 mov       r0, r0, lsr #16
  000d8	eb000000	 bl        mmcif_data_swap
  000dc	e0c600b2	 strh      r0, [r6], #2

; 794  : 
; 795  : 				

; 796  : 				dBufPtr++;
; 797  : 				dLength-=2;

  000e0	e2870cff	 add       r0, r7, #0xFF, 24
  000e4	e28010fe	 add       r1, r0, #0xFE
  000e8	e2840001	 add       r0, r4, #1
  000ec	e1a02801	 mov       r2, r1, lsl #16
  000f0	e1a01800	 mov       r1, r0, lsl #16
  000f4	e1a08822	 mov       r8, r2, lsr #16
  000f8	e1a02821	 mov       r2, r1, lsr #16
  000fc	e1a00808	 mov       r0, r8, lsl #16
  00100	e1a01802	 mov       r1, r2, lsl #16
  00104	e1a07820	 mov       r7, r0, lsr #16
  00108	e1a04821	 mov       r4, r1, lsr #16
  0010c	e15400a7	 cmp       r4, r7, lsr #1
  00110	3affffeb	 bcc       |$L41312|
  00114		 |$L41314|

; 753  :     UINT16  *dBufPtr;
; 754  :     

; 755  :     

; 756  :     UINT16  dLength;
; 757  :     

; 758  : 	UINT16  y,z;
; 759  : 
; 760  :     
; 761  : 	

; 762  :     dBufPtr = (UINT16 *)dBuf;
; 763  :     z = 0;
; 764  :     dLength = dataLength;
; 765  : 
; 766  : 	

; 767  : 	

; 768  : 	while(dLength)

  00114	e1a00808	 mov       r0, r8, lsl #16
  00118	e1b07820	 movs      r7, r0, lsr #16
  0011c	1affffbf	 bne       |$L41298|
  00120		 |$L41299|

; 798  : 			}
; 799  : 
; 800  : 		}
; 801  : 	}
; 802  : 
; 803  : 
; 804  : 	

; 805  : 	

; 806  : 
; 807  : 	mmc_nop_deselect();

  00120	eb000000	 bl        mmc_nop_deselect

; 808  : 	stopMMCClock();

  00124	eb000000	 bl        stopMMCClock

; 809  : 	

; 810  : 	return MMC_NO_ERROR; 		

  00128	e1a00009	 mov       r0, r9

; 811  : }

  0012c	e8bd83f0	 ldmia     sp!, {r4 - r9, pc}
  00130		 |$L41600|
  00130	00000000	 DCD       |gSDMMCRegPtr|
  00134		 |$M41597|

			 ENDP  ; |MMCReceive|

	EXPORT	|MMCSetupXfer|
	IMPORT	|setupMMcHostDataRegister|

  00000			 AREA	 |.text| { |MMCSetupXfer| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$MMCSetupXfer|, PDATA, SELECTION=5, ASSOC=|.text| { |MMCSetupXfer| } ; comdat associative
|$T41611| DCD	|MMCSetupXfer|
	DCD	0x40003302
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |MMCSetupXfer| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |MMCSetupXfer| PROC

; 836  : {

  00000	e92d4070	 stmdb     sp!, {r4 - r6, lr}
  00004	e24dd008	 sub       sp, sp, #8
  00008		 |$M41609|
  00008	e1a04000	 mov       r4, r0
  0000c	e1a06002	 mov       r6, r2

; 837  :     UINT16  cmdDatContReg;
; 838  :     UINT16  blkLength;
; 839  :     UINT16  noBlocks = nBlocks;

  00010	e1cd10b2	 strh      r1, [sp, #2]

; 840  : 
; 841  :     cmdDatContReg = NO;

  00014	e3a00000	 mov       r0, #0
  00018	e1cd00b4	 strh      r0, [sp, #4]

; 842  :     blkLength = 0;
; 843  :     setupMMcHostDataRegister(cmdIndex, &cmdDatContReg, &noBlocks, &blkLength);

  0001c	e28d3000	 add       r3, sp, #0
  00020	e1cd00b0	 strh      r0, [sp]
  00024	e28d2002	 add       r2, sp, #2
  00028	e28d1004	 add       r1, sp, #4
  0002c	e1a00004	 mov       r0, r4
  00030	eb000000	 bl        setupMMcHostDataRegister

; 844  : 
; 845  :     
; 846  : #if (USE_INTERRUPT)
; 847  : 	

; 848  : 	

; 849  : #else
; 850  : 	

; 851  : 	

; 852  : #endif
; 853  : 	WRITE_REGISTER_ULONG(&gSDMMCRegPtr->INT_MASK, 0x3F);

  00034	e59f508c	 ldr       r5, [pc, #0x8C]
  00038	e3a0203f	 mov       r2, #0x3F
  0003c	e5950000	 ldr       r0, [r5]
  00040	e2801034	 add       r1, r0, #0x34

; 854  : 
; 855  :     if (cmdIndex != SSTOP_TRANSMISSION)

  00044	e1a00804	 mov       r0, r4, lsl #16
  00048	e5812000	 str       r2, [r1]
  0004c	e1a01820	 mov       r1, r0, lsr #16

; 856  :     {
; 857  :         
; 858  :         if ( cmdDatContReg != NO )

  00050	e1dd20b4	 ldrh      r2, [sp, #4]
  00054	e351004c	 cmp       r1, #0x4C
  00058	0a00000f	 beq       |$L41339|
  0005c	e1a00802	 mov       r0, r2, lsl #16
  00060	e1b01820	 movs      r1, r0, lsr #16
  00064	0a00000c	 beq       |$L41339|

; 859  :         {
; 860  : 			
; 861  : 			

; 862  : 			

; 863  : 			WRITE_REGISTER_ULONG(&gSDMMCRegPtr->BLK_LEN, blkLength);

  00068	e1dd00b0	 ldrh      r0, [sp]
  0006c	e1a01800	 mov       r1, r0, lsl #16
  00070	e5950000	 ldr       r0, [r5]
  00074	e1a02821	 mov       r2, r1, lsr #16
  00078	e2801020	 add       r1, r0, #0x20
  0007c	e5812000	 str       r2, [r1]

; 864  : 
; 865  : 			
; 866  : 			

; 867  : 			

; 868  : 			WRITE_REGISTER_ULONG(&gSDMMCRegPtr->NOB, noBlocks);

  00080	e1dd00b2	 ldrh      r0, [sp, #2]
  00084	e1a01800	 mov       r1, r0, lsl #16
  00088	e5950000	 ldr       r0, [r5]
  0008c	e1a02821	 mov       r2, r1, lsr #16
  00090	e2801024	 add       r1, r0, #0x24
  00094	e5812000	 str       r2, [r1]
  00098	e1dd20b4	 ldrh      r2, [sp, #4]
  0009c		 |$L41339|

; 869  :         }
; 870  :     }
; 871  : 
; 872  : 	
; 873  : 	cmdDatContReg |= respType;

  0009c	e1a00802	 mov       r0, r2, lsl #16
  000a0	e1a02820	 mov       r2, r0, lsr #16
  000a4	e1a01806	 mov       r1, r6, lsl #16
  000a8	e1820821	 orr       r0, r2, r1, lsr #16

; 874  : 
; 875  : 	
; 876  : 	

; 877  : 	

; 878  : 	WRITE_REGISTER_ULONG(&gSDMMCRegPtr->CMD_DATA_CONT, cmdDatContReg);

  000ac	e1a02800	 mov       r2, r0, lsl #16
  000b0	e5950000	 ldr       r0, [r5]
  000b4	e1a03822	 mov       r3, r2, lsr #16
  000b8	e2801014	 add       r1, r0, #0x14
  000bc	e5813000	 str       r3, [r1]

; 879  : 
; 880  : }

  000c0	e28dd008	 add       sp, sp, #8
  000c4	e8bd8070	 ldmia     sp!, {r4 - r6, pc}
  000c8		 |$L41613|
  000c8	00000000	 DCD       |gSDMMCRegPtr|
  000cc		 |$M41610|

			 ENDP  ; |MMCSetupXfer|

	EXPORT	|MMCPrepareAndSetup|

  00000			 AREA	 |.text| { |MMCPrepareAndSetup| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$MMCPrepareAndSetup|, PDATA, SELECTION=5, ASSOC=|.text| { |MMCPrepareAndSetup| } ; comdat associative
|$T41623| DCD	|MMCPrepareAndSetup|
	DCD	0x40001401
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |MMCPrepareAndSetup| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |MMCPrepareAndSetup| PROC

; 904  : {

  00000	e92d40f0	 stmdb     sp!, {r4 - r7, lr}
  00004		 |$M41621|
  00004	e1a05000	 mov       r5, r0
  00008	e1a07001	 mov       r7, r1
  0000c	e1a06002	 mov       r6, r2
  00010	e1a04003	 mov       r4, r3

; 905  :     
; 906  :     if ( !stopMMCClock() )

  00014	eb000000	 bl        stopMMCClock
  00018	e3500000	 cmp       r0, #0

; 907  :         return NO;

  0001c	03a00000	 moveq     r0, #0

; 922  : }

  00020	08bd80f0	 ldmeqia   sp!, {r4 - r7, pc}

; 908  : 
; 909  :     
; 913  :     MMCSendCommand( Arg, Cmd, 0 );

  00024	e3a02000	 mov       r2, #0
  00028	e1a01007	 mov       r1, r7
  0002c	e1a00005	 mov       r0, r5
  00030	eb000000	 bl        MMCSendCommand

; 914  : 
; 915  :     
; 916  :     MMCSetupXfer( Cmd, noBlocks, Resp );

  00034	e1a02004	 mov       r2, r4
  00038	e1a01006	 mov       r1, r6
  0003c	e1a00007	 mov       r0, r7
  00040	eb000000	 bl        MMCSetupXfer

; 917  : 
; 918  :     
; 919  :     startMMCClock();

  00044	eb000000	 bl        startMMCClock

; 920  : 
; 921  :     return YES;

  00048	e3a00001	 mov       r0, #1

; 922  : }

  0004c	e8bd80f0	 ldmia     sp!, {r4 - r7, pc}
  00050		 |$M41622|

			 ENDP  ; |MMCPrepareAndSetup|

	EXPORT	|checkCardBusy|

  00000			 AREA	 |.text| { |checkCardBusy| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000			 AREA	 |.pdata$$checkCardBusy|, PDATA, SELECTION=5, ASSOC=|.text| { |checkCardBusy| } ; comdat associative
|$T41635| DCD	|checkCardBusy|
	DCD	0x40001000
; Function compile flags: /Ogsy

  00000			 AREA	 |.text| { |checkCardBusy| }, CODE, ARM, SELECTION=1 ; comdat noduplicate

  00000		 |checkCardBusy| PROC

; 942  : {

  00000		 |$M41633|

; 943  :     UINT32  dStatus, dtimer;
; 944  : 
; 945  :     dtimer = 0x200;

  00000	e59f0034	 ldr       r0, [pc, #0x34]
  00004	e3a03c02	 mov       r3, #2, 24
  00008	e5901000	 ldr       r1, [r0]
  0000c	e2812004	 add       r2, r1, #4
  00010		 |$L41359|

; 952  :     {
; 953  : 		
; 954  : 		

; 955  : 		

; 956  : 		dStatus = READ_REGISTER_ULONG(&gSDMMCRegPtr->STATUS);

  00010	e5920000	 ldr       r0, [r2]

; 957  : 		
; 958  : 		if ( (dStatus & DONE_PROG_RDWR) || (dStatus & DONE_WDATA_XFER) ) 

  00014	e3100a01	 tst       r0, #1, 20
  00018	1a000005	 bne       |$L41628|
  0001c	e3100b02	 tst       r0, #2, 22
  00020	1a000003	 bne       |$L41628|

; 960  : 
; 961  :         dtimer--;

  00024	e2533001	 subs      r3, r3, #1

; 946  : 
; 947  :     
; 951  :     while ( dtimer )

  00028	1afffff8	 bne       |$L41359|

; 962  :     }
; 963  : 
; 964  :     
; 965  :     return NO;

  0002c	e3a00000	 mov       r0, #0

; 966  : }

  00030	e1a0f00e	 mov       pc, lr
  00034		 |$L41628|

; 959  : 			return YES;

  00034	e3a00001	 mov       r0, #1

; 966  : }

  00038	e1a0f00e	 mov       pc, lr
  0003c		 |$L41637|
  0003c	00000000	 DCD       |gSDMMCRegPtr|
  00040		 |$M41634|

			 ENDP  ; |checkCardBusy|

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -