亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产精品视频你懂的| 国产一区高清在线| 精品一区精品二区高清| av色综合久久天堂av综合| 欧美一区二区观看视频| 最新欧美精品一区二区三区| 国产一区二区导航在线播放| 欧美亚洲动漫制服丝袜| 18涩涩午夜精品.www| 国内精品不卡在线| 91精品国产一区二区三区香蕉 | **欧美大码日韩| 精东粉嫩av免费一区二区三区| 欧美日韩综合在线| 亚洲精品视频免费看| 福利电影一区二区| 久久久久久久久久久黄色| 蜜臀va亚洲va欧美va天堂| 欧美性色黄大片| 亚洲欧洲制服丝袜| 色综合中文字幕| 亚洲女人小视频在线观看| www.激情成人| ...av二区三区久久精品| 成人免费黄色在线| 国产精品国产自产拍高清av| 成人自拍视频在线| 国产精品久久久久久久久晋中 | 国产盗摄一区二区三区| 久久综合久久鬼色| 国产高清精品在线| 中文字幕精品一区二区三区精品| 国产精品一品二品| 国产精品―色哟哟| 99re视频精品| 一区二区三区四区五区视频在线观看| 99久久99久久精品免费观看| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 不卡一卡二卡三乱码免费网站| 国产精品色哟哟网站| 99久久99精品久久久久久| 亚洲精品免费看| 666欧美在线视频| 激情都市一区二区| 国产精品三级av在线播放| 91亚洲精华国产精华精华液| 最新日韩av在线| 欧美亚洲国产一区二区三区| 日韩激情一二三区| xnxx国产精品| 波多野结衣在线一区| 亚洲综合一区在线| 欧美一区二区三区视频| 国产麻豆91精品| 亚洲色图视频免费播放| 91精品国产综合久久精品性色| 久久精品国产精品亚洲红杏| 国产精品美女久久福利网站| 欧美综合欧美视频| 国产呦精品一区二区三区网站| 中文字幕av一区 二区| 色老综合老女人久久久| 日韩成人精品在线观看| 中文av一区特黄| 欧美日本在线观看| 国产精品一区二区你懂的| 一区二区三区国产豹纹内裤在线| 欧美一区国产二区| 国产aⅴ精品一区二区三区色成熟| 亚洲精品乱码久久久久久日本蜜臀| 欧美日本在线播放| 成人国产亚洲欧美成人综合网| 亚洲成人三级小说| 中文字幕免费不卡在线| 欧美日韩精品一区二区天天拍小说 | 欧美在线观看禁18| 国产精品亚洲视频| 午夜a成v人精品| 成人免费在线视频观看| 久久婷婷国产综合精品青草| 91丝袜美腿高跟国产极品老师 | av亚洲精华国产精华精华| 奇米一区二区三区av| 亚洲视频每日更新| 久久精品亚洲精品国产欧美| 欧美日韩高清一区二区| 91在线视频观看| 国产露脸91国语对白| 日韩av电影免费观看高清完整版在线观看| 亚洲国产精品黑人久久久 | 欧美撒尿777hd撒尿| 成人18精品视频| 精品中文字幕一区二区小辣椒 | 欧美日韩电影一区| 一本久久精品一区二区| www.亚洲精品| 国产毛片一区二区| 久草这里只有精品视频| 青青草97国产精品免费观看无弹窗版 | 日韩精品一区二区在线| 666欧美在线视频| 欧美精品一级二级三级| 在线看日本不卡| 在线国产电影不卡| 91日韩精品一区| 99热国产精品| 99久久精品国产毛片| 99久久99精品久久久久久| 成人高清免费观看| 国v精品久久久网| 处破女av一区二区| 成人免费毛片嘿嘿连载视频| 国产成人av影院| 成人免费毛片a| a亚洲天堂av| 91日韩精品一区| 欧美色中文字幕| 欧美精品日韩精品| 欧美一区二区三区在线观看视频| 在线播放日韩导航| 欧美一级在线观看| 久久久影视传媒| 国产精品亲子伦对白| 亚洲免费电影在线| 日韩制服丝袜av| 毛片一区二区三区| 国产成人高清在线| 91首页免费视频| 欧美日韩国产乱码电影| 日韩免费一区二区| 国产日产欧产精品推荐色| 国产精品久久二区二区| 亚洲激情校园春色| 蜜桃视频一区二区三区在线观看 | 亚洲精品一线二线三线无人区| 精品国产伦一区二区三区免费| 久久久精品中文字幕麻豆发布| 国产精品家庭影院| 午夜精品福利一区二区蜜股av| 日韩电影在线免费观看| 国产福利电影一区二区三区| 99精品欧美一区| 91精品欧美一区二区三区综合在| 26uuuu精品一区二区| 亚洲欧美国产77777| 日韩激情一二三区| 成人理论电影网| 欧美一三区三区四区免费在线看| 国产视频911| 亚洲成人精品在线观看| 国产一区二区三区黄视频 | 九一久久久久久| 91在线精品一区二区| 777亚洲妇女| 国产精品久久久久久久久搜平片| 亚洲午夜久久久久久久久久久| 国产麻豆成人精品| 欧美色图一区二区三区| 国产免费成人在线视频| 日日摸夜夜添夜夜添国产精品| 国产suv一区二区三区88区| 欧美人与z0zoxxxx视频| 国产精品久久久久影院老司| 爽好久久久欧美精品| 国产成人8x视频一区二区 | 日本欧洲一区二区| 一本色道久久加勒比精品| 国产色爱av资源综合区| 日韩国产欧美视频| 欧美性猛交xxxx黑人交| 国产精品毛片a∨一区二区三区| 美女视频黄 久久| 欧美性大战xxxxx久久久| 国产精品福利av | 国产一区二区主播在线| 欧美酷刑日本凌虐凌虐| 一色桃子久久精品亚洲| 国产成人精品免费| 久久久久久久久久美女| 麻豆精品视频在线观看视频| 欧美日本在线一区| 午夜欧美视频在线观看| 在线一区二区三区四区五区| 中文在线一区二区 | 国模无码大尺度一区二区三区| 7777精品伊人久久久大香线蕉经典版下载| 亚洲卡通欧美制服中文| thepron国产精品| 国产女同性恋一区二区| 国产不卡在线播放| 国产亚洲1区2区3区| 国产精品一区一区三区| 久久久久久久综合狠狠综合| 久久99深爱久久99精品| 日韩免费在线观看| 国产综合成人久久大片91| 久久久综合网站| 成人丝袜18视频在线观看| 国产精品成人免费在线| 91色porny|