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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? vportcap.c

?? 使用DM642 來進行scaling 有說明檔
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 *  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 */
/**************************************************************************/
/* vportcap.c file */
/**************************************************************************/

/* DSP/BIOS standard include files */
#include <std.h>
#include <mem.h>
#include <que.h>     
#include <tsk.h>    
#include <hwi.h>          
#include <clk.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>

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

/* video driver specific include files */
#include <vport.h>
#include <vportcap.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>

/* type defines and data structures */
/**************************************************************
 *     data structure for video port object                   *
 **************************************************************/
typedef struct PortObj{
    /* port status register, contains information on whether */
    /* port is opened, configured, etc.                      */
    Int     status;
    /* vp base address for all register access */
    Int     base;
    
    /* two channel objects for channel A & B.  */
    /* This is only for capture operation      */
    _VPORT_ChanObj chanObj[2];
} PortObj;


/* 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 void captureEdmaISR(Int tcc);
static void captureISR(Int portNum);
static Int _configCh(Ptr chanp, VPORTCAP_Params *params);
static Int _configChan(Ptr chanp, Ptr args);     
static Int _configPort(Ptr chanp, Ptr args);    
static Int _configTransfer(Ptr chanp,VPORTCAP_Params *params);  
static Int _covrRecover(Ptr chanp);
static Int _setVIntCb(Ptr chanp, Ptr args);
static Int _startVPCapture(Ptr chanp);
static Int _stopVPCapture(Ptr chanp);   
static void _delay(Int delayTime);
static void _autoSync(_VPORT_ChanObj* chan);
static Int _getNumPendingIORqsts(Ptr chanp, Ptr args);


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

/**************************************************************
 * Static allocation and initialization of port objects       *
 **************************************************************/
static PortObj portObjs[_VP_PORT_CNT] = {
    /* video port 0 */
    {0, _VP_BASE_PORT0,
    /* channel A */  
        {{0, 0, 0, _VP_BASE_CHAPORT0, EDMA_CHA_VP0EVTYA, EDMA_CHA_VP0EVTUA, 
        EDMA_CHA_VP0EVTVA, _VP_YSRCA0_ADDR, _VP_CBSRCA0_ADDR, 
        _VP_CRSRCA0_ADDR }, 
    /* channel B */  
        {0, 0, 1, _VP_BASE_CHBPORT0, EDMA_CHA_VP0EVTYB, EDMA_CHA_VP0EVTUB, 
        EDMA_CHA_VP0EVTVB,  _VP_YSRCB0_ADDR, _VP_CBSRCB0_ADDR, 
        _VP_CRSRCB0_ADDR}}},

    /* video port 1 */
    {0, _VP_BASE_PORT1, 
    /* channel A */  
        {{0, 1, 0, _VP_BASE_CHAPORT1, EDMA_CHA_VP1EVTYA, EDMA_CHA_VP1EVTUA, 
        EDMA_CHA_VP1EVTVA, _VP_YSRCA1_ADDR, _VP_CBSRCA1_ADDR, 
        _VP_CRSRCA1_ADDR }, 
    /* channel B */  
        {0, 1, 1, _VP_BASE_CHBPORT1, EDMA_CHA_VP1EVTYB, EDMA_CHA_VP1EVTUB, 
        EDMA_CHA_VP1EVTVB, _VP_YSRCB1_ADDR, _VP_CBSRCB1_ADDR, 
        _VP_CRSRCB1_ADDR}}},

    /* video port 2 */
    {0, _VP_BASE_PORT2,
    /* channel A */  
        {{0, 2, 0, _VP_BASE_CHAPORT2, EDMA_CHA_VP2EVTYA, EDMA_CHA_VP2EVTUA, 
         EDMA_CHA_VP2EVTVA, _VP_YSRCA2_ADDR, _VP_CBSRCA2_ADDR, 
         _VP_CRSRCA2_ADDR  }, 
    /* channel B */  
        {0, 2, 1, _VP_BASE_CHBPORT2, EDMA_CHA_VP2EVTYB, EDMA_CHA_VP2EVTUB, 
         EDMA_CHA_VP2EVTVB,  _VP_YSRCB2_ADDR, _VP_CBSRCB2_ADDR, 
         _VP_CRSRCB2_ADDR }}}
};


