📄 dma_opti.s
字号:
#include "xvid_section_def.h"
#include "Dma_Macro.h"
#include "Memap.h"
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Func:
! DMA_YUV_I2E
! Description:
! Internal SRAM to External SDRAM
! Author:
! Fang ZF
! Date:
! 2006-1-3 21:30
! Modify:
! Jian Huan
! Date:
! 2006-2-15 9:21
! Optimize:
! Jian Huan
! Date:
! 2006-7-14 9:46
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Code Prototype:
!
! __attribute__((section(".avi_v_text, \"ax\"")))
! void DMA_YUV_I2E(DECODER *xvid_dec,short y, short size)
! {
! unsigned int temp2;
! DMA_CHANNEL_REG *DmaChl;
!
! unsigned long dstY=0, dstUV=0;
!
! while(DMA_CHANNEL_FULL == ( DmaChl = GetDmaChannelState(0)));
!
! dstY = (unsigned long )((unsigned long )(xvid_dec->cur->y_page)<<16) + (unsigned long)(y)*(unsigned long)(size); //指向SDRAM里当前帧Y分量的地址
!
! temp2 = 0x8c00-320*4*y;
! //---------------------------------------------------------------------
! DmaChl->pDmaFnct = DMA_FNCT_NULL;
! DmaChl->pDmaFnctArg = DMA_FNCT_NULL;
! //---------------------------------------------------------------------
!
! DmaChl->DmaSar = (unsigned long)(((unsigned long)(IntMem.mb_y_row)<<1)+(unsigned long)0x40000);
! DmaChl->DmaDar = ((unsigned long)(dstY)<<1)+(unsigned long)0x4000000;
!
! DmaChl->DmaCtl.Lsb = 0x00040025;
! DmaChl->DmaCtl.Msb = 0x00000F00;
!
! DmaChl->DmaCfg.Lsb = 0x00000020;
! DmaChl->DmaCfg.Msb = 0x00001004;
!
! DmaChl->DmaDsr = 0xA0000000|temp2;
!
! Dma_I2EBlock = 1;
!
! DmaChl->Priority = 0;
!
! DmaChl->pResFlag = &Dma_I2EBlock;
!
! CALL_DmaChannelSetup(0);
! }
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MP4_ASSEMBLE_SECTION
.global _DMA_YUV_I2E
.walign 2
_DMA_YUV_I2E:
stdu r0, r12, -2
stdu r2, r12, -2
stdu r8, r12, -2
stdu r10, r12, -2
stdu r14, r12, -2
mov r0, %rpc
stu r0, r12, -1
mov r8, r5 !backup y
mov r9, r6 !backup size
DMA_YUVI2E_GET_DMA_STATE:
mov r4, 0
lda r13, _GetDmaChannelState !Here one question may occur becaues of
!the return of _GetDmaChannelState is pointer of struct
call r13
cmp r4, -1 !DMA_CHANNEL_FULL
bz DMA_YUVI2E_GET_DMA_STATE
mov r13, r4 !DmaChl
mov r6, r4 !DmaChl
!dstY = (unsigned long )((unsigned long )(xvid_dec->cur->y_page)<<16) + (unsigned long)(y)*(unsigned long)(size);
movh r4, _Xvidec
mov r0, 0
movl r4, _Xvidec
xor r3, r3
add r4, 4
movh r2, 0x8c
ldu r1, r4, 1 !xvid_dec->cur
movl r2, 0x00
ld r1, r1 !xvid_dec->cur->y_page
mov r4, -1
mac.a r8, r9 !dstY
mov r5, -1
!temp2 = 0x8c00-320*4*y;
movh r9, 0x05
movl r9, 0x00 !320*4
movh r10, _IntMem
macn.b r8, r9 !temp2
movl r10, _IntMem
mov r15, 0
!DmaChl->pDmaFnct = DMA_FNCT_NULL;
!DmaChl->pDmaFnctArg = DMA_FNCT_NULL;
stdu r4, r13, 2
mov r8, 0x0000
!DmaChl->DmaSar = (unsigned long)(((unsigned long)(IntMem.mb_y_row)<<1)+(unsigned long)0x40000);
!DmaChl->DmaDar = ((unsigned long)(dstY)<<1)+(unsigned long)0x4000000;
!
!DmaChl->DmaCtl.Lsb = 0x00040025;
!DmaChl->DmaCtl.Msb = 0x00000F00;
!
!DmaChl->DmaCfg.Lsb = 0x00000020;
!DmaChl->DmaCfg.Msb = 0x00001004;
!DmaChl->DmaDsr = 0xA0000000|temp2;
ld r14, r10, 0
mov r9, 0x0004
shll.e r14, 1
add.e r14, r8
add r13, 2
shll r9, 8
stdu r14, r13, 2 !DmaChl->DmaSar
shll.e r0, 1
add.e r0, r8
stdu r0, r13, 2 !DmaChl->DmaDar
movlh r8, 0x00040025
stdu r8, r13, 2 !DmaChl->DmaCtl.Lsb
movlh r10, 0x00000F00
stdu r10, r13, 2 !DmaChl->DmaCtl.Msb
movlh r8, 0x00000020
stdu r8, r13, 2 !DmaChl->DmaCfg.Lsb
movlh r10, 0x00001004
stdu r10, r13, 2 !DmaChl->DmaCfg.Msb
add r13, 2
movh r10, _Dma_I2EBlock
movlh r0, 0xA0000000
or.e r0, r2
stdu r0, r13, 2 !DmaChl->DmaDsr
!Dma_I2EBlock = 1;
!
!DmaChl->Priority = 0;
!
!DmaChl->pResFlag = &Dma_I2EBlock;
!
!CALL_DmaChannelSetup(0);
movl r10, _Dma_I2EBlock
mov r14, 1
st r14, r10, 0 ![1]Dma_I2EBlock = 1
mov r15, 0
st r15, r6, 3 !DmaChl->Priority = 0;
mov r4, 0
st r10, r6, 2 !DmaChl->pResFlag = &Dma_I2EBlock;
movh r13, _CALL_DmaChannelSetup
movl r13, _CALL_DmaChannelSetup
call r13
mov r5, r12
add r5, 1
ldu r6, r5, 1
mov %rpc, r6
lddu r14, r5, 2
lddu r10, r5, 2
lddu r8, r5, 2
lddu r2, r5, 2
lddu r0, r5, 2
add r5, -1
mov r12, r5
ret
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Func:
! DMA_YUV_E2I_A
! Description:
! index: 0-->y; 2-->uv
! dst_offset_pos: offset position of refer-image
! NB:
! The Size of Match_Block is 18X17 or 18X9
! Author:
! fang zf
! jian huan (modify)
! Date:
! 2006-1-3 14:47
! 2006-1-9 10:49 (modify)
! Optimize:
! Jian Huan
! Date:
! 2006-7-14 16:18
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!__attribute__((section(".avi_v_text, \"ax\"")))
!void DMA_YUV_E2I_A(short index, short dst_offset_pos) //32BIT--32BIT
!{
! short vert_in, hor_in, hor_out;
! unsigned long src;
! unsigned short dst;
! IMAGE *refimg = Xvidec.ref;
! DMA_CHANNEL_REG *DmaChl;
! unsigned int resflag;
!
! while(DMA_CHANNEL_FULL == ( DmaChl = GetDmaChannelState(0)));
!
!
! if(index == 0){
! Global_Offset = (unsigned short)(src_offset_pos & 0x1);
! src = (((unsigned long)(refimg->y_page))<<16) + (src_offset_pos - (unsigned long)Global_Offset);
! dst = &match_y_block[0];
! resflag = &Dma_E2IBlock_Y;
! Dma_E2IBlock_Y = 1;
! //hor_in = 18;
! vert_in = 17;
! }else if(index == 2){
! src = (((unsigned long)(refimg->uv_page))<<16) + 0x2c00 + src_offset_pos;
! dst = &match_uv_block[0];
! resflag = &Dma_E2IBlock_UV;
! Dma_E2IBlock_UV = 1;
! //hor_in = 18;
! vert_in = 9;
! }
!//---------------------------------------------------------------------
! DmaChl->pDmaFnct = DMA_FNCT_NULL;
! DmaChl->pDmaFnctArg = DMA_FNCT_NULL;
!//---------------------------------------------------------------------
! DmaChl->DmaSar = ((unsigned long)(src)<<1)+(unsigned long)(0x4000000);
! DmaChl->DmaDar = ((unsigned long)(dst)<<1)+(unsigned long)0x40000;
!
! DmaChl->DmaCtl.Lsb = 0x00020025; //32-bit transfer
! DmaChl->DmaCtl.Msb = (unsigned long)(9*(unsigned long)vert_in);
!
! DmaChl->DmaCfg.Lsb = 0x00000020;
! DmaChl->DmaCfg.Msb = 0x00001004;
!
! //DmaChl.DmaSgr.Lsb = (unsigned long)(160-9)|((unsigned long)(9)<<20);
! DmaChl->DmaSgr = 0x00900097;
!
! DmaChl->Priority = 1;
!
! DmaChl->pResFlag = resflag;
!
! CALL_DmaChannelSetup(0);
!
!}
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MP4_ASSEMBLE_SECTION
.global _DMA_YUV_E2I_A
.walign 2
_DMA_YUV_E2I_A:
stdu r0, r12, -2
stdu r2, r12, -2
stdu r8, r12, -2
stdu r10, r12, -2
stdu r14, r12, -2
mov r0, %rpc
stu r0, r12, -1
mov r8, r4 !index
DMA_YUVE2I_A_GET_DMA_STATE:
mov r4, 0
lda r13, _GetDmaChannelState
call r13
cmp r4, -1 !DMA_CHANNEL_FULL
bz DMA_YUVE2I_A_GET_DMA_STATE
mov r13, r4
mov r6, r4
cmp r8, 0
bnz DMA_YUVE2I_A_INDEX_2
DMA_YUVE2I_A_INDEX_0:
mov r4, 1
movh r11, _src_offset_pos
movl r11, _src_offset_pos
movh r10, _Global_Offset
lddu r14, r11, 2 !src_offset_pos
and r4, r14 !Global_Offset
movl r10, _Global_Offset
st r4, r10
movh r11, _Xvidec
movl r11, _Xvidec
xor r5, r5
!src = (((unsigned long)(refimg->y_page))<<16) + (src_offset_pos - (unsigned long)Global_Offset);
add r11, 5
ld r1, r11
xor r0, r0
ld r1, r1
sub.e r14, r4
add.e r0, r14 !src
!dst = &match_y_block[0];
movh r14, _match_y_block
xor r15, r15 !dst
movl r14, _match_y_block
movh r5, _Dma_E2IBlock_Y
movl r5, _Dma_E2IBlock_Y
mov r4, 1
st r4, r5, 0
movh r8, 0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -