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

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

?? pdds3c2440_ser.cpp

?? 三星2440 cpu WINCE 5.00板級(jí)支持包
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//
// 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:

    Serial PDD for SamSang 2440 UART Common Code.

Notes: 
--*/
#include <windows.h>
#include <types.h>
#include <ceddk.h>

#include <ddkreg.h>
#include <serhw.h>
#include <Serdbg.h>
#include <pdds3c2440_ser.h>
#include <s3c2440x_base_regs.h>
CReg2440Uart::CReg2440Uart(PULONG pRegAddr)
:   m_pReg(pRegAddr)
{
    m_fIsBackedUp = FALSE;
    PROCESSOR_INFO procInfo;
    DWORD dwBytesReturned;
    if (!KernelIoControl(IOCTL_PROCESSOR_INFORMATION, NULL, 0, &procInfo, sizeof(PROCESSOR_INFO), &dwBytesReturned))
    {
        m_s3c2440_pclk = DEFAULT_S3C2440X_PCLK;
        RETAILMSG(TRUE, (TEXT("WARNING: CReg2440Uart::CReg2440Uart failed to obtain processor frequency - using default value (%d).\r\n"), m_s3c2440_pclk)); 
    }
    else
    {
        m_s3c2440_pclk = procInfo.dwClockSpeed;
        RETAILMSG(TRUE, (TEXT("INFO: CReg2440Uart::CReg2440Uart using processor frequency reported by the OAL (%d).\r\n"), m_s3c2440_pclk)); 
    }

}
BOOL   CReg2440Uart::Init() 
{

    if (m_pReg) { // Set Value to default.
        Write_ULCON(0);
        Write_UCON(0);
        Write_UFCON(0);
        Write_UMCON(0);
        return TRUE;
    }
    else
        return FALSE;
}

void CReg2440Uart::Backup()
{
    m_fIsBackedUp = TRUE;
    m_ULCONBackup = Read_ULCON();
    m_UCONBackup = Read_UCON();
    m_UFCONBackup = Read_UFCON();
    m_UMCOMBackup = Read_UMCON();
    m_UBRDIVBackup = Read_UBRDIV();    
}
void CReg2440Uart::Restore()
{
    if (m_fIsBackedUp) {
        Write_ULCON(m_ULCONBackup );
        Write_UCON( m_UCONBackup );
        Write_UFCON( m_UFCONBackup );
        Write_UMCON( m_UMCOMBackup );
        Write_UBRDIV( m_UBRDIVBackup);
        m_fIsBackedUp = FALSE;
    }
}
CReg2440Uart::Write_BaudRate(ULONG BaudRate)
{
    DEBUGMSG(ZONE_INIT, (TEXT("SetBaudRate -> %d\r\n"), BaudRate));
    if ( (Read_UCON() & CS_MASK) == CS_PCLK ) {
        Write_UBRDIV( (int)(m_s3c2440_pclk/16.0/BaudRate) -1 );
        return TRUE;
    }
    else {
        // TODO: Support external UART clock.
        //OUTREG(pHWHead,UBRDIV,( (int)(S2440UCLK/16.0/BaudRate) -1 ));
        RETAILMSG(TRUE, (TEXT("ERROR: The s3c2440x serial driver doesn't support an external UART clock.\r\n")));
        ASSERT(FALSE);
        return(FALSE);
    }
}
#ifdef DEBUG
void CReg2440Uart::DumpRegister()
{
    NKDbgPrintfW(TEXT("DumpRegister (ULCON=%x, UCON=%x, UFCON=%x, UMCOM = %x, UBDIV =%x)\r\n"),
        Read_ULCON(),Read_UCON(),Read_UFCON(),Read_UMCON(),Read_UBRDIV());
    
}
#endif

