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

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

?? dsk5402_mcbsp_ad50.c

?? TMS320DM642使用的mini驅動程序的例子
?? C
字號:
/*
 *  Copyright 2003 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.
 *  
 */
/* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
/*
 *  ======== dsk5402_mcbsp_ad50.c ========
 *
 *  MCBSP sample-by-sample device driver for TI.
 *  5402 DSK. Uses the C54x Chip Support Library. 
 */

#include <std.h>

#include <atm.h>
#include <hwi.h>
#include <que.h>

#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_irq.h>

#include <iom.h>

#include <dsk5402_mcbsp_ad50.h>
#include <ad50.h>

typedef struct ChanObj {
    Bool        inuse;          /* TRUE => channel has been opened */
    Int         mode;           /* IOM_INPUT or IOM_OUTPUT */
    IOM_Packet  *dataPacket;    /* current active I/O packet */
    QUE_Obj     pendList;       /* list of packets for I/O */
    Uns         *bufptr;        /* pointer *within* current buffer */
    Uns         bufcnt;         /* remaining samples to be handled */
    IOM_TiomCallback cbFxn;     /* used to notify client when I/O complete */
    Ptr         cbArg;
} ChanObj, *ChanHandle;

#define INPUT  0  /* Used as index since IOM mode is a bit mask, not index */
#define OUTPUT 1

#define NUMCHANS        2       /* INPUT and OUTPUT */

static ChanObj chans[NUMCHANS] = {
    { FALSE, INPUT, NULL, { NULL, NULL }, NULL, 0, NULL, NULL },
    { FALSE, OUTPUT, NULL, { NULL, NULL }, NULL, 0, NULL, NULL }
};

static MCBSP_Handle hMcbsp;

/*
 * Forward declaration of IOM interface 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);

/*
 * Public IOM interface table.
 */
IOM_Fxns DSK5402_MCBSP_AD50_FXNS = {
    mdBindDev,
    IOM_UNBINDDEVNOTIMPL,
    mdControlChan,
    mdCreateChan,
    mdDeleteChan,
    mdSubmitChan
};

/*
 *  Public driver setup data object. Used if the user passes NULL as
 *  setup() argument, or by the user to modify the default parameters.
 */
DSK5402_MCBSP_AD50_DevParams DSK5402_MCBSP_AD50_DEVPARAMS = {
    AD50_DEFAULTPARAMS,              /* default codec parameters */
};

/*
 * local ISR functions.
 * rxIsr() and txIsr() are plugged using HWI_dispatchPlug() in mdBindDev().
 */
static Void rxIsr(void);
static Void txIsr(void);
static Void updateChan(ChanHandle chan);
static Void abortio(ChanHandle chan);

/*
 *  ======== mdBindDev ========
 *  This function is called by DSP/BIOS during device initialization.
 *  It is called after DSK5402_MCBSP_AD50_init().
 *  
 */
#pragma CODE_SECTION(mdBindDev, ".text:init")
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
{
    DSK5402_MCBSP_AD50_DevParams *params = 
        (DSK5402_MCBSP_AD50_DevParams *)devParams;
    static Bool curinit = FALSE;

    /* CSL handle to the McBSP. The McBSP is shared between the two channels */
    static MCBSP_Config mcbspCfg0 = {
        0x0021,        /*  Serial Port Control Register 1   */
        0x0201,        /*  Serial Port Control Register 2   */
        0x0040,        /*  Receive Control Register 1   */
        0x0000,        /*  Receive Control Register 2   */
        0x0040,        /*  Transmit Control Register 1   */
        0x0000,        /*  Transmit Control Register 2   */
        0x0000,        /*  Sample Rate Generator Register 1   */
        0x0000,        /*  Sample Rate Generator Register 2   */
        0x0000,        /*  Multichannel Control Register 1   */
        0x0000,        /*  Multichannel Control Register 2   */
        0x000c,        /*  Pin Control Register   */
        0x0000,        /*  Receive Channel Enable Register Partition A   */
        0x0000,        /*  Receive Channel Enable Register Partition B   */
        0x0000,        /*  Transmit Channel Enable Register Partition A   */
        0x0000         /*  Transmit Channel Enable Register Partition B   */
    };

    static volatile ioport unsigned port04;     /* for CPLD CTRL 2 */

    if (curinit) {
        return (IOM_EBADIO);
    }
    curinit = TRUE; 

    /* use default parameters if none are given */
    if (params == NULL) {
        params = &DSK5402_MCBSP_AD50_DEVPARAMS;
    }

    /* open the McBSP */
    hMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
    MCBSP_config(hMcbsp, &mcbspCfg0);

    /*
     * DSK5402 board setup ...
     * Select McBSP1 mapped to Audio Codec (CPLD Register)
     * and FC bit = 0 (secondary control off)
     */
    port04 &= 0xf5;

    /* start the McBSP */
    MCBSP_start(hMcbsp, MCBSP_XMIT_START | MCBSP_RCV_START, 0x0);

    /* set codec parameters (this will also initialize the codec) */
    AD50_setParams(hMcbsp, &(params->ad50) );

    /* bind Rx/Tx interrupts and use DSP/BIOS HWI dispatcher */
    HWI_dispatchPlug(IRQ_EVT_RINT1, (Fxn)rxIsr, NULL);
    HWI_dispatchPlug(IRQ_EVT_XINT1, (Fxn)txIsr, NULL);


    *devp = chans;

    return (IOM_COMPLETED);
}

