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

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

?? uarthw_evmdm642.c

?? DM642支持4個(gè)串口的驅(qū)動代碼
?? 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)" */
/*
 *  ======== uarthw_evmdm642.c ========
 */
 
#include <std.h>

#define CHIP_DM642      1

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

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

#include <evmdm642.h>
#include <evmdm642_osd.h>

#include <uarthw.h>
#include <uarthw_evmdm642.h>
#include <uarthw_evmdm642hal.h>

#define DM642_CPLD_UART_BASE	0xa0000000

#define RBRREG(regset)  (regset->uart[0])
#define THRREG(regset)  (regset->uart[0])
#define DLLREG(regset)  (regset->uart[0])
#define DLHREG(regset)  (regset->uart[1])
#define IERREG(regset)  (regset->uart[1])
#define FCRREG(regset)  (regset->uart[2])
#define EFRREG(regset)  (regset->uart[2])
#define IIRREG(regset)  (regset->uart[2])
#define LCRREG(regset)  (regset->uart[3])
#define MCRREG(regset)  (regset->uart[4])
#define XON1REG(regset) (regset->uart[4])
#define LSRREG(regset)  (regset->uart[5])
#define XON2REG(regset) (regset->uart[5])
#define MSRREG(regset)  (regset->uart[6])
#define XOF1REG(regset) (regset->uart[6])
#define TCRREG(regset)  (regset->uart[6])
#define SPRREG(regset)  (regset->uart[7])
#define XOF2REG(regset) (regset->uart[7])
#define TLRREG(regset)  (regset->uart[7])
#define FRDYREG(regset) (regset->uart[7])

#define getLineStatus(regset)           ((Byte)LSRREG(regset))
#define getModemControlReg(regset)      ((Byte)MCRREG(regset))
#define setModemControlReg(regset, c)   MCRREG(regset) = (c)
#define getLineControlReg(regset)       ((Byte)LCRREG(regset))
#define setLineControlReg(regset, c)    LCRREG(regset) = (c)
#define disableRx(regset)               (IERREG(regset) &= ~UART_IER_RXDATAEN)
#define disableTx(regset)               (IERREG(regset) &= ~UART_IER_THREMPEN)
#define enableRx(regset)                (IERREG(regset) |= UART_IER_RXDATAEN)
#define enableTx(regset)                (IERREG(regset) |= UART_IER_THREMPEN)
#ifdef _DEBUG
#define getInt(regset)                  ((Byte)IIRREG(regset) & 0x3f)
#else
#define getInt(regset)                  ((Byte)IIRREG(regset) & 0x0f)
#endif /* _DEBUG */

#define NUMPORTS                        4
#define NOINTPENDING                    0x01
#define IDENTIFYINT(id)                 ((id >> 1) & 0x03)

#define MCRDTRMASK                      0xFE
#define MCRRTSMASK                      0xFD
#define LCRBRKMASK                      0xBF

#define AFERTSCTSMASK                   0xDD
#define AFERTSCTSFLW                    0x22
#define AFECTSFLW                       0x20
#define AFEDISFLW                       0x00

#define LCRBREAKPOS                     6
#define MCRRTSPOS                       1

typedef struct UartRegs {
    volatile unsigned short uart[8];
} UartRegs;

static void setupFlowParams(UARTHW_Handle hUart, Uns flowParam);
static void uartIsr(Ptr cbArg);
static Int uartRxFull(UartRegs * regs);

static UARTHW_EVMDM642_Params defaultParams = { \
    UARTHW_EVMDM642_FLOW_NONE,                  \
    UARTHW_EVMDM642_DISABLE_PARITY,             \
    UARTHW_EVMDM642_WORD8,                      \
    UARTHW_EVMDM642_STOP1,                      \
    UARTHW_EVMDM642_BAUD_115200                 \
};

