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

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

?? uartmd.c

?? DM642支持4個串口的驅動代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 *  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)" */
/*
 *  ======== uartmd.c ========
 */

#include <std.h>
#include <stdlib.h>
#include <string.h>

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

#include <uartmd.h>
#include <uarthw.h>
#include <circ.h>

#define INPUT           0
#define OUTPUT          1
#define NUMCHANS        2

/*
 * SUPPORTPACKEDCHARS is used for devices that are not byte-addressable
 * where you want to use the UART to transfer full 16-bits of data.  A
 * character is 16-bits on the 54x and 55x.  SUPPORTPACKEDCHARS and the
 * UARTMD_DevParams.packedChars flag are used to specify that full 16-bits
 * of word should be output.  This is useful when using UART to transfer
 * data (not ASCII). UARTs typically support only 8-bit transfers so we
 * need to do 2 transfers per 16-bit word.
 */
#if defined(_54_) || defined(_55_)
#define SUPPORTPACKEDCHARS      1
#else
#define SUPPORTPACKEDCHARS      0
#endif

/*
 * There is one UartChanObj per direction.  This mini-driver must be
 * opened for input and output separately (does not support IOM_INOUT).
 */
typedef struct UartChanObj {
    Uns                 inUse;          /* TRUE if channel is in use */
    Int                 mode;           /* INPUT or OUTPUT */

    struct UartPortObj  *port;          /* to support multiple UART ports */
    
    IOM_Packet          *dataPacket;    /* current active I/O packet */
    Char                *bufptr;        /* pointer within current buf */
    Uns                 bufcnt;         /* size of remaining I/O job */

    QUE_Obj             pendList;       /* IOM_Packets pending I/O go here */

    CIRC_Obj            circ;           /* circular buffer */

    IOM_TiomCallback    cbFxn;          /* to notify client when I/O complete */
    Ptr                 cbArg;          /* argument for cbFxn() */

#if SUPPORTPACKEDCHARS
    Bool                packedChars;    /* TRUE => output all 16 bits */
    Bool                halfWay;        /* TRUE if we're between 1/2 words */
    Char                halfWord;       /* holds 1/2 word */
#endif
 
} UartChanObj, *UartChanHandle;

/*
 * There is one UartPortObj per UART.
 * This mini-driver supports 'NUMPORTS' UART.
 */
typedef struct UartPortObj {
    UARTHW_Handle               hUart;
    UARTMD_TnotifyHandler       notifyFunc;
    Uns                         evtMask;
    UartChanObj                 chans[NUMCHANS];
} UartPortObj, *UartPortHandle;

/*
 * Forward declaration of IOM mini driver interface functions.  These
 * are only exposed via the IOM function table to avoid namespace pollution.
 */
static Int mdBindDev(Ptr *devp, Int devid, Ptr bindParams);
static Int mdControlChan(Ptr chanp, Uns cmd, Ptr arg);
static Int mdCreateChan(Ptr *mdChan, Ptr drvhandle, String name, Int mode, \
        Ptr optArgs, IOM_TiomCallback cbFxn, Ptr cbArg);
static Int mdDeleteChan(Ptr chanp);
static Int mdSubmitChan(Ptr chanp, IOM_Packet *packet);


/*
 * Control functions.  These functions are called by mdControl() for
 * assorted control commmands.
 */
static Int  controlNotify(UartChanHandle chan, UARTMD_NotifyStruct* notify);


/*
 * Submit functions.  These functions are called by mdSubmitChan() for
 * assorted submit commands.
 */
static Int  submitAbort(UartChanHandle chan, IOM_Packet *packet);
static Int  submitFlush(UartChanHandle chan, IOM_Packet *packet);
static Int  submitRead(UartChanHandle chan, IOM_Packet *packet);
static Int  submitWrite(UartChanHandle chan, IOM_Packet *packet);


/* 
 * Callback functions.  These functions are called by the low-level UARTHW
 * ISR for different event types.
 */
static Void cbLineStatus(UartPortHandle port, Int lsrVal);
static Void cbModemStatus(UartPortHandle port, Int msrVal);
static Void cbRxHandler(UartPortHandle port, Int rxVal);
static Void cbTxHandler(UartPortHandle port);


/*
 * Support functions.
 */
static Void getNextPacket(UartChanHandle chan);


/*
 * Public Mini Driver interface table.
 */
IOM_Fxns UARTMD_FXNS =
{
    &mdBindDev,
    IOM_UNBINDDEVNOTIMPL,
    &mdControlChan,
    &mdCreateChan,
    &mdDeleteChan,
    &mdSubmitChan,
};

/*
 * These functions are called by the UARTHW code.
 */
