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

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

?? c6x1x_edma_mcasp.c

?? 使用DM642 來進(jìn)行scaling 有說明檔
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):
/*
 *  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)" */
/* 
 *  ======== c6x1x_edma_mcasp.c ========
 * 
 *  Generic McASP driver for the TMS320C6x1x series. Uses the EDMA.
 */

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

#include <iom.h>

#include <csl.h>
#include <csl_mcasp.h>
#include <csl_irq.h>
#include <csl_edma.h>
#include <csl_cache.h>
#include <csl_chip.h>

#include <c6x1x_edma_mcasp.h>

/*
 *  Macro to start serializer & state machine
 *  if turned on, driver will start both transmit and receive serializer 
 *  and state machine synchronously  
 */
#define STARTSERIALIZERSYNC     0

/*
 *  Macro to enable edma loop job interrupt
 *  if turned on, each time edma loop job gets running, an ineterrupt will
 *  be generated. This is only used for debug purpose.
 */
#define ENABLELOOPINTR          0 

#if ENABLELOOPINTR
#include <log.h>
extern far LOG_Obj trace;
#endif

#define IRQEVTINPUT             5
#define IRQEVTOUTPUT            6
#define IRQEDMA                 8


/* Maximum number of EDMA jobs linked at a time (Must be 2). */
#define MAXLINKCNT 2

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

/* States for chanCleanUp() */
#define SETFALSE 1
#define FREETCC 2
#define FREETABLE 3
#define FREETABLEEX 4
#define DELCHAN 5

/* Macro to increment and return the indice that ranges over MAXLINKCNT */
#define nextIndex(index) ((index) ^ 1)

/* Number of ports available */
#define NUMPORTS _MCASP_PORT_CNT 

/* Number of channels per port (one input and one output channel) */
#define NUMCHANS 2

/* Structure containing channel specific variables */
typedef struct ChanObj {
    Uns inUse;                /* True if the channel is in use */
    Int mode;                 /* Input or output channel */
    struct PortObj *port;     /* Pointer to the port which owns this chan */
    EDMA_Handle xferPram;     /* Handle to transfer PaRAM */
    EDMA_Handle pramTbl[MAXLINKCNT]; /* Handles to link PaRAMs */
    EDMA_Handle prevPramPtr;  /* Points to the PaRAM last used */
    EDMA_Handle loophEdma;    /* Handle to the Loop job PaRAM */
    IOM_Packet *flushPacket;  /* Holds the flushpacket (if any) */
    IOM_Packet *abortPacket;  /* Holds the abortpacket (if any) */
    IOM_Packet *packetList[MAXLINKCNT]; /* Holds linked  packets */
    QUE_Obj packetQueue;      /* Holds submitted but not linked packets */
    Int submitCount;          /* Number of submit calls pending */
    Int writeIndex;           /* Index of next PaRAM to write to */
    Int readIndex;            /* Index of next PaRAM to read from */
    Int tcc;                  /* Channel transfer complete code */
    IOM_TiomCallback cbFxn;   /* Called when I/O complete */
    Ptr cbArg;                /* Argument to callback function */
    Bool pause;   
    Fxn avSyncCbFxn;
} ChanObj, *ChanHandle;

/* Structure containing port specific variables */
typedef struct PortObj {
    Uns inUse;                /* True if the port is in use */
    Int devId;                /* The device id passed to mdBindDev() */
    Bool cacheCalls;          /* Submitted buffers are in cacheable memory */
    Uint32 enableHclkg;       /* Holds enable Hclk variable */
    Uint32 enableClkg;        /* Holds enable Clk variable */
    Uint32 enableFsyncg;      /* Holds enable Fsync variable */
    MCASP_Handle hMcasp;      /* CSL Device handle */
    ChanObj chans[NUMCHANS];  /* The channels associated with the port */
    Uns chanCreated;          /* One channel in this port has been Created */
    C6X1X_EDMA_MCASP_TevtCallback evtCallback; /* event callback */
    Uns evtMask;              /* registered events */
} PortObj, *PortHandle;

/* Declare the port and channel structures */
static PortObj ports[NUMPORTS];