/*
 *  ======== mdControlChan ========
 */
static Int mdControlChan(Ptr chanp, Uns cmd, Ptr args)
{
        /*
         * If a channel timeouts(in IOM class driver) a calldown is made to mdControlChan w/
         *   cmd = IOM_CHAN_TIMED out. Timeout processing is optionally implemented here.
         * If not performed return status of IOM_ENOTIMPL.
         */
        if (cmd == IOM_CHAN_TIMEDOUT) {
        /*
         *  Channel timed out. Perform needed channel cleanup.
         */ 
                abortio(chanp);
    }
    else {
        return (IOM_ENOTIMPL); /* return IOM_ENOTIMPL for codes not handled */    
    }
    
    return (IOM_COMPLETED);

}




/*
 *  ======== mdCreateChan ========
 */
static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
                Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
{
    ChanHandle  chans = (ChanHandle)devp;
    ChanHandle  chan;
    
    if (mode == IOM_INPUT) {
        chan = &chans[INPUT];     /* input only channel */
    }
    else if (mode == IOM_OUTPUT) {
        chan = &chans[OUTPUT];    /* output only channel */
    }
    else {
        return (IOM_EBADMODE); /* bi-directional channels not supported */
    }
    
    /*
     * Check check if channel is already in use.
     * Use ATM_setu() for atomic test-and-set.
     */
    if (ATM_setu((Uns *)&chan->inuse, TRUE)) {
        return (IOM_EBADIO);            /* ERROR! channel is already open! */
    }

    QUE_new(&chan->pendList);

    chan->dataPacket = NULL;

    /* no need to initialize chan->bufptr */

    chan->cbFxn = cbFxn;
    chan->cbArg = cbArg;

    if (chan->mode == INPUT) {
        IRQ_enable(IRQ_EVT_RINT1);  /* Rx Intr enable */
    }
    else {
        IRQ_enable(IRQ_EVT_XINT1);  /* Tx intr enable */
    }

    *chanp = chan;                  /* return channel handle */

    return (IOM_COMPLETED);         /* success */
}

/*
 *  ======== mdDeleteChan ========
 *  Mark the channel available and disable the appropriate interrupt.
 */
static Int mdDeleteChan(Ptr chanp)
{
    ChanHandle chan = (ChanHandle)chanp;

    chan->inuse = FALSE;

    if (chan->mode == INPUT) {
        IRQ_disable(IRQ_EVT_RINT1);
    }
    else {
        IRQ_disable(IRQ_EVT_XINT1);
    }

    return (IOM_COMPLETED);
}

/*
 *  ======== mdSubmitChan ========
 *  Sets the buf variables in the channel object.  ISR will then
 *  emtpy or fill this buffer.
 */
static Int mdSubmitChan(Ptr chanp, IOM_Packet *packet)
{
    ChanHandle chan = (ChanHandle)chanp;
    Uns         imask;

    /*
     * First check if command is to abort or flush this channel.
     * Note: For this audio codec we are going to toss the output data even 
     *       when flushing.
     */
    if (packet->cmd == IOM_FLUSH || packet->cmd == IOM_ABORT) {

        abortio(chan);  
        
        packet->status = IOM_COMPLETED; /* flush/abort pkt completed */

        return (IOM_COMPLETED);
    }

    imask = HWI_disable();

    if (chan->dataPacket == NULL) {

        chan->bufptr = (Uns *)packet->addr;
        chan->bufcnt = packet->size;

        /* 'dataPacket' must be set last to synchronize with ISR */
        chan->dataPacket = packet;
    }
    else {
        QUE_put(&chan->pendList, packet);
    }

    HWI_restore(imask);

    return (IOM_PENDING);
}

/*
 *  ======== DSK5402_MCBSP_AD50_init ========
 */
#pragma CODE_SECTION(DSK5402_MCBSP_AD50_init, ".text:init")
Void DSK5402_MCBSP_AD50_init(Void)
{
}

/*
 *  ======== rxIsr ========
 *  Handle receive (input) interrupt.
 *
 *  Copies a new sample from McBSP to buffer.  If buffer is full, then call
 *  the registered callback function with the registered argument and the
 *  size of the buffer.
 */
