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

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

?? xrmdd.c

?? wince 5.0下 實(shí)現(xiàn)PCI8串口卡驅(qū)動(dòng)
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
////////////////////////////////////////
//(c) 2005 EXAR Corporation 
//All Rights Reserved.
//
//Exar Corporation ("Exar") hereby grants the User of this Exar 
//product-specific XR17C15x Windows CE.Net Device Driver (hereinafter 
//referred to as "Driver") a non-exclusive, nontransferable license 
//to use the Driver in accordance with the term set forth below.  
//Before using the Driver, the User should read the following use 
//restrictions.  If the User does not accept these terms, the Driver 
//should not be used or downloaded.
//The User is granted this limited license to use this Driver for 
//User's end product that includes the Exar XR17C158/XR17D158 Octal UART PCI 
//device, XR17C154/XR17D154 Quad UART PCI Device, and XR17C152/XR17D152 Dual UART 
//PCI Device and is not granted rights to sell, loan, rent, lease or 
//license the Driver, in whole or in part, or in modified form to anyone 
//other than User.  User may modify the Driver to suit its specific 
//applications but rights to derivative works and such modifications 
//shall belong to Exar.
//
//The Driver is provided on an "AS IS" basis and Exar makes absolutely 
//no warranty with respect to performance or the information contained 
//therein.  EXAR DISCLAIMS AND USER WAIVES ALL WARRANTIES, EXPRESS OR 
//IMPLIED, INCLUDING WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A 
//PARTICULAR PURPOSE.  The entire risk as to Driver quality and 
//performance is with the User.  ACCORDINGLY, IN NO EVENT SHALL EXAR 
//BE LIABLE FOR ANY DAMAGES, WHETHER IN CONTRACT OR TORT, INCLUDING 
//ANY LOST PROFITS OR OTHER INCIDENTAL, CONSEQUENTIAL, EXEMPLARY, OR 
//PUNITIVE DAMAGES ARISING OUT OF THE USE OR APPLICATION OF THE DRIVER.  
//Further, Exar reserves the right to make changes tot eh Driver without 
//notice to improve reliability, function or design.  Exar does not 
//convey any license under patent rights or any other intellectual 
//property rights, including those of third parties.
//
//Exar is not obligated to provide maintenance or support for the Driver. 
//
//////////////////////////////////////////////////////////
/*++
Module Name:  xrmdd.c

Abstract:  

This file contains the serial mdd (model device driver) code.  This is
intended to work with a series of serial pdds to implement serial
devices for the WinCE OS.  

Functions:
COM_Init
COM_Open
COM_Close
COM_Deinit
COM_Read
COM_Write
COM_Seek
COM_PowerUp
COM_PowerDown
COM_IOControl
DllEntry
SerialEventHandler
SerialDispatchThread
ApplyDCB
SerialGetDroppedByteNumber
WaitCommEvent
EvaluateEventFlag
ProcessExiting


Notes: 


--*/
#include <windows.h>
#include <types.h>
#include <memory.h>
#include <linklist.h>
#include <nkintr.h>
#include <serdbg.h>
#include <hwcomapi.h>
#include <pegdser.h>
#include <devload.h>
#include <pm.h>
#include <pkfuncs.h>


#include "xrserpriv.h"

/* Debug Zones.
 */
#ifdef DEBUG

    #define DBG_INIT    0x0001
    #define DBG_OPEN    0x0002
    #define DBG_READ    0x0004
    #define DBG_WRITE   0x0008
    #define DBG_CLOSE   0x0010
    #define DBG_IOCTL   0x0020
    #define DBG_THREAD  0x0040
    #define DBG_EVENTS  0x0080
    #define DBG_CRITSEC 0x0100
    #define DBG_FLOW    0x0200
    #define DBG_IR      0x0400
    #define DBG_NOTHING 0x0800
    #define DBG_ALLOC   0x1000
    #define DBG_FUNCTION 0x2000
    #define DBG_WARNING 0x4000
    #define DBG_ERROR   0x8000

