亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vportdis.c

?? 使用DM642 來進行scaling 有說明檔
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*
 *  Copyright 2004 by Texas Instruments Incorporated.
 *  All rights reserved. Property of Texas Instruments Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  
 */        
/* August 2004 */
/**************************************************************************/
/* vportdis.c file */
/**************************************************************************/

/* DSP/BIOS standard include files */
#include <std.h>
#include <mem.h>
#include <que.h>    
#include <tsk.h> 
#include <hwi.h>

/* Chip-support library include files */
#include <csl.h>
#include <csl_edma.h>
#include <csl_vphal.h>         
#include <csl_irq.h>
#include <csl_cache.h>
#include <csl_dat.h>

/* IOM/GIO driver model include files */
#include <iom.h>
#include <fvid.h>                       

/* video driver specif-ic include files */
#include <vport.h>
#include <vportdis.h>
#include <edc.h>
#include "_vport.h"

/* debug include files */
/* to minimize code size and cycle count overhead of the driver */             
/* error checking is only performed at debug time               */
#include <assert.h>


/* mini-driver API functions */
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams);
static Int mdControlChan(Ptr chanp, Uns cmd, Ptr args);
static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
        Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg);
static Int mdDeleteChan(Ptr chanp);
static Int mdSubmitChan(Ptr chanp, IOM_Packet *packet);


/* local functions */
static Int _configAsyncMode(Ptr chanp, Uns cmd, Ptr args);
static Int _configChan(Ptr chanp, Ptr args);
static Int _configEDMA(Ptr chanp, VPORTDIS_Params *params);
static Int _configPort(Ptr chanp, Ptr args);
static Int _configRegs(Ptr chanp, VPORTDIS_Params *params);
static void displayEdmaISR(Int tcc);
static void displayISR(int portNum);
static Int _displayStart(Ptr chanp);
static Int _displayStop(Ptr chanp);
static Int _dundRecover(Ptr chanp);
static Int  _frmAlmostCmopleteIsr(int portNum);
static Int _getlastActiveLine(VPORTDIS_Params* params);
static Int _getNumPendingIORqsts(Ptr chanp, Ptr args);
static Int _setVIntCb(Ptr chanp, Ptr args);

/* constant data for initialization of image buffers */
/* 0 for Y, 0x80 for cb and cr                       */
static const Int fillValue[4] = {
0, 0, 0x80808080, 0x80808080
};


/* global and static variables */
IOM_Fxns VPORTDIS_Fxns = {
    mdBindDev,    
    (IOM_TmdUnBindDev)IOM_mdNotImpl,
    mdControlChan,
    mdCreateChan,
    mdDeleteChan,
    mdSubmitChan
};

/**************************************************************
 * Static allocation and initialization of port objects       *
 * as display supports only 1 channel, the same channel       *
 * object for capture is used here for the whoel port         *
 **************************************************************/
_VPORT_ChanObj chanObjs[_VP_PORT_CNT] = {
    {0, 0, 0, _VP_BASE_PORT0, EDMA_CHA_VP0EVTYA, EDMA_CHA_VP0EVTUA, 
        EDMA_CHA_VP0EVTVA, _VP_YDSTA0_ADDR, _VP_CBDST0_ADDR, _VP_CRDST0_ADDR}, 
    {0, 1, 0, _VP_BASE_PORT1, EDMA_CHA_VP1EVTYA, EDMA_CHA_VP1EVTUA, 
        EDMA_CHA_VP1EVTVA,  _VP_YDSTA1_ADDR, _VP_CBDST1_ADDR, _VP_CRDST1_ADDR}, 
    {0, 2, 0, _VP_BASE_PORT2, EDMA_CHA_VP2EVTYA, EDMA_CHA_VP2EVTUA, 
        EDMA_CHA_VP2EVTVA, _VP_YDSTA2_ADDR, _VP_CBDST2_ADDR, _VP_CRDST2_ADDR },
};     