typedef struct UARTHW_Obj {
    Int uartId;                         /* UART port ID */
    Int rxDisabled;                     /* disabled flag */
    UartRegs * regs;                    /* base pointer to reg set */
    UARTHW_EVMDM642_Params *params;
    UARTHW_Tcallback * cbFxns;
    Ptr cbArg;
} UARTHW_Obj;

UARTHW_Obj portObj[NUMPORTS];

#ifdef _DEBUG
struct {
        Int errInts;
        Int mdmInts;
        Int rhrInts;
        Int thrInts;
        Int rtoInts;
        Int rxCnt;
        Int rxXoff;
        Int rtsCts;
} intStats[NUMPORTS] =
{
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0}
};
#endif /* _DEBUG */


/*
 *  ======== UARTHW_open ========
 *
 *  This function is used to attach to the UART.
 *  Typically this function plugs the UART interrupt vector with
 *  the internal driver supplied isr routine.
 *  Initializes the UART, UART flow parameters and UART communication parameters
 *
 */
UARTHW_Handle UARTHW_open(Int uartId, Ptr params, Ptr cbArg, UARTHW_Tcallback *cbFxns)
{
    volatile Char c;
        UartRegs *regs;
    UARTHW_EVMDM642_Params *uartParams = (UARTHW_EVMDM642_Params *)params;
    UARTHW_Handle  port;

    if (uartId >= NUMPORTS) {
        return (NULL);                  // invalid UART id
    }

    port = &portObj[uartId];
    
    port->uartId = uartId;
    regs = port->regs = (UartRegs *) (DM642_CPLD_UART_BASE + (uartId * sizeof(UartRegs)));

    /* 
     * Initialize the isrhandler to the one given by
     * generic uart.
     */
    port->cbFxns = cbFxns;
    port->cbArg = cbArg;
       
    EVMDM642_OSD_init();

/*    if (uartId == 0) {
        EVMDM642_OSD_intHook(UARTA_IRQ, uartIsr, port);
    } 
    else {
        EVMDM642_OSD_intHook(UARTB_IRQ, uartIsr, port);
    }
*/
	switch(uartId)
	{
	case 0:
        EVMDM642_OSD_intHook(UARTA_IRQ, uartIsr, port);
        break;
	case 1:
        EVMDM642_OSD_intHook(UARTB_IRQ, uartIsr, port);
        break;
   	case 2:
        EVMDM642_OSD_intHook(UARTC_IRQ, uartIsr, port);
        break;
	case 3:
        EVMDM642_OSD_intHook(UARTD_IRQ, uartIsr, port);
        break;
	}
	
    /* 
     * Use the default attributes if one is not given
     */
    if (uartParams == NULL) {
        uartParams = &defaultParams;
    }

    /*
     * Set EFR registers
     */
    LCRREG(regs) = 0xBF;                /* address secondary register set */
    EFRREG(regs) =  0;   //UART_EFR_AUTOCTS | UART_EFR_AUTORTS | UART_EFR_ENHFUNCEN; /* enable enhanced functions */
					
    LCRREG(regs) = 0x00;                /* back to primary register set */
    MCRREG(regs) = 0x00;
    MCRREG(regs) = UART_MCR_IRQENOP | UART_MCR_FIFORDYEN; /* enable IRQ and FIF rdy register */
    IERREG(regs) = 0x00;                /* set interrupt enable register */
    FCRREG(regs) = 0x00;                /* set FIFO control */

    /*
     * Set up baud rate and other comm parameters
     */
    LCRREG(regs) = UART_LCR_DLTCHEN; /* enable divisor */
    DLLREG(regs) = uartParams->baud;
    DLHREG(regs) = uartParams->baud >> 8;
    LCRREG(regs) = uartParams->wordSize | (uartParams->stopBits << 2) |
                (uartParams->parity << 3);

    FCRREG(regs) =                              /* FIFO control register */
                UART_FCR_RXTRG16 | UART_FCR_TXTRG32 | UART_FCR_DMAMODE |
                UART_FCR_RSTTXFIFO | UART_FCR_RSTRXFIFO | UART_FCR_FIFOEN;
    IERREG(regs) =                              /* enable normal interrupts */
                UART_IER_MDMSTATEN | UART_IER_RXLSTATEN | UART_IER_THREMPEN |
                UART_IER_RXDATAEN;
    LSRREG(regs);                               /* clear previous line status */
    MSRREG(regs);                               /* modem status register */
    MCRREG(regs);                               /* modem control register */

    while (uartRxFull(regs)) { /* remove active characters */
        c = (Byte)RBRREG(regs);
    }

    port->params = uartParams;
      
    setupFlowParams(port, (uartParams->flowControl) & UARTHW_EVMDM642_HW_FLOW_MASK);

    port->rxDisabled = 0;               /* indicate we're enabled now */
    enableRx(regs);
    enableTx(regs);
  
    return (port);
}