static UARTHW_Tcallback cbFxns[4] = { 
    (UARTHW_Tcallback)cbModemStatus, 
    (UARTHW_Tcallback)cbTxHandler,
    (UARTHW_Tcallback)cbRxHandler, 
    (UARTHW_Tcallback)cbLineStatus
};

/* This mini-driver supports 'NUMPORTS' UARTs. */
#ifdef _64_
#define NUMPORTS        4       /* 2 ports for dual UART on EVMDM642 board */
#else
#define NUMPORTS        1
#endif
static UartPortObj  ports[NUMPORTS];

/*
 *  ======== UARTMD_init ========
 *  UARTMD_init() initializes the data structures used by this mini-driver.
 */
Void UARTMD_init(Void)
{
    Int i, j;

    /* initialize all uartPortObj fields to '0' */
    memset(ports, 0, sizeof(ports));

    for (i=0; i < NUMPORTS; i++) {
        for (j=0; j < NUMCHANS; j++) {
            /* initialize port->chans */
            QUE_new(&ports[i].chans[j].pendList);
            CIRC_new(&ports[i].chans[j].circ);
            ports[i].chans[j].port = &ports[i];
        }
    }
}

/*
 *  ======== mdBindDev ========
 *  mdBindDev() is called by DEV_init() to bind and initialize the hardware. 
 */
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
{
    UARTMD_DevParams *params = (UARTMD_DevParams *)devParams;
    UARTMD_DevParams defaultParams = UARTMD_DEVPARAMS_DEFAULT;
    UARTHW_Handle hUart;

    if ((Uns)devid > NUMPORTS-1) {
        return (IOM_EBADARGS);
    }

    if (params == NULL) {
        params = &defaultParams;
    }

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

#if SUPPORTPACKEDCHARS
    ports[devid].chans[INPUT].packedChars = params->packedChars;
    ports[devid].chans[OUTPUT].packedChars = params->packedChars;
#endif

    hUart = UARTHW_open(devid, params->uarthwParams, &ports[devid], cbFxns);

    if (hUart != NULL) {
        ports[devid].hUart = hUart;
        *devp = &ports[devid];
        return (IOM_COMPLETED);
    }
    else {
        return (IOM_EBADIO);
    }
}

/*
 *  ======== mdControlChan ========
 *  The Mini driver ctrl function. Catch all for adding device or vendor
 *  specific functionality to a mini driver.
 */
static Int mdControlChan(Ptr chanp, Uns cmd, Ptr arg)
{
    UartChanHandle chan = (UartChanHandle)chanp;
    UARTHW_Handle hUart = chan->port->hUart;
    Int status;

    if (cmd == UARTMD_REGISTER_NOTIFY) {
        status = controlNotify(chan, arg);
    } 
    else if (cmd == UARTMD_SETBREAK) {
        status = UARTHW_setBreak(hUart, ArgToInt(arg));
    } 
    else if (cmd == UARTMD_GETMODEMSTATUS) {
        status = UARTHW_getModemStatus(hUart, (char*)arg);
    } 
    else if (cmd == UARTMD_SETRTS) {
        status = UARTHW_setRTS(hUart, ArgToInt(arg));
    } 
    else if (cmd == UARTMD_SETDTR) {
        status = UARTHW_setDTR(hUart, ArgToInt(arg));
    } 
    else {
        status = IOM_ENOTIMPL;
    }
        
    return (status);    
}

/*
 *  ======== mdCreateChan ========
 */
static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode, \
                         Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
{
    UartChanHandle      chan;
    UartPortHandle      port = (UartPortHandle)devp;
               
    if (mode == IOM_INPUT) {
        chan = &port->chans[INPUT];
        chan->mode = INPUT;
    }
    else if (mode == IOM_OUTPUT) {
        chan = &port->chans[OUTPUT];
        chan->mode = OUTPUT;
    }
    else {
        return (IOM_EBADMODE);
    }
        
    if (ATM_setu(&chan->inUse, TRUE)) {
        return (IOM_EINUSE);
    }

    /*
     * Save the callback function and argument.  cbFxn() is called every
     * time an I/O job completes.
     */
    chan->cbFxn = cbFxn;
    chan->cbArg = cbArg;

    /* chanp will be passed to subsequent mini-driver calls */
    *chanp = chan;
    
    return (IOM_COMPLETED);             
}

/*
 *  ======== mdDeleteChan ========
 *  Deletes an instance of the UART channel. 
 *  All I/O jobs must be completed prior to calling mdDelete().
 */
static Int mdDeleteChan(Ptr chanp)
{
    UartChanHandle chan = (UartChanHandle)chanp;
   
    chan->inUse = FALSE;
        
    return (IOM_COMPLETED);
}

/*
 *  ======== mdSubmitChan ========
 *  The main entry point to the mini driver for read / write operations.
 *  mdSubmitChan() also handles the flush and abort operations.
 */