CPdd2440Uart::CPdd2440Uart (LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj )
:   CSerialPDD(lpActivePath,pMdd, pHwObj)
,   m_ActiveReg(HKEY_LOCAL_MACHINE,lpActivePath)
,   CMiniThread (0, TRUE)   
{
    m_pReg2440Uart = NULL;
    m_pINTregs = NULL;
    m_dwIntShift = 0;
    m_dwSysIntr = MAXDWORD;
    m_hISTEvent = NULL;
    m_dwDevIndex = 0;
    m_pRegVirtualAddr = NULL;
    m_XmitFlushDone =  CreateEvent(0, FALSE, FALSE, NULL);
    m_XmitFifoEnable = FALSE;
    m_dwWaterMark = 8 ;
}
CPdd2440Uart::~CPdd2440Uart()
{
    InitModem(FALSE);
    if (m_hISTEvent) {
        m_bTerminated=TRUE;
        ThreadStart();
        SetEvent(m_hISTEvent);
        ThreadTerminated(1000);
        InterruptDisable( m_dwSysIntr );         
        CloseHandle(m_hISTEvent);
    };
    if (m_pReg2440Uart)
        delete m_pReg2440Uart;
    if (m_XmitFlushDone)
        CloseHandle(m_XmitFlushDone);
    if (m_pRegVirtualAddr != NULL) {
        MmUnmapIoSpace((PVOID)m_pRegVirtualAddr,0UL);
    }
    if (m_pINTregs!=NULL) {
        MmUnmapIoSpace((PVOID)m_pINTregs,0UL);
    }
        
}
BOOL CPdd2440Uart::Init()
{
    if ( CSerialPDD::Init() && IsKeyOpened() && m_XmitFlushDone!=NULL) { 
        // IST Setup .
        DDKISRINFO ddi;
        if (GetIsrInfo(&ddi)!=ERROR_SUCCESS) {
            return FALSE;
        }
        m_dwSysIntr = ddi.dwSysintr;
        if (m_dwSysIntr !=  MAXDWORD && m_dwSysIntr!=0 ) 
            m_hISTEvent= CreateEvent(0,FALSE,FALSE,NULL);
        
        if (m_hISTEvent!=NULL)
            InterruptInitialize(m_dwSysIntr,m_hISTEvent,0,0);
        else
            return FALSE;
        
        // Get Device Index.
        if (!GetRegValue(PC_REG_DEVINDEX_VAL_NAME, (PBYTE)&m_dwDevIndex, PC_REG_DEVINDEX_VAL_LEN)) {
            m_dwDevIndex = 0;
        }
        if (!GetRegValue(PC_REG_SERIALWATERMARK_VAL_NAME,(PBYTE)&m_dwWaterMark,sizeof(DWORD))) {
            m_dwWaterMark = 8;
        }
        if (!GetRegValue(PC_REG_2440UART_INTBIT_VAL_NAME,(PBYTE)&m_dwIntShift,sizeof(DWORD))) {
            RETAILMSG(1,(TEXT("Registery does not have %s set. Drivers fail!!!\r\n"),PC_REG_2440UART_INTBIT_VAL_NAME));
            m_dwIntShift =0;
            return FALSE;
        }
        if (!GetRegValue(PC_REG_2440UART_IST_TIMEOUTS_VAL_NAME,(PBYTE)&m_dwISTTimeout, PC_REG_2440UART_IST_TIMEOUTS_VAL_LEN)) {
            m_dwISTTimeout = INFINITE;
        }
        if (!MapHardware() || !CreateHardwareAccess()) {
            return FALSE;
        }
        
        return TRUE;        
    }
    return FALSE;
}
BOOL CPdd2440Uart::MapHardware() 
{
    if (m_pRegVirtualAddr !=NULL)
        return TRUE;

    // Get IO Window From Registry
    DDKWINDOWINFO dwi;
    if ( GetWindowInfo( &dwi)!=ERROR_SUCCESS || 
            dwi.dwNumMemWindows < 1 || 
            dwi.memWindows[0].dwBase == 0 || 
            dwi.memWindows[0].dwLen <  0x2c)
        return FALSE;
    DWORD dwInterfaceType;
    if (m_ActiveReg.IsKeyOpened() && 
            m_ActiveReg.GetRegValue( DEVLOAD_INTERFACETYPE_VALNAME, (PBYTE)&dwInterfaceType,sizeof(DWORD))) {
        dwi.dwInterfaceType = dwInterfaceType;
    }

    // Translate to System Address.
    PHYSICAL_ADDRESS    ioPhysicalBase = { dwi.memWindows[0].dwBase, 0};
    ULONG               inIoSpace = 0;
    if (TranslateBusAddr(m_hParent,(INTERFACE_TYPE)dwi.dwInterfaceType,dwi.dwBusNumber, ioPhysicalBase,&inIoSpace,&ioPhysicalBase)) {
        // Map it if it is Memeory Mapped IO.
        m_pRegVirtualAddr = MmMapIoSpace(ioPhysicalBase, dwi.memWindows[0].dwLen,FALSE);
    }
    ioPhysicalBase.LowPart = S3C2440X_BASE_REG_PA_INTR ;
    ioPhysicalBase.HighPart = 0;
    inIoSpace = 0; 
    if (TranslateBusAddr(m_hParent,(INTERFACE_TYPE)dwi.dwInterfaceType,dwi.dwBusNumber, ioPhysicalBase,&inIoSpace,&ioPhysicalBase)) {
        m_pINTregs = (S3C2440X_INTR_REG *) MmMapIoSpace(ioPhysicalBase,sizeof(S3C2440X_INTR_REG),FALSE);
    }
    return (m_pRegVirtualAddr!=NULL && m_pINTregs!=NULL);
}
BOOL CPdd2440Uart::CreateHardwareAccess()
{
    if (m_pReg2440Uart)
        return TRUE;
    if (m_pRegVirtualAddr!=NULL) {
        m_pReg2440Uart = new CReg2440Uart((PULONG)m_pRegVirtualAddr);
        if (m_pReg2440Uart && !m_pReg2440Uart->Init()) { // FALSE.
            delete m_pReg2440Uart ;
            m_pReg2440Uart = NULL;
        }
            
    }
    return (m_pReg2440Uart!=NULL);
}
#define MAX_RETRY 0x1000
void CPdd2440Uart::PostInit()
{
    DWORD dwCount=0;
    m_HardwareLock.Lock();
    m_pReg2440Uart->Write_UCON(0); // Set to Default;
    DisableInterrupt(S2440UART_INT_RXD|S2440UART_INT_TXD|S2440UART_INT_ERR);
    // Mask all interrupt.
    while ((GetInterruptStatus() & (S2440UART_INT_RXD|S2440UART_INT_TXD|S2440UART_INT_ERR))!=0 && 
            dwCount <MAX_RETRY) { // Interrupt.
        InitReceive(TRUE);
        InitLine(TRUE);
        ClearInterrupt(S2440UART_INT_RXD|S2440UART_INT_TXD|S2440UART_INT_ERR);
        dwCount++;
    }
    ASSERT((GetInterruptStatus() & (S2440UART_INT_RXD|S2440UART_INT_TXD|S2440UART_INT_ERR))==0);
    // IST Start to Run.
    m_HardwareLock.Unlock();
    CSerialPDD::PostInit();
    CeSetPriority(m_dwPriority256);
#ifdef DEBUG
    if ( ZONE_INIT )
        m_pReg2440Uart->DumpRegister();
#endif
    ThreadStart();  // Start IST.
}
DWORD CPdd2440Uart::ThreadRun()
{
    while ( m_hISTEvent!=NULL && !IsTerminated()) {
        if (WaitForSingleObject( m_hISTEvent,m_dwISTTimeout)==WAIT_OBJECT_0) {
            m_HardwareLock.Lock();    
            while (!IsTerminated() ) {
                DWORD dwData = (GetInterruptStatus() & (S2440UART_INT_RXD|S2440UART_INT_TXD|S2440UART_INT_ERR));
                DWORD dwMask = (GetIntrruptMask() & (S2440UART_INT_RXD|S2440UART_INT_TXD|S2440UART_INT_ERR));
                 DEBUGMSG(ZONE_THREAD,
                      (TEXT(" CPdd2440Uart::ThreadRun INT=%x, MASK =%x\r\n"),dwData,dwMask));
                dwMask &= dwData;
                if (dwMask) {
                    DEBUGMSG(ZONE_THREAD,
                      (TEXT(" CPdd2440Uart::ThreadRun Active INT=%x\r\n"),dwMask));
                    DWORD interrupts=INTR_MODEM; // Always check Modem when we have change. It may work at polling mode.
                    if ((dwMask & S2440UART_INT_RXD)!=0)
                        interrupts |= INTR_RX;
                    if ((dwMask & S2440UART_INT_TXD)!=0)
                        interrupts |= INTR_TX;
                    if ((dwMask & S2440UART_INT_ERR)!=0) 
                        interrupts |= INTR_LINE|INTR_RX;
                    NotifyPDDInterrupt((INTERRUPT_TYPE)interrupts);
                    ClearInterrupt(dwData);
                }
                else 
                    break;
            }
            m_HardwareLock.Unlock();   
            InterruptDone(m_dwSysIntr);
        }
        else { // Polling Modem.
            NotifyPDDInterrupt(INTR_MODEM);
            DEBUGMSG(ZONE_THREAD,(TEXT(" CPdd2440Uart::ThreadRun timeout INT=%x,MASK=%d\r\n"),m_pINTregs->SUBSRCPND,m_pINTregs->INTSUBMSK));
#ifdef DEBUG
            if ( ZONE_THREAD )
                m_pReg2440Uart->DumpRegister();
#endif
        }
    }
    return 1;
}
BOOL CPdd2440Uart::InitialEnableInterrupt(BOOL bEnable )
{
    m_HardwareLock.Lock();
    if (bEnable) 
        EnableInterrupt(S2440UART_INT_RXD | S2440UART_INT_ERR );
    else
        DisableInterrupt(S2440UART_INT_RXD | S2440UART_INT_ERR );
    m_HardwareLock.Unlock();
    return TRUE;
}