/* Define EDMA Event Id's Array */
static Uns eventIds[NUMPORTS][2] = {
    { EDMA_CHA_AREVT0, EDMA_CHA_AXEVT0 },
#if NUMPORTS >= 2
    { EDMA_CHA_AREVT1, EDMA_CHA_AXEVT1 },
#endif
#if NUMPORTS == 3
    { EDMA_CHA_AREVT2, EDMA_CHA_AXEVT2 }
#endif
};

/*
 * Forward declaration of the IOM interface functions. They are only
 * exposed via the IOM function table to avoid namespace pollution.
 */
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams);
static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
                        Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg);
                        
static Int mdControlChan(Ptr *chanp, Int cmd, Arg arg);                        
static Int mdDeleteChan(Ptr chanp);
static Int mdSubmitChan(Ptr chanp, IOM_Packet *packet);
static Int mdUnBindDev(Ptr devp);

#if ENABLELOOPINTR
static Void isrLoop(Int tcc);
#endif

/* Public IOM interface table */
IOM_Fxns C6X1X_EDMA_MCASP_FXNS = {
    &mdBindDev,
    &mdUnBindDev,
    &mdControlChan,
    &mdCreateChan,
    &mdDeleteChan,
    &mdSubmitChan
};

/* Local function prototypes */
static Void chanCleanUp(ChanHandle chan, Uns state);
static Void isrCommon(ChanHandle chan);
static Void isrInput(Int tcc);
static Void isrOutput(Int tcc);
static Void isrEvent(Int mode);
static Void linkPacket(ChanHandle chan, IOM_Packet *packet);

/* Local driver variables. */
static Uint32 loopDstBuf;
static Uint32 loopSrcBuf;

#if ENABLELOOPINTR
static Void isrLoop(Int tcc)
{
    LOG_printf(&trace, "LOOP=%d", tcc);
}
#endif

/*
 * ======== chanCleanUp ========
 * Cleans up the channel resources.
 */
static Void chanCleanUp(ChanHandle chan, Uns state)
{
    switch(state) {
    case DELCHAN:
        /* Close the EDMA channel */
        EDMA_close(chan->xferPram);

        /* Disable transfer interrupts from the EDMA */
        EDMA_intDisable(chan->tcc);
        /* will fall through the next case */
    case FREETABLEEX:
        /* Free the EDMA link PaRAM tables */
        EDMA_freeTableEx(MAXLINKCNT, chan->pramTbl);
        /* will fall through the next case */
    case FREETABLE:
        /* Free the loop EDMA PaRAM table */
        EDMA_freeTable(chan->loophEdma);
        /* will fall through the next case */
    case FREETCC:
        /* Free the transfer complete code */
        EDMA_intFree(chan->tcc);
        /* will fall through the next case */
    case SETFALSE:
        /* Mark the channel as closed */
        chan->inUse = FALSE;
        break;
    }
}
/*
 * ======== isrCommon ========
 * Shared ISR code between input and output. Processes a normal EDMA job.
 */
static Void isrCommon(ChanHandle chan)
{
    IOM_Packet *packet;
    Int cnt;

    /* Check to see if this is a completed async abort call */
    if (chan->abortPacket) {
        /* Discard all packets in transmission or queued up */
        if (chan->submitCount > MAXLINKCNT) {
            cnt = MAXLINKCNT;
        }
        else {
            cnt = chan->submitCount;
        }

        while (cnt > 0) {
            packet = chan->packetList[chan->readIndex];
            packet->status = IOM_ABORTED;
            (*chan->cbFxn)(chan->cbArg, packet);

            chan->readIndex = nextIndex(chan->readIndex);
            cnt--;
        }

        while (!QUE_empty(&chan->packetQueue)) {
            packet = QUE_dequeue(&chan->packetQueue);
            packet->status = IOM_ABORTED;
            (*chan->cbFxn)(chan->cbArg, packet);
        }

        /* Reset the driver channel state */
        chan->writeIndex = 0;
        chan->readIndex = 0;
        chan->submitCount = 0;

        chan->abortPacket->status = IOM_COMPLETED;
        (*chan->cbFxn)(chan->cbArg, chan->abortPacket);
        chan->abortPacket = NULL;
        return;
    }

    /* Fetch the completed packet */
    packet = chan->packetList[chan->readIndex];

    chan->readIndex = nextIndex(chan->readIndex);

    /* Mark the packet as completed */
    packet->status = IOM_COMPLETED;

    /* Call the callback function */
    (*chan->cbFxn)(chan->cbArg, packet);

    chan->submitCount--;

    /*
     * See if there are any unlinked packets in the packetQueue
     * and if so link them.
     */
    if (chan->submitCount >= MAXLINKCNT) {
        packet = QUE_dequeue(&chan->packetQueue);
        linkPacket(chan, packet);
    }
}