/*
 *  ======== UARTHW_getModemStatus ========
 *
 *  This function is used to get the modem status for the UART. 
 */
 
Int UARTHW_getModemStatus(UARTHW_Handle hUart, char *pmodemStatus)
{
    *pmodemStatus = (Byte)MSRREG(hUart->regs);

    return (IOM_COMPLETED);
}

/*
 *  ======== UARTHW_resetDevice ========
 *
 *  This function is used to reset the UART 16c75x.
 *  Ideally this function should clear the transmit and 
 *  receive fifos if the fifos are being used.
 */
void UARTHW_resetDevice(UARTHW_Handle hUart)
{
    FCRREG(hUart->regs) =
                UART_FCR_RXTRG16 | UART_FCR_TXTRG32 | UART_FCR_DMAMODE |
                UART_FCR_RSTTXFIFO | UART_FCR_RSTRXFIFO | UART_FCR_FIFOEN;
}

/*
 *  ======== UARTHW_setBreak ========
 *
 *  This function is used to set the break on/off for the UART 16c75x 
 */
Int UARTHW_setBreak(UARTHW_Handle hUart, Int bBreak)
{
    char lcrVal;

    lcrVal = getLineControlReg(hUart->regs);
    lcrVal = (lcrVal & LCRBRKMASK) | (bBreak << LCRBREAKPOS);
    setLineControlReg(hUart->regs, lcrVal);
   
    return (IOM_COMPLETED);
}

/*
 *  ======== UARTHW_setDTR ========
 *
 *  This function is used to set the DTR signal for the UART 16c75x 
 */
Int UARTHW_setDTR(UARTHW_Handle hUart, int dtrval)
{
    char mcrVal;

    mcrVal = getModemControlReg(hUart->regs);
    mcrVal = (mcrVal & MCRDTRMASK) | dtrval;
    setModemControlReg(hUart->regs, mcrVal);

    return (IOM_COMPLETED);
}

/*
 *  ======== UARTHW_setRTS ========
 *
 *  This function is used to set the RTS signal for the UART 16c75x 
 */
Int UARTHW_setRTS(UARTHW_Handle hUart, int rtsval)
{
    char mcrVal;

    mcrVal = getModemControlReg(hUart->regs);
    mcrVal = (mcrVal & MCRRTSMASK) | (rtsval << MCRRTSPOS);
    setModemControlReg(hUart->regs, mcrVal);
    
    return (IOM_COMPLETED);
}

/*
 *  ======== UARTHW_txEmpty ========
 *
 *  This function is used to get the transmit buffer empty condition 
 */
Int UARTHW_txEmpty(UARTHW_Handle hUart)
{
    return ((Byte)LSRREG(hUart->regs) & UART_LSR_THREMPTY);
}

/*
 *  ======== UARTHW_writeChar ========
 *
 *  This function is used to write a character to the transmit register 
 */
void UARTHW_writeChar(UARTHW_Handle hUart, char c)
{
    THRREG(hUart->regs) = c;
}

/*
 *  ======== UARTHW_enableRx ========
 *  Enable the Rx Interrupt of the UART.
 *
 */