DBGPARAM dpCurSettings = {
    TEXT("Serial"), {
        TEXT("Init"),TEXT("Open"),TEXT("Read"),TEXT("Write"),
        TEXT("Close"),TEXT("Ioctl"),TEXT("Thread"),TEXT("Events"),
        TEXT("CritSec"),TEXT("FlowCtrl"),TEXT("Infrared"),TEXT("User Read"),
        TEXT("Alloc"),TEXT("Function"),TEXT("Warning"),TEXT("Error")},
    0
}; 
#endif

#ifndef MIN
    #define MIN(x,y)		((x) < (y) ? (x) : (y))
#endif

//
// Macros to maintain a usage count for a particular serial structure,
// so that we know when it is safe to deallocate it.
//
#define COM_INC_USAGE_CNT(pOpenHead)  \
    InterlockedIncrement(&pOpenHead->StructUsers)

#define COM_DEC_USAGE_CNT(pOpenHead)  \
    InterlockedDecrement(&pOpenHead->StructUsers)

// Define some internally used functions
BOOL COM_Close(PHW_OPEN_INFO    pOpenHead);
BOOL COM_Deinit(PHW_INDEP_INFO pSerialHead);
VOID EvaluateEventFlag(PVOID pHead, ULONG fdwEventMask);

/*
 @doc INTERNAL
 @func	BOOL | DllEntry | Process attach/detach api.
 *
 @rdesc The return is a BOOL, representing success (TRUE) or failure (FALSE).
 */
BOOL
DllEntry(
              HINSTANCE   hinstDll,             /*@parm Instance pointer. */
              DWORD   dwReason,                 /*@parm Reason routine is called. */
              LPVOID  lpReserved                /*@parm system parameter. */
              )
{
    if ( dwReason == DLL_PROCESS_ATTACH ) {
        DEBUGREGISTER(hinstDll);
        DEBUGMSG (ZONE_INIT, (TEXT("serial port process attach\r\n")));
	DisableThreadLibraryCalls((HMODULE) hinstDll);
    }

    if ( dwReason == DLL_PROCESS_DETACH ) {
        DEBUGMSG (ZONE_INIT, (TEXT("process detach called\r\n")));
    }

    return(TRUE);
}

/*
 @doc INTERNAL
 @func	VOID | DoTxData | Sends next available chunk of TX data.
 *
 */
