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

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

?? pdsocket.cpp

?? 這是由長高科技的開發平臺
?? 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:

    Platform dependent PCMCIA initialization functions

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

#include "PDSocket.h"

//////////////////////////////////////////////////////////////////////////

//#define PCMCIA_DRIVER_KEY TEXT("Drivers\\PCMCIA")
#define FN_SYSINTR_VALUE_NAME TEXT("FnSysIntr")
#define FN_IRQ_VALUE_NAME TEXT("FnIrq")
#define FORCE_FN_SYSINTR_NAME TEXT("ForceFnSysIntr")
#define CONTROLLER_FN_INT_VALUE_NAME TEXT("ControllerFnInt")
#define CSC_SYSINTR_VALUE_NAME TEXT("CSCSysIntr")
#define CSC_IRQ_VALUE_NAME TEXT("CSCIrq")
#define POLLING_MODE_NAME TEXT("PollingMode")
#define POLL_TIMEOUT_NAME TEXT("PollTimeout")
#define DISABLE_SOCKET_NAME TEXT("DisableSocket")
#define CSC_INTERRUPT_DELAY_NAME TEXT("CSCInterruptDelay")

#define CHIPSET_ID_CNT 32
#define CHIPSET_ID_LEN ((CHIPSET_ID_CNT * 9) + 1)