void UARTHW_enableRx(UARTHW_Handle hUart)
{
    if (ATM_seti(&hUart->rxDisabled, 0)) {
        enableRx(hUart->regs);
    }
}

/*
 *  ======== UARTHW_disableRx ========
 *  Disable the Rx Interrupt of the UART.
 *
 */
void UARTHW_disableRx(UARTHW_Handle hUart)
{
    int gie;

    gie = IRQ_globalDisable();
    disableRx(hUart->regs);
    hUart->rxDisabled = 1;
    IRQ_globalRestore(gie);
}

/*
 *  ======== setupFlowParams ========
 *
 *  This function is used to setup the UART 16c75x flow paramaters
 */
static void setupFlowParams(UARTHW_Handle hUart, Uns flowParam)
{
    char mcrVal;
 
    mcrVal = getModemControlReg(hUart->regs);
        mcrVal &= AFERTSCTSMASK;
 
    if (flowParam & UARTHW_EVMDM642_FLOW_AFE_RTSCTS) {
        mcrVal |= AFERTSCTSFLW;
    }
    else if (flowParam & UARTHW_EVMDM642_FLOW_AFE_CTS) {
        mcrVal |= AFECTSFLW;
    }
    else {
        mcrVal |= AFEDISFLW;  
    }

    setModemControlReg(hUart->regs, mcrVal);                
}

/* 
 *  ======== uartIsr ========
 *
 *  This is the interrupt service handler used by the EVMDM642
 *  UART driver.
 */
static void uartIsr(Ptr portArg)
{
    Int                 id;
    Int                 argval;
    Int                 temp;
    UARTHW_Handle       port = (UARTHW_Handle) portArg;
    UARTHW_Tcallback    *callbacks = port->cbFxns;
    Ptr                 cbArg = port->cbArg;

    /*
     * While loop here since 16C752/4 holds interrupt line high until
     * all interrupt conditions are handled (2 or more may be pending
     * at same time).  DM642 uses edge-triggered interrupts and would
     * miss interrupts otherwise.
     */
    while (!((id = getInt(port->regs)) & NOINTPENDING)) {
        switch (id) {
            case UART_INT_MSR: /* Modem status interrupt -- read and dispatch */
#ifdef _DEBUG
                intStats[port->uartId].mdmInts++;
#endif /* _DEBUG */
                argval = (Byte)MSRREG(port->regs);
                (*callbacks[UARTHW_MODEM_STATUSHANDLER])(cbArg, argval);
                break;

            case UART_INT_THR:          /* Transmit handler */
#ifdef _DEBUG
                intStats[port->uartId].thrInts++;
#endif /* _DEBUG */
                /* NOTE:
                 * This shouldn't be necessary, but sometimes the interrupt
                 * comes in before the transmitter is really empty.  Still
                 * working on this one
                 */
                while (!(temp = UARTHW_txEmpty(port))) {
                    asm(" NOP");
                }

                (*callbacks[UARTHW_TXEMPTY_STATUSHANDLER])(cbArg, temp);
                break;

            case UART_INT_RHR:          /* Receive Handler */
            case UART_INT_RXTO:         /* Receive time-out error */
#ifdef _DEBUG
                if (id == UART_INT_RHR)
                    intStats[port->uartId].rhrInts++;
                else
                    intStats[port->uartId].rtoInts++;
#endif /* _DEBUG */
                while ((!port->rxDisabled) && uartRxFull(port->regs)) {
#ifdef _DEBUG
                    intStats[port->uartId].rxCnt++;
#endif /* _DEBUG */
                    argval = (Byte)RBRREG(port->regs);
                    (*callbacks[UARTHW_RXFULL_STATUSHANDLER])(cbArg, argval); 
                }
                break;

                case UART_INT_RLSERR:   /* Receiver line status error */
#ifdef _DEBUG
                    intStats[port->uartId].errInts++;
#endif /* _DEBUG */
                    argval = (Byte)LSRREG(port->regs);
                    /*
                     * Isolate parity/framing/overrun and data ready
                     * Discard characters by reading the receiver buffer
                     * ready register, and get the line status again
                     */
                    while ((argval & UART_LSR_ERRMASK) && (argval & UART_LSR_DATAIN)) {
                        (Byte)RBRREG(port->regs);
                        argval = (Byte)LSRREG(port->regs);
                    }
                    (*callbacks[UARTHW_LINE_STATUSHANDLER])(cbArg, argval);
                    break;
#ifdef _DEBUG
                case UART_INT_XOFF:     /* Xoff interrupt */
                    intStats[port->uartId].rxXoff++;
                    break;

                case UART_INT_CTSRTS:  /* RTS or CTS pin change to inactive */
                    intStats[port->uartId].rtsCts++;
                    break;
                default:
                    while (1) {
                        /* should never get here ... */
                        asm(" NOP");
                    }
#endif /* _DEBUG */
        }
    }
}

