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

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

?? pl010com.c

?? 收集到的orion_ep93xx_wince_bsp_1-3-507串行通訊驅動源碼,未作測試
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:  

Abstract:  

Notes: 
--*/

#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <memory.h>
#include "pl010ser.h"
#include <serhw.h>
#include <ser16550.h>
#include <hw16550.h>
#include <nkintr.h>
#include <devload.h>
#include <hwdefs.h>
#include <clocks.h>

#include "pl010com.h"
#include <oalintr.h>

#undef ZONE_INIT
#include <serdbg.h>

// #define DBGMSG
#define DBGMSG NKDbgPrintfW


// Macros to read/write serial registers.
#define INB(pInfo, reg) (READ_PORT_UCHAR((UCHAR *)((pInfo)->reg)))

VOID SL_Init2(
    PVOID   pHead, //  points to device head
    PUCHAR  pRegBase, // Pointer to 16550 register base
    EVENT_FUNC EventCallback, // This callback exists in MDD
    PVOID   pMddHead   // This is the first parm to callback
    );

static
BOOL
SerSetIRBaudRate(
                PSER_INFO   pHWHead,
                ULONG baud     // @parm     UINT16 what is the baud rate
                )
{
    DEBUGMSG (ZONE_INIT, (TEXT("Serial set IR Baud %d\r\n"),
                          baud));

    return (TRUE);
}

/*
 *  NOTE : The caller should have set pHWHead->fIRMode.  It is not
 * set here, since power on/off may need to temporarily disable
 * the intefaces without actually overwriting the current recorded
 * mode.
 */
static
void
SerSetOutputMode(
                PSER_INFO   pHWHead,
                BOOL UseIR,     // @parm     BOOL Should we use IR interface
                BOOL Use9Pin    // @parm     BOOL Should we use Wire interface
                )
{
    // If you support IR, here you need to set the interface to either IR mode
    // or normal serial. Note that it is possible for both BOOls to
    // be false (i.e. power down), but never for both to be TRUE.

    if(pHWHead->dwDevIndex  == 2)
    {
        if(UseIR)
        {
            //
            // Enable SIR in the UART 2 register.  Also Enable
            // the interrupts.
            //
            *UART2_CR           |=  CR_SIREN;

            //
            // Enable SIR.
            //
            *IRDA_IRENABLE      = IRENABLE_SIR ;  
            *IRDA_IRENABLE      = IRENABLE_SIR ;  
        }
        else
        {
            //
            // Enable SIR in the UART 2 register.  Also Enable
            // the interrupts.
            //
            *UART2_CR           &=  ~CR_SIREN;

            //
            // Enable SIR.
            //
            *IRDA_IRENABLE      = 0;  
            *IRDA_IRENABLE      = 0;  
        }
    }
}



/*++
*******************************************************************************
Routine:

    Ser_GetRegistryData

Description:

    Take the registry path provided to COM_Init and use it to find this 
    requested comm port's DeviceArrayIndex, teh IOPort Base Address, and the
   Interrupt number.
   
Arguments:

    LPCTSTR regKeyPath  the registry path passed in to COM_Init.

Return Value:

    -1 if there is an error.

*******************************************************************************
--*/
BOOL
Ser_GetRegistryData(PSER_INFO pHWHead, LPCTSTR regKeyPath)
{
#define GCI_BUFFER_SIZE 256   

    LONG    regError;
    HKEY    hKey;
    DWORD   dwDataSize = GCI_BUFFER_SIZE;

    DEBUGMSG(ZONE_INIT, (TEXT("Try to open %s\r\n"), regKeyPath));



    // We've been handed the name of a key in the registry that was generated
    // on the fly by device.exe.  We're going to open that key and pull from it
    // a value that is the name of this serial port's real key.  That key
    // will have the DeviceArrayIndex that we're trying to find.  
    hKey = OpenDeviceKey(regKeyPath);
    if ( hKey == NULL ) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,
                 (TEXT("Failed to open device key\r\n")));
        return ( FALSE );        
    }

    // Okay, we're finally ready to try and load our registry data.
    dwDataSize = PC_REG_DEVINDEX_VAL_LEN;
    regError = RegQueryValueEx(
                              hKey, 
                              PC_REG_DEVINDEX_VAL_NAME, 
                              NULL, 
                              NULL,
                              (LPBYTE)(&pHWHead->dwDevIndex), 
                              &dwDataSize);



    RegCloseKey (hKey);

    if ( regError != ERROR_SUCCESS ) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,
                 (TEXT("Failed to get serial registry values, Error 0x%X\r\n"),
                  regError));
        return ( FALSE );
    }

    switch(pHWHead->dwDevIndex)
    {
        case 1:
            pHWHead->pBaseAddress   = (PUCHAR)UART1_BASE;
            pHWHead->dwSysIntr      = SYSINTR_UART1;
            break;
            
        case 2:
            pHWHead->pBaseAddress   = (PUCHAR)UART2_BASE;
            pHWHead->dwSysIntr      = SYSINTR_UART2;

            //
            // The documentation is not very clear on this register.
            // It says that this is a divisor of the UART clock rate.
            // The divided frequency should be between 1.42 and 2.12 Mhz
            //
            // If this register is not programmed, UART recieve will not
            // work.
            //
            *UART2_ILPR         = 3;

            break;
        case 3:
            pHWHead->pBaseAddress   = (PUCHAR)UART3_BASE;
            pHWHead->dwSysIntr      = SYSINTR_UART3;
            break;
    }

    DEBUGMSG (1|ZONE_INIT,
              (TEXT("SerInit - Devindex %d, SysIntr %d, IOB %X, IOLen %X \r\n"),
               pHWHead->dwDevIndex, pHWHead->dwSysIntr, pHWHead->pBaseAddress, pHWHead->dwIOLen));

    return ( TRUE ); 
}