BOOL  CPdd2440Uart::InitXmit(BOOL bInit)
{
    if (bInit) { 
        m_HardwareLock.Lock();    
        DWORD dwBit = m_pReg2440Uart->Read_UCON();
        // Set TxINterrupt To Level.
        dwBit |= (1<<9);
        // Set Interrupt Tx Mode.
        dwBit &= ~(3<<2);
        dwBit |= (1<<2);
        m_pReg2440Uart->Write_UCON(dwBit );

        dwBit = m_pReg2440Uart->Read_UFCON();
        // Reset Xmit Fifo.
        dwBit |= (1<<2);
        dwBit &= ~(1<<0);
        m_pReg2440Uart->Write_UFCON( dwBit);
        // Set Trigger level to 4. 
        dwBit &= ~(3<<6);
        dwBit |= (1<<6);
        m_pReg2440Uart->Write_UFCON(dwBit); 
        // Enable Xmit FIFO.
        dwBit &= ~(1<<2);
        dwBit |= (1<<0);
        m_pReg2440Uart->Write_UFCON(dwBit); // Xmit Fifo Reset Done..
        m_HardwareLock.Unlock();
    }
    else { // Make Sure data has been trasmit out.
        // We have to make sure the xmit is complete because MDD will shut donw the device after this return
        DWORD dwTicks = 0;
        DWORD dwUTRState;
        while (dwTicks < 1000 && 
                (((dwUTRState = m_pReg2440Uart->Read_UTRSTAT())>>1) & 3)!=3  ) { // Transmitter empty is not true
            DEBUGMSG(ZONE_THREAD|ZONE_WRITE,(TEXT("CPdd16550::InitXmit! Wait for UTRSTAT=%x clear.\r\n"), dwUTRState));
            Sleep(5);
            dwTicks +=5;
        }
    }
    return TRUE;
}
DWORD   CPdd2440Uart::GetWriteableSize()
{
    DWORD dwWriteSize = 0;
    DWORD dwUfState = m_pReg2440Uart->Read_UFSTAT() ;
    if ((dwUfState& (1<<9))==0) { // It is not full.
        dwUfState = ((dwUfState>>4) & 0xf); // It is fifo count.
        if (dwUfState < SER2440_FIFO_DEPTH_TX-1)
            dwWriteSize = SER2440_FIFO_DEPTH_TX-1 - dwUfState;
    }
    return dwWriteSize;
}
void    CPdd2440Uart::XmitInterruptHandler(PUCHAR pTxBuffer, ULONG *pBuffLen)
{
    PREFAST_DEBUGCHK(pBuffLen!=NULL);
    m_HardwareLock.Lock();    

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品色噜噜| 日韩三级在线免费观看| 婷婷亚洲久悠悠色悠在线播放| 日韩免费成人网| 日本乱码高清不卡字幕| 九九**精品视频免费播放| 亚洲精品老司机| 久久精品视频免费| 欧美精品在线观看播放| 国产欧美日韩精品一区| 日日摸夜夜添夜夜添精品视频| 欧美日韩精品一区二区三区四区| 国产日韩视频一区二区三区| 九九视频精品免费| 精品毛片乱码1区2区3区| 久久97超碰色| 久久精品亚洲麻豆av一区二区 | 国产欧美日韩在线观看| 色婷婷精品大视频在线蜜桃视频| 久久97超碰色| 久久精品国产在热久久| 婷婷国产v国产偷v亚洲高清| 亚洲精品网站在线观看| 国产精品久久久久久一区二区三区 | 91精品国产一区二区三区蜜臀| 99re这里都是精品| 福利电影一区二区三区| 另类小说欧美激情| 久久精品国产精品亚洲综合| 日韩精品一卡二卡三卡四卡无卡| 亚洲精品水蜜桃| 亚洲免费视频成人| 亚洲人123区| 一区二区三区欧美日| 亚洲精品高清视频在线观看| 亚洲三级理论片| 樱花影视一区二区| 一区二区三区在线免费观看| 亚洲精品亚洲人成人网| 亚洲一区精品在线| 亚洲在线免费播放| 亚洲高清在线视频| 日精品一区二区| 久久精品国产亚洲aⅴ| 精品一区二区久久| 国产精品一二三四| 成人av在线网站| 91成人国产精品| 欧美福利视频一区| 日韩免费高清视频| 国产日产欧美精品一区二区三区| 欧美国产日产图区| 亚洲欧美一区二区久久| 一区二区三区欧美久久| 日本麻豆一区二区三区视频| 毛片av中文字幕一区二区| 国产一区二区三区久久久 | 亚洲视频网在线直播| 亚洲最大色网站| 麻豆成人综合网| 福利一区在线观看| 欧美性受xxxx| 日韩欧美中文一区二区| 国产女同互慰高潮91漫画| **性色生活片久久毛片| 亚洲成av人片在线| 国产自产视频一区二区三区| 顶级嫩模精品视频在线看| 色偷偷久久一区二区三区| 欧美一区二区视频免费观看| 久久久精品蜜桃| 亚洲乱码国产乱码精品精的特点| 亚洲va欧美va天堂v国产综合| 精品一区二区综合| 99综合电影在线视频| 欧美日韩国产一区| 2021久久国产精品不只是精品| 国产精品久线在线观看| 日韩中文字幕麻豆| 暴力调教一区二区三区| 91麻豆精品久久久久蜜臀| 国产精品无人区| 日韩va亚洲va欧美va久久| 国产+成+人+亚洲欧洲自线| 欧美日韩日本视频| 欧美国产综合一区二区| 日韩不卡在线观看日韩不卡视频| 国产精品18久久久久| 欧美性欧美巨大黑白大战| 久久综合九色综合欧美98| 亚洲精品一二三四区| 国产米奇在线777精品观看| 一本大道久久a久久综合| 精品卡一卡二卡三卡四在线| 亚洲欧美日韩系列| 国产一区91精品张津瑜| 欧美日韩一区小说| 中文字幕一区二区在线播放| 美国三级日本三级久久99| 91成人看片片| 欧美韩日一区二区三区| 日本在线不卡一区| 欧美亚洲动漫制服丝袜| 国产精品久久影院| 韩国成人在线视频| 国产精品美女视频| av激情亚洲男人天堂| 自拍偷拍欧美精品| 国产精品综合av一区二区国产馆| 欧美福利电影网| 美女mm1313爽爽久久久蜜臀| 精品视频一区二区不卡| 亚洲同性gay激情无套| 成人精品视频网站| 中国色在线观看另类| 国内欧美视频一区二区| ●精品国产综合乱码久久久久| 97精品久久久久中文字幕 | 国产在线播放一区二区三区| 欧美性生活影院| 一区二区三区中文字幕| 99精品视频在线播放观看| 国产清纯在线一区二区www| 麻豆视频一区二区| 欧美一级电影网站| 男人的j进女人的j一区| 欧美日韩二区三区| 亚洲午夜免费视频| 在线一区二区观看| 亚洲人成在线观看一区二区| 99麻豆久久久国产精品免费优播| 国产精品视频看| 不卡的av网站| 亚洲男帅同性gay1069| 91亚洲永久精品| 亚洲狠狠丁香婷婷综合久久久| 成人国产亚洲欧美成人综合网 | 一区二区三区在线观看视频| 99国产精品久久久久久久久久久| 国产精品国产自产拍在线| 99久久99久久精品免费看蜜桃| 中文字幕中文字幕中文字幕亚洲无线| 国产91精品一区二区麻豆网站| 久久综合色8888| 大胆欧美人体老妇| 综合久久国产九一剧情麻豆| 色综合天天综合网天天狠天天| 亚洲精品免费视频| 欧美精品乱码久久久久久按摩| 日本不卡一区二区| 欧美mv日韩mv国产网站app| 国产乱子伦一区二区三区国色天香| 久久久亚洲精品一区二区三区| 福利电影一区二区| 一区二区三区中文字幕精品精品| 欧美日韩三级一区| 精品一区二区三区欧美| 国产亚洲一区二区三区在线观看| 99久久婷婷国产| 亚洲午夜精品网| 日韩免费看网站| 成人少妇影院yyyy| 亚洲国产精品尤物yw在线观看| 日韩亚洲国产中文字幕欧美| 国产一区二区伦理| 亚洲欧洲精品成人久久奇米网| 欧美无砖砖区免费| 精品一区二区免费在线观看| 国产精品麻豆视频| 精品婷婷伊人一区三区三| 精品一区二区三区久久| 成人欧美一区二区三区| 91.com视频| 成人动漫视频在线| 日本亚洲三级在线| 国产精品九色蝌蚪自拍| 成人国产精品免费观看视频| 国产午夜精品一区二区三区嫩草 | 亚洲九九爱视频| 91精品国产综合久久久久久久久久| 国产一区视频在线看| 亚洲美女视频在线| 久久久久久9999| 欧美日韩午夜影院| 国产精品综合二区| 亚洲一区在线观看免费| 久久日韩精品一区二区五区| 色婷婷综合五月| 极品少妇一区二区三区精品视频 | 91麻豆.com| 久久精品久久综合| 亚洲午夜久久久久中文字幕久| 久久精品视频免费| 在线不卡的av| 一本一道综合狠狠老| 国产在线精品视频| 日韩福利电影在线观看| 亚洲人成网站在线| 国产香蕉久久精品综合网| 日韩一级片在线观看|