/*
 * ======== uartRxFull ========
* * 
 * This function is used to get the Receive Buffer Full condition 
 */
static Int uartRxFull(UartRegs *regs)
{
    return ((Byte)LSRREG(regs) & UART_LSR_DATAIN);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色噜噜偷拍精品综合在线| 欧美二区三区91| 日产国产高清一区二区三区| 久久免费视频色| 欧美日韩在线免费视频| 粉嫩av亚洲一区二区图片| 亚洲综合激情网| 国产精品午夜久久| 91精品国产综合久久久蜜臀图片| 99久久伊人网影院| 精品亚洲成av人在线观看| 亚洲小说春色综合另类电影| 国产目拍亚洲精品99久久精品| 久久久激情视频| 欧美日韩成人综合| 97国产精品videossex| 国产美女av一区二区三区| 日本伊人色综合网| 午夜伦理一区二区| 亚洲免费大片在线观看| 国产农村妇女精品| 国产亚洲短视频| www国产亚洲精品久久麻豆| 欧美丰满一区二区免费视频| 欧美午夜一区二区| 一本到一区二区三区| 99精品在线观看视频| 成人午夜电影久久影院| 国产精品亚洲午夜一区二区三区| 久久国产精品第一页| 久久丁香综合五月国产三级网站| 丝瓜av网站精品一区二区| 亚洲永久免费视频| 亚洲精品国产精华液| 亚洲日本护士毛茸茸| 国产精品久久久久7777按摩| 国产精品第一页第二页第三页| 中国色在线观看另类| 日本一区二区三区国色天香| 国产亚洲一本大道中文在线| 国产午夜精品久久久久久免费视| 久久先锋资源网| 国产日韩视频一区二区三区| 久久精品综合网| 国产精品每日更新在线播放网址| 国产精品免费av| 国产精品久久久久aaaa| 综合激情成人伊人| 一区二区三区久久久| 伊人婷婷欧美激情| 亚洲成在线观看| 日韩和的一区二区| 美女www一区二区| 韩国成人福利片在线播放| 国产乱码精品一区二区三 | 国产乱人伦偷精品视频不卡 | 国产精品视频一二三区| 国产精品网站在线观看| 1区2区3区国产精品| 一二三四区精品视频| 日韩国产欧美在线播放| 国产一区二区伦理| 国产资源精品在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 婷婷久久综合九色综合伊人色| 日本韩国一区二区三区视频| 91视频在线观看| 欧美日韩成人综合天天影院| 欧美mv日韩mv国产网站| 欧美日韩三级一区二区| 久久网站热最新地址| 丝袜美腿亚洲色图| 在线免费观看成人短视频| 国产丝袜在线精品| 久久精品国内一区二区三区| 欧美视频在线一区| 亚洲视频在线一区| 夫妻av一区二区| 精品国产一区久久| 亚洲chinese男男1069| 91亚洲精华国产精华精华液| 国产欧美一区二区三区鸳鸯浴| 偷拍一区二区三区| 欧美性xxxxxx少妇| 亚洲美腿欧美偷拍| 99在线热播精品免费| 中文字幕免费不卡在线| 激情都市一区二区| 欧美体内she精高潮| 欧美精品一区二区久久婷婷| 丝袜亚洲精品中文字幕一区| 91久久精品一区二区二区| 国产精品成人在线观看 | 欧美一区二区三区视频在线 | 欧美综合天天夜夜久久| 亚洲天堂精品在线观看| 岛国一区二区三区| 国产日韩欧美精品电影三级在线| 国产在线视频精品一区| 精品欧美一区二区久久 | 91麻豆精品国产91久久久更新时间| 日韩伦理av电影| www.在线欧美| 亚洲免费观看高清在线观看| 91蜜桃网址入口| 亚洲啪啪综合av一区二区三区| 91丝袜美女网| 亚洲精品福利视频网站| 欧美婷婷六月丁香综合色| 亚洲一二三区在线观看| 欧美日韩精品欧美日韩精品一综合| 亚洲自拍偷拍网站| 欧美久久久久久蜜桃| 日韩激情视频在线观看| 日韩美女一区二区三区| 精品亚洲国产成人av制服丝袜| 欧美精品一区二区三区很污很色的 | 午夜伊人狠狠久久| 91精品国产综合久久精品图片| 视频一区视频二区中文字幕| 日韩欧美一二三四区| 韩国一区二区在线观看| 国产午夜一区二区三区| 不卡一区二区中文字幕| 亚洲午夜精品一区二区三区他趣| 欧美日韩黄色影视| 久久99精品久久久| 国产精品美女视频| 欧美中文字幕一区二区三区| 青青草精品视频| 国产视频一区在线播放| 色又黄又爽网站www久久| 天天免费综合色| 久久久国产一区二区三区四区小说 | 亚洲欧美另类小说| 3d成人h动漫网站入口| 国产最新精品免费| 中文字幕一区在线| 欧美日本不卡视频| 精品一区二区精品| 最好看的中文字幕久久| 欧美日本韩国一区二区三区视频 | 国产成a人亚洲精品| 亚洲欧美区自拍先锋| 欧美精品日日鲁夜夜添| 国产成人啪免费观看软件| 樱桃视频在线观看一区| 精品99999| 色狠狠色狠狠综合| 久久99九九99精品| 亚洲人成在线观看一区二区| 91精品欧美综合在线观看最新| 国产成人精品影视| 亚洲国产成人tv| 国产免费成人在线视频| 91精品国产91热久久久做人人| 国产91丝袜在线18| 日韩精品每日更新| 中文字幕日韩一区二区| 欧美一级日韩不卡播放免费| www.日韩大片| 毛片av中文字幕一区二区| 亚洲裸体在线观看| 日韩免费在线观看| 在线观看免费视频综合| 国产精品99久久久久久似苏梦涵| 一区二区三区欧美在线观看| 精品精品国产高清a毛片牛牛| 色婷婷综合视频在线观看| 韩国一区二区视频| 日韩—二三区免费观看av| 成人欧美一区二区三区小说| 日韩欧美第一区| 91黄色免费版| 成人丝袜高跟foot| 极品美女销魂一区二区三区| 亚洲国产va精品久久久不卡综合| 中文字幕欧美日本乱码一线二线 | 亚洲尤物视频在线| 中文字幕一区二区三区蜜月| 精品国产一区二区在线观看| 777xxx欧美| 欧美性色黄大片手机版| 91在线小视频| 激情久久五月天| 久久超碰97中文字幕| 日本成人在线看| 午夜精品成人在线| 亚洲国产综合人成综合网站| 亚洲精品中文在线| 国产精品久久777777| 久久99精品久久久久久| 美女一区二区在线观看| 午夜精品久久久久久久久久久 | 美女网站色91| 午夜精品久久久久久久久| 亚洲综合色自拍一区| 亚洲欧美国产三级| 亚洲黄色av一区| 一区二区三区毛片|