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

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

?? ccir.c

?? WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*

  Copyright(c) 1998,1999 SIC/Hitachi,Ltd.

	Module Name:

		ccir.c

	Revision History:

		26th April 1999		Released

*/
#include <windows.h>
#include <types.h>
#include <memory.h>
#include <serhw.h>
#include <hw16550.h>
#include <serdbg.h>
#include <excpt.h>
#include "ccir.h"

#include "cc.h"
#include "macros.h"
//#include "shx.h"
//#include "mobytel.h"

#ifdef TARGET_NT
#include <devemul.h>
#include <ser_emul.h>
#define try __try
#define except __except
#endif

#define INB(pInfo, reg) (READ_REGISTER_USHORT((pInfo)->reg) & 0x00FF)
#define OUTB(pInfo, reg, value) (WRITE_REGISTER_USHORT(((pInfo)->reg), (value) & 0x00FF))

BOOL CCIR_SetByteSize(PVOID pHead, ULONG ByteSize);
BOOL CCIR_SetStopBits(PVOID pHead, ULONG StopBits);
BOOL CCIR_SetParity(PVOID pHead, ULONG Parity);
				  
#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION 

//
// Reading the LSR clears most of its bits.  So, we provide this wrapper,
// which reads the register, records any interesting values, and
// stores the current LSR contents in the shadow register.
//
__inline
VOID
ReadLSR(
    PSER16550_INFO  pHWHead
    )
{
    ULONG LineEvents = 0;
    
    try
    {
        pHWHead->LSR = INB(pHWHead, pLSR);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        pHWHead->LSR = SERIAL_LSR_THRE;
    }

    if ( pHWHead->LSR & (SERIAL_LSR_OE | SERIAL_LSR_PE | SERIAL_LSR_FE))
    {
        // Note: Its not wise to do debug msgs in here since they will
        // pretty much guarantee that the FIFO gets overrun.
        if ( pHWHead->LSR & SERIAL_LSR_OE )
        {
            //DEBUGMSG (ZONE_WARN, (TEXT("Overrun\r\n")));
            pHWHead->DroppedBytes++;
            pHWHead->CommErrors |= CE_OVERRUN;
        }

        if ( pHWHead->LSR & SERIAL_LSR_PE )
        {
            //DEBUGMSG (ZONE_WARN, (TEXT("parity\r\n")));
            pHWHead->CommErrors |= CE_RXPARITY;
        }

        if ( pHWHead->LSR & SERIAL_LSR_FE )
        {
            //DEBUGMSG (ZONE_WARN, (TEXT("frame\r\n")));
            pHWHead->CommErrors |= CE_FRAME;
        }

        LineEvents |= EV_ERR;
    }

    if( pHWHead->LSR & SERIAL_LSR_BI )
	{
		//DEBUGMSG (ZONE_WARN, (TEXT("break\r\n")));
		LineEvents |= EV_BREAK;
	}
    
     // Let WaitCommEvent know about this error
    if( LineEvents )
        pHWHead->EventCallback( pHWHead->pMddHead, LineEvents );
}

//
// Reading the MSR clears many of its bits.  So, we provide this wrapper,
// which reads the register, records any interesting values, and
// stores the current MSR contents in the shadow register.
// Note that we always have DDCD and DCTS enabled, so if someone
// wants to keep an eye on these lines, its OK to simply read the
// shadow register, since if the value changes, the interrupt
// will cause the shadow to be updated.
//
__inline
VOID
ReadMSR(
    PSER16550_INFO  pHWHead
    )
{
    ULONG		Events = 0;
    UCHAR       msr;
    
    try
    {
        msr = INB(pHWHead, pMSR);
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        msr = 0;
    }
    
    // Save the MSR value in a shadow
    pHWHead->MSR = msr;

    // For changes, we use callback to evaluate the event
    if (msr & SERIAL_MSR_DCTS)
        Events |= EV_CTS;

    if( msr & SERIAL_MSR_DDSR )
        Events |= EV_DSR;

    if ( msr & SERIAL_MSR_RI )
        Events |= EV_RING;

    if ( msr & SERIAL_MSR_DDCD )
        Events |= EV_RLSD;

    if( Events )
        pHWHead->EventCallback( pHWHead->pMddHead, Events );
}

