pxadma.cod

来自「这是mobile6.0下的DMB驱动」· COD 代码 · 共 537 行 · 第 1/2 页

COD
537
字号

  00000		 |PhyDmaSendDescriptor| PROC

; 88   : {

  00000		 |$L39041|
  00000	e92d4070	 stmdb       sp!, {r4 - r6, lr}
  00004	e24dd004	 sub         sp, sp, #4
  00008		 |$M39039|
  00008	e1a03001	 mov         r3, r1
  0000c	e1a05000	 mov         r5, r0

; 89   : 	volatile DMAC_REGISTERS_P	pDmacAddr;
; 90   : 	DWORD						tmp;
; 91   : 	DMAC_FRAME_DESCRIPTOR_ST*	desc;
; 92   : 	DMA_DESCRIPTOR_ST*			dbDesc = transaction->desc;
; 93   : 
; 94   : 	ResetEvent(dev->dmaIntEvent);

  00010	e595000c	 ldr         r0, [r5, #0xC]
  00014	e5936000	 ldr         r6, [r3]
  00018	e3a01002	 mov         r1, #2
  0001c	eb000000	 bl          EventModify

; 95   : 	pDmacAddr = dev->pDmacAddr;
; 96   : 
; 97   : 	desc = dev->desc;

  00020	e5954038	 ldr         r4, [r5, #0x38]

; 98   : 
; 99   : 	desc->ddadr = 1;

  00024	e5952000	 ldr         r2, [r5]
  00028	e3a03001	 mov         r3, #1
  0002c	e5843000	 str         r3, [r4]

; 100  : 	desc->dsadr = dbDesc->srcPhyAddr;

  00030	e5963000	 ldr         r3, [r6]

; 101  : 	desc->dtadr = dbDesc->dstPhyAddr;
; 102  : 	desc->dcmd = dbDesc->len;
; 103  : 
; 104  : 	tmp = userBurstSizeToDmaConfig[dev->burstSize];
; 105  : 	desc->dcmd |= (tmp<<16);								// BURST

  00034	e58d2000	 str         r2, [sp]
  00038	e59fe12c	 ldr         lr, [pc, #0x12C]
  0003c	e5843004	 str         r3, [r4, #4]
  00040	e5963004	 ldr         r3, [r6, #4]
  00044	e28e100c	 add         r1, lr, #0xC
  00048	e5843008	 str         r3, [r4, #8]
  0004c	e5962008	 ldr         r2, [r6, #8]
  00050	e584200c	 str         r2, [r4, #0xC]
  00054	e5953014	 ldr         r3, [r5, #0x14]
  00058	e7913103	 ldr         r3, [r1, +r3, lsl #2]
  0005c	e1822803	 orr         r2, r2, r3, lsl #16
  00060	e584200c	 str         r2, [r4, #0xC]

; 106  : 	tmp = userBusWidthToDmaConfig[dev->busWidth];
; 107  : 	desc->dcmd |= (tmp<<14);								// TRANSFER WIDTH	

  00064	e5953018	 ldr         r3, [r5, #0x18]
  00068	e79e3103	 ldr         r3, [lr, +r3, lsl #2]
  0006c	e1822703	 orr         r2, r2, r3, lsl #14
  00070	e584200c	 str         r2, [r4, #0xC]

; 108  : 
; 109  : 	if (dbDesc->flags & DMA_INC_SRC_ADDR)

  00074	e596300c	 ldr         r3, [r6, #0xC]
  00078	e3130001	 tst         r3, #1

; 110  : 		desc->dcmd |= DMAC_DCMD_INCSRCADDR;

  0007c	13823102	 orrne       r3, r2, #2, 2
  00080	1584300c	 strne       r3, [r4, #0xC]

; 111  : 	if (dbDesc->flags & DMA_INC_DST_ADDR)

  00084	e596300c	 ldr         r3, [r6, #0xC]
  00088	e3130002	 tst         r3, #2

; 112  : 		desc->dcmd |= DMAC_DCMD_INCTRGADDR;

  0008c	1594300c	 ldrne       r3, [r4, #0xC]
  00090	13833101	 orrne       r3, r3, #1, 2
  00094	1584300c	 strne       r3, [r4, #0xC]

; 113  : 
; 114  : 	if (dbDesc->flags & DMA_USE_DST_FLOW_CONTROL)

  00098	e596300c	 ldr         r3, [r6, #0xC]
  0009c	e3130004	 tst         r3, #4

; 115  : 		desc->dcmd |= DMAC_DCMD_FLOWTRG;

  000a0	1594300c	 ldrne       r3, [r4, #0xC]
  000a4	13833201	 orrne       r3, r3, #1, 4
  000a8	1584300c	 strne       r3, [r4, #0xC]

; 116  : 	if (dbDesc->flags & DMA_USE_SRC_FLOW_CONTROL)

  000ac	e596300c	 ldr         r3, [r6, #0xC]
  000b0	e3130008	 tst         r3, #8

; 117  : 		desc->dcmd |= DMAC_DCMD_FLOWSRC;

  000b4	1594300c	 ldrne       r3, [r4, #0xC]
  000b8	13833202	 orrne       r3, r3, #2, 4
  000bc	1584300c	 strne       r3, [r4, #0xC]

; 118  : 
; 119  : 
; 120  : 	desc->dcmd |= DMAC_DCMD_ENDIRQEN;						// Enable end interrupt for last descriptor.

  000c0	e594300c	 ldr         r3, [r4, #0xC]
  000c4	e3833602	 orr         r3, r3, #2, 12
  000c8	e584300c	 str         r3, [r4, #0xC]

; 121  : 
; 122  :     if (dev->useHWFlowCtrl == TRUE)

  000cc	e595301c	 ldr         r3, [r5, #0x1C]
  000d0	e3530001	 cmp         r3, #1

; 123  :     {//Request to Channel Map for DREQ 
; 124  :         pDmacAddr->drcmr1[dev->dmaReq] = DMAC_DRCRM_MAP_CHANNEL + dev->channel;

  000d4	05952004	 ldreq       r2, [r5, #4]
  000d8	05951010	 ldreq       r1, [r5, #0x10]
  000dc	059d3000	 ldreq       r3, [sp]
  000e0	02822080	 addeq       r2, r2, #0x80
  000e4	00833101	 addeq       r3, r3, r1, lsl #2
  000e8	05832100	 streq       r2, [r3, #0x100]

; 125  :     }
; 126  : 
; 127  : 
; 128  : 	//Clear all existing interrupts and set mode to no descriptor fetch
; 129  : 	pDmacAddr->dcsr[dev->channel] = DMAC_DCSR_CLEAR_ALL_INTERRUPTS;		

  000ec	e5952004	 ldr         r2, [r5, #4]
  000f0	e59d3000	 ldr         r3, [sp]
  000f4	e3a0101f	 mov         r1, #0x1F
  000f8	e7831102	 str         r1, [r3, +r2, lsl #2]

; 130  : 	
; 131  : 
; 132  : 	// DALGN - DMA ALIGNMENT REG.
; 133  : 	if ((dbDesc[0].srcPhyAddr & 0x7) || (dbDesc[0].dstPhyAddr & 7))

  000fc	e5963000	 ldr         r3, [r6]
  00100	e3130007	 tst         r3, #7
  00104	05963004	 ldreq       r3, [r6, #4]
  00108	03130007	 tsteq       r3, #7

; 134  : 		pDmacAddr->dalgn |= 1<<dev->channel;
; 135  : 	else
; 136  : 		pDmacAddr->dalgn &= ~(1<<dev->channel);

  0010c	059d1000	 ldreq       r1, [sp]
  00110	05952004	 ldreq       r2, [r5, #4]
  00114	03a00001	 moveq       r0, #1
  00118	05b130a0	 ldreq       r3, [r1, #0xA0]!
  0011c	159d1000	 ldrne       r1, [sp]
  00120	01c33210	 biceq       r3, r3, r0, lsl r2
  00124	15b130a0	 ldrne       r3, [r1, #0xA0]!
  00128	15952004	 ldrne       r2, [r5, #4]
  0012c	13a00001	 movne       r0, #1
  00130	11833210	 orrne       r3, r3, r0, lsl r2
  00134	e5813000	 str         r3, [r1]

; 137  : 	
; 138  : 	//Set DMA first descriptor
; 139  : 	pDmacAddr->ddg[dev->channel].ddadr = dev->descPhyAddr.LowPart;

  00138	e59d3000	 ldr         r3, [sp]

; 140  : 	
; 141  : 	// Start Running
; 142  : 	pDmacAddr->dcsr[dev->channel] = DMAC_DCSR_RUN;// | DMAC_DCSR_EORIRQEN;

  0013c	e59de000	 ldr         lr, [sp]
  00140	e5951004	 ldr         r1, [r5, #4]
  00144	e5952030	 ldr         r2, [r5, #0x30]
  00148	e0833201	 add         r3, r3, r1, lsl #4
  0014c	e5832200	 str         r2, [r3, #0x200]
  00150	e5953004	 ldr         r3, [r5, #4]
  00154	e3a02102	 mov         r2, #2, 2

; 143  : 
; 144  : 
; 145  : 	return TRUE;

  00158	e3a00001	 mov         r0, #1
  0015c	e78e2103	 str         r2, [lr, +r3, lsl #2]

; 146  : }

  00160	e28dd004	 add         sp, sp, #4
  00164	e8bd4070	 ldmia       sp!, {r4 - r6, lr}
  00168	e12fff1e	 bx          lr
  0016c		 |$L39044|
  0016c	00000000	 DCD         |userBusWidthToDmaConfig|
  00170		 |$M39040|

			 ENDP  ; |PhyDmaSendDescriptor|

	EXPORT	|PhyDmaIntHandler|
	IMPORT	|GetEventData|

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

  00000			 AREA	 |.pdata$$PhyDmaIntHandler|, PDATA, SELECTION=5, ASSOC=|.text| { |PhyDmaIntHandler| } ; comdat associative
|$T39054| DCD	|$L39053|
	DCD	0x40000a01
; Function compile flags: /Ogsy

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

  00000		 |PhyDmaIntHandler| PROC

; 149  : {

  00000		 |$L39053|
  00000	e52de004	 str         lr, [sp, #-4]!
  00004		 |$M39051|

; 150  : 	DWORD stReg;
; 151  : 
; 152  : 	stReg = GetEventData(dev->dmaIntEvent);	

  00004	e590000c	 ldr         r0, [r0, #0xC]
  00008	eb000000	 bl          GetEventData

; 153  : 	//RETAILMSG(1, (TEXT("DMB dma int.\r\n")));
; 154  : 
; 155  : 	//Check that status returned from DMA controllers is good.
; 156  : 	if (stReg & DMAC_DCSR_ENDINTR || stReg & DMAC_DCSR_EORINT)	

  0000c	e3100004	 tst         r0, #4
  00010	03100c02	 tsteq       r0, #2, 24

; 158  : 	else
; 159  : 		return DMA_STATUS_ERR;

  00014	03e00000	 mvneq       r0, #0

; 160  : }

  00018	049de004	 ldreq       lr, [sp], #4

; 157  : 		return DMA_STATUS_OK;

  0001c	13a00000	 movne       r0, #0

; 160  : }

  00020	149de004	 ldrne       lr, [sp], #4
  00024	e12fff1e	 bx          lr
  00028		 |$M39052|

			 ENDP  ; |PhyDmaIntHandler|

	END

⌨️ 快捷键说明

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