static Int mdSubmitChan(Ptr chanp, IOM_Packet *packet)
{
    Uns cmd = (packet->cmd);
    Int status;
    
    if (cmd == IOM_READ){
        status = submitRead(chanp, packet);
    }
    else if (cmd == IOM_WRITE){
        status = submitWrite(chanp, packet);
    }
    else if (cmd == IOM_ABORT){
        status = submitAbort(chanp, packet);
    }
    else if (cmd == IOM_FLUSH){
        status = submitFlush(chanp, packet);
    }
    else {
        status = IOM_ENOTIMPL; 
    }
  
    return (status);
}


/*
 *  -------- control functions --------
 */

/*
 *  ======== controlNotify ========
 *  The local routine to handle application call to set the
 *  notification callback and events for which it desires
 *  notifications.
 */
static Int controlNotify(UartChanHandle chan, UARTMD_NotifyStruct * notify)
{
    chan->port->evtMask = notify->evtMask;
    chan->port->notifyFunc = notify->notifyFunc;
  
    return (IOM_COMPLETED);
}


/*
 *  -------- submit functions --------
 */

/*
 *  ======== submitAbort ========
 *  The local routine to handle an IOM_ABORT command.
 */
static Int submitAbort(UartChanHandle chan, IOM_Packet *packet)
{
    IOM_Packet  *dataPacket;
    Uns         imask;
    CIRC_Handle circ = &chan->circ;

    /*
     * Atomically save dataPacket and set chan->dataPacket to NULL.
     * 'chan->dataPacket' is used to synchronize with the ISR.  If the
     * ISR sees chan->dataPacket == NULL, it will not attempt to
     * reload any packets from the pendList.
     */
    imask = HWI_disable();
    CIRC_reset(circ);
    dataPacket = chan->dataPacket;
    chan->dataPacket = NULL;            /* stop all active I/O */

#if SUPPORTPACKEDCHARS
    chan->halfWay = FALSE;
#endif
    
    HWI_restore(imask);

    /*
     * Return all packets in order with their status tagged as aborted.
     * Since chan->dataPacket was set to NULL above, we don't need to
     * worry about synchronizing with the ISR.
     */

    /*
     * Return active dataPacket first.
     */ 
    if (dataPacket != NULL) {
        dataPacket->status = IOM_ABORTED;
        chan->cbFxn(chan->cbArg, dataPacket);
    }

    /*
     * Now remove remaining packets from the pending list and call
     * the callback one at a time.  We use QUE_get() here for code size
     * savings, but we could use QUE_dequeue() since ISR will not
     * reference this queue.
     */
    dataPacket = QUE_get(&chan->pendList);
    while (dataPacket != (IOM_Packet *)&chan->pendList) {
        dataPacket->status = IOM_ABORTED;
        chan->cbFxn(chan->cbArg, dataPacket);

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合狠狠综合久久激情| 欧美日韩高清一区二区三区| 青青草视频一区| 三级欧美在线一区| 天天操天天干天天综合网| 亚洲最新视频在线观看| 亚洲综合久久久久| 蜜臀a∨国产成人精品| 国产精品99久久久久久有的能看 | 欧美这里有精品| 99精品欧美一区二区三区综合在线| 国产mv日韩mv欧美| 色综合久久久久久久| 欧美日韩精品福利| 精品91自产拍在线观看一区| 国产亚洲精品aa| 中文字幕视频一区二区三区久| 亚洲图片另类小说| 日韩精品一二三四| 国产精品一区二区三区99| 国产·精品毛片| 色94色欧美sute亚洲线路一久| 欧美无乱码久久久免费午夜一区| 5566中文字幕一区二区电影| 久久久精品天堂| 亚洲天堂久久久久久久| 日韩成人精品在线| 国产成人免费视频网站高清观看视频| 99视频热这里只有精品免费| 欧美精品在欧美一区二区少妇| 欧美mv和日韩mv国产网站| 国产女主播一区| 亚洲国产精品综合小说图片区| 久草精品在线观看| 91蜜桃网址入口| 日韩精品一区二区在线观看| 亚洲丝袜精品丝袜在线| 奇米影视一区二区三区| 91性感美女视频| 日韩你懂的电影在线观看| 亚洲欧美日韩电影| 国产精品一区免费在线观看| 色嗨嗨av一区二区三区| 久久亚洲精精品中文字幕早川悠里| 亚洲欧洲国产日本综合| 精品夜夜嗨av一区二区三区| 欧美午夜电影网| 中文字幕在线一区| 国产一区二区三区香蕉| 91麻豆精品国产91久久久使用方法 | 亚洲图片欧美色图| 成人黄动漫网站免费app| 91精品国产色综合久久ai换脸| 欧美国产国产综合| 国内欧美视频一区二区| 欧美日韩一卡二卡三卡| 亚洲天堂成人网| 成人av在线播放网址| 国产午夜三级一区二区三| 日本少妇一区二区| 欧美三级乱人伦电影| 亚洲伦理在线免费看| 91在线无精精品入口| 中文字幕久久午夜不卡| 久久99蜜桃精品| 精品入口麻豆88视频| 日韩va亚洲va欧美va久久| 欧美午夜不卡视频| 亚洲国产精品自拍| 欧美日韩在线直播| 天堂成人国产精品一区| 欧美精品一二三| 亚洲高清在线精品| 欧美高清精品3d| 日本午夜精品一区二区三区电影 | 精品国产污网站| 久久精品国产999大香线蕉| 欧美一级淫片007| 麻豆精品一二三| 2022国产精品视频| 国产寡妇亲子伦一区二区| 久久综合久久久久88| 国产成人综合网站| 中文一区一区三区高中清不卡| 国产一区美女在线| 国产精品免费丝袜| 91麻豆视频网站| 亚洲综合在线免费观看| 欧美日韩高清一区二区不卡| 琪琪一区二区三区| 久久久五月婷婷| k8久久久一区二区三区| 亚洲一区精品在线| 日韩一区二区在线看片| 国产九九视频一区二区三区| 国产亚洲综合在线| 91亚洲大成网污www| 日日嗨av一区二区三区四区| 久久综合精品国产一区二区三区| 懂色一区二区三区免费观看| 亚洲免费色视频| 91精品国产91久久综合桃花| 国内精品第一页| 亚洲品质自拍视频网站| 91麻豆精品国产| 国产精品亚洲一区二区三区妖精| 亚洲人吸女人奶水| 日韩视频免费观看高清完整版在线观看 | 欧美成人激情免费网| 成人动漫一区二区在线| 亚洲综合网站在线观看| 久久综合狠狠综合久久综合88 | 亚洲精品乱码久久久久久| 91精品婷婷国产综合久久性色| 国产精品一区二区在线看| 亚洲一区二区三区四区在线免费观看| 欧美一区二区免费视频| 97se亚洲国产综合自在线| 蜜桃一区二区三区四区| 亚洲三级小视频| 久久久亚洲高清| 91精品在线免费| 色综合久久久久综合99| 国产成人综合亚洲网站| 男女视频一区二区| 亚洲亚洲精品在线观看| 亚洲欧洲另类国产综合| 久久欧美中文字幕| 制服丝袜日韩国产| 欧美亚一区二区| 99久久99久久免费精品蜜臀| 国产精品伊人色| 国精产品一区一区三区mba桃花 | 国产69精品久久777的优势| 免费在线观看成人| 五月天亚洲婷婷| 亚洲精品日韩一| 国产精品传媒视频| 国产精品久久久久久久久久免费看| 日韩西西人体444www| 欧美日韩大陆在线| 欧美性猛片xxxx免费看久爱| 91猫先生在线| 91黄视频在线观看| 欧美综合久久久| 91免费在线看| 色素色在线综合| 色综合久久综合网欧美综合网| jlzzjlzz国产精品久久| 99久久99久久精品免费观看| jizzjizzjizz欧美| 91视频在线看| 色天使色偷偷av一区二区| 色国产综合视频| 欧美日韩视频在线第一区| 在线中文字幕不卡| 欧美日韩国产小视频| 欧美性生活久久| 91精品国产91综合久久蜜臀| 日韩精品一区在线| 国产精品嫩草99a| 亚洲免费在线看| 天天影视涩香欲综合网| 免费成人av资源网| 国产精品888| jlzzjlzz亚洲女人18| 欧美在线你懂得| 91麻豆精品国产自产在线| 26uuu精品一区二区三区四区在线| 精品1区2区在线观看| 国产精品午夜久久| 午夜精品久久久久久久99水蜜桃 | 7777精品伊人久久久大香线蕉完整版| 欧美在线一二三四区| 在线播放91灌醉迷j高跟美女 | 亚洲综合在线免费观看| 日韩电影在线一区二区| 国产在线精品一区二区三区不卡| 国产成人精品一区二区三区网站观看| 99riav一区二区三区| 91精品欧美福利在线观看| 久久久久久99精品| 亚洲一区二区欧美激情| 九九精品一区二区| 色悠悠久久综合| 日韩欧美国产一区二区三区| 国产精品久久久久桃色tv| 亚洲成人av中文| 大白屁股一区二区视频| 欧美日韩一区二区电影| 国产视频在线观看一区二区三区| 亚洲综合成人在线视频| 国产精品一区二区三区四区| 欧美亚洲动漫精品| 国产精品婷婷午夜在线观看| 天天色 色综合| 色999日韩国产欧美一区二区| 精品免费日韩av| 亚洲第一电影网| 99久久综合精品|