#ifdef DEBUG
//
// This routine is used only for debugging, and performs a formatted
// ascii dump of the various UART registers.
//
VOID
CCIR_DumpSerialRegisters(
    PVOID  pHead
    )
{
    UINT8 byte;
    PSER16550_INFO   pHWHead   = (PSER16550_INFO)pHead;

    
    try
    {
        ReadLSR( pHWHead );
        byte = pHWHead->LSR;
        
        NKDbgPrintfW(TEXT("16550 lsr: \t%2.2X\t"), byte);
        if( byte & SERIAL_LSR_DR )
            NKDbgPrintfW(TEXT("DataReady "));
        if( byte & SERIAL_LSR_OE )
            NKDbgPrintfW(TEXT("OverRun "));
        if( byte & SERIAL_LSR_PE )
            NKDbgPrintfW(TEXT("ParityErr "));
        if( byte & SERIAL_LSR_FE )
            NKDbgPrintfW(TEXT("FramingErr "));
        if( byte & SERIAL_LSR_BI )
            NKDbgPrintfW(TEXT("BreakIntpt "));
        if( byte & SERIAL_LSR_THRE )
            NKDbgPrintfW(TEXT("THREmpty "));
        if( byte & SERIAL_LSR_TEMT )
            NKDbgPrintfW(TEXT("TXEmpty "));
        if( byte & SERIAL_LSR_FIFOERR )
            NKDbgPrintfW(TEXT("FIFOErr "));
        NKDbgPrintfW(TEXT("\r\n"));

        byte = INB(pHWHead, pIER);
        NKDbgPrintfW(TEXT("16550 IER: \t%2.2X\t"), byte);
        if( byte & SERIAL_IER_RDA )
            NKDbgPrintfW(TEXT("RXData "));
        if( byte & SERIAL_IER_THR )
            NKDbgPrintfW(TEXT("TXData "));
        if( byte & SERIAL_IER_RLS )
            NKDbgPrintfW(TEXT("RXErr "));
        if( byte & SERIAL_IER_MS )
            NKDbgPrintfW(TEXT("ModemStatus "));
        NKDbgPrintfW(TEXT("\r\n"));
      
        byte = INB(pHWHead, pLCR);
        NKDbgPrintfW(TEXT("16550 lcr: \t%2.2X\t"), byte);

        NKDbgPrintfW(TEXT("%dBPC "), ((byte & 0x03)+5) );
        
        if( byte & SERIAL_LCR_DLAB )
            NKDbgPrintfW(TEXT("DLAB "));
        if( byte & SERIAL_LCR_DLAB )
            NKDbgPrintfW(TEXT("Break "));
        NKDbgPrintfW(TEXT("\r\n"));
    
        byte = INB(pHWHead, pMCR);
        NKDbgPrintfW(TEXT("16550 mcr: \t%2.2X\t"), byte);
        if( byte & SERIAL_MCR_DTR )
            NKDbgPrintfW(TEXT("DTR "));
        if( byte & SERIAL_MCR_RTS )
            NKDbgPrintfW(TEXT("RTS "));
        if( byte & SERIAL_MCR_OUT1 )
            NKDbgPrintfW(TEXT("OUT1 "));
        if( byte & SERIAL_MCR_OUT2 )
            NKDbgPrintfW(TEXT("OUT2 "));
        if( byte & SERIAL_MCR_LOOP )
            NKDbgPrintfW(TEXT("LOOP "));
        NKDbgPrintfW(TEXT("\r\n"));

        ReadMSR( pHWHead );
        byte = pHWHead->MSR;
        NKDbgPrintfW(TEXT("16550 msr: \t%2.2X\t"), byte);
        if( byte & SERIAL_MSR_DCTS )
            NKDbgPrintfW(TEXT("DCTS "));
        if( byte & SERIAL_MSR_DDSR )
            NKDbgPrintfW(TEXT("DDSR "));
        if( byte & SERIAL_MSR_TERI )
            NKDbgPrintfW(TEXT("TERI "));
        if( byte & SERIAL_MSR_DDCD )
            NKDbgPrintfW(TEXT("DDCD"));
        if( byte & SERIAL_MSR_CTS )
            NKDbgPrintfW(TEXT(" CTS"));
        if( byte & SERIAL_MSR_DSR )
            NKDbgPrintfW(TEXT("DSR "));
        if( byte & SERIAL_MSR_RI )
            NKDbgPrintfW(TEXT("RI "));
        if( byte & SERIAL_MSR_DCD )
            NKDbgPrintfW(TEXT("DCD "));
        NKDbgPrintfW(TEXT("\r\n"));

    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Nothing much to clean up here.
    }
}
#endif // DEBUG
//
// Helper routine to search through a lookup table for a designated
// key.
//
ULONG
CCIR_LookUpValue(
    ULONG	Key,
    PLOOKUP_TBL pTbl,
    PULONG	pErrorCode
    )
{
    ULONG   index = 0;

    *pErrorCode = 0;

    while ( index < pTbl->Size )
	{
        if ( Key == pTbl->Table[index].Key )
            return pTbl->Table[index].AssociatedValue;

        ++index;
	}

    *pErrorCode = (ULONG)-1;

    return 0;
}