/*
 @doc OEM 
 @func PVOID | SerInit | Initializes device identified by argument.
 *  This routine sets information controlled by the user
 *  such as Line control and baud rate. It can also initialize events and
 *  interrupts, thereby indirectly managing initializing hardware buffers.
 *  Exported only to driver, called only once per process.
 *
 @rdesc The return value is a PVOID to be passed back into the HW
 dependent layer when HW functions are called.
 */
static
PVOID
SerInit(
       ULONG   Identifier, // @parm Device identifier.
       PVOID   pMddHead,   // @parm First argument to mdd callbacks.
       PHWOBJ  pHWObj      // @parm Pointer to our own HW OBJ for this device
       )
{
    PSER_INFO   pHWHead;

    // Allocate for our main data structure and one of it's fields.
    pHWHead = (PSER_INFO)LocalAlloc( LMEM_ZEROINIT|LMEM_FIXED ,
                                     sizeof(SER_INFO) );
    if ( !pHWHead )
        return( NULL );

    if ( ! Ser_GetRegistryData(pHWHead, (LPCTSTR)Identifier) ) {
        DEBUGMSG (ZONE_INIT|ZONE_ERROR,
                  (TEXT("SerInit - Unable to read registry data.  Failing Init !!! \r\n")));
        pHWHead->pBaseAddress = NULL;   // clear this field so de-init won't call VirtualFree
        goto ALLOCFAILED;
    }

    pHWHead->pMddHead     = pMddHead;
    pHWHead->pHWObj = pHWObj;
    pHWHead->cOpenCount   = 0;

    // Legacy - We have 2 identical fields becausw registry used to contain IRQ
    pHWHead->pHWObj->dwIntID = pHWHead->dwSysIntr;
    DEBUGMSG (1|ZONE_INIT,
              (TEXT("SerInit - SYSINTR %d\r\n"),  pHWHead->pHWObj->dwIntID));

    // Set up our Comm Properties data    
    pHWHead->CommProp.wPacketLength       = 0xffff;
    pHWHead->CommProp.wPacketVersion     = 0xffff;
    pHWHead->CommProp.dwServiceMask      = SP_SERIALCOMM;
    pHWHead->CommProp.dwReserved1         = 0;
    pHWHead->CommProp.dwMaxTxQueue        = 16;
    pHWHead->CommProp.dwMaxRxQueue        = 16;
    pHWHead->CommProp.dwMaxBaud       = BAUD_115200;
    pHWHead->CommProp.dwProvSubType      = PST_RS232;


    pHWHead->CommProp.dwProvCapabilities =
            PCF_SETXCHAR |
            PCF_INTTIMEOUTS |
            PCF_PARITY_CHECK |
            PCF_SPECIALCHARS |
            PCF_TOTALTIMEOUTS |
            PCF_XONXOFF;

    if(pHWHead->dwDevIndex)
    {
        pHWHead->CommProp.dwProvCapabilities |=PCF_DTRDSR | PCF_RLSD | PCF_RTSCTS;
    }
    
 
    pHWHead->CommProp.dwSettableBaud      =
    BAUD_075 | BAUD_110 | BAUD_150 | BAUD_300 | BAUD_600 |
    BAUD_1200 | BAUD_1800 | BAUD_2400 | BAUD_4800 |
    BAUD_7200 | BAUD_9600 | BAUD_14400 |
    BAUD_19200 | BAUD_38400 | BAUD_56K | BAUD_128K |
    BAUD_115200 | BAUD_57600 | BAUD_USER;


    pHWHead->CommProp.dwSettableParams    =
    SP_BAUD | SP_DATABITS | SP_HANDSHAKING | SP_PARITY |
    SP_PARITY_CHECK | SP_RLSD | SP_STOPBITS;

    pHWHead->CommProp.wSettableData       =
    DATABITS_5 | DATABITS_6 | DATABITS_7 | DATABITS_8;

    pHWHead->CommProp.wSettableStopParity =
    STOPBITS_10 | STOPBITS_20 |
    PARITY_NONE | PARITY_ODD | PARITY_EVEN | PARITY_SPACE |
    PARITY_MARK;

    pHWHead->fIRMode  = FALSE;   // Select wired by default

    // Init 16550 info
    DEBUGMSG (ZONE_INIT, (TEXT("SerInit - Init 16550 data\r\n")));
    SL_Init2( pHWHead, pHWHead->pBaseAddress, EvaluateEventFlag, pMddHead);

    DEBUGMSG (ZONE_INIT,
              (TEXT("SerInit - Disabling UART Power\r\n")));
    SerSetOutputMode(pHWHead, FALSE, FALSE );    

    return (pHWHead);

    ALLOCFAILED:

    LocalFree(pHWHead);
    return (NULL);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美蜜桃一区二区三区| 久久综合久久综合久久| 欧美一区二区三区性视频| 久久久国产精华| 亚洲国产日韩一级| 成人动漫在线一区| www激情久久| 亚洲成av人片在线观看无码| 丰满亚洲少妇av| 日韩一区二区高清| 亚洲午夜一区二区三区| 成人激情免费网站| 精品国内片67194| 天天影视色香欲综合网老头| 99精品久久99久久久久| 国产亚洲女人久久久久毛片| 蜜臀精品久久久久久蜜臀| 欧美在线观看一区| 亚洲欧美一区二区三区极速播放| 国内精品不卡在线| 日韩欧美国产三级| 日本免费新一区视频| 欧美在线视频你懂得| 国产精品毛片大码女人| 成人久久久精品乱码一区二区三区| 欧美v日韩v国产v| 麻豆精品国产传媒mv男同| 欧美日韩国产片| 亚洲18影院在线观看| 在线观看日韩精品| 亚洲国产视频一区二区| 狠狠色狠狠色合久久伊人| 2023国产精华国产精品| 精品一区二区久久| 精品国产免费人成电影在线观看四季 | 国产一区二区三区| 欧美一级片免费看| 免费一区二区视频| 日韩精品一区二区三区四区视频| 日韩va亚洲va欧美va久久| 欧美日韩精品免费| 日韩电影在线免费| 日韩欧美国产一区二区在线播放 | 亚洲欧美日韩在线播放| 99久久99久久综合| 一区二区三区中文免费| 欧美亚洲自拍偷拍| 婷婷久久综合九色国产成人| 欧美精品在欧美一区二区少妇| 视频一区二区国产| 日韩一区二区影院| 国产米奇在线777精品观看| 国产亚洲女人久久久久毛片| 99久精品国产| 亚州成人在线电影| 精品国产乱子伦一区| 成人综合在线视频| 亚洲自拍欧美精品| 日韩一区二区在线观看视频 | 国产色综合一区| 91原创在线视频| 午夜伊人狠狠久久| 精品国产乱码久久久久久浪潮| 国产不卡在线播放| 亚洲色图另类专区| 日韩一二三四区| 国产成人免费视频网站高清观看视频| 中文字幕一区av| 欧美美女直播网站| 国产成人免费视| 亚洲精品乱码久久久久久| 在线不卡中文字幕播放| 国产精品12区| 亚洲国产日韩精品| 欧美国产激情一区二区三区蜜月| 欧洲在线/亚洲| 国产精品综合久久| 亚洲永久免费av| 国产亚洲精品资源在线26u| 欧洲一区在线观看| 国产电影精品久久禁18| 午夜在线电影亚洲一区| 欧美韩日一区二区三区四区| 欧美另类z0zxhd电影| 丁香婷婷综合网| 美国欧美日韩国产在线播放| 成人欧美一区二区三区1314| 日韩无一区二区| 欧美伊人久久久久久午夜久久久久| 精品一区二区在线观看| 亚洲bt欧美bt精品| 18欧美乱大交hd1984| 久久综合久久鬼色中文字| 欧美日本在线观看| 色成人在线视频| 成人手机在线视频| 黑人巨大精品欧美一区| 奇米影视在线99精品| 亚洲欧美欧美一区二区三区| 欧美经典一区二区| 欧美mv和日韩mv国产网站| 欧美剧情电影在线观看完整版免费励志电影| 国产69精品一区二区亚洲孕妇| 精品一区精品二区高清| 麻豆精品国产传媒mv男同| 三级在线观看一区二区| 夜夜嗨av一区二区三区中文字幕| 亚洲国产精华液网站w| 国产色产综合色产在线视频| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 综合自拍亚洲综合图不卡区| 亚洲精品一区在线观看| 日韩免费高清电影| 欧美一级夜夜爽| 这里是久久伊人| 91精品国产麻豆| 69成人精品免费视频| 欧美片在线播放| 欧美剧情电影在线观看完整版免费励志电影| 91天堂素人约啪| 日本久久电影网| 欧美日韩亚洲丝袜制服| 欧美日韩成人在线一区| 91麻豆精品国产自产在线观看一区 | 亚洲va国产天堂va久久en| 亚洲成人中文在线| 日韩精品一级二级 | 国产成人亚洲精品狼色在线| 成人综合在线视频| 色综合久久综合网| 欧美日韩一级片网站| 777奇米成人网| 精品国产乱子伦一区| 国产日韩欧美激情| 中文字幕亚洲综合久久菠萝蜜| 亚洲精品久久7777| 视频一区视频二区在线观看| 卡一卡二国产精品| 成人的网站免费观看| 91国产视频在线观看| 91精品国产91久久久久久一区二区| 91精品国产麻豆| 国产精品免费看片| 亚洲成人免费影院| 加勒比av一区二区| 99久久精品国产一区二区三区| 欧美精品少妇一区二区三区| 精品1区2区在线观看| 亚洲丝袜另类动漫二区| 水蜜桃久久夜色精品一区的特点| 精品一区二区免费在线观看| 91丨porny丨国产| 91精品综合久久久久久| 亚洲国产精品传媒在线观看| 亚洲一区二区四区蜜桃| 久久国产麻豆精品| 一本色道久久加勒比精品| 日韩欧美123| 亚洲女女做受ⅹxx高潮| 久久99精品久久只有精品| 95精品视频在线| 精品国产乱码久久久久久1区2区 | 日韩国产欧美在线视频| 成人做爰69片免费看网站| 91麻豆精品国产91久久久久| 国产精品免费av| 久久精品国产99国产精品| 色婷婷精品大视频在线蜜桃视频| 日韩一区二区三区三四区视频在线观看| 欧美国产成人精品| 久色婷婷小香蕉久久| 欧美色综合天天久久综合精品| 久久久777精品电影网影网 | 亚洲综合一区在线| 成人性生交大片免费看中文| 51精品国自产在线| 洋洋av久久久久久久一区| 国产成人在线电影| 欧美不卡在线视频| 丝袜美腿高跟呻吟高潮一区| 色狠狠av一区二区三区| 18涩涩午夜精品.www| 丰满放荡岳乱妇91ww| 久久综合九色综合97婷婷女人| 天堂精品中文字幕在线| 91久久精品日日躁夜夜躁欧美| 国产欧美一区二区三区鸳鸯浴 | 亚洲v日本v欧美v久久精品| 97精品久久久午夜一区二区三区| 久久久蜜桃精品| 久久精品国产色蜜蜜麻豆| 欧美一区二区三区视频在线观看| 亚洲午夜成aⅴ人片| 欧洲国内综合视频| 亚洲精品乱码久久久久| 色哟哟日韩精品| 亚洲乱码一区二区三区在线观看| www..com久久爱| 国产精品国模大尺度视频| 粉嫩一区二区三区在线看|