static Void rxIsr(Void)
{
    ChanHandle  chan = &chans[INPUT];

    if (chan->dataPacket == NULL) {
        MCBSP_read(hMcbsp);             /* toss data */
        return;
    }

    *chan->bufptr = MCBSP_read(hMcbsp);

    updateChan(chan);
}

/*
 *  ======== txIsr ========
 *  Handle transmit (output) interrupt.
 *
 *  Copies a new sample from the buffer to MCBSP.  If buffer is empty, then
 *  call the registered callback function with the registered argument and
 *  the size of the buffer.
 */
static Void txIsr(Void)
{
    ChanHandle  chan = &chans[OUTPUT];

    if (chan->dataPacket == NULL) {
        MCBSP_write(hMcbsp, 0);         /* output dummy sample */
        return;
    }

    MCBSP_write(hMcbsp, *chan->bufptr & 0xfffe);

    updateChan(chan);
}

/*
 *  ======== updateChan ========
 *  updateChan() is called at ISR context with appropriate ISR disabled.
 *  updateChan() is used by the rx and tx ISRs to update the channel
 *  structures after input or output sample has been handled.
 */
static Void updateChan(ChanHandle chan)
{
    IOM_Packet *tmpPacket;

    chan->bufptr++;
    chan->bufcnt--;

    /* Is this buffer finished? */
    if (chan->bufcnt == 0) {
        chan->dataPacket->status = IOM_COMPLETED;

        tmpPacket = chan->dataPacket;

        chan->dataPacket = QUE_get(&chan->pendList);
        if (chan->dataPacket == (IOM_Packet *)&chan->pendList) {
            chan->dataPacket = NULL;
        }
        else {
            chan->bufptr = chan->dataPacket->addr;
            chan->bufcnt = chan->dataPacket->size;
        }

        (*chan->cbFxn)(chan->cbArg, tmpPacket);
    }
}

/*
 *  ======== abortio ========
 *  Aborts uncompleted i/o packet requests.
 */
static Void abortio(ChanHandle chan)
{
    IOM_Packet *tmpPacket;

    HWI_disable();
    tmpPacket = chan->dataPacket;
    chan->dataPacket = NULL;
    HWI_enable();
        
    if (tmpPacket) {     
        tmpPacket->status = IOM_ABORTED;   /* abort current request */
        (*chan->cbFxn)(chan->cbArg, tmpPacket); 
                
        tmpPacket = QUE_get(&chan->pendList);
        while (tmpPacket != (IOM_Packet *)&chan->pendList) {

            tmpPacket->status = IOM_ABORTED;   /* abort queued requests */
            (*chan->cbFxn)(chan->cbArg, tmpPacket);

            tmpPacket = QUE_get(&chan->pendList);
        }
    }
}




