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

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

?? pdds3c2440_ser.cpp

?? 三星2440 cpu WINCE 5.00板級支持包
?? CPP
?? 第 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:

    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();    

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人一区二区| 一区二区久久久久久| 久久国产尿小便嘘嘘| 奇米色一区二区| 日韩精品一卡二卡三卡四卡无卡| 亚洲欧美日韩国产综合| 国产精品三级在线观看| 精品乱人伦小说| 亚洲成人av在线电影| 欧美一级艳片视频免费观看| 91在线porny国产在线看| 成人免费毛片a| 色婷婷av一区二区三区gif| 不卡av电影在线播放| 99国产精品久久| 欧美综合天天夜夜久久| 欧美午夜精品电影| 日韩一级欧美一级| 国产日韩在线不卡| 亚洲日本韩国一区| 午夜精品影院在线观看| 精品一区二区日韩| av激情成人网| 欧美一级艳片视频免费观看| 久久嫩草精品久久久久| 最新热久久免费视频| 午夜影院久久久| 国产一二精品视频| 欧美丝袜自拍制服另类| 欧美不卡一区二区三区| 亚洲人成伊人成综合网小说| 日本不卡一区二区| 不卡视频一二三| 欧美一级片在线看| 国产精品国产三级国产普通话蜜臀 | 在线观看免费视频综合| 欧美一区2区视频在线观看| 国产精品久久一卡二卡| 日韩av电影天堂| 色综合久久综合中文综合网| 欧美一区二区三区喷汁尤物| 国产精品福利影院| 久久99久国产精品黄毛片色诱| 色综合久久99| 国产视频亚洲色图| 麻豆国产精品视频| 欧美自拍偷拍一区| 国产精品无遮挡| 国内一区二区在线| 欧美狂野另类xxxxoooo| 自拍偷拍欧美激情| 91在线一区二区| 国产精品每日更新| 26uuu国产日韩综合| 国产91综合一区在线观看| 国产片一区二区| 欧美性极品少妇| 亚洲国产精品久久久久秋霞影院| 在线欧美小视频| 日韩不卡在线观看日韩不卡视频| 日韩视频免费观看高清完整版| 99re这里只有精品首页| 国产精品三级在线观看| 亚洲欧美日韩国产手机在线| 国产精品18久久久久久久久| 欧美一区二区三区免费在线看 | 欧美色手机在线观看| 中文字幕欧美一| 成人av网在线| 国产精品美女视频| 国产高清不卡二三区| 亚洲精品在线电影| 精品一区二区免费视频| 日韩美女在线视频| 久久疯狂做爰流白浆xx| 日韩亚洲欧美中文三级| 美脚の诱脚舐め脚责91| 日韩欧美一级二级三级久久久| 日本一区中文字幕| 精品久久久久久亚洲综合网| 精品一区二区成人精品| 久久这里只有精品6| 国模冰冰炮一区二区| 国产欧美视频一区二区| www.成人网.com| 亚洲美女区一区| 精品视频在线视频| 美女网站在线免费欧美精品| 亚洲精品在线一区二区| 国产999精品久久久久久绿帽| 欧美激情在线一区二区三区| 一本色道久久综合精品竹菊| 洋洋成人永久网站入口| 日韩女同互慰一区二区| 国产精品996| 亚洲天堂2016| 91精品国产一区二区| 国产成人a级片| 一区二区在线观看免费 | 国产成人在线视频免费播放| 亚洲欧洲无码一区二区三区| 欧美日韩综合在线免费观看| 精品一区二区国语对白| 亚洲免费观看视频| 日韩亚洲欧美高清| 成人一区二区视频| 亚洲国产精品久久一线不卡| 日韩欧美国产一二三区| 99久精品国产| 久久电影网站中文字幕 | 久久精品99久久久| 日韩一区欧美一区| 日韩欧美视频在线| 91麻豆自制传媒国产之光| 热久久国产精品| 亚洲免费看黄网站| 国产视频一区二区在线| 欧美精品在线一区二区三区| 丁香激情综合五月| 久久99精品久久久| 亚洲综合偷拍欧美一区色| 国产欧美视频在线观看| 日韩午夜激情视频| 在线亚洲欧美专区二区| 成人综合婷婷国产精品久久蜜臀| 青青草97国产精品免费观看 | www.日韩av| 国产麻豆一精品一av一免费| 亚洲自拍欧美精品| 亚洲视频免费看| 欧美国产激情一区二区三区蜜月| 欧美酷刑日本凌虐凌虐| 97久久超碰国产精品| 国产精品自在在线| 卡一卡二国产精品 | 久久久不卡影院| 日韩一区二区三免费高清| 色88888久久久久久影院按摩 | 欧美另类高清zo欧美| 91色porny在线视频| 国产一区二区久久| 精品影视av免费| 麻豆国产91在线播放| 日本女优在线视频一区二区| 亚洲第一久久影院| 亚洲成人福利片| 亚洲gay无套男同| 亚洲综合色成人| 亚洲午夜日本在线观看| 亚洲综合久久av| 亚洲丶国产丶欧美一区二区三区| 一区二区久久久| 亚洲成人在线网站| 日韩成人午夜精品| 精品一区二区三区av| 韩日av一区二区| 成人爽a毛片一区二区免费| 国产成人午夜精品5599| 国产宾馆实践打屁股91| caoporm超碰国产精品| 91亚洲男人天堂| 欧美三级电影在线观看| 欧美一区二区在线不卡| 日韩区在线观看| 久久久精品天堂| 亚洲免费资源在线播放| 亚洲一区二区偷拍精品| 日日骚欧美日韩| 国产成人综合自拍| 91亚洲永久精品| 欧美精品视频www在线观看| 欧美一级理论性理论a| 国产欧美视频在线观看| 一区二区三区四区亚洲| 无吗不卡中文字幕| 黄一区二区三区| av一区二区三区在线| 欧美人狂配大交3d怪物一区| 日韩欧美电影一二三| 中文字幕一区二区三区在线播放| 一区二区三区蜜桃| 久久99最新地址| 91日韩一区二区三区| 宅男噜噜噜66一区二区66| 国产亚洲人成网站| 亚洲高清视频中文字幕| 国产成人综合亚洲网站| 欧美性受xxxx黑人xyx性爽| 精品少妇一区二区三区在线视频| 国产精品久久久久久久久免费桃花| 亚洲最色的网站| 国产高清一区日本| 欧美日韩国产高清一区二区三区| 久久中文娱乐网| 亚洲一区免费在线观看| 成人永久aaa| 欧美成人精品福利| 亚洲国产视频一区| 从欧美一区二区三区| 欧美成人精品福利|