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

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

?? vportdis.c

?? DM642上用的TH8200采集芯片的配套驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* DSP/BIOS standard include files */
#include <std.h>
#include <mem.h>
#include <que.h>    
#include <tsk.h>

/* Chip-support library include files */
#include <csl.h>
#include <csl_edma.h>
#include <csl_vphal.h>         
#include <csl_irq.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 _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 _setVIntCb(Ptr chanp, Ptr args);


/* 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;
        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;
        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[2 * j] = EDMA_allocTable(-1)) == EDMA_HINV 
             || (chan->hRld[2 * j + 1] =EDMA_allocTable(-1)) == EDMA_HINV 
             || (chan->tcc[j] = EDMA_intAlloc(chan->edmaChanNum[j])) == -1){
                retVal = IOM_EALLOC;
            }/* if((chan->...*/ 
        }/* for(j = 0; j < NUM_EDMA_CHANS; j++) {...*/
        /* if EDMAs are not allocated successfully, */
        /* delete the channel just created          */
        if(retVal == IOM_COMPLETED && (void *)chanParams != INV) {
            retVal = mdControlChan(chan, VPORT_CMD_CONFIG_CHAN, chanParams); 
        }
        if(! retVal) {
             /* configure the channel */
             *chanp = chan;
        }else {
            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_close(chan->hEdma[j]);
            EDMA_freeTable(chan->hRld[2 * j]);
            EDMA_freeTable(chan->hRld[2 * j + 1]);
            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;
        /* reset video port */
        base[_VP_VPCTL_OFFSET] |= 
            VP_VPCTL_VPRST_RESET << _VP_VPCTL_VPRST_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 != FVID_ALLOC) {/* FVID_FREE or FVID_EXCHANGE */
        viop = *(void **)packet->addr; /* pointer of a video I/O packet */
        if(chan->queEmpty) {
            /* don't put it into queue, update the rld register directly */
            chan->queEmpty = FALSE;                   
        }
        QUE_enqueue(&chan->qIn, (QUE_Handle)viop);        
        retVal = packet->status = IOM_COMPLETED;
    }
    if(packet->cmd != FVID_FREE) { /* FVID_ALLOC or FVID_EXCHANGE */
        if(chan->packetIOM == INV){
            if((viop = (FVID_Frame *)QUE_dequeue(&chan->qOut))
                !=(FVID_Frame *)&chan->qOut) {
                /* only when there is no outstanding pending request */
                *(void **)packet->addr = (void *)viop;
                packet->size = sizeof(FVID_Frame);
                retVal = packet->status = IOM_COMPLETED;
            }
            else {
                chan->packetIOM = packet;
                retVal = packet->status = IOM_PENDING;
            }
        }else retVal = IOM_EINUSE;    
                    
    }    
    IRQ_globalRestore(gie);
    return retVal;
}


/*
 *  ========  _configChan ========
 */
static Int _configChan(Ptr chanp, Ptr args)
{
    _VPORT_ChanObj* chan = (_VPORT_ChanObj *)chanp;
    VPORTDIS_Params*   params = (VPORTDIS_Params* )args; 
    Int retVal;           
    
    
    if(!(chan->status & _VPORT_CFGED)) {
        /* configure video port channel A/B control register */
        _configRegs(chanp, params);
        /* configure EDMA and frame buffer */
        retVal = _configEDMA(chanp, params);
    } else {
        retVal = IOM_EINUSE;
    }    
    return retVal;
}                     


/*
 *  ======== _configEDMA ========
 */
