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

📄 dma_opti.s

📁 瑞芯微RK2608固件源代码
💻 S
📖 第 1 页 / 共 4 页
字号:
#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 + -