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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? uarthw_evmdm642.c.bak

?? DM642支持4個(gè)串口的驅(qū)動(dòng)代碼
?? BAK
字號(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)" */
/*
 *  ======== 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>

#include 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)           (LSRREG(regset))
#define getModemControlReg(regset)      (MCRREG(regset))
#define setModemControlReg(regset, c)   MCRREG(regset) = (c)
#define getLineControlReg(regset)       (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)                  (IIRREG(regset) & 0x3f)
#else
#define getInt(regset)                  (IIRREG(regset) & 0x0f)
#endif /* _DEBUG */

#define NUMPORTS                        2
#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 Byte 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}
};
#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);
    }

    /* 
     * 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) = 
    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 = 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 = 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 (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 = 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 = 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 = 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)) {
                        RBRREG(port->regs);
                        argval = 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 (LSRREG(regs) & UART_LSR_DATAIN);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人永久免费视频| 成人18视频在线播放| 国产精品二三区| 欧美一区二区三区在| 成人a免费在线看| 久久99精品一区二区三区| 亚洲男人的天堂在线观看| 欧美电视剧在线观看完整版| 色诱亚洲精品久久久久久| 国产成人亚洲综合色影视| 美女视频黄 久久| 亚洲一区二区不卡免费| 自拍偷拍亚洲激情| 久久美女艺术照精彩视频福利播放| 欧美日韩日日骚| 99在线热播精品免费| 国产精品一区二区久久精品爱涩| 午夜精品影院在线观看| 亚洲女人的天堂| 欧美国产精品久久| 久久先锋影音av鲁色资源| 欧美日本一区二区三区| 在线亚洲免费视频| 91美女片黄在线观看| 波多野结衣中文字幕一区| 国产成人在线视频免费播放| 欧美无砖砖区免费| 99久久er热在这里只有精品15| 久久国产精品99久久久久久老狼| 日韩精品一级中文字幕精品视频免费观看 | 婷婷综合久久一区二区三区| 国产精品超碰97尤物18| 日本一区二区不卡视频| 欧美精品一区二区三区四区| 欧美大片在线观看| 日韩一区和二区| 欧美一级免费大片| 欧美成人精品3d动漫h| 欧美电影免费观看高清完整版在线 | 一区二区视频在线| 亚洲品质自拍视频| 一区二区三区91| 亚洲电影视频在线| 日韩国产欧美在线观看| 日韩精品五月天| 日日夜夜免费精品视频| 蜜桃视频一区二区三区在线观看| 日本不卡一区二区三区| 免费精品视频在线| 国产一区二区三区美女| 国产成人av一区二区三区在线| 国产福利精品导航| 成人久久18免费网站麻豆 | 成人国产精品免费网站| 成人福利视频网站| 91色porny蝌蚪| 欧美性欧美巨大黑白大战| 欧美日韩国产中文| 精品久久久久一区二区国产| 久久婷婷国产综合国色天香| 欧美激情一区不卡| 亚洲一区电影777| 蜜乳av一区二区| 国产精品一二三区在线| 99在线精品观看| 91麻豆精品91久久久久同性| 久久久亚洲精华液精华液精华液| 日本一区二区久久| 一区二区在线观看免费| 久久不见久久见免费视频7| 国产99久久久久久免费看农村| 99精品久久只有精品| 欧美狂野另类xxxxoooo| 久久久久国色av免费看影院| 亚洲精品videosex极品| 琪琪一区二区三区| 成人一区在线看| 欧美性高清videossexo| 久久蜜桃av一区精品变态类天堂 | 精品久久久久一区二区国产| 自拍偷拍欧美精品| 日韩国产在线观看| 99在线精品一区二区三区| 欧美久久久久久蜜桃| 久久久www免费人成精品| av午夜精品一区二区三区| 欧美老人xxxx18| 亚洲国产经典视频| 日韩在线a电影| 成人精品高清在线| 91精品国产综合久久香蕉麻豆| 国产网红主播福利一区二区| 亚洲国产精品一区二区尤物区| 国产在线播放一区| 在线不卡免费av| 成人欧美一区二区三区视频网页| 日本中文字幕一区二区视频| 91免费视频观看| 久久久国产精华| 免费在线观看不卡| 欧美日韩一区二区三区在线看| 国产欧美一区二区在线观看| 日韩中文字幕av电影| av一本久道久久综合久久鬼色| 日韩欧美国产一区二区在线播放| 亚洲精品中文在线观看| 国产风韵犹存在线视精品| 欧美美女bb生活片| 亚洲婷婷综合久久一本伊一区| 久久精品免费观看| 欧美美女一区二区在线观看| 亚洲欧美日本韩国| 成人的网站免费观看| 久久欧美中文字幕| 另类欧美日韩国产在线| 欧美日本免费一区二区三区| 亚洲欧美经典视频| av电影在线观看一区| 国产日韩欧美精品综合| 国产一区二区三区最好精华液| 欧美一区二区三区在线| 亚洲国产日韩av| 色88888久久久久久影院按摩| 中文字幕av一区 二区| 国产精品一区二区在线播放| 亚洲精品在线观| 国产在线精品视频| 亚洲精品一区二区三区影院| 欧美bbbbb| 精品国产污网站| 久久狠狠亚洲综合| 欧美大尺度电影在线| 日本不卡视频在线观看| 日韩欧美国产综合| 九色porny丨国产精品| 日韩欧美在线网站| 美女脱光内衣内裤视频久久影院| 日韩小视频在线观看专区| 蜜臀av性久久久久蜜臀av麻豆| 6080亚洲精品一区二区| 日韩**一区毛片| 日韩精品一区二区三区老鸭窝 | 日本久久一区二区三区| 亚洲欧美日本在线| 在线视频欧美精品| 日韩精品91亚洲二区在线观看| 欧美一级一区二区| 国产一区二区在线看| 国产亲近乱来精品视频| 成人精品国产免费网站| 亚洲精品大片www| 欧美日韩一本到| 麻豆一区二区三| 国产夜色精品一区二区av| 99视频一区二区| 亚洲综合在线第一页| 69av一区二区三区| 国产一区久久久| 亚洲欧美国产三级| 欧美一区二区视频观看视频 | 欧美精品一卡二卡| 免费久久99精品国产| 亚洲国产成人自拍| 色哟哟日韩精品| 日韩成人精品视频| 中文天堂在线一区| 欧美日韩你懂得| 国产寡妇亲子伦一区二区| 亚洲美女区一区| 3d成人动漫网站| 国产超碰在线一区| 亚洲第一电影网| 久久久国际精品| 欧美日本视频在线| 成人毛片视频在线观看| 午夜精品在线看| 国产精品欧美一级免费| 7777精品伊人久久久大香线蕉完整版 | 午夜精品久久久久| 国产性做久久久久久| 欧美性生交片4| 国产东北露脸精品视频| 亚洲国产成人91porn| 久久久久久久久久电影| 欧洲精品一区二区三区在线观看| 久久精品av麻豆的观看方式| 亚洲欧美日韩在线| 精品1区2区在线观看| 欧美午夜电影在线播放| 国产传媒日韩欧美成人| 午夜电影网亚洲视频| 国产精品区一区二区三区| 欧美一级精品在线| 91高清在线观看| 成人午夜电影久久影院| 奇米四色…亚洲| 一区二区三区 在线观看视频| 国产人成亚洲第一网站在线播放| 欧美性大战久久久久久久| 不卡欧美aaaaa|