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

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

?? c6x1x_edma_mcasp.c

?? 通過BIOS在DEC6713上實(shí)現(xiàn)了音頻的采樣與播放
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):
                if (MCASP_FGETH(hMcasp, XSTAT, XCKFAIL)) {
                    MCASP_FSETSH(hMcasp, XSTAT, XCKFAIL, YES);
                    events |= C6X1X_EDMA_MCASP_EVT_XCKFAIL;
                }
                if (MCASP_FGETH(hMcasp, XSTAT, XSYNCERR)) {
                    MCASP_FSETSH(hMcasp, XSTAT, XSYNCERR, YES);
                    events |= C6X1X_EDMA_MCASP_EVT_XSYNCERR;
                }   
                if (MCASP_FGETH(hMcasp, XSTAT, XDMAERR)) {
                    MCASP_FSETH(hMcasp, XSTAT, XDMAERR, 1);
                    events |= C6X1X_EDMA_MCASP_EVT_XDMAERR;
                }   
                /* Clear not registered events here */
                MCASP_RSETH(hMcasp, XSTAT, 0xFFFFFFFF);
            }
            eventReturn = ports[portNbr].evtMask & events;
 
            if (eventReturn) {
                (*ports[portNbr].evtCallback)(eventReturn, portNbr);
            } 
        }   
    }    
}

/*
 * ======== linkPacket ========
 * Links a packet with the EDMA. When called by mdSubmitChan() it is called
 * with all interrupts disabled, but when called by an ISR only the EDMA IRQ
 * is disabled.
 */
static Void linkPacket(ChanHandle chan, IOM_Packet *packet)
{
    EDMA_Handle pramPtr;
    Uns edmaCnt;

    /* Store the packet in the packetList */
    chan->packetList[chan->writeIndex] = packet;

    /* Set up pointer to link PaRAM to write submit job info to */
    pramPtr = chan->pramTbl[chan->writeIndex];
    chan->writeIndex = nextIndex(chan->writeIndex);

    /* Load the buffer pointer into the EDMA */
    if (chan->mode == INPUT) {
        EDMA_RSETH(pramPtr, DST, (Uint32) packet->addr);
    }
    else {
        EDMA_RSETH(pramPtr, SRC, (Uint32) packet->addr);
    }

    /*
     * Load the transfer count (in samples) into the EDMA. Use the ESIZE
     * field of the EDMA job to calculate number of samples.
     */
    edmaCnt = (Uint32)packet->size >> (2 - EDMA_FGETH(pramPtr, OPT, ESIZE));
    EDMA_FSETH(pramPtr, CNT, FRMCNT, (edmaCnt / 
            EDMA_FGETH(pramPtr, CNT, ELECNT) - 1)); 

    /*
     * Link to loop EDMA job upon termination. This way we won't
     * loose the frame sync if the channel is starved.
     */
    EDMA_link(pramPtr, chan->loophEdma);

    /* Disable the EDMA channel to make sure current job doesn't complete */
    EDMA_disableChannel(chan->xferPram);

    /*
     * Link the currently executing job to the new job. This can be
     * either the loop EDMA job or a real data EDMA job.
     */
    EDMA_link(chan->xferPram, pramPtr);

    if (chan->submitCount > 0) {
        /*
         * We need to link the parameter space corresponding to the running
         * job so that if a breakpoint occurs, we know how to recover.
         */
        EDMA_link(chan->prevPramPtr, pramPtr);
    }

    /* Reenable the EDMA channel */
    EDMA_enableChannel(chan->xferPram);

    /* Save the new job for the loop above for next time */
    chan->prevPramPtr = pramPtr;
}