VOID
DoTxData( PHW_INDEP_INFO pSerialHead )
{
    PHW_VTBL            pFuncTbl = pSerialHead->pHWObj->pFuncTbl;
    PVOID               pHWHead = pSerialHead->pHWHead;
    ULONG               Len;



    DEBUGMSG (ZONE_WRITE, (TEXT("DoPutBytes wait for CritSec %x.\r\n"),
                           &(pSerialHead->TxBufferInfo.CS)));
    TxEnterCS(pSerialHead);
    DEBUGMSG (ZONE_WRITE, (TEXT("DoPutBytes got CritSec %x.\r\n"),
                           &(pSerialHead->TxBufferInfo.CS)));

    // If device was closed from under us, stop transmitting
    if ( !pSerialHead->OpenCnt ) {
        DEBUGMSG (ZONE_THREAD|ZONE_WRITE , (TEXT("Device closed! Quit transmission!\r\n")));
        DEBUGMSG (ZONE_WRITE,
                  (TEXT("SerialEventHandler: %d sent up-to-now.\n\r"),pSerialHead->TxBytesSent));
        pSerialHead->TxBufferInfo.Permissions = 0;
        pSerialHead->TxBufferInfo.TxCharBuffer = NULL;
        pSerialHead->TxBufferInfo.Length = 0;
        TxRead(pSerialHead) = 0;
    }

    // Check the flow control status, and if not flowed off, call the
    // hw TX routine to actually transmit some data.
    if ( pSerialHead->TxBufferInfo.TxCharBuffer && TxBytesAvail(pSerialHead) ) {
        DWORD oldPerm = SetProcPermissions(pSerialHead->TxBufferInfo.Permissions);

        if ( pSerialHead->DCB.fRtsControl == RTS_CONTROL_TOGGLE ) {
            DEBUGMSG (ZONE_THREAD|ZONE_WRITE , (TEXT("RTS set.\r\n")));
            pFuncTbl->HWSetRTS(pHWHead);
        }

        // Don't transmit anything if we are flowed off.
        if ( pSerialHead->StopXmit ) {
            // But we still need to call TxIntrHandler so that the interrupt
            // gets cleared.
            DEBUGMSG (ZONE_FLOW|ZONE_WRITE , (TEXT("XOFF'ed, send nothing.\r\n")));
            Len = 0;
        } else {
            DEBUGMSG (ZONE_WRITE,
                      (TEXT("TxRead = %d, TxLength = %d, TxBytesAvail = %d.\r\n"),
                       TxRead(pSerialHead), TxLength(pSerialHead),
                       TxBytesAvail(pSerialHead)));
            Len = TxBytesAvail(pSerialHead);
        }
        DEBUGMSG (ZONE_WRITE, (TEXT("About to copy %d bytes\r\n"), Len));
        pFuncTbl->HWTxIntrHandler(pHWHead,
                                  TxBuffRead(pSerialHead),
                                  &Len);
        DEBUGMSG (ZONE_WRITE, (TEXT("%d bytes actually copied.\r\n"), Len));
        // Update Fifo info
        pSerialHead->TxBytes += Len;
        pSerialHead->TxBytesSent += Len;
        TxRead(pSerialHead) += Len;

        // Even if everything was Tx'ed, don't signal TX complete until
        // we get transmit interrupt indicating that the data has
        // actually been sent.  Since few/no UARTS have a way to tell
        // how much data remains, we don't bother trying to adjust the
        // return length to account for partially completed hardware buffer TX
        SetProcPermissions(oldPerm);
    } else {
        // Even if there is nothing left to send, we need to call
        // the interrupt handler so that it can clear the
        // transmit interrupt
        Len = 0;
        pFuncTbl->HWTxIntrHandler(pHWHead,
                                  NULL,
                                  &Len);        
        DEBUGMSG (ZONE_WRITE, (TEXT("Transmission complete, %d bytes sent\r\n"), Len));
        pSerialHead->TxBufferInfo.Permissions = 0;
        pSerialHead->TxBufferInfo.TxCharBuffer = NULL;
        pSerialHead->TxBufferInfo.Length = 0;
        TxRead(pSerialHead) = 0;
        SetEvent(pSerialHead->hTransmitEvent);
    }

    TxLeaveCS(pSerialHead);
    DEBUGMSG (ZONE_WRITE|ZONE_FUNCTION,
              (TEXT("DoPutBytes released CritSec: %x.\r\n"),
               &(pSerialHead->TxBufferInfo.CS)));

}