/*
 * ======== isrInput ========
 * The input isr called from the EDMA dispatcher every time an input
 * EDMA job completes.
 */
static Void isrInput(Int tcc)
{
    ChanHandle chan;
    Int portNbr;

    /* Check which port was responsible for the interrupt */
    for (portNbr = 0; portNbr < NUMPORTS; portNbr++) {
        chan = &ports[portNbr].chans[INPUT];

        if (chan->tcc == tcc && chan->inUse) {

            if (EDMA_RGETH(chan->xferPram, DST) == (Uint32) &loopDstBuf &&
                chan->submitCount > 1 && !chan->abortPacket) {
                /*
                 * An emulation halt has occured with more than 1 job
                 * submitted. Link the currently executing job (the Loop job)
                 * to the first of the linked jobs which hadn't been called
                 * back. This way we still have the same number of submitted
                 * jobs after the execution continues as we had before the
                 * emulation halt (breakpoint) occured (this preserves double
                 * buffering if used).
                 */
                //EDMA_disableChannel(chan->xferPram);
                EDMA_link(chan->xferPram, chan->pramTbl[chan->readIndex]);
                //EDMA_enableChannel(chan->xferPram);
            }
            else {
                /* Call the common ISR code for a finished normal EDMA job */
                isrCommon(chan);
            }
        }
    }
}

/*
 * ======== isrOutput ========
 * The output isr called from the EDMA dispatcher every time an output
 * EDMA job completes.
 */
static Void isrOutput(Int tcc)
{
    ChanHandle chan;
    Int portNbr;     
    
    /* Check which port was responsible for the interrupt */
    for (portNbr = 0; portNbr < NUMPORTS; portNbr++) 
    {
        chan = &ports[portNbr].chans[OUTPUT];
        if (chan->tcc == tcc && chan->inUse ) 
        {                             
			if(chan->avSyncCbFxn != NULL) {
			    chan->avSyncCbFxn(); /* add hook for the a/v sync call-back function */
			}
            if(!chan->pause)
            {
            	if (EDMA_RGETH(chan->xferPram, SRC) == (Uint32)&loopSrcBuf &&
	                chan->submitCount > 1 && !chan->abortPacket) {
	                /*
	                 * An emulation halt has occured with more than 1 job
	                 * submitted. Link the currently executing job (the Loop job)
	                 * to the first of the linked jobs which hadn't been called
	                 * back. This way we still have the same number of submitted
	                 * jobs after the execution continues as we had before the
	                 * emulation halt (breakpoint) occured (this preserves double
	                 * buffering if used).
	                 */
	                //EDMA_disableChannel(chan->xferPram);
	                EDMA_link(chan->xferPram, chan->pramTbl[chan->readIndex]);
	                //EDMA_enableChannel(chan->xferPram);
	            	}
	            	else {
	                /* Call the common ISR code for a finished normal EDMA job */
	                isrCommon(chan);
	
	                /* Check to see if an async flush has completed */
	                if (chan->submitCount == 0 && chan->flushPacket) {
	                    chan->flushPacket->status = IOM_COMPLETED;
	                    (*chan->cbFxn)(chan->cbArg,chan->flushPacket);
	                    chan->flushPacket = NULL;
	                }
	            }
            }
        }
    }
}

/*
 * ======== isrEvent ========
 * The event isr called when an McASP input/output event happens
 * This is used for exception event handling asserted by McASP. Normal data
 * hanlding is done by EDMA. 
 */