/*
 *  ======== mdBindDev ========
 *  Register all external devices to video port display driver 
 */
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
{
   Int portNum = devid;
   volatile Int i;
   volatile Int* base = (volatile Int *)chanObjs[portNum].base;                       
   
   assert(portNum < _VP_PORT_CNT);
   base[_VP_VPCTL_OFFSET] = 
             VP_VPCTL_VPRST_RESET << _VP_VPCTL_VPRST_SHIFT;
   for(i = 0; i < 100000; i ++);      
    *devp = &chanObjs[portNum];                                                                                           
   return mdControlChan(&chanObjs[portNum], 
           VPORT_CMD_CONFIG_PORT, devParams);
}


/*
 *  ======== mdControlChan ========
 */
static Int mdControlChan(Ptr chanp, Uns cmd, Ptr args)
{
    Int retVal = IOM_COMPLETED;
    _VPORT_ChanObj* chan = (_VPORT_ChanObj *)chanp;
    
    /* command dispatcher */
    switch (cmd){
        case VPORT_CMD_START:
        retVal = _displayStart(chanp);
        break;
        
        case VPORT_CMD_STOP:
        retVal = _displayStop(chanp);
        break;
        
        case VPORT_CMD_CONFIG_CHAN:
        retVal = _configChan(chanp, args);
        break;
        
        case VPORT_CMD_SET_VINTCB:
        _setVIntCb(chanp, args);
        break;
        
        case VPORT_CMD_DUND_RECOVER:
        retVal = _dundRecover(chanp);
        break;
        
        case VPORT_CMD_CONFIG_PORT:
        retVal = _configPort(chanp, args);
        break; 
        
        case VPORTDIS_CMD_ASYNC_MODE_ENABLE:     
        case VPORTDIS_CMD_ASYNC_MODE_DISABLE:
        case VPORTDIS_CMD_ASYNC_MODE_RESET_FRAMECT:
        retVal = _configAsyncMode(chanp, cmd, args);
        break;  
                               
        case VPORT_CMD_GET_NUM_IORQST_PENDING:
        retVal = _getNumPendingIORqsts(chanp, args);
        break;
        
        default:
        if(chan->edcFxns!=INV) {
            retVal =  chan->edcFxns->ctrl(chan->edcHandle, 
                cmd-VPORT_CMD_EDC_BASE,(Arg)args);
        }else {
            retVal = IOM_ENOTIMPL;
        }
   }    
   return retVal;
}              


/*
 *  ======== mdCreateChan ========
 *  create a channel
 */
static Int  mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
              Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
{
    _VPORT_ChanObj* chan;
    Int retVal = IOM_COMPLETED;   
    Int j;     

    if(mode != IOM_OUTPUT){
        return IOM_EBADARGS;
    }
    
    chan = (_VPORT_ChanObj *)devp;
    if(chan->edcFxns != INV) {
        /* open external device */
        chan->edcHandle 
           = chan->edcFxns->open(name, (Arg)INV);
    } 
    
    if(! (chan->status & _VPORT_OPENED)) {
        chan->status |= _VPORT_OPENED;
        
        chan->vIntMask = 0;
        QUE_new(&chan->qIn);
        QUE_new(&chan->qOut);
        chan->cbFxn = cbFxn;
        chan->vIntFxn = (VPORT_IntCallBack)INV;
        chan->queEmpty = FALSE;   
        chan->cbArg = (Arg)cbArg;
        chan->packetIOM = INV;     
        chan->vIntCbArg = (Int)INV;        
        chan->bufSz = 0;
        chan->asyncModeEnable = 0;   /* disable async mode(call-back mode) be default */
        chan->pullDownMode = VPORTDIS_PULLDOWN_DISABLE; /* disable 3:2 pull-down */
        chan->asyncCallBackFxn = (Fxn)INV;      
        chan->startFlag = 0;

        /* allocate EDMA PaRAM and RLD entries */
        for(j = 0; j < _VPORT_NUM_EDMA_CHANS 
          && retVal == IOM_COMPLETED; j ++ ) {
            if((chan->hEdma[j] = 
             EDMA_open(chan->edmaChanNum[j], EDMA_OPEN_RESET)) == EDMA_HINV
             || (chan->hRld[4 * j] = EDMA_allocTable(-1)) == EDMA_HINV 
             || (chan->hRld[4 * j + 1] =EDMA_allocTable(-1)) == EDMA_HINV 
             || (chan->hRld[4 * j + 2] =EDMA_allocTable(-1)) == EDMA_HINV 
             || (chan->hRld[4 * j + 3] =EDMA_allocTable(-1)) == EDMA_HINV 
             ||  (chan->tcc[j] = EDMA_intAlloc(chan->edmaChanNum[j])) == -1){
                retVal = IOM_EALLOC;
                retVal = IOM_EALLOC;
            }/* if((chan->...*/ 
        }/* for(j = 0; j < NUM_EDMA_CHANS; j++) {...*/
        
        /* if EDMA resources are allocated successfully, go ahead */
        /* and configure the channel                              */
        if(retVal == IOM_COMPLETED && (void *)chanParams != INV) {
            retVal = mdControlChan(chan, VPORT_CMD_CONFIG_CHAN, chanParams); 
        }
        if(! retVal) {
             /* configured the channel successfully, return handle */
             *chanp = chan;
        }else {
            /* failed, free all resources and return error */
            mdDeleteChan(chan);
            *chanp = INV;
        }               
    } /*if(!chan->opened) */
    return retVal;
}               