VOID
SerialEventHandler(PHW_INDEP_INFO       pSerialHead)
{
    PHW_VTBL            pFuncTbl = pSerialHead->pHWObj->pFuncTbl;
    PVOID               pHWHead = pSerialHead->pHWHead;
    ULONG               CharIndex;
    ULONG               RoomLeft = 0;
    ULONG               TotalLeft = 0;
    INTERRUPT_TYPE      it = INTR_NONE;
    BOOL                RxDataAvail = FALSE;

    DEBUGMSG (ZONE_THREAD, (TEXT("+SerialEventHandler, pHead 0x%X\r\n"),
                            pSerialHead));

    if ( pSerialHead->KillRxThread ||
         !pSerialHead->hSerialEvent ) {
        DEBUGMSG (ZONE_THREAD, (TEXT("Exitting thread\r\n")));
        SetEvent(pSerialHead->hKillDispatchThread);
        ExitThread(0);
    }

// NOTE - This one is a little tricky.  If the only owner is a monitoring task
// then I don't have an owner for read/write, yet I might be in this routine
// due to a change in line status.  Lets just do the best we can and increment
// the count for the access owner if available.
    if ( pSerialHead->pAccessOwner )
        COM_INC_USAGE_CNT(pSerialHead->pAccessOwner);

    while ( 1 ) {

        if ( !(it = pFuncTbl->HWGetIntrType(pHWHead)) ) {
            DEBUGMSG (ZONE_THREAD,
                      (TEXT("SerialEventHandler, No Interrupt.\r\n")));
            break;
        }

        DEBUGMSG (ZONE_THREAD,
                  (TEXT("SerialEventHandler, Interrupts 0x%X\r\n"), it));
        if ( it & INTR_RX ) {
            // It's read data event. Optimize the read by reading chunks
            // if the user has not specified using xflow control
            // or event/error/eof characters. Ack the receive,
            // unmask the interrupt, get the current data pointer
            // and see if data is available.
            // Note: We have to copy RxRead and RxWrite index to local in order to make it atomic.
            register DWORD RxWIndex=RxWrite(pSerialHead), RxRIndex=RxRead(pSerialHead);

            DEBUGMSG (ZONE_THREAD|ZONE_READ , (TEXT("Rx Event\r\n")));

            if ( RxRIndex == 0 ) {
                // have to leave one byte free.
                RoomLeft = RxLength(pSerialHead) - RxWIndex - 1;
            } else {
                RoomLeft = RxLength(pSerialHead) - RxWIndex;
            }
            if ( RxRIndex > RxWIndex ) {
                RoomLeft = RxRIndex - RxWIndex - 1;
            }
            if ( RoomLeft ) {
                pSerialHead->DroppedBytesPDD +=
                pFuncTbl->HWRxIntrHandler(pHWHead,
                                          RxBuffWrite(pSerialHead),
                                          &RoomLeft);
            } else {
                BYTE    TempBuf[16];
                RoomLeft = 16;
                pFuncTbl->HWRxIntrHandler(pHWHead,
                                          TempBuf,
                                          &RoomLeft);

                pSerialHead->DroppedBytesMDD += RoomLeft;
                DEBUGMSG (ZONE_WARN|ZONE_READ, (TEXT("Tossed %d bytes\r\n"),
                                                RoomLeft));
                RoomLeft = 0;
            }

            DEBUGMSG (ZONE_READ ,
                      (TEXT("After HWGetBytes, Fifo(R=%d,W=%d,BA=%d,L=%d) ByteRead=%d\r\n"),
                       RxRead(pSerialHead), RxWrite(pSerialHead),

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区日韩| 日韩中文欧美在线| 69精品人人人人| 成人福利视频网站| 蜜桃精品在线观看| 一区二区三区中文在线| 中文字幕精品在线不卡| 欧美大片免费久久精品三p| 欧洲视频一区二区| www.欧美日韩| 国产麻豆成人精品| 精品一区免费av| 丝袜美腿亚洲色图| 亚洲综合一二三区| 中文字幕在线不卡一区二区三区| 精品少妇一区二区三区在线播放 | 欧美日韩一卡二卡| 91一区二区三区在线观看| 国产风韵犹存在线视精品| 老司机精品视频在线| 日韩高清在线观看| 亚洲成人在线免费| 亚洲最新视频在线观看| 亚洲欧美aⅴ...| 亚洲丝袜自拍清纯另类| 中文幕一区二区三区久久蜜桃| 精品国产乱码久久久久久牛牛| 在线播放中文一区| 欧美高清一级片在线| 欧美日本国产视频| 欧美日韩一二区| 欧美精品高清视频| 91.com视频| 日韩免费高清电影| 欧美大肚乱孕交hd孕妇| 日韩一卡二卡三卡| 精品久久人人做人人爽| 精品1区2区在线观看| 精品国产一区二区国模嫣然| 日韩电影免费在线| 视频一区国产视频| 免费久久99精品国产| 久久精品久久99精品久久| 麻豆极品一区二区三区| 韩国三级中文字幕hd久久精品| 精品无人码麻豆乱码1区2区| 黄色成人免费在线| 国产a级毛片一区| 成人ar影院免费观看视频| 99久久精品免费| 91久久久免费一区二区| 欧美丰满嫩嫩电影| 欧美一区二区福利在线| 久久伊人蜜桃av一区二区| 久久久久久影视| 国产精品美女一区二区| 亚洲自拍偷拍欧美| 看电视剧不卡顿的网站| 成人小视频在线| 色哟哟欧美精品| 91精品午夜视频| 精品国产91乱码一区二区三区 | 欧美成人a∨高清免费观看| 26uuu国产在线精品一区二区| 中文字幕精品一区二区精品绿巨人| 亚洲欧洲99久久| 日韩国产精品久久| 国产激情一区二区三区| 成人av网站免费| 欧美日韩精品一区二区三区| 欧美成人猛片aaaaaaa| 成人免费小视频| 美女性感视频久久| 成人av动漫网站| 91精品中文字幕一区二区三区| 久久色在线视频| 亚洲精品免费看| 久久精工是国产品牌吗| 99精品视频一区| 欧美一区二区人人喊爽| 国产精品国产三级国产a| 日韩精品免费专区| 不卡的电视剧免费网站有什么| 欧美日韩一区二区三区不卡| 国产拍揄自揄精品视频麻豆| 亚洲大片免费看| 成人国产亚洲欧美成人综合网| 欧美伦理视频网站| 亚洲欧洲日韩av| 国产一区二区美女| 欧美区视频在线观看| 国产精品久久久久久亚洲毛片 | 日韩一区二区三区四区五区六区 | 亚洲三级在线免费观看| 麻豆91免费看| 樱桃国产成人精品视频| 久久国产成人午夜av影院| 色综合天天天天做夜夜夜夜做| 欧美电影免费观看高清完整版 | 欧美自拍偷拍一区| 国产日韩欧美激情| 美女脱光内衣内裤视频久久网站| 91麻豆精品视频| 国产亚洲精品免费| 美女视频黄久久| 欧美日韩国产首页| 亚洲欧洲综合另类在线| 国产·精品毛片| 精品少妇一区二区三区在线播放 | 国产精品成人免费精品自在线观看| 久久超级碰视频| 777色狠狠一区二区三区| 亚洲人123区| 粉嫩绯色av一区二区在线观看| 日韩一区二区免费视频| 亚洲一区二区三区影院| 色综合天天天天做夜夜夜夜做| 国产欧美日韩在线观看| 国产一区二区久久| 日韩欧美色综合网站| 肉丝袜脚交视频一区二区| 欧美在线|欧美| 亚洲免费观看高清| 免费不卡在线视频| 欧美精品久久天天躁| 一区二区高清视频在线观看| 91在线视频官网| 亚洲精品中文在线观看| 99精品国产热久久91蜜凸| 国产精品麻豆视频| 不卡欧美aaaaa| 国产精品久久久久久久久晋中| 国产白丝网站精品污在线入口| 久久久久久亚洲综合影院红桃 | 在线免费一区三区| 亚洲欧美激情视频在线观看一区二区三区 | 欧美成人精品3d动漫h| 人禽交欧美网站| 日韩精品一区二区三区视频在线观看| 日日夜夜精品视频免费| 欧美精品 日韩| 久久精品国产亚洲a| 久久久www免费人成精品| 国产成人av资源| 国产精品久久午夜| 色老汉一区二区三区| 偷拍日韩校园综合在线| 欧美一级理论片| 国产九九视频一区二区三区| 亚洲国产成人在线| 一本色道久久加勒比精品| 五月婷婷综合网| 欧美第一区第二区| 成人免费视频一区| 亚洲一区在线观看免费观看电影高清| 欧美精品日韩精品| 国产九色精品成人porny| 国产精品国产精品国产专区不片 | 正在播放亚洲一区| 精品无码三级在线观看视频| 国产精品456| 亚洲男人天堂一区| 91精品国产手机| 国产成人精品三级| 亚洲午夜在线观看视频在线| 精品少妇一区二区三区日产乱码 | 一个色妞综合视频在线观看| 91精品国产入口在线| 丰满少妇久久久久久久| 亚洲最新在线观看| 欧美成人三级电影在线| 99久久精品免费观看| 欧美aaa在线| 国产精品久久久久影院亚瑟| 欧美日韩性生活| 国产一区二区成人久久免费影院| 亚洲视频小说图片| 欧美大胆一级视频| 日本电影亚洲天堂一区| 国产在线一区观看| 一区二区三区中文字幕电影| 精品成人佐山爱一区二区| 色综合一个色综合亚洲| 精品一二三四区| 亚洲在线观看免费| 国产精品色呦呦| 欧美一区二区免费| 在线中文字幕一区二区| 国产综合色视频| 丝袜美腿亚洲色图| 亚洲老妇xxxxxx| 久久久精品日韩欧美| 欧美老肥妇做.爰bbww| 91香蕉视频污| 国产麻豆成人精品| 日韩1区2区日韩1区2区| 一区二区三区免费在线观看| 亚洲国产成人在线| 久久蜜桃香蕉精品一区二区三区| 欧美日韩中字一区|