/*
 *  =================== mdBindDev ============================
 *  Register all external devices to video port capture driver 
 */
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
{
    Int portNum = devid;         
    volatile Int i;
    volatile Int* base = (volatile Int *)portObjs[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 = &portObjs[portNum];                                                                                           
    return mdControlChan(&portObjs[portNum], VPORT_CMD_CONFIG_PORT, devParams); 
}


/*
 *  ======== mdControlChan ========
 */
static Int mdControlChan(Ptr chanp, Uns cmd, Ptr args)
{
    Int retVal = IOM_EBADMODE;
    _VPORT_ChanObj* chan = (_VPORT_ChanObj* )chanp;

    switch (cmd) {
        case VPORT_CMD_START:
        retVal = _startVPCapture(chanp);
        break;
        case VPORT_CMD_STOP:
        retVal = _stopVPCapture(chanp);
        break;
        case VPORT_CMD_SET_VINTCB:
        retVal = _setVIntCb(chanp, args);
        break;
        case VPORT_CMD_CONFIG_PORT:
        retVal = _configPort(chanp, args);
        break;
        case VPORT_CMD_COVR_RECOVER:
        retVal = _covrRecover(chanp);
        break;
        case VPORT_CMD_CONFIG_CHAN:
        retVal = _configChan(chanp, 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;
        } 
        break;   
    }
    return retVal;
}              


/*
 *  =================== mdCreateChan ============================
 *  create a capture channel
 */
static Int  mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
                      Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
{
    Int chanNum;           
    volatile Int* base;
    PortObj* port;
    Int retVal = IOM_COMPLETED;       
     

    if(mode != IOM_INPUT){
        return IOM_EBADARGS;
    }
    if(*name ++ != '/') {
        return IOM_EBADARGS;
    }
    chanNum = *name ++ - 'A';

    assert(chanNum < _VPORT_CHAN_CNT);
    
    port = (PortObj *)devp;
    if(port->chanObj[chanNum].edcFxns != INV) {
        /* open external device */
        port->chanObj[chanNum].edcHandle 
           = port->chanObj[chanNum].edcFxns->open(name, (Arg)INV);
    } 
    if(! (port->status & _VPORT_OPENED)) {
        port->status |= _VPORT_OPENED;
        base = (volatile Int *)port->base;                       
        

        /* reset both channels */
        base[_VP_VCACTL_OFFSET] |= 
            VP_VCACTL_RSTCH_RESET << _VP_VCACTL_RSTCH_SHIFT;
        base[_VP_VCBCTL_OFFSET] |= 
            VP_VCBCTL_RSTCH_RESET << _VP_VCBCTL_RSTCH_SHIFT;
    } /* if(!port->opened)  */
    /* initialize the channel object */
    if(! (port->chanObj[chanNum].status & _VPORT_OPENED)) {
        Int j;
        _VPORT_ChanObj *chan = &port->chanObj[chanNum];       

        chan->status |= _VPORT_OPENED;
        chan->cbFxn = cbFxn;
        chan->cbArg = (Arg)cbArg;
        chan->numFrms = 0;
        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;
            }/* if((port->...*/ 
        }/* for(j = 0; j < NUM_EDMA_CHANS; j++) {...*/
        if( retVal == IOM_COMPLETED && (void *)chanParams != INV) {
            retVal = mdControlChan(&port->chanObj[chanNum], 
                VPORT_CMD_CONFIG_CHAN, chanParams); 
        }
        if(retVal == IOM_COMPLETED) {
             /* configure the channel */
             *chanp = &port->chanObj[chanNum];
        }else {
            mdDeleteChan(&port->chanObj);
            *chanp = INV;                     
        }               
    } /*if(!chan->opened) */
    return retVal;
}               


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