#define BAUD_TABLE_SIZE 23
static const
PAIRS	LS_BaudPairs[BAUD_TABLE_SIZE] =	{
    {50,	    2307},
    {75,	    1538},
    {110,	    1049},
    {135,	    858},
    {150,	    769},
    {300,	    384},
    {600,	    192},
    {1200,	    96},
    {1800,	    64},
    {2000,	    58},
    {2400,	    48},
    {3600,	    32},
    {4800,	    24},
    {7200,	    16},
    {9600,	    12},
    {12800,	    9},
    {14400,	    8},
    {19200,     6},
    {23040,     5},
    {28800,     4},
    {38400,     3},
    {57600,     2},
    {115200,    1}
};

static const
LOOKUP_TBL  LS_BaudTable = {BAUD_TABLE_SIZE, (PAIRS *) LS_BaudPairs};

//
// Helper function.  Pass in a baudrate, and the corresponding divisor
// (from the baudtable) is returned.  If no matching baudrate is found
// in baudtable, then return 0.
//
USHORT
CCIR_DivisorOfRate(
    PVOID   pHead,      // @parm PVOID returned by HWinit.
    ULONG   BaudRate	// @parm     ULONG representing decimal baud rate.    
    )
{
    ULONG   errorcode = 0;
    USHORT  divisor;    

    divisor = (USHORT)CCIR_LookUpValue(BaudRate,
                                  ((PSER16550_INFO) pHead)->pBaudTable, &errorcode);

    if ( errorcode )
        divisor = 0;

    return divisor;
}

//
// This is a reverse lookup table which can be used to determine
// the FIFO trigger level from the 2 bit value stored in the FCR
//
#define HIGH_WATER_SIZE     4
static const
PAIRS	HighWaterPairs[HIGH_WATER_SIZE] = {
    {SERIAL_1_BYTE_HIGH_WATER, 0},
    {SERIAL_4_BYTE_HIGH_WATER, 4},
    {SERIAL_8_BYTE_HIGH_WATER, 8},
    {SERIAL_14_BYTE_HIGH_WATER, 14}
};
static const
LOOKUP_TBL  HighWaterTable = {HIGH_WATER_SIZE, (PAIRS *) HighWaterPairs};

#define IER_NORMAL_INTS (SERIAL_IER_RDA | SERIAL_IER_RLS | SERIAL_IER_MS)

//
/////////////////// Start of exported entrypoints ////////////////
//