/*
 *  ======== mdDeleteChan ========
 *  delete the channel
 */

static Int  mdDeleteChan(Ptr chanp)
{
    _VPORT_ChanObj* chan = (_VPORT_ChanObj* )chanp;
    Int j;
    volatile Int* base;
    
    if(chan->status & _VPORT_OPENED) {
        chan->status = 0;
        mdControlChan(chanp, VPORT_CMD_STOP, NULL);
        for(j = 0; j < _VPORT_NUM_EDMA_CHANS; j ++) {
            EDMA_disableChannel(chan->hEdma[j]);
            EDMA_clearChannel(chan->hEdma[j]);
            EDMA_close(chan->hEdma[j]);
            EDMA_freeTable(chan->hRld[4 * j]);
            EDMA_freeTable(chan->hRld[4 * j + 1]);
            EDMA_freeTable(chan->hRld[4 * j + 2]);
            EDMA_freeTable(chan->hRld[4 * j + 3]);
            EDMA_intFree(chan->tcc[j]);
        }      
        
        for(j = 0; j < chan->numFrms ; j ++) {
            MEM_free(chan->segId, chan->viops[j].frame.iFrm.y1, chan->bufSz);
        }        
        
        base = (volatile Int *)chan->base;
        /* reset display */
        base[_VP_VDCTL_OFFSET] |= 
            VP_VDCTL_RSTCH_RESET << _VP_VDCTL_RSTCH_SHIFT;
        
        chan->status = 0;
        /* close external device */
        if(chan->edcFxns != INV) {
            chan->edcFxns->close(chan->edcHandle);
        }
        
    }    
    return IOM_COMPLETED;
}


/*
 *  ======== mdSubmitChan ========
 */