static Void isrEvent(Int mode)
{
    MCASP_Handle hMcasp;
    Uns portNbr;
    Uns events;
    Uns eventReturn;
    
    /* Check which port was responsible for the interrupt */
    for (portNbr = 0; portNbr < NUMPORTS; portNbr++) {
        if (ports[portNbr].inUse) {
            hMcasp = ports[portNbr].hMcasp;
            events = 0;
            if (mode == INPUT) {          
                if (MCASP_FGETH(hMcasp, RSTAT, ROVRN)) {
                    MCASP_FSETSH(hMcasp, RSTAT, ROVRN, YES);
                    events |= C6X1X_EDMA_MCASP_EVT_ROVRN;
                } 
                if (MCASP_FGETH(hMcasp, RSTAT, RCKFAIL)) {
                    MCASP_FSETSH(hMcasp, RSTAT, RCKFAIL, YES);
                    events |= C6X1X_EDMA_MCASP_EVT_RCKFAIL;
                }
                if (MCASP_FGETH(hMcasp, RSTAT, RSYNCERR)) {
                    MCASP_FSETSH(hMcasp, RSTAT, RSYNCERR, YES);
                    events |= C6X1X_EDMA_MCASP_EVT_RSYNCERR;
                }   
                if (MCASP_FGETH(hMcasp, RSTAT, RDMAERR)) {
                    MCASP_FSETH(hMcasp, RSTAT, RDMAERR, 1);
                    events |= C6X1X_EDMA_MCASP_EVT_RDMAERR;
                }   
                /* Clear not registered events here */
                MCASP_RSETH(hMcasp, RSTAT, 0xFFFFFFFF);
            } 
            else {
                if (MCASP_FGETH(hMcasp, XSTAT, XUNDRN)) {
                    MCASP_FSETSH(hMcasp, XSTAT, XUNDRN, YES);
                    events |= C6X1X_EDMA_MCASP_EVT_XUNDRN;
                } 
                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;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产乱子伦一区| 中文字幕制服丝袜成人av| 成人综合婷婷国产精品久久 | 亚洲精品中文在线观看| 日韩一二三区不卡| 色婷婷香蕉在线一区二区| 国产一区二区三区四区五区入口 | 欧美激情中文不卡| 欧美精品在欧美一区二区少妇| 成人国产在线观看| 久久99精品久久久久久| 亚洲主播在线观看| 成人免费小视频| 国产日本欧洲亚洲| 日韩欧美卡一卡二| 欧美视频在线一区二区三区| www.亚洲免费av| 国产麻豆精品95视频| 蜜臀精品久久久久久蜜臀| 亚洲一区二区三区视频在线播放| 国产日产欧美一区二区三区| 欧美一级理论性理论a| 91亚洲精品一区二区乱码| 成人激情文学综合网| 国产精品一区二区视频| 久久91精品国产91久久小草| 国产91丝袜在线18| 精品一区二区精品| 蜜桃传媒麻豆第一区在线观看| 亚洲一线二线三线久久久| 亚洲精品视频免费看| 日韩美女视频一区二区 | 久久这里只有精品首页| 日韩免费性生活视频播放| 欧美一区二区精品久久911| 在线成人av网站| 欧美日韩成人一区| 欧美裸体一区二区三区| 5858s免费视频成人| 91精品国产色综合久久不卡电影 | 免费视频一区二区| 日本伊人午夜精品| 久久机这里只有精品| 精品一区二区三区久久| 国产精品综合一区二区三区| 国产一区二区三区综合 | 欧美高清视频一二三区 | 91视频xxxx| 91玉足脚交白嫩脚丫在线播放| 一本大道av伊人久久综合| 欧美亚洲国产一区在线观看网站| 欧美亚洲高清一区| 91麻豆精品国产91久久久使用方法| 制服丝袜亚洲色图| 欧美精品一区在线观看| 国产精品久久久久久久久免费相片 | 亚洲.国产.中文慕字在线| 日本va欧美va欧美va精品| 精品一区二区三区不卡| 懂色av中文字幕一区二区三区| heyzo一本久久综合| 欧美日韩精品一区视频| 欧美大胆一级视频| 国产免费成人在线视频| 一区二区三区欧美久久| 日本成人在线看| 国产不卡视频在线观看| 欧洲精品中文字幕| 日韩视频免费观看高清完整版| 久久九九久久九九| 亚洲在线视频一区| 韩国精品一区二区| 91视频xxxx| 精品久久人人做人人爽| ...中文天堂在线一区| 偷窥少妇高潮呻吟av久久免费| 麻豆91精品视频| 成人激情黄色小说| 欧美精品在线观看播放| 国产欧美在线观看一区| 亚洲国产视频网站| 国产91在线观看| 欧美高清dvd| 国产精品乱码人人做人人爱| 午夜久久久久久久久久一区二区| 国产在线观看免费一区| 在线一区二区三区做爰视频网站| 精品黑人一区二区三区久久| 亚洲精品午夜久久久| 国产一区二区三区免费看| 在线欧美日韩国产| 欧美韩国日本一区| 蜜桃视频一区二区| 91福利视频久久久久| 久久精品视频在线免费观看| 日日骚欧美日韩| 91在线观看地址| 久久综合久久综合久久| 亚洲成av人片在www色猫咪| 风间由美一区二区av101| 在线不卡欧美精品一区二区三区| 亚洲欧洲av色图| 国产一区久久久| 欧美一区二区久久| 亚洲国产日韩一区二区| 91在线一区二区三区| 久久蜜臀精品av| 日产精品久久久久久久性色| 日本精品裸体写真集在线观看| 欧美激情综合五月色丁香小说| 精品一区二区在线观看| 欧美色男人天堂| 一区二区欧美国产| 91麻豆福利精品推荐| 中文字幕一区二区三区精华液| 国产福利一区二区三区| 精品久久久久久久久久久久包黑料 | 午夜日韩在线观看| 欧美亚洲国产bt| 一区二区高清免费观看影视大全| av综合在线播放| 一区二区中文视频| 99这里都是精品| 国产精品伦理一区二区| 成人免费视频网站在线观看| 久久久久国产一区二区三区四区| 精品午夜一区二区三区在线观看| 欧美久久一区二区| 日韩激情一区二区| 91麻豆精品久久久久蜜臀| 五月婷婷欧美视频| 56国语精品自产拍在线观看| 日韩有码一区二区三区| 日韩午夜小视频| 久久电影网站中文字幕| 精品国产乱码久久久久久免费| 看电视剧不卡顿的网站| 久久综合五月天婷婷伊人| 国产综合久久久久久鬼色 | 欧美亚洲一区二区在线| 亚洲国产另类精品专区| 欧美日韩一区二区三区四区五区 | 久久精品一区二区三区av| 国产精品18久久久久久vr| 欧美—级在线免费片| 99久久精品费精品国产一区二区| 亚洲欧美区自拍先锋| 欧美在线观看一区| 免费成人美女在线观看| 精品国产91乱码一区二区三区| 国产另类ts人妖一区二区| 中文字幕 久热精品 视频在线 | 色婷婷综合激情| 亚洲成人免费观看| 日韩限制级电影在线观看| 国产精品一区二区无线| 自拍偷拍亚洲综合| 欧美精品一二三| 国产精品一级片在线观看| 中文字幕一区日韩精品欧美| 欧美亚洲国产bt| 看片的网站亚洲| 国产精品久久久久桃色tv| 欧美色中文字幕| 久久精品国产亚洲高清剧情介绍| 国产欧美日韩精品一区| 在线观看中文字幕不卡| 日韩国产成人精品| 国产人成一区二区三区影院| 色婷婷久久一区二区三区麻豆| 免费黄网站欧美| 国产精品久久久久一区二区三区| 欧美日韩一区二区在线观看| 国产呦萝稀缺另类资源| 亚洲男帅同性gay1069| 日韩一区二区电影| 成人综合婷婷国产精品久久| 亚洲超碰精品一区二区| 国产女人aaa级久久久级| 欧美剧在线免费观看网站 | av亚洲精华国产精华精| 秋霞电影网一区二区| 综合久久给合久久狠狠狠97色| 7777精品伊人久久久大香线蕉 | 色88888久久久久久影院按摩 | 国产成人精品网址| 亚洲6080在线| 成人欧美一区二区三区白人| 日韩一区二区三区免费观看| 色先锋资源久久综合| 韩国v欧美v亚洲v日本v| 亚洲一区二区三区在线播放| 欧美国产丝袜视频| 6080日韩午夜伦伦午夜伦| 91视频在线观看| 国产九色sp调教91| 日本va欧美va欧美va精品| 一区二区三区四区亚洲| 国产欧美一区二区在线观看| 日韩一区二区影院|