//
// @doc OEM 
// @func PVOID | CCIR_Open | Configures 16550 for default behaviour.
//
VOID
CCIR_Open(
    PVOID   pHead // @parm PVOID returned by HWinit.
    )
{
    PSER16550_INFO pHWHead = (PSER16550_INFO)pHead;

    DEBUGMSG (ZONE_OPEN,
              (TEXT("+CCIR_Open 0x%X\r\n"), pHead));

     // If the device is already open, all we do is increment count
    if( pHWHead->OpenCount++ )
    {
        DEBUGMSG (ZONE_OPEN,
                  (TEXT("-CCIR_Open 0x%X (%d opens)\r\n"),
                   pHead, pHWHead->OpenCount));
        return ;
    }
    
    pHWHead->FCR = 0;
    pHWHead->IER = 0;
    pHWHead->IIR = 0;
    pHWHead->LSR = 0;
    pHWHead->MSR = 0;
    pHWHead->DroppedBytes = 0;
    pHWHead->CTSFlowOff = FALSE;  // Not flowed off yet
    pHWHead->DSRFlowOff = FALSE;  // Not flowed off yet
    pHWHead->CommErrors   = 0;
    pHWHead->ModemStatus  = 0;

    try
    {
#ifdef NOTDEF        
         // Enable all interrupts, then disable THR. Note IRQ enable in MCR.
         // Enable THR in PutBytes.
        *pHWHead->pIER = (UCHAR)(SERIAL_IER_RDA | SERIAL_IER_THR |
                                 SERIAL_IER_RLS | SERIAL_IER_MS);
        *pHWHead->pIER &= ~SERIAL_IER_THR;
#else
        OUTB(pHWHead, pIER, (UCHAR)IER_NORMAL_INTS|SERIAL_IER_THR);
        OUTB(pHWHead, pIER, (UCHAR)IER_NORMAL_INTS);
#endif        
        OUTB(pHWHead, pMCR, SERIAL_MCR_IRQ_ENABLE);

         // Set default framing bits.
        OUTB(pHWHead, pLCR, SERIAL_8_DATA | SERIAL_1_STOP | SERIAL_NONE_PARITY);

    
        DEBUGMSG (ZONE_OPEN,
                  (TEXT("CCIR_Open Setting DCB parameters\r\n")));

         // Get defaults from the DCB structure
        CCIR_SetBaudRate( pHead, pHWHead->dcb.BaudRate );
        CCIR_SetByteSize( pHead, pHWHead->dcb.ByteSize );
        CCIR_SetStopBits( pHead, pHWHead->dcb.StopBits );
        CCIR_SetParity(   pHead, pHWHead->dcb.Parity );

        //
        // A 16450 (which is pretty much a FIFO-less 16550) can be supported by
        // not initializing the FIFO.
        //
        if (pHWHead->ChipID == CHIP_ID_16550) {
             // Set up to use 16550 fifo for 14 byte interrupt granularity.
             // Shadow the FCR bitmask since reading this location is the IIR.
			 // NOTE: to minimize overruns, trigger RX INT on 1 byte in FIFO
            pHWHead->FCR = SERIAL_FCR_ENABLE | SERIAL_1_BYTE_HIGH_WATER |
                SERIAL_FCR_RCVR_RESET | SERIAL_FCR_TXMT_RESET;
            OUTB(pHWHead, pIIR_FCR, pHWHead->FCR);

            pHWHead->IIR = INB(pHWHead, pIIR_FCR);  // Update IIR shadow
        }
        
#ifdef DEBUG
        if( ZONE_INIT )
            CCIR_DumpSerialRegisters(pHWHead);
#endif
    }
    except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
            EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
        // Just get out of here.
    }
    
    DEBUGMSG (ZONE_OPEN,
              (TEXT("-CCIR_Open 0x%X\r\n"), pHead));
}