static Int _configEDMA(Ptr chanp, VPORTDIS_Params *params)
{
    _VPORT_ChanObj* chan = (_VPORT_ChanObj *)chanp;
    Int i;
    EDMA_Config  cfgEdma;
    Int thrld;
    Int edmaChans;
    Int8* curAddr;
    
    if(chan->status & _VPORT_CFGED) {
        assert(params->numFrmBufs  >= 2 
            && params->numFrmBufs <= VPORT_MAX_NUM_FRMBUFS);
        chan->numFrms = params->numFrmBufs;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
洋洋成人永久网站入口| 国产精品区一区二区三| 性欧美疯狂xxxxbbbb| 欧美影片第一页| 亚洲成av人片在线观看无码| 欧美日韩成人在线| 免费一级片91| 精品成人一区二区三区| 国产精品99久久不卡二区| 日本一区二区免费在线| 99在线精品视频| 夜夜夜精品看看| 91麻豆精品国产91| 国产不卡视频一区二区三区| 亚洲日本韩国一区| 欧美精品久久久久久久多人混战 | 3d动漫精品啪啪一区二区竹菊| 一区二区三区久久| 91精品国产高清一区二区三区蜜臀 | 韩国欧美国产一区| 中文字幕精品—区二区四季| 精品视频在线视频| 久久99国产精品久久| 国产精品久久网站| 欧美日韩精品一区二区在线播放 | 国产在线精品免费av| 国产精品免费观看视频| 9191国产精品| 99久久精品国产精品久久| 亚洲图片一区二区| 日本一区二区三区国色天香| 欧美视频中文字幕| 国产在线不卡一区| 亚洲曰韩产成在线| 久久久久久日产精品| 欧美色老头old∨ideo| 国产精品资源在线看| 亚洲成人一二三| 国产精品欧美久久久久一区二区 | 成人激情黄色小说| 亚洲国产精品久久久久婷婷884| 久久久久国产一区二区三区四区| 在线观看成人免费视频| 国产精品乡下勾搭老头1| 亚洲一卡二卡三卡四卡五卡| 中文字幕国产一区| 日韩精品一区在线| 欧美日韩国产天堂| av中文字幕不卡| 激情综合色播五月| 亚洲动漫第一页| 国产精品乱子久久久久| 26uuu另类欧美| 91精品国产综合久久国产大片 | 在线观看国产日韩| 不卡区在线中文字幕| 久久精品国产99国产| 亚洲国产另类av| 亚洲欧美另类久久久精品2019| 久久精品亚洲国产奇米99| 欧美日韩国产欧美日美国产精品| 91免费在线视频观看| 国产很黄免费观看久久| 麻豆成人综合网| 日韩国产高清影视| 亚洲国产精品欧美一二99| 亚洲免费伊人电影| 亚洲欧美一区二区三区国产精品 | 综合久久久久综合| 国产精品网站一区| 欧美激情综合在线| 国产欧美日韩另类一区| 精品播放一区二区| 精品国产欧美一区二区| 欧美电影精品一区二区| 欧美电影精品一区二区| 精品免费99久久| 日韩欧美的一区二区| 日韩一区二区三区视频在线观看| 91精品国产综合久久精品性色| 欧美日韩aaa| 欧美午夜一区二区三区免费大片| 欧美综合欧美视频| 欧美又粗又大又爽| 欧美日韩dvd在线观看| 91麻豆精品国产91久久久久久久久 | 蜜桃传媒麻豆第一区在线观看| 五月天激情综合网| 蜜桃av噜噜一区| 精品一区二区免费| 国产成人综合网站| 丁香啪啪综合成人亚洲小说| www.综合网.com| 色八戒一区二区三区| 欧美午夜一区二区三区免费大片| 欧美系列日韩一区| 日韩精品一区二区三区视频| 26uuu国产电影一区二区| 亚洲国产成人私人影院tom| 成人欧美一区二区三区小说| 亚洲黄色小说网站| 日本免费新一区视频| 国产馆精品极品| 色悠久久久久综合欧美99| 欧美调教femdomvk| 日韩免费观看高清完整版| 日本一区二区三区四区在线视频| 亚洲美女屁股眼交| 午夜激情综合网| 国产在线视频不卡二| 国产欧美精品日韩区二区麻豆天美 | 亚洲一区二区五区| 日韩一区欧美二区| 精品一区二区三区免费视频| 激情图片小说一区| 91影视在线播放| 欧美日本一区二区三区| 欧美成人女星排名| 亚洲婷婷在线视频| 99久久综合国产精品| 日韩精品中文字幕在线不卡尤物| 亚洲欧美日韩久久精品| 国产福利91精品一区二区三区| 一本一本大道香蕉久在线精品 | 麻豆91免费看| 99视频精品全部免费在线| 色综合色狠狠天天综合色| 亚洲精品一区二区三区影院| 一二三区精品福利视频| 不卡电影免费在线播放一区| 久久综合久久综合久久综合| 亚洲大片精品永久免费| 日韩影院免费视频| 色老汉一区二区三区| 欧美精品一区二区三| 亚洲免费在线电影| 国产毛片一区二区| 精品视频全国免费看| 亚洲猫色日本管| 91在线观看地址| 亚洲黄色在线视频| 麻豆精品视频在线观看免费| 91精品国产一区二区三区蜜臀| 亚洲一卡二卡三卡四卡| 欧美中文字幕一区| 亚洲欧美综合另类在线卡通| 91色porny| 日韩精品五月天| 91精品免费在线| av电影在线观看一区| 中文字幕国产一区| 欧美日韩三级一区| 欧美伊人久久大香线蕉综合69| 日韩精品一区二区三区视频 | 色婷婷综合久久久中文字幕| 粉嫩av一区二区三区粉嫩| 欧美一区中文字幕| 亚洲综合一区二区三区| 91亚洲精品久久久蜜桃| 国产欧美一区二区精品婷婷 | 一区二区三区中文在线| 99热精品一区二区| 亚洲少妇屁股交4| 99久久99久久精品免费看蜜桃| 2020日本不卡一区二区视频| 黄色日韩网站视频| 久久亚洲精精品中文字幕早川悠里 | 欧美成人国产一区二区| 免费高清视频精品| 日韩一区二区三免费高清| 日韩高清不卡一区二区| 欧美一区二区在线播放| 亚洲成av人片| 欧美日本一区二区在线观看| 日韩国产一二三区| 日韩美女在线视频| 国产激情视频一区二区三区欧美| 久久久无码精品亚洲日韩按摩| 国产大片一区二区| 国产精品全国免费观看高清| 成人理论电影网| 亚洲精品日韩综合观看成人91| 在线观看日韩av先锋影音电影院| 亚洲电影激情视频网站| 6080日韩午夜伦伦午夜伦| 久久99热99| 久久久久久久久久久久久女国产乱| 国产v综合v亚洲欧| 亚洲欧美日韩中文字幕一区二区三区| 色综合婷婷久久| 亚洲一区二区在线播放相泽| 91精品国产麻豆| 国产精品18久久久久久vr| 国产精品免费视频一区| 欧美在线观看视频在线| 奇米精品一区二区三区在线观看| 精品粉嫩aⅴ一区二区三区四区| 成人激情视频网站| 亚洲va欧美va天堂v国产综合| 这里只有精品电影|