?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美卡一卡二| 亚洲精品一线二线三线| 91精品啪在线观看国产60岁| 国产视频在线观看一区二区三区| 亚洲精品成a人| 国产成人免费视频| 欧美一区在线视频| 亚洲综合色视频| www.亚洲人| 国产日韩欧美a| 精品一区二区三区免费毛片爱 | 欧美国产精品一区二区三区| 午夜精品一区在线观看| 色吧成人激情小说| 中文字幕一区二区不卡| 国产美女一区二区| 精品国偷自产国产一区| 五月天丁香久久| 欧美丝袜丝交足nylons图片| 日韩理论片在线| 菠萝蜜视频在线观看一区| 欧美精品一区二区三区在线播放| 美腿丝袜亚洲色图| 欧美欧美欧美欧美首页| 爽爽淫人综合网网站| 欧美网站大全在线观看| 亚洲午夜一区二区三区| 91久久精品午夜一区二区| 亚洲人成在线观看一区二区| 99久久精品免费观看| 亚洲欧洲日韩综合一区二区| 成人亚洲精品久久久久软件| 久久久噜噜噜久久中文字幕色伊伊 | 日韩电影免费在线看| 在线免费不卡视频| 亚洲最快最全在线视频| 欧美视频一区在线观看| 亚洲一区在线观看免费观看电影高清| 在线视频综合导航| 亚洲第一会所有码转帖| 欧美剧情电影在线观看完整版免费励志电影 | 欧美精品一区二区三区蜜桃| 国产九色精品成人porny| 国产清纯在线一区二区www| 成人午夜激情视频| 亚洲精选免费视频| 欧美日韩精品福利| 久久99九九99精品| 久久精品人人爽人人爽| 91亚洲大成网污www| 亚洲国产精品嫩草影院| 91精品国产日韩91久久久久久| 另类成人小视频在线| 中文字幕成人在线观看| 99精品久久久久久| 亚洲香肠在线观看| 精品久久久久久综合日本欧美 | 日韩视频在线永久播放| 国产在线精品免费| 亚洲私人影院在线观看| 欧美精品久久一区二区三区| 久久精品久久综合| 欧美极品美女视频| 欧美亚洲自拍偷拍| 精品在线观看视频| 亚洲丝袜自拍清纯另类| 欧美一区二区三区白人| 99这里只有精品| 麻豆精品一二三| 亚洲视频在线观看一区| 日韩亚洲欧美一区二区三区| 成人动漫一区二区三区| 美女性感视频久久| 一区二区三区在线免费| 久久亚洲精品国产精品紫薇| 欧美性受xxxx| 成人午夜激情影院| 麻豆91在线播放免费| 一区二区三区在线视频观看| 久久婷婷成人综合色| 91精品国产综合久久久久| 不卡的av电影在线观看| 精品一区二区影视| 亚洲成年人影院| 91高清视频在线| 欧日韩精品视频| 麻豆专区一区二区三区四区五区| 国产精品你懂的在线| 日韩欧美国产三级| 欧洲国内综合视频| 99精品久久只有精品| 国产精品456露脸| 日韩av在线免费观看不卡| 亚洲色图在线看| 中文字幕免费不卡| 久久一二三国产| 欧美一区二区三区系列电影| 欧美在线三级电影| 一本高清dvd不卡在线观看| 国产大陆a不卡| 精品亚洲国产成人av制服丝袜 | 欧美国产97人人爽人人喊| 精品国产一区久久| 日韩欧美国产电影| 日韩一级二级三级精品视频| 欧美精品成人一区二区三区四区| 99免费精品在线| 成人av在线一区二区| 欧美三级日本三级少妇99| 99综合电影在线视频| 国产毛片精品一区| 激情国产一区二区| 美腿丝袜亚洲一区| 久久福利资源站| 美女视频黄久久| 日韩精品免费视频人成| 日韩中文字幕亚洲一区二区va在线 | 99精品偷自拍| av电影天堂一区二区在线| 色综合久久中文字幕| 色偷偷久久一区二区三区| 色婷婷久久综合| 欧美日韩成人综合天天影院| 欧美精品一二三区| 日韩午夜在线观看| 2024国产精品| 色久优优欧美色久优优| 国产福利一区在线| 丰满岳乱妇一区二区三区| 不卡欧美aaaaa| 色综合网站在线| 欧美高清dvd| 精品福利在线导航| 国产精品免费丝袜| 亚洲线精品一区二区三区八戒| 午夜av一区二区三区| 精品夜夜嗨av一区二区三区| 风间由美一区二区av101| av激情综合网| 欧美剧情片在线观看| 久久一区二区三区国产精品| 日韩伦理免费电影| 奇米色777欧美一区二区| 国产毛片精品一区| 色老汉一区二区三区| 日韩精品在线网站| 中文字幕在线不卡一区| 亚洲成av人片在线观看| 国产一区二区三区四区五区入口| 不卡区在线中文字幕| 欧美一区二区三区成人| 国产精品久久毛片a| 91精品国产综合久久久久久久久久 | 日本美女一区二区三区视频| 精品一区二区免费看| 91免费看片在线观看| 91精品国产福利| 亚洲欧美日韩人成在线播放| 蜜臀av亚洲一区中文字幕| 成人av午夜电影| 欧美成人a在线| 亚洲一区在线观看视频| 国产精品一色哟哟哟| 欧美日韩免费观看一区二区三区| 久久婷婷国产综合精品青草| 亚洲.国产.中文慕字在线| eeuss国产一区二区三区| 日韩一本二本av| 亚洲高清三级视频| 成人黄色软件下载| 精品动漫一区二区三区在线观看| 亚洲女同女同女同女同女同69| 欧美日韩午夜影院| 欧美日韩一级二级三级| 久久午夜老司机| 亚洲成人精品一区二区| 国产成人精品免费在线| 日韩视频免费观看高清完整版在线观看| 国产婷婷色一区二区三区在线| 日本91福利区| 欧美日韩一区二区三区四区| 椎名由奈av一区二区三区| 国产伦精品一区二区三区免费| 7777女厕盗摄久久久| 亚洲超碰精品一区二区| 色婷婷综合在线| 亚洲三级电影网站| 97超碰欧美中文字幕| 国产亚洲精品福利| 激情国产一区二区 | 亚洲精品成人悠悠色影视| 成人久久视频在线观看| 国产午夜精品一区二区三区嫩草| 日本欧美在线看| 在线观看网站黄不卡| 亚洲欧美激情视频在线观看一区二区三区 | 国产自产2019最新不卡| 欧美sm极限捆绑bd| 国产一区二区电影| 国产亚洲成av人在线观看导航|