//
// @doc OEM 
// @func PVOID | CCIR_Close | Does nothing except keep track of the
// open count so that other routines know what to do.
//
VOID

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一区二区不卡| 日本精品视频一区二区| www国产亚洲精品久久麻豆| 精品在线你懂的| 久久品道一品道久久精品| 国产精品综合网| 中文字幕国产精品一区二区| 99国产精品99久久久久久| 亚洲欧美日韩国产中文在线| 欧美日韩日日骚| 麻豆国产欧美一区二区三区| 久久看人人爽人人| 91色九色蝌蚪| 丝袜美腿一区二区三区| 精品国产乱码久久久久久1区2区 | 91福利在线导航| 午夜亚洲国产au精品一区二区| 欧美一区二区在线看| 国模娜娜一区二区三区| 亚洲日本中文字幕区| 欧美久久一区二区| 国产精品一区二区不卡| 一区二区三区精品视频| 日韩欧美一级片| 99精品国产热久久91蜜凸| 日韩激情一区二区| 国产精品嫩草影院av蜜臀| 欧美日韩aaa| 成人av电影在线网| 日产欧产美韩系列久久99| 国产精品美日韩| 欧美乱熟臀69xxxxxx| 成人免费视频视频| 青青草视频一区| 中文字幕一区视频| 日韩精品一区二区三区四区视频| 91在线porny国产在线看| 精品一区二区三区免费毛片爱| 亚洲国产成人午夜在线一区| 91精品国模一区二区三区| 99久久婷婷国产| 国产裸体歌舞团一区二区| 亚洲国产精品视频| 亚洲欧洲av色图| 久久夜色精品国产欧美乱极品| 91麻豆产精品久久久久久| 在线视频国产一区| 成人午夜av在线| 精品在线免费视频| 免费在线成人网| 亚洲成人资源网| 亚洲视频资源在线| 国产日韩精品一区二区三区在线| 欧美一区二区三区在线观看| 在线亚洲人成电影网站色www| 国产91丝袜在线观看| 久久99精品国产麻豆婷婷| 日韩精品福利网| 午夜精品国产更新| 洋洋av久久久久久久一区| 国产精品九色蝌蚪自拍| 国产欧美精品一区二区色综合朱莉| 欧美精品丝袜中出| 欧美日韩视频专区在线播放| 91网站在线观看视频| jlzzjlzz亚洲日本少妇| 粉嫩aⅴ一区二区三区四区| 国产专区欧美精品| 国产自产v一区二区三区c| 精品伊人久久久久7777人| 欧美aⅴ一区二区三区视频| 亚洲成a人片综合在线| 亚洲国产成人av网| 五月综合激情网| 亚洲不卡在线观看| 午夜精品久久久久久久久久 | 视频一区视频二区在线观看| 一区二区免费在线播放| 一区二区三区精品久久久| 亚洲最大成人综合| 五月婷婷欧美视频| 日韩精品久久理论片| 久久精品国产999大香线蕉| 蜜桃精品视频在线| 国产真实乱偷精品视频免| 国产福利91精品一区二区三区| 国产精品1区2区3区| 国产一区二区美女| 国产激情一区二区三区四区| 国产高清无密码一区二区三区| 国产成人在线视频播放| 99精品久久99久久久久| 欧美在线制服丝袜| 欧美日韩精品一区二区| 91精品国产综合久久久久久| 欧美电视剧在线看免费| 国产日本欧洲亚洲| 亚洲摸摸操操av| 日韩av中文字幕一区二区| 国产电影一区在线| 99久久精品国产一区| 欧美午夜视频网站| 久久这里只有精品首页| 亚洲区小说区图片区qvod| 天堂成人国产精品一区| 国产成人午夜视频| 色婷婷综合激情| 亚洲精品在线免费观看视频| 中文字幕欧美国产| 性做久久久久久久免费看| 国产精品一区久久久久| 色综合久久综合网97色综合| 日韩一级黄色片| 中文字幕欧美一| 日韩电影在线免费观看| www.欧美亚洲| 欧美成人性战久久| 亚洲人成影院在线观看| 美女被吸乳得到大胸91| 一本一道波多野结衣一区二区| 欧美xxxxxxxx| 一区二区三区产品免费精品久久75| 久久国产欧美日韩精品| 91同城在线观看| 精品国产一区二区三区久久久蜜月 | 91小视频在线免费看| 欧美成人精品高清在线播放 | 欧美国产一区在线| 日韩精品国产欧美| 99精品久久99久久久久| 精品999在线播放| 亚洲成人tv网| 91丨国产丨九色丨pron| 精品久久久久久久久久久院品网| 亚洲精品成a人| 成人性生交大片免费看中文 | 欧美日韩色一区| 国产精品国产三级国产专播品爱网 | 久久久久久久久久久久久夜| 亚洲成av人片一区二区三区| 99久久精品国产导航| 久久精品欧美日韩精品| 男女视频一区二区| 欧美日韩亚洲综合| 亚洲精品免费在线观看| 成人精品视频一区二区三区尤物| 欧美大尺度电影在线| 丝瓜av网站精品一区二区| 一本色道久久综合亚洲91 | 成人欧美一区二区三区视频网页 | 日本在线不卡视频一二三区| 99久久精品99国产精品 | 亚洲国产精品视频| 91蜜桃免费观看视频| 欧美国产在线观看| 国产精品一区二区久久不卡 | 免费av网站大全久久| 欧美日韩卡一卡二| 亚洲永久免费视频| 91丝袜呻吟高潮美腿白嫩在线观看| 国产精品乱人伦一区二区| 国产一区二区三区蝌蚪| 精品国产麻豆免费人成网站| 蜜臀av一级做a爰片久久| 日韩免费在线观看| 久久国产成人午夜av影院| 日韩一区二区三区免费看| 麻豆视频一区二区| 欧美一级片在线| 蜜臀久久久久久久| 日韩女优毛片在线| 国产在线精品免费av| 久久久青草青青国产亚洲免观| 激情久久五月天| 国产午夜精品久久| 成人国产精品免费网站| 亚洲婷婷国产精品电影人久久| 色狠狠色狠狠综合| 亚洲午夜免费福利视频| 337p亚洲精品色噜噜狠狠| 免费欧美在线视频| 精品国产乱码久久久久久蜜臀| 国产成人av资源| 中文字幕亚洲在| 在线一区二区三区四区| 日韩激情视频网站| 精品国产91亚洲一区二区三区婷婷 | 亚洲国产精品一区二区www| 7777精品伊人久久久大香线蕉的 | 欧美日韩精品福利| 日韩av一二三| 欧美高清在线视频| 色综合久久99| 麻豆精品久久久| 国产精品入口麻豆原神| 欧美中文字幕一区| 紧缚奴在线一区二区三区| 国产精品毛片高清在线完整版| 在线免费观看不卡av| 精品一区二区精品|