static Int  mdDeleteChan(Ptr chanp)
{
    _VPORT_ChanObj* chan = (_VPORT_ChanObj* )chanp;
    PortObj* port = &portObjs[chan->portNum];
    Int j;
    
    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);
        }        
        /* close external device */
        if(chan->edcFxns != INV) {
            chan->edcFxns->close(chan->edcHandle);
        }
    }    
    
    if(! (port->chanObj[0].status & _VPORT_OPENED) 
       && ! (port->chanObj[1].status & _VPORT_OPENED)) {
        port->status = 0;
    }
    return IOM_COMPLETED;
}
                   

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

    _VPORT_ChanObj* chan = (_VPORT_ChanObj *)chanp;
    FVID_Frame* viop;                             
    Uint32 gie = IRQ_globalDisable();
    Int retVal = IOM_PENDING;  
    Int offset = chan->nextEDMARlds << 1;
    Bool nextViopChanged = FALSE;             
    Bool notToLate = TRUE;
    volatile Int* cBase = (volatile Int *)chan->base;
    Int capStatReg = cBase[_VP_VCASTAT_OFFSETA];
    short lineNum;
    
     
    /* get the current line number being captured */
    lineNum = (capStatReg & _VP_VCASTAT_VCYPOS_MASK)
                           >> _VP_VCASTAT_VCYPOS_SHIFT;
            
    /* account for field/frame operation modes */ 
    lineNum += chan->numLinesFld1 
        * ((capStatReg & _VP_VCASTAT_VCFLD_MASK) >> _VP_VCASTAT_VCFLD_SHIFT);    

    /* make sure we are not too close to the end of a frame */
    notToLate = (lineNum < (chan->lastLineNum - 5));

    assert(chan->status & _VPORT_READY);
    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 */
        viop = *(void **)packet->addr; /* pointer of a video I/O packet */
        if(chan->queEmpty && notToLate) {
            /* don't put it into queue, update the rld register directly */
            chan->nextViop = viop; 
            nextViopChanged = TRUE;
        } 
        else {               
            QUE_enqueue(&chan->qIn, (QUE_Handle)viop);    
        }
        chan->queEmpty = FALSE;
        retVal = packet->status = IOM_COMPLETED;
    }
    if(packet->cmd != FVID_FREE) {/* FVID_ALLOC or FVID_EXCHANGE */
        if(chan->mrViop != INV) {
            /* only when there is no outstanding pending request */
            if(chan->packetIOM == INV){
                if(chan->nextViop != chan->mrViop){
                    *(void **)packet->addr = (void *)chan->mrViop;
                    chan->mrViop = INV;
                    packet->size = sizeof(FVID_Frame);
                    retVal = packet->status = IOM_COMPLETED;                
                } else {
                    if (notToLate) {
                        *(void **)packet->addr = (void *)chan->mrViop;
                        chan->mrViop = INV;
                        packet->size = sizeof(FVID_Frame);
                        retVal = packet->status = IOM_COMPLETED;
                        /* If queue is already empty, it means the driver currently*/
                        /* only owns one frame, which is the current frame. So make*/
                        /* the next frame the same as the current one              */
                        chan->nextViop = chan->curViop;
                    } else {
                        chan->mrViop = INV; /* too late, just recycle the mrViop */                    
                        chan->packetIOM = packet;
                        retVal = packet->status = IOM_PENDING;
                    }
                }
            }
            else retVal = IOM_EINUSE;    
        } else {
            chan->packetIOM = packet;
            retVal = packet->status = IOM_PENDING;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91电影在线观看| 国产精品卡一卡二卡三| 国产日产亚洲精品系列| 亚洲综合男人的天堂| 久久黄色级2电影| 在线观看视频一区二区欧美日韩| 欧美变态tickle挠乳网站| 亚洲人123区| 国产精品一级在线| 7878成人国产在线观看| 亚洲裸体xxx| 丁香激情综合五月| 日韩欧美的一区二区| 午夜电影一区二区| 色综合色综合色综合色综合色综合 | 日韩不卡一区二区| 一本大道久久a久久精品综合| 日韩欧美国产高清| 日本美女一区二区| 欧美日韩免费一区二区三区| 亚洲久草在线视频| 91国偷自产一区二区三区成为亚洲经典 | 国产一区二区在线视频| 欧美日韩精品免费观看视频| 亚洲欧美偷拍卡通变态| 成人免费观看视频| 欧美经典一区二区三区| 国产黑丝在线一区二区三区| 精品国产一二三| 国产一区二区免费看| 久久一区二区三区四区| 国精产品一区一区三区mba视频| 欧美理论在线播放| 热久久国产精品| 欧美一级片在线观看| 日本一区中文字幕| 日韩午夜精品电影| 国产一区二区免费在线| 国产午夜精品久久久久久免费视| 国产电影一区二区三区| 国产精品视频麻豆| 一本一道综合狠狠老| 亚洲精品成人精品456| 欧美日韩综合在线| 天堂蜜桃一区二区三区| 日韩三级.com| 国产精品亚洲一区二区三区在线| 精品粉嫩超白一线天av| 国产成人8x视频一区二区| 国产精品午夜在线| 91麻豆高清视频| 亚洲成年人影院| 精品日韩成人av| 成人一区二区三区中文字幕| 国产精品福利影院| 欧美日韩高清一区二区不卡 | 精品在线观看免费| 国产欧美一区二区精品性| 91年精品国产| 免费高清视频精品| 中文字幕免费一区| 欧美老年两性高潮| 国产精品一区二区三区乱码| 亚洲天天做日日做天天谢日日欢| 欧美日韩三级视频| 国产一区二区成人久久免费影院| 国产精品免费免费| 欧美美女bb生活片| 高清在线成人网| 亚洲不卡在线观看| 欧美国产视频在线| 欧美一区国产二区| 成人av电影观看| 久久99久久99| 一区二区三区精品在线观看| 精品国产免费人成电影在线观看四季 | 久久超级碰视频| 国产精品网站导航| 91精品国产aⅴ一区二区| 懂色一区二区三区免费观看| 亚洲第一电影网| 国产女人18毛片水真多成人如厕| 欧美性高清videossexo| 成人一区在线看| 日韩av一区二区三区| 自拍偷拍国产精品| 精品久久国产字幕高潮| 91国偷自产一区二区开放时间| 久久97超碰国产精品超碰| 一级日本不卡的影视| 久久天天做天天爱综合色| 欧美日韩高清一区二区三区| 白白色亚洲国产精品| 国产美女在线观看一区| 奇米影视一区二区三区| 夜色激情一区二区| 国产精品国产三级国产有无不卡 | 国产亲近乱来精品视频| 欧美一区二区女人| 欧美视频精品在线| 99v久久综合狠狠综合久久| 国产精品一区二区三区99| 男女视频一区二区| 日本特黄久久久高潮| 午夜久久久影院| 亚洲成a人片综合在线| 亚洲精品成人天堂一二三| 亚洲同性gay激情无套| 亚洲18女电影在线观看| 中文字幕一区二区三区四区不卡 | 国产尤物一区二区| 久久国产欧美日韩精品| 美女高潮久久久| 日韩av中文字幕一区二区三区| 亚洲国产另类av| 亚洲自拍偷拍麻豆| 亚洲成av人片一区二区| 午夜久久久影院| 免费看日韩a级影片| 首页国产欧美日韩丝袜| 美女视频黄免费的久久 | 26uuu精品一区二区三区四区在线| 91精品在线一区二区| 日韩一卡二卡三卡四卡| 日韩色在线观看| 精品福利一区二区三区 | 日韩欧美国产精品一区| 精品国产伦一区二区三区观看体验 | 欧美一区二区在线免费观看| 欧美一级专区免费大片| 精品国产乱码久久久久久夜甘婷婷| 日韩欧美精品在线视频| 精品久久国产97色综合| 国产精品久久午夜| 亚洲精选视频免费看| 亚洲丰满少妇videoshd| 日本在线播放一区二区三区| 久久精品国产99国产| 国产99久久久久久免费看农村| jiyouzz国产精品久久| 在线免费观看日韩欧美| 91精品午夜视频| 国产日韩欧美综合一区| 综合久久久久综合| 日韩va欧美va亚洲va久久| 国产最新精品精品你懂的| 不卡电影免费在线播放一区| 欧美日韩国产综合视频在线观看| 欧美精品v日韩精品v韩国精品v| 久久综合九色综合97婷婷女人| 国产欧美日本一区视频| 亚洲一区二区在线视频| 国产一区二区在线视频| 91精品1区2区| 久久奇米777| 亚洲第一狼人社区| 国产精品一二三四| 日韩欧美在线1卡| 亚洲人被黑人高潮完整版| 免费成人美女在线观看| 成人国产精品视频| 91精品国产一区二区三区蜜臀| 国产精品久久久久久久久动漫 | 亚洲另类春色校园小说| 老司机精品视频导航| 在线视频一区二区三区| 久久久久久免费| 视频精品一区二区| www.欧美精品一二区| 欧美一区二区在线不卡| 中文字幕亚洲在| 国内成+人亚洲+欧美+综合在线| 91丝袜美女网| 久久久久久久综合日本| 日本欧美一区二区三区| 欧美在线观看一区| 亚洲国产精品精华液ab| 毛片不卡一区二区| 欧美影院一区二区| 综合亚洲深深色噜噜狠狠网站| 激情综合色综合久久| 欧美精品久久久久久久久老牛影院 | eeuss影院一区二区三区 | 一区二区三区日韩精品| 成人三级在线视频| 久久色成人在线| 麻豆专区一区二区三区四区五区| 欧美亚州韩日在线看免费版国语版| 国产精品天天看| 国产精品69毛片高清亚洲| 欧美成人vps| 美国十次综合导航| 日韩欧美的一区二区| 喷水一区二区三区| 91精品国产综合久久福利软件| 久久狠狠亚洲综合| 精品国产乱码久久久久久久| 男女激情视频一区| 日韩视频免费观看高清完整版 | 一区二区三区欧美日|