/*
 * ======== mdBindDev ========
 * This function allocates and configures the McASP port specified by devId.
 */
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
{
    Uns old;
    Int inIrqId;
    int outIrqId;
    int irqId;
    PortHandle port;
    HWI_Attrs hwiAttrs;
    C6X1X_EDMA_MCASP_DevParams *params =
        (C6X1X_EDMA_MCASP_DevParams *) devParams;

    /* This driver must receive a valid devparams */
    if (params == NULL) {
        return (IOM_EBADARGS);
    }

    /* Check the version number */
    if (params->versionId != C6X1X_EDMA_MCASP_VERSION_1){
        /* Unsupported version */
        return(IOM_EBADARGS);
    }

    /* Get the device parameters of the specified port */
    port = &ports[devid];

    /* Mark the port as in use */
    old = ATM_setu(&(port->inUse), TRUE);

    /* Check if the port was already bound */
    if (old) {
        return (IOM_EALLOC);
    }

    /* Map the supplied IRQ to the EDMA event */
    if (params->irqId > 0 ) {
        irqId = params->irqId;
    }
    else {
        irqId = IRQEDMA;
    }
    IRQ_map(IRQ_EVT_EDMAINT, irqId);

    hwiAttrs.intrMask = params->edmaIntrMask;
    hwiAttrs.ccMask = IRQ_CCMASK_NONE; /* the default value */
    hwiAttrs.arg = NULL;

    /* Plug the EDMA dispatcher into the HWI dispatcher */
    HWI_dispatchPlug(irqId, (Fxn)EDMA_intDispatcher, -1, &hwiAttrs);
   
    /* Set the McASP high frequency sample rate generator */
    /* Set the McASP sample rate generator */
    /* Set the McASP frame sync generator */
    port->enableHclkg = params->enableHclkg;
    port->enableClkg = params->enableClkg;
    port->enableFsyncg = params->enableFsyncg;

    /* True if buffers are in external memory */
    port->cacheCalls = params->cacheCalls;

    /* Store the devid */
    port->devId = devid;

    /* No channel create yet */
    port->chanCreated = 0;

    /* Open and reset the McASP */
    port->hMcasp = MCASP_open(devid, MCASP_OPEN_RESET);

    if (port->hMcasp == INV) {
        return (IOM_EALLOC);
    }

    /* Configure the McASP with the supplied configuration */
    MCASP_config(port->hMcasp, params->mcaspCfgPtr);

    if (params->evtCallback != NULL) {
        /* register the events */
        port->evtCallback = params->evtCallback->evtFxn;
        port->evtMask = params->evtCallback->evtMask;
 
        if (params->inEvtIrqId > 0) {
            inIrqId = params->inEvtIrqId;
        }
        else {
            inIrqId = IRQEVTINPUT;
        } 

        if (params->outEvtIrqId > 0) {
            outIrqId = params->outEvtIrqId;
        }
        else {
            outIrqId = IRQEVTOUTPUT;
        } 

        IRQ_map(MCASP_getXmtEventId(port->hMcasp), outIrqId);
        IRQ_map(MCASP_getRcvEventId(port->hMcasp), inIrqId); 

        hwiAttrs.intrMask = params->inEvtIntrMask;
        hwiAttrs.ccMask = IRQ_CCMASK_NONE; /* the default value */
        hwiAttrs.arg = INPUT;
        HWI_dispatchPlug(inIrqId, (Fxn)isrEvent, -1, &hwiAttrs);

        hwiAttrs.intrMask = params->outEvtIntrMask;
        hwiAttrs.ccMask = IRQ_CCMASK_NONE; /* the default value */
        hwiAttrs.arg = OUTPUT;
        HWI_dispatchPlug(outIrqId, (Fxn)isrEvent, -1, &hwiAttrs);
    } 
    else {
        port->evtCallback = NULL;
    }

    /* set 0xe for debug, real value should be 0 */
    loopSrcBuf = 0;
    loopDstBuf = 0; 

    /* Return the device handle and a status code for success */
    *devp = port;
    return (IOM_COMPLETED);
}

/*
 * ======== mdCreateChan ========
 * This function creates and configures a device channel.
 */