static Int  mdSubmitChan(Ptr chanp, IOM_Packet *packet)
{

    _VPORT_ChanObj* chan = (_VPORT_ChanObj *)chanp;
    FVID_Frame* viop;                             
    Int retVal = IOM_PENDING;
    Uint32 gie = IRQ_globalDisable();     
    
    if(packet->cmd  == IOM_ABORT) {
       /* clear all pending I/O requests */
       while(!QUE_empty(&chan->qIn)) {
          QUE_enqueue(&chan->qOut, QUE_dequeue(&chan->qIn));       
       }
       return IOM_ABORTED;
    
    }else  if(packet->cmd != FVID_ALLOC 
        && packet->cmd != FVID_FREE 
        && packet->cmd != FVID_EXCHANGE){        
        /* other commands not supported */
        return IOM_ENOTIMPL;    
    }

    
    if(packet->cmd != FVID_ALLOC) {/* FVID_FREE or FVID_EXCHANGE */
        if(chan->asyncModeEnable) {
        /* In async mode, FVID_free and FVID_exchange is not supported.*/
           return IOM_EINUSE; 
        }
        viop = *(void **)packet->addr; /* pointer of a video I/O packet */
        if(chan->queEmpty) {
            /* check to make sure it is not to at the end of a frame */
            /* to avoid any race condition                           */
            volatile Int* base = (volatile Int *)chan->base;
            short lineNum = (base[_VP_VDSTAT_OFFSET] & _VP_VDSTAT_VDYPOS_MASK)
                           >> _VP_VDSTAT_VDYPOS_SHIFT;
            /* make sure we are at least five lines before completion */
            /* to prevent EDMA reload happening while it is being modified */
            if(lineNum <= chan->lastLineNum - 5) {
                Int offset = chan->nextEDMARlds << 1;
                chan->nextViop = viop;
                /* now modify the EDMA rld entries */
                if(chan->mergeFlds){
                    EDMA_RSETH(chan->hRld[offset], SRC, 
                        viop->frame.iFrm.y1);
                    EDMA_RSETH(chan->hRld[offset + 1], SRC, 
                        viop->frame.iFrm.y2);
                    if(!(chan->mode & _VPORT_MASK_RAW)){
                        EDMA_RSETH(chan->hRld[4 + offset], SRC, 
                          viop->frame.iFrm.cb1);     
                        EDMA_RSETH(chan->hRld[5 + offset], SRC, 
                          viop->frame.iFrm.cb2);                         
                        EDMA_RSETH(chan->hRld[8 + offset], SRC, 
                          viop->frame.iFrm.cr1);     
                        EDMA_RSETH(chan->hRld[9 + offset], SRC, 
                          viop->frame.iFrm.cr2);              
                    }           
                } else {
                    EDMA_RSETH(chan->hRld[offset], SRC, 
                        viop->frame.iFrm.y1);
                    if(!(chan->mode & _VPORT_MASK_RAW)){
                        EDMA_RSETH(chan->hRld[4 + offset], SRC, 
                          viop->frame.iFrm.cb1);     

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品网站在线观看| 色综合视频在线观看| 色诱亚洲精品久久久久久| 国产一区福利在线| 久久蜜臀中文字幕| 国产精品一区二区久久不卡| 中文字幕不卡的av| 91小宝寻花一区二区三区| 亚洲一区二区五区| 91精品福利在线一区二区三区 | 精品国产免费久久| 99热国产精品| 日韩高清在线一区| 国产欧美一区二区三区在线看蜜臀 | 国产91丝袜在线播放0| 欧美激情中文字幕一区二区| 中文字幕欧美国产| 亚洲视频每日更新| 欧美日韩大陆在线| 奇米精品一区二区三区四区| 久久精品视频一区| 91精品国产日韩91久久久久久| 在线观看视频一区| 蜜臀久久99精品久久久久宅男| 久久精品夜色噜噜亚洲aⅴ| 国产亚洲精品精华液| 亚洲欧美自拍偷拍| 精品精品国产高清一毛片一天堂| 26uuu久久天堂性欧美| 日本道色综合久久| 成人黄色小视频在线观看| 精品一区二区免费在线观看| 污片在线观看一区二区| 自拍av一区二区三区| 亚洲国产视频在线| 亚洲国产综合人成综合网站| 久久99这里只有精品| 五月天丁香久久| 国产成人av一区二区| 国产精品影视在线观看| 欧美视频日韩视频| 欧美性大战久久久久久久蜜臀| 91麻豆精品国产自产在线观看一区 | 久久在线免费观看| 亚洲综合在线电影| 国产午夜精品一区二区| 亚洲黄色尤物视频| 国产成人午夜精品5599| 91免费看视频| 久久久精品国产99久久精品芒果| 亚洲综合色区另类av| 91麻豆视频网站| 国产区在线观看成人精品| 日韩电影免费一区| 欧美天堂一区二区三区| 国产精品白丝在线| 国产精品美女久久久久av爽李琼| 日本一区二区高清| 精品中文字幕一区二区| 欧美中文字幕一区二区三区亚洲| 精品免费日韩av| 国产亚洲自拍一区| 久久草av在线| 在线观看91av| 国产精品三级视频| 国产盗摄一区二区| 精品国产电影一区二区| 欧美aaaaa成人免费观看视频| 在线视频欧美精品| 亚洲男同1069视频| 亚洲r级在线视频| 老汉av免费一区二区三区| 欧美精品123区| 亚洲成人精品一区二区| 91国产丝袜在线播放| 亚洲免费在线播放| 91九色02白丝porn| 亚洲狠狠爱一区二区三区| 色综合久久88色综合天天免费| 中文字幕不卡三区| 成人短视频下载| 亚洲欧洲日韩av| 色菇凉天天综合网| 一区二区在线电影| 欧美视频一区二区| 视频一区欧美日韩| 国产精品一区二区91| 久久精品视频一区二区三区| 国产91丝袜在线观看| 成人欧美一区二区三区视频网页| 97精品久久久午夜一区二区三区| 精品少妇一区二区三区日产乱码 | 国产在线一区观看| 欧美色爱综合网| 久久久久久久久一| 99精品热视频| 亚洲成人手机在线| 久久久久综合网| 99在线热播精品免费| 午夜精品久久一牛影视| 日韩免费看的电影| 亚洲bdsm女犯bdsm网站| 欧美大片国产精品| 不卡视频在线看| 图片区小说区国产精品视频| 日韩欧美精品三级| 91免费视频观看| 韩国三级在线一区| 亚洲色图第一区| 欧美电影免费观看高清完整版| 国产成人av福利| 洋洋成人永久网站入口| 久久久久国产精品麻豆| 欧美视频一区二| 成人精品gif动图一区| 日韩精品午夜视频| 国产精品美女久久久久高潮 | 国产一区二区导航在线播放| 1024亚洲合集| www精品美女久久久tv| 在线观看av不卡| 成人黄动漫网站免费app| 日本aⅴ免费视频一区二区三区| 国产精品蜜臀av| 日韩免费在线观看| 欧美亚洲国产一区二区三区va| 国产精品一级片| 欧美aaa在线| 亚洲国产成人porn| 亚洲同性gay激情无套| 日韩精品影音先锋| 91精选在线观看| 欧美丝袜第三区| 91免费看视频| 91美女视频网站| 成人性生交大片免费看视频在线| 国产日韩影视精品| 宅男噜噜噜66一区二区66| 欧洲激情一区二区| 91色九色蝌蚪| 成人av网站在线观看| 国产精品小仙女| 国产一区二区三区最好精华液| 婷婷综合五月天| 性做久久久久久久久| 亚洲一区二区三区视频在线播放| 国产精品水嫩水嫩| 国产精品毛片无遮挡高清| 日本一区二区三区四区| www国产精品av| 亚洲精品一区二区三区在线观看| 欧美欧美欧美欧美| 91精品一区二区三区在线观看| 欧美日韩午夜影院| 欧美日韩精品欧美日韩精品一综合| av亚洲精华国产精华| 91香蕉视频污在线| 日本福利一区二区| 欧美日韩一区二区欧美激情| 欧美日韩免费不卡视频一区二区三区| 在线观看日韩av先锋影音电影院| 91激情在线视频| 欧美乱妇一区二区三区不卡视频| 在线不卡免费欧美| 日韩欧美国产wwwww| 欧美成人video| 国产亚洲人成网站| 久久精品人人做| ㊣最新国产の精品bt伙计久久| 综合久久国产九一剧情麻豆| 一区二区三区四区国产精品| 日本aⅴ精品一区二区三区| 免费视频一区二区| 成人精品一区二区三区中文字幕| 99热在这里有精品免费| 欧美美女一区二区三区| 精品国产电影一区二区| **欧美大码日韩| 日本午夜精品一区二区三区电影 | 久久久国际精品| 亚洲日本一区二区三区| 午夜久久福利影院| 免费观看在线综合色| 成人app网站| 91精品国产色综合久久不卡蜜臀 | 国产精品一区二区久久精品爱涩| 99国产精品国产精品毛片| 欧美精品在线观看一区二区| 久久久精品欧美丰满| 亚洲国产精品久久人人爱蜜臀| 国产综合久久久久久久久久久久 | 久久狠狠亚洲综合| 91在线视频免费观看| 欧美电视剧免费观看| 成人免费小视频| 国产一级精品在线| 欧美女孩性生活视频| 成人欧美一区二区三区视频网页| 久久精品国产99| 欧美日精品一区视频|