const SS_POWER_ENTRY CPcmciaCardSocket::m_rgPowerEntries[NUM_POWER_ENTRIES] =
{
    { 0,    PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
    { 33,   PWR_SUPPLY_VCC                                     },
    { 50,   PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
    { 120,                   PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 }
};
DWORD CPcmciaCardSocket::ms_dwSocketLastIndex = 1;

CPcmciaCardSocket::CPcmciaCardSocket( CPcmciaBusBridge* pBridge )
{
    m_pBridge = pBridge;
    m_dwSocketIndex = 0;
    while( m_dwSocketIndex == 0 )
    {
        m_dwSocketIndex = ( DWORD )
                          InterlockedIncrement( ( LONG * ) &ms_dwSocketLastIndex ); 
        //Make it is it does not exist.
        CPcmciaCardSocket* pSocket = GetSocket( ( HANDLE ) m_dwSocketIndex );
        if( pSocket != NULL )
        {
            // Duplicated , Retry.
            m_dwSocketIndex = 0;
            pSocket->DeRef();
        }
    }

    DEBUGCHK( m_pBridge );
    while( m_pBridge->LockOwner( 1000 ) != TRUE )
    {
        DEBUGCHK( FALSE );
    }
    DEBUGMSG( ZONE_INIT,
              ( TEXT( "CARDBUS: CPcmciaCardSocket (Socket=%d) Created\r\n" ),
                GetSocketHandle() ) );
}

CPcmciaCardSocket::~CPcmciaCardSocket()
{
    m_pBridge->ReleaseOwner();
    DEBUGMSG( ZONE_INIT,
              ( TEXT( "CARDBUS: CPcmciaCardSocket (Socket=%d) Deleted\r\n" ),
                GetSocketHandle() ) );
}

STATUS CPcmciaCardSocket::GetPowerEntry( PDWORD pdwNumOfEnery,
                                         PSS_POWER_ENTRY pPowerEntry )
{
    STATUS status = CERR_BAD_ARGS;
    if( pdwNumOfEnery != NULL && pPowerEntry != NULL )
    {
        DWORD dwNumOfCopied = min( *pdwNumOfEnery, NUM_POWER_ENTRIES );
        if( dwNumOfCopied != 0 )
        {
            memcpy( pPowerEntry,
                    m_rgPowerEntries,
                    dwNumOfCopied * sizeof( SS_POWER_ENTRY ) );
            *pdwNumOfEnery = dwNumOfCopied;
            status = CERR_SUCCESS;
        }
    }
    return status;
}

UINT16 CPcmciaCardSocket::GetSocketNo()
{
    return m_pBridge->GetSocketNo();
};

CPcmciaBusBridge::CPcmciaBusBridge( LPCTSTR RegPath ) : CPCCardBusBridgeBase( RegPath ),
                                                        CMiniThread( 0,
                                                                     TRUE )
{
    m_dwFnIrq = -1;
    m_fPCICCritSecInitialized = false;
    m_pCardBusResource = NULL;
    m_hISTEvent = NULL;
    m_uSocketNum = ( WORD ) - 1;
    m_pCardSocket = NULL;
    m_fPowerCycleEvent = FALSE;
    m_fCardInjectEvent = FALSE;
    m_fPollingMode = TRUE;
	m_dwCSCInterruptDelay = 0;
};


CPcmciaBusBridge::~CPcmciaBusBridge()
{
    // Terminate IST
    m_bTerminated = TRUE;
    if( m_hISTEvent )
    {
        SetEvent( m_hISTEvent );
        ThreadTerminated( 1000 );
        if( !m_fPollingMode )
        {
            InterruptDisable( m_dwCSCSysIntr );
        }
        CloseHandle( m_hISTEvent );
    };

    if( m_uSocketNum != ( UINT16 ) - 1 )
    {
        GetSocketNumberFromCS( FALSE );
        m_uSocketNum = ( UINT16 ) - 1;
    }

    RemovePcmciaCardSocket();

    if( m_pCardBusResource != NULL )
    {
        delete  m_pCardBusResource;
    }
    if( m_fPCICCritSecInitialized )
    {
        DeleteCriticalSection( &m_PCICCritSec );
    }
}

BOOL CPcmciaBusBridge::InstallIsr()
{
    UINT8 tmp;

    //
    // Disable interrupts
    //
    WritePCICRegister( REG_INTERRUPT_AND_GENERAL_CONTROL, 0 );

	// Management int -> edge triggering(PULSE), System int -> LEVEL triggering 
    WritePCICRegister( REG_GENERAL_CONTROL, MISC1_VCC_33|MISC1_PM_IRQ|MISC1_SPK_ENABLE );
    UINT8 bPat = ReadPCICRegister( REG_GENERAL_CONTROL );
	// 25Mhz_bypass,low_power_dynamic,IRQ12=drive_LED
	WritePCICRegister( REG_GLOBAL_CONTROL, MISC2_LOW_POWER_MODE|MISC2_LED_ENABLE);

	// before configuring timing register, FIFO should be cleared.
	WritePCICRegister( REG_FIFO_CTRL, FIFO_EMPTY_WRITE);    //Flush FIFO

	//default access time is 300ns
	WritePCICRegister( REG_SETUP_TIMING0, 5);                   //80ns(no spec)
	WritePCICRegister( REG_CMD_TIMING0, 20);                  //320ns(by spec,25Mhz clock)
	WritePCICRegister( REG_RECOVERY_TIMING0, 5);                   //80ns(no spec)

	//default access time is 300ns
	WritePCICRegister( REG_SETUP_TIMING1, 2);                   //80ns(no spec)
	WritePCICRegister( REG_CMD_TIMING1, 8);                   //320ns(by spec,25Mhz clock)
	WritePCICRegister( REG_RECOVERY_TIMING1, 2);                   //80ns(no spec)

    if( !m_fPollingMode )
    {
        // PD6710 specific code to enable CSC interrupt (routed to -INTR)
        tmp = CFG_CARD_DETECT_ENABLE | CFG_READY_ENABLE;
        WritePCICRegister( REG_STATUS_CHANGE_INT_CONFIG, tmp );

        // Enable Manage Interrupt
        tmp = ReadPCICRegister( REG_INTERRUPT_AND_GENERAL_CONTROL );
        tmp |= INT_ENABLE_MANAGE_INT;
        WritePCICRegister( REG_INTERRUPT_AND_GENERAL_CONTROL, tmp );
    }
    else
    {
        WritePCICRegister( REG_STATUS_CHANGE_INT_CONFIG, 0 );
    }

    // CreateIST Event
    m_hISTEvent = CreateEvent( 0, FALSE, FALSE, NULL );

    if( !m_fPollingMode )
    {
        // Run IST
        BOOL r = InterruptInitialize( m_dwCSCSysIntr, m_hISTEvent, 0, 0 );
        ASSERT( r );
    }

    return TRUE;
}

#ifdef DEBUG
VOID CPcmciaBusBridge::DumpAllRegisters()
{
    DEBUGMSG( ZONE_FUNCTION, ( TEXT( "Dumping all PCIC registers\r\n" ) ) );
    for( UINT8 nRegNum = 0; nRegNum < 0x40; nRegNum++ )
    {
        UINT8 val;
		if( nRegNum == REG_CARD_STATUS_CHANGE )
			val = -1;
		else
			val = ReadPCICRegister( nRegNum );
        DEBUGMSG( ZONE_FUNCTION,
                  ( TEXT( "%02x: %02x\r\n" ), nRegNum, val ) );
    }
    DEBUGMSG( ZONE_FUNCTION, ( TEXT( "Dump completed.\r\n" ) ) );
}
#endif

//
// Function to set the PCIC index register
//
VOID CPcmciaBusBridge::PCICIndex( UINT8  register_num )
{
    WRITE_PORT_UCHAR( m_PCICIndex, ( UINT8 )( register_num ) );
}

//
// Function to write to the PCIC data register
//
VOID CPcmciaBusBridge::PCICDataWrite( UINT8 value )
{
    WRITE_PORT_UCHAR( m_PCICData, value );
}

//
// Function to read the PCIC data register
//
UINT8 CPcmciaBusBridge::PCICDataRead( VOID )
{
    return READ_PORT_UCHAR( m_PCICData );
}


//
// Verify the PCIC's REG_CHIP_REVISION
//
// This bit of code looks in the 82365 chip revision register (PCIC index 0)
// to see if a valid 82365 is in the system.  The original code only
// recognized the 83h silicon revision.  This indicates REV C silicon from
// Intel.  However, Intel also had a very popular rev B version, and that's
// what the integrated PCMCIA controller on the AMD ElanSC400 emulated.  The
// silicon revision register for that version returned 82h.
//
BOOL CPcmciaBusBridge::IsValidPCICSig( void )
{
    switch( m_vRevision = ReadPCICRegister( REG_CHIP_REVISION ) )
    {
      case 0x82:
      case 0x83:
      case 0x84:
        // for newer chip - can handle 3.3v
        DEBUGMSG( 1,
                  ( TEXT( "PCMCIA:IsValidPCICSig Valid CHIP_REVISION detected = 0x%x at 0x%x\r\n" ),
                    m_vRevision,
                    m_PCICIndex ) );
        return TRUE;
    }
    DEBUGMSG( 1,
              ( TEXT( "PCMCIA:IsValidPCICSig Invalid CHIP_REVISION = 0x%x at 0x%x!!!\r\n" ),
                m_vRevision,
                m_PCICIndex ) );
    return FALSE;
}

//
// Function to get the initial settings from the registry
//
// NOTE: lpRegPath is assumed to be under HKEY_LOCAL_MACHINE
//
// Returns ERROR_SUCCESS on success or a Win32 error code on failure
//
DWORD CPcmciaBusBridge::GetRegistryConfig()
{
    DWORD dwRet = 1;
    DWORD dwSize, dwType, dwData;

    // get the PCMCIA windows configuration
    if( !LoadWindowsSettings() )
    {
        dwRet = ERROR_INVALID_DATA;
        goto grc_fail;
    }

    // get the polling mode value
    dwSize = sizeof( DWORD );
    if( !RegQueryValueEx( POLLING_MODE_NAME,
                          &dwType,
                          ( PUCHAR ) & dwData,
                          &dwSize ) )
    {
        m_fPollingMode = FALSE; // RegQueryValueEx failed, default to FALSE
    }
    else
    {
        m_fPollingMode = dwData ? TRUE : FALSE;
    }

    // get the function interrupt routing configuration

    // Get the controller function interrupt number
    dwSize = sizeof( DWORD );
    if( RegQueryValueEx( CONTROLLER_FN_INT_VALUE_NAME,
                          &dwType,
                          ( PUCHAR ) & dwData,
                          &dwSize ) )
    {
        m_dwControllerFnIntNo = dwData;
    }
    else
    {
        dwRet = FALSE;
        goto grc_fail;
    }

    // Get the function interrupt SYSINTR or IRQ value

    // First try to get the IRQ value
    dwSize = sizeof( DWORD );
    if( RegQueryValueEx( FN_IRQ_VALUE_NAME,
                        &dwType,
                        ( PUCHAR ) & dwData,
                        &dwSize ) )
    {
        m_dwFnSysIntr = SYSINTR_UNDEFINED;
        m_dwFnIrq = dwData;

        // check if we should automatically convert the IRQ to SYSINTR value
        dwSize = sizeof( DWORD );
        if( RegQueryValueEx( FORCE_FN_SYSINTR_NAME,
                              &dwType,
                              ( PUCHAR ) & dwData,
                              &dwSize ) )
        {
            if( dwData )
            {
                // Convert the interrupt to a logical sysintr value.
                if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &m_dwFnIrq, sizeof(DWORD), &m_dwFnSysIntr, sizeof(DWORD), NULL))
                {
                    RETAILMSG(1, (TEXT("PCMCIA: Failed to obtain function interrupt information!\r\n")));
                    m_dwFnSysIntr = SYSINTR_UNDEFINED;
                    dwRet = ERROR_INVALID_DATA;
                    goto grc_fail;
                }
                m_dwFnIrq = -1;
            }
        }
    }
    else
    {
        // IRQ value was not specified, try to get the SYSINTR value
        dwSize = sizeof( DWORD );
        if( RegQueryValueEx( FN_SYSINTR_VALUE_NAME,
                              &dwType,
                              ( PUCHAR ) & dwData,
                              &dwSize ) )
        {
            m_dwFnSysIntr = dwData;
            m_dwFnIrq = -1;
        }
        else
        {
            RETAILMSG(1, (TEXT("PCMCIA: Failed to obtain function interrupt information!\r\n")));
            dwRet = ERROR_INVALID_DATA;
            goto grc_fail;
        }
    }

    // get card status change interrupt routing configuration
    m_dwCSCSysIntr = SYSINTR_UNDEFINED;

    dwSize = sizeof( DWORD );
    if( RegQueryValueEx( CSC_SYSINTR_VALUE_NAME,
                            &dwType,
                            ( PUCHAR ) & dwData,
                            &dwSize ) )
    {
        m_dwCSCSysIntr = dwData;
    }
    else
    {
        dwSize = sizeof( DWORD );
        if( !RegQueryValueEx( CSC_IRQ_VALUE_NAME,
                                &dwType,
                                ( PUCHAR ) & dwData,
                                &dwSize ) )
        {
            m_fPollingMode = TRUE;
        }
        else
        {
            // Convert the interrupt to a logical sysintr value.
            if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwData, sizeof(DWORD), &m_dwCSCSysIntr, sizeof(DWORD), NULL))
            {
                RETAILMSG(1, (TEXT("PCMCIA: Failed to obtain sysintr value for CSC interrupt.\r\n")));
                m_dwCSCSysIntr = SYSINTR_UNDEFINED;
                m_fPollingMode = TRUE;
            }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲天堂av一区| 日韩午夜精品电影| 亚洲欧美日本在线| 国产成人免费视频精品含羞草妖精 | 91在线丨porny丨国产| 欧日韩精品视频| 在线综合视频播放| 久久久久久久精| 亚洲成精国产精品女| 免费一级片91| 一本久久a久久精品亚洲| 精品国产欧美一区二区| 日韩激情一二三区| 欧美日韩精品福利| 久久久99精品免费观看不卡| 中文字幕日本乱码精品影院| 激情文学综合插| 欧美一区二区久久| 午夜精品视频在线观看| 成人精品免费视频| 精品国产一区二区精华| 麻豆一区二区99久久久久| 色综合久久久久| 91精品久久久久久久久99蜜臂| 欧美大片免费久久精品三p | 欧美自拍偷拍一区| 亚洲成人777| 日韩视频在线永久播放| 一区二区在线免费观看| 色婷婷精品大在线视频| 一区二区三区在线观看欧美| 欧美卡1卡2卡| 韩国成人在线视频| 国产精品五月天| 欧美一区二区日韩| 三级久久三级久久久| 成人教育av在线| 日本成人中文字幕| 中文字幕欧美区| 欧美成人a在线| 91精品欧美福利在线观看| 国内成+人亚洲+欧美+综合在线 | 日韩一区二区三区免费观看| 国产精品一区二区男女羞羞无遮挡| 色欧美88888久久久久久影院| 亚洲欧美激情一区二区| 欧美人妖巨大在线| 懂色av一区二区夜夜嗨| 3d动漫精品啪啪1区2区免费 | 亚洲午夜在线观看视频在线| 欧美一区二区三区在线电影| 国产91丝袜在线观看| 亚洲成在人线免费| 一区二区三区日韩欧美| 精品黑人一区二区三区久久| 色综合天天视频在线观看| 久久精品国产亚洲高清剧情介绍| 中文字幕一区视频| 国产精品伦理在线| 日本不卡一区二区| 亚洲国产成人91porn| 日日夜夜免费精品| 午夜av电影一区| 全国精品久久少妇| 精品亚洲porn| 丝袜诱惑制服诱惑色一区在线观看| 中文字幕乱码久久午夜不卡| 精品三级av在线| 一区二区视频在线看| 久久精品夜夜夜夜久久| 亚洲国产一区二区三区| 三级不卡在线观看| 亚洲品质自拍视频| 国产精品麻豆欧美日韩ww| 日韩一区二区精品| 国产精品情趣视频| 亚洲一区二区在线观看视频| 蜜臀久久久久久久| 91国偷自产一区二区三区成为亚洲经典 | 久久精品国产精品亚洲综合| 国产乱国产乱300精品| 成人自拍视频在线| 欧美在线播放高清精品| 精品国产91亚洲一区二区三区婷婷| 欧美成人三级在线| 亚洲午夜一区二区三区| 麻豆精品视频在线| 成人精品视频一区| 制服.丝袜.亚洲.另类.中文| 精品国产91乱码一区二区三区| 国产精品麻豆欧美日韩ww| 一区二区三区在线看| 日韩国产一区二| 国产在线一区二区综合免费视频| 成人福利视频在线看| 欧美mv日韩mv亚洲| 日韩高清不卡一区| 欧美日韩亚洲综合在线| 国产精品午夜在线观看| 国产一区二区三区四区五区美女| 欧美精品一级二级三级| 亚洲午夜av在线| 91玉足脚交白嫩脚丫在线播放| 精品第一国产综合精品aⅴ| 午夜不卡在线视频| 欧美日韩视频在线观看一区二区三区 | 欧美日韩www| 卡一卡二国产精品| 久久久亚洲综合| 国产成人免费视频网站| 国产欧美日韩另类一区| 99精品久久免费看蜜臀剧情介绍| 久久精品欧美一区二区三区不卡 | 欧美日韩一区国产| 日韩国产精品久久久| 久久精品这里都是精品| 91啪亚洲精品| 午夜激情久久久| 国产日产欧美一区二区三区 | 久久久国产一区二区三区四区小说 | 久久国产精品免费| 色吊一区二区三区| 中文字幕一区二区三区蜜月| 99精品视频一区二区| 国产精品视频第一区| 成人一区二区三区视频在线观看| 日韩欧美一区二区视频| 国产精品一区二区在线观看不卡 | 成人国产亚洲欧美成人综合网| 日韩三级av在线播放| 精品一区二区在线观看| 欧美一区中文字幕| 国产一区二区在线观看视频| 国产欧美日韩视频在线观看| 99精品国产热久久91蜜凸| 91精品国产综合久久久蜜臀图片| 久久精品国产99久久6| 国产女主播视频一区二区| 91免费观看视频在线| 久久99精品久久久久久动态图| 国产精品色一区二区三区| 在线影院国内精品| 日韩av电影免费观看高清完整版| 欧美日韩视频在线第一区| 丰满少妇在线播放bd日韩电影| 欧美国产一区二区在线观看| 91久久线看在观草草青青| 国产一区二区视频在线| 免费黄网站欧美| 日韩精品一级二级| 亚洲丝袜精品丝袜在线| 国内精品久久久久影院薰衣草| 亚洲成人免费电影| 国产精品精品国产色婷婷| 91精品免费观看| 国产福利精品导航| 国产成人综合在线| 不卡高清视频专区| 成人精品小蝌蚪| aaa国产一区| 91国在线观看| 欧美日韩一区二区三区在线看| 捆绑调教美女网站视频一区| 麻豆精品视频在线观看视频| 国内精品视频666| 久久国产精品99久久人人澡| 亚洲国产精品国自产拍av| 国产日韩一级二级三级| thepron国产精品| 一本色道亚洲精品aⅴ| 欧美最猛黑人xxxxx猛交| 欧美乱妇一区二区三区不卡视频| 色天使色偷偷av一区二区| 欧美片网站yy| 色婷婷av一区| 日韩欧美一区电影| 国产三级精品三级| 三级精品在线观看| 国产成人精品亚洲777人妖 | 成人h动漫精品一区二区| 91成人看片片| 亚洲裸体xxx| 国产精品一区三区| 日韩三级av在线播放| 一区二区成人在线| 99久久国产综合精品女不卡| 日韩三级免费观看| 国产精品国产三级国产普通话三级| 国产乱子伦视频一区二区三区| 欧美另类videos死尸| 亚洲欧美偷拍另类a∨色屁股| 免费成人深夜小野草| 欧美欧美欧美欧美首页| 一区二区三区精密机械公司| 一区二区三区四区蜜桃| 色婷婷国产精品综合在线观看| 国产日韩一级二级三级| 另类小说欧美激情| 色综合久久天天综合网| 91精品国产高清一区二区三区|