static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
                        Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
{
    PortHandle port = (PortHandle) devp;
    C6X1X_EDMA_MCASP_ChanParams *params =
        (C6X1X_EDMA_MCASP_ChanParams *) chanParams;
    ChanHandle chan;
    Uns old;
    Uns esize;
    Uns cnt;
    Uns fs;
    Uns elerld;
    Uns mcaspAddr;
    Int edmaChanEvent;
    Int i;
#if ENABLELOOPINTR
    Int loopTcc;
#endif

    /*
     * Configuration structure for the loop EDMA job. If the McASP
     * is left to free running, this loop job is running when there is
     * no data to transfer. This is useful if the McASP is externally
     * clocked.  If the driver is starved or if an emulation halt
     * (breakpoint) occurs, the frame sync will still be correct when
     * the driver continues transmitting data.
     */
    EDMA_Config loopEdmaCfg = {
        EDMA_FMKS(OPT, PRI, HIGH)           |
        EDMA_FMKS(OPT, ESIZE, 32BIT)        |
        EDMA_FMKS(OPT, 2DS, NO)             |
        EDMA_FMKS(OPT, SUM, NONE)           |
        EDMA_FMKS(OPT, 2DD, NO)             |
        EDMA_FMKS(OPT, DUM, NONE)           |
        EDMA_FMKS(OPT, TCINT, NO)           |
        EDMA_FMKS(OPT, TCC, DEFAULT)        |
        EDMA_FMKS(OPT, LINK, YES)           |
        EDMA_FMKS(OPT, FS, NO),

        EDMA_FMK (SRC, SRC, NULL),

        EDMA_FMK (CNT, FRMCNT, 0)           |
        EDMA_FMK (CNT, ELECNT, 0),

        EDMA_FMKS(IDX, FRMIDX, OF(0))       |
        EDMA_FMKS(IDX, ELEIDX, OF(0)),

        EDMA_FMK (DST, DST, NULL),

        EDMA_FMK (RLD, ELERLD, 0)           |
        EDMA_FMK (RLD, LINK, NULL)
    };


    /* This driver needs a valid channel parameter structure passed */
    if (params == NULL) {
        return (IOM_EBADARGS);
    }

    /* Use own indexes since IOM mode is a bit mask and not an index */
    if (mode == IOM_INPUT) {
        chan = &port->chans[INPUT];
        chan->mode = INPUT;
    }
    else {
        chan = &port->chans[OUTPUT];
        chan->mode = OUTPUT;
    }

    /* Mark the channel as used */
    old = ATM_setu(&(chan->inUse), TRUE);

    /* Make sure the channel wasn't already created */
    if (old) {
        return (IOM_EALLOC);
    }

    /* Initialise the channel structure */
    chan->cbFxn = cbFxn;
    chan->cbArg = cbArg;
    chan->port = port;
    chan->writeIndex = 0;
    chan->readIndex = 0;
    chan->submitCount = 0;
    chan->flushPacket = NULL;
    chan->abortPacket = NULL;

    /* Initialize the packet queue */
    QUE_new(&chan->packetQueue);

    /*
     * Set the number of elements (corresponding to number of McASP TDM
     * channels) used in the Loop job to preserve the frame sync.
     * FRMCNT should be (num of TDM slots - 1);
     */
    cnt = params->tdmChans - 1;
    EDMA_FSETA(&loopEdmaCfg.cnt, CNT, FRMCNT, cnt);
    EDMA_FSETA(&loopEdmaCfg.cnt, CNT, ELECNT, params->edmaCfgPtr->cnt);

    /* Use the same sample size in the Loop job as in normal jobs */
    esize = EDMA_FGETA(&params->edmaCfgPtr->opt, OPT, ESIZE);
    EDMA_FSETA(&loopEdmaCfg.opt, OPT, ESIZE, esize);

    /* Use  the same FS info as in the normal job */
    fs = EDMA_FGETA(&params->edmaCfgPtr->opt, OPT, FS); 
    EDMA_FSETA(&loopEdmaCfg.opt, OPT, FS, fs);

    /* Use  the same ELERLD info as in the normal job */
    elerld = EDMA_FGETA(&params->edmaCfgPtr->rld, RLD, ELERLD); 
    EDMA_FSETA(&loopEdmaCfg.rld, RLD, ELERLD, elerld); 

    /* Allocate a TCC for the EDMA */
    chan->tcc = EDMA_intAlloc(-1);
    /* If tcc > 15 we abort. */
    if (chan->tcc == -1 || chan->tcc > 15) {
        chanCleanUp(chan, SETFALSE);
        return (IOM_EALLOC);
    }

#if ENABLELOOPINTR
    loopTcc = EDMA_intAlloc(-1);
    /* If tcc > 15 we abort. */
    if (loopTcc == -1 || loopTcc > 15) {
        EDMA_intFree(loopTcc);
        chanCleanUp(chan, FREETCC);
        return (IOM_EALLOC);
    }
#endif

    /* Allocate an EDMA PaRAM for the Loop EDMA job. */
    chan->loophEdma = EDMA_allocTable(-1);

    if (chan->loophEdma == EDMA_HINV) {
        chanCleanUp(chan, FREETCC);
        return (IOM_EALLOC);
    }

    /*
     * Allocate EDMA PaRAM link area based on max number of
     * submits possible.
     */
    if (EDMA_allocTableEx(MAXLINKCNT, chan->pramTbl) != MAXLINKCNT) {
        chanCleanUp(chan, FREETABLE);
        return (IOM_EALLOC);
    }

    /* workaround for big endian problem in McASP */
    if (chan->mode == INPUT) {
        mcaspAddr = MCASP_getRbufAddr(port->hMcasp);
    }
    else {
        mcaspAddr = MCASP_getXbufAddr(port->hMcasp);
    }

#ifdef _BIG_ENDIAN
    if (esize == EDMA_OPT_ESIZE_8BIT) {
        mcaspAddr += 3;
    }
    else if (esize == EDMA_OPT_ESIZE_16BIT) {
        mcaspAddr += 2;
    }
#endif

    if (chan->mode == INPUT) {
        
        /* Put input specific parameters in the Loop EDMA config */
        EDMA_RSETA(&loopEdmaCfg.src, SRC, mcaspAddr);
        EDMA_RSETA(&loopEdmaCfg.dst, DST, (Uint32) &loopDstBuf);

        EDMA_RSETA(&params->edmaCfgPtr->src, SRC, mcaspAddr);
        /* Register our isrInput with the EDMA dispatcher */
        EDMA_intHook(chan->tcc, &isrInput);
    }
    else {     
        
        /* Put output specific parameters in the Loop EDMA config */
        EDMA_RSETA(&loopEdmaCfg.src, SRC, (Uint32) &loopSrcBuf);
        EDMA_RSETA(&loopEdmaCfg.dst, DST, mcaspAddr);

        EDMA_RSETA(&params->edmaCfgPtr->dst, DST, mcaspAddr);
        /* Register our isrOutput with the EDMA dispatcher */
        EDMA_intHook(chan->tcc, &isrOutput);
    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人网页在线观看| 在线视频观看一区| 一区二区欧美国产| 亚洲国产成人自拍| 久久久久久久网| 日韩视频永久免费| 欧美在线高清视频| 欧美亚洲国产怡红院影院| 成人h动漫精品| 午夜久久久久久| 亚洲一区二区三区四区不卡| 亚洲视频在线一区二区| 中文字幕第一页久久| 久久精品网站免费观看| 26uuu成人网一区二区三区| 日韩一区二区中文字幕| 欧美一区二区免费视频| 欧美精品123区| 色噜噜久久综合| 日本久久精品电影| 欧美色图天堂网| 在线国产电影不卡| 色偷偷久久一区二区三区| 一本色道久久综合亚洲精品按摩| 成人午夜伦理影院| 99久久99精品久久久久久| 91在线视频18| 欧美自拍丝袜亚洲| 欧美剧情片在线观看| 91精品国产综合久久久久久漫画 | 在线看一区二区| 色88888久久久久久影院按摩| 色香色香欲天天天影视综合网| 欧美亚洲国产一区二区三区va | 国产一区久久久| 成人av综合在线| 在线观看视频一区| 在线播放国产精品二区一二区四区| 欧美日韩精品一二三区| 精品久久久久久亚洲综合网| 久久精品一区二区| 亚洲在线观看免费视频| 日韩黄色免费网站| 国产传媒一区在线| 91老师片黄在线观看| 7777精品伊人久久久大香线蕉经典版下载| 8x福利精品第一导航| 精品国产区一区| 国产精品久久久久久户外露出| 亚洲午夜激情av| 国产一区欧美一区| 91精彩视频在线观看| 日韩一级黄色大片| 亚洲欧洲三级电影| 毛片一区二区三区| 99国产精品国产精品毛片| 91丨porny丨户外露出| 日韩一区二区三区免费看| 日本一区二区三区四区在线视频| 亚洲精品乱码久久久久| 久久国内精品自在自线400部| 99re在线精品| 26uuu色噜噜精品一区| 一片黄亚洲嫩模| 另类小说视频一区二区| 色偷偷成人一区二区三区91| 久久久亚洲高清| 日本午夜精品一区二区三区电影| av电影在线观看不卡| 精品日产卡一卡二卡麻豆| 亚洲图片一区二区| 91麻豆蜜桃一区二区三区| 7777精品伊人久久久大香线蕉 | 亚洲国产电影在线观看| 蜜臀av一级做a爰片久久| 欧美在线影院一区二区| 国产精品久久久久影视| 国产美女娇喘av呻吟久久| 欧美日韩国产影片| 亚洲乱码国产乱码精品精的特点| 国产传媒欧美日韩成人| 2021国产精品久久精品 | 国产精品亚洲专一区二区三区| 欧美精品一二三区| 一区二区免费在线| av资源站一区| 中文字幕欧美国产| 国产成都精品91一区二区三| 久久久久久久久99精品| 久草在线在线精品观看| 日韩视频免费观看高清完整版| 亚洲午夜激情网页| 91麻豆视频网站| 一区二区三区中文字幕精品精品| 成人黄色在线视频| 亚洲欧美在线视频| 色综合网站在线| 亚洲电影第三页| 91精品国产手机| 另类调教123区| 久久九九99视频| 国模无码大尺度一区二区三区| 国产网站一区二区三区| 成人涩涩免费视频| 日韩伦理av电影| 色哟哟一区二区在线观看| 亚洲人成网站在线| 欧美日韩电影在线播放| 久久99精品国产麻豆不卡| 久久久久久久综合日本| 成人激情小说网站| 亚洲一级在线观看| 日韩美女视频一区二区在线观看| 久久国产剧场电影| 国产精品久久久久久久浪潮网站 | 日韩亚洲欧美成人一区| 日韩在线a电影| 国产亚洲短视频| 一本色道久久综合狠狠躁的推荐 | 激情文学综合网| 国产日韩欧美亚洲| 欧美性受xxxx| 国产自产v一区二区三区c| 中文字幕成人av| 欧美福利视频导航| 粉嫩蜜臀av国产精品网站| 亚洲最大成人网4388xx| 91丨九色丨蝌蚪丨老版| 男女男精品视频网| 国产精品人人做人人爽人人添| 日本丶国产丶欧美色综合| 青草av.久久免费一区| 国产精品天天看| 5566中文字幕一区二区电影 | 911精品国产一区二区在线| 成人激情免费网站| 国产一区二区在线观看免费| 日日噜噜夜夜狠狠视频欧美人 | 国产精品欧美久久久久无广告 | 欧美日韩国产大片| 91国内精品野花午夜精品| 国产91对白在线观看九色| 国内精品不卡在线| 精品一区二区三区不卡| 久久精品免费看| 免费成人你懂的| 免费视频一区二区| 久久精品国产99国产| 免费av网站大全久久| 日韩精品1区2区3区| 日本三级韩国三级欧美三级| 亚瑟在线精品视频| 亚洲成人综合在线| 亚洲狠狠爱一区二区三区| 亚洲国产精品久久久男人的天堂| 亚洲一区二区三区中文字幕| 一区二区欧美精品| 婷婷夜色潮精品综合在线| 香蕉影视欧美成人| 奇米影视一区二区三区小说| 美女一区二区三区在线观看| 久久成人18免费观看| 激情久久五月天| 成人性视频免费网站| 99精品久久久久久| 欧美日韩国产一级二级| 欧美一区二区三区电影| 久久久久久一二三区| 亚洲视频一区二区在线| 亚洲成人免费在线| 精品中文字幕一区二区| 成人免费三级在线| 在线观看日韩国产| 日韩欧美一级二级| 国产日韩成人精品| 亚洲资源中文字幕| 精品综合免费视频观看| eeuss影院一区二区三区| 欧美在线观看视频一区二区| 91精品国产入口| 国产日产精品1区| 亚洲国产一区二区在线播放| 麻豆国产欧美一区二区三区| 懂色av一区二区三区免费观看 | 日韩无一区二区| 中文字幕日本不卡| 日产国产欧美视频一区精品| 大美女一区二区三区| 欧美日韩国产综合一区二区| 国产人成一区二区三区影院| 亚洲一区二区影院| 国产乱码一区二区三区| 日本韩国欧美一区二区三区| 日韩一区二区免费在线电影| 亚洲视频综合在线| 国产乱国产乱300精品| 欧美日韩国产免费| 国产精品色噜噜| 精品一区二区免费| 欧美日韩精品专区|