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

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

?? phcd.cpp

?? ISP1161 USB Driver under WinCE for StrongARM processor implementation
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/*++
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.
Copyright (c) 1995-1998  Microsoft Corporation

Module Name:  
    phcd.cpp
Abstract:  
    This file implements the USB host controller driver for the
    Open HCI interface.
    
Notes: 

--*/


// There are four warnings that I like from Warning level 4.  Since we build
// at warning level 3, I'm setting these four down to level 3 so I still get
// them.
// C4100 unrefrenced formal parameter
// C4101 unrefrenced local variable
// C4705 statement has no effect
// C4706 assignment in conditional
#pragma warning (3 : 4100 4101 4705 4706)

#include <windows.h>
extern "C" {  // nkintr.h now contains this, but autopc doesn't have the latest,
              // so include here as well for now.
#include <nkintr.h>
}
#include <ceddk.h>
#include <phcdddsi.h>

#include "hcdi.h"
#include "globals.hpp"
#include "mem.hpp"
#include "hub.hpp"
#include "phcdinc.hpp"
#include "phcd.hpp"
#include "bcr.h"


#undef ZONE_HUB
#define ZONE_HUB 0

#undef ZONE_TD
#define ZONE_TD 0

#undef ZONE_WARNING
#define ZONE_WARNING 2

#define ISPDBG 0

#define PLAT_STRONGARM 

extern "C" PVOID VirtualAllocCopy(unsigned size,char *str,PVOID pVirtualAddress);

// This flag will cause our free routines to overwrite structures with invalid
// data, to verify that no one is still accessing them.  For test only.
#undef  OVERWRITE_STRUCTS_ON_FREE
#ifdef  OVERWRITE_STRUCTS_ON_FREE
#define INVALID_STRUCT_DATA 0xff
#endif

// Define the following constant to be gcTdNoInterrupt to cause the HC to
// be interrupted only at the end of each transfer; this has some unpleasant
// side effects at the moment due to the way in which transfers are aborted
// and the fact that we don't track TDs well enough; nonetheless, you can get
// a performance gain with that setting if you don't do frequent power-suspend
// operations or hot-plugging of USB devices.
// Define the constant to be zero to get interrupts on every single TD.
// Note that we always arrange for an interrupt on the last TD of any transfer.

#define TDIRQ_NORM 0

#define NUM_ELEMENTS(a)  ((sizeof(a) / sizeof(a[0])))

const TCHAR gcszUSBDFileName[]     = TEXT("USBD.DLL");
const TCHAR gcszHcdAttach[]        = TEXT("HcdAttach");
const TCHAR gcszHcdDetach[]        = TEXT("HcdDetach");
const TCHAR gcszHcdDeviceAttach[]  = TEXT("HcdDeviceAttached");
const TCHAR gcszHcdDeviceDettach[] = TEXT("HcdDeviceDetached");

// Definitions for accessing PHCI registry values
const TCHAR gcPhciKeyName[]              = TEXT("Drivers\\PHCI");
const TCHAR gcPhciRsvdBandwidthValName[] = TEXT("ReservedBandwidth");


//#ifdef DEBUG
#if 1
static const TCHAR *szCfgStateStrings[] =
{
   TEXT("NoState"),
   TEXT("UsingAddr0"),
   TEXT("GettingInitialDescriptor"),
   TEXT("SettingAddress"),
   TEXT("GettingDeviceDescriptor"),
   TEXT("GettingInitialConfig"),
   TEXT("GettingConfig"),
   TEXT("SettingConfig"),
   TEXT("DoneConfig"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("HubGettingDescriptor"),
   TEXT("HubConfiguring"),
   TEXT("HubPoweringPorts"),
   TEXT("HubReady"),
   TEXT("HubClearingChanges"),
   TEXT("HubGettingPortStatus"),
   TEXT("HubStartingPortReset"),
   TEXT("HubResettingPort"),
   TEXT("HubWaitingForPortReset"),
   TEXT("HubWaitingForPortShutoff"),
   TEXT("HubKillingPort"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("Unused"),
   TEXT("HubWaitingForHubClearFlags"),
   TEXT("HubClearingLocalPowerFlag"),
   TEXT("HubClearingOverCurrentFlag"),
};

#define CONFIG_STATE_STR(pDev)  (( pDev->configStatus < NUM_ELEMENTS(szCfgStateStrings)) ? \
                                   szCfgStateStrings[pDev->configStatus] : TEXT("Invalid"))
#endif

// Inline function to copy data to or from a client buffer.  Return successful
// if copy was successful, or invalidBuffer if an exception occurs while copying
// the data.
//
// Note the dwPerms parameter - this is used for the PHCI interrupt thread, which
// may have different process permissions than the client that initiated the 
// transfer (e.g. if client driver exposes another interface and some application
// calls through with a buffer).  This isn't necessary as long as we are in the
// context of the thread that owns the memory, since permissions are automatically
// added in a PSL call.
static inline EError
CopyClientData(PUCHAR pDst, PUCHAR pSrc, UINT cLen, DWORD dwPerms)
{
    DWORD dwOldPerms;
    EError eRet;

    // Set process permissions for accessing client buffer, if necessary
    if (dwPerms)
        dwOldPerms = SetProcPermissions(dwPerms);
    __try {
        memcpy(pDst,pSrc,cLen);
        eRet = successful;
    }
    __except (EXCEPTION_EXECUTE_HANDLER) {
        ERRORMSG(1,(TEXT("!PHCD: Exception copying client data: 0x%X-->0x%X (%u)\r\n"),
                     pSrc,pDst,cLen));
        eRet = invalidPtr;
    }
    if (dwPerms)
        SetProcPermissions(dwOldPerms);
    return eRet;
}

ULONG CALLBACK CPhcd::UsbDriverThreadStub(PVOID context)
{
    CPhcd* pHcd = (CPhcd*)context;
    return(pHcd->UsbDriverThread());
}

#ifdef USE_CRITICAL_THREAD
ULONG CALLBACK CPhcd::UsbDriverCriticalThreadStub(PVOID context)
{
    CPhcd* pHcd = (CPhcd*)context;
    return(pHcd->UsbDriverCriticalThread());
}
#endif // USE_CRITICAL_THREAD


ULONG CALLBACK CPhcd::Isp1161AuxThreadStub (PVOID context)
{
    CPhcd* pHcd = (CPhcd*)context;
    return(pHcd->Isp1161AuxThread());
}

DWORD CPhcd::Isp1161AuxThread(void)
{

	RETAILMSG(1, (TEXT("PHCD: Enter Isp1161AuxThread\r\n")));

	while (!m_bClosing)
    {
		WaitForSingleObject(m_hUsbInterrupt, INFINITE);
		RETAILMSG(1, (TEXT("PHCD: Got one interrupt\r\n")));

		InterruptDone(m_sysIntr);
	}
//	DumpRegisters();
	return 0;
}



CPhcd::CPhcd(LPVOID pvPhcdPddObject, CPhysMem * pobMem,
        LPCWSTR szDriverRegistryKey, REGISTER regBase, DWORD dwSysIntr)
{
    extern HCD_FUNCS gc_HcdFuncs;

    //save this to pass on the the USBD
    UnusedParameter(szDriverRegistryKey);

    UINT index;

    m_pHcdFuncs = &gc_HcdFuncs;

    m_pvPhcdPddObject = pvPhcdPddObject;
    m_pobMem = pobMem;
    m_regBase = regBase;
	
    m_sysIntr = dwSysIntr;

    m_nAdjustFrame = 0;
    m_fAdjust = FALSE;
    m_hAdjustmentEvent = NULL;

    m_numRootHubPorts = 0;
    m_PowerOnToPowerGoodTime = 0;
    m_bAddr0Busy = FALSE;
    m_addrThatOwnsAddr0 = 0;
    m_numPortsWaitingForAddr0 = 0;
    m_addr0CurRetryValue = 0;
    m_schedOverrunCount = 0;

    m_pHcca = NULL;
    m_paLastIntrEd = NULL;
                                                      
    DEBUGMSG(ZONE_INIT, (TEXT("PHCD: SysIntr = %d, regBase = 0x%X\r\n"),
             dwSysIntr, regBase));

    m_bClosing = FALSE;
    m_bPoweredUpAfterPowerDown = FALSE;
    m_fStabilizing = FALSE;

    m_fTimeWarp = FALSE;
    m_fWDH = FALSE;
    m_fSF = FALSE;
    m_fRHSC = FALSE;
    m_fSO = FALSE;
    m_fUE = FALSE;
    m_fFNO = FALSE;

    m_paWriteBackDone = 0;
    m_paWriteBackDone2 = 0;
    m_paLastWriteBackDone = 0;

    m_hClientDriverComplete = NULL;
    m_hUsbPsudoInterrupt = NULL;
    
    m_fCriticalRunning = FALSE;
#ifdef USE_CRITICAL_THREAD
    m_cCriticalTds = 0;
    m_hReleaseCriticalThread = NULL;
    m_hCriticalThreadDone = NULL;
    m_hCriticalThread = NULL;
#endif

    m_hUsbInterrupt = NULL;
    m_hIsrThread = NULL;

    m_nReserveFakeBandwidth  = 0;

	//Zouying
	m_EdpointServicedOne1ms  = 0;
	
	m_TdsPutToATLIndex       = 0;
	m_TdsPutToITLFirstIndex  = 0;
	m_TdsPutToITLSecondIndex = 0;

	
	m_ATLTransferLen		 = 0;


	m_ATLBeingReadOut		 = FALSE;
	m_bReDump				 = FALSE;
	
	for(UINT i=0; i< sizeof(m_bsPTDReDump)/sizeof(BOOL); i++)
		m_bsPTDReDump[i] = FALSE;

	m_DataToggleBit			 = 1;
	uFrameNumber			 = 0;
	uTimes					 = 0;

	
	m_HcBulkHeadED			= 0;
    m_HcBulkCurrentED		= 0;
	m_HcControlHeadED		= 0;
	m_HcControlCurrentED	= 0;
	m_HcHCCA				= 0;
	m_HcPeriodCurrentED		= 0;
	m_HcDoneHead			= 0;
	m_HcPeriodicStart		= 0;

	m_HcControlCBSR			= 4;
	m_HcControlPLE			= 0;
	m_HcControlIE			= 0;
	m_HcControlCLE			= 0;
	m_HcControlBLE			= 0;

	m_HcCommandCLF			= 0;
	m_HcCommandBLF			= 0;
	
	// Allow fake bandwidth to be initialized via registry.  This gives platforms
    // a way to account for delays in accessing the host bus, etc.
    HKEY hKey;
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,gcPhciKeyName,0,KEY_READ,&hKey) == ERROR_SUCCESS) 
	{
        DWORD dwSize = sizeof(m_nReserveFakeBandwidth);
        
		if (RegQueryValueEx(hKey,gcPhciRsvdBandwidthValName,NULL,NULL,
                            (UCHAR *)&m_nReserveFakeBandwidth,&dwSize) == ERROR_SUCCESS) 
		{
            DEBUGMSG(ZONE_INIT,(TEXT("PHCD: Reserved bandwidth read from registry: %u\r\n"),
                                m_nReserveFakeBandwidth));
        }
        RegCloseKey(hKey);
    }

    m_dwFrameNumber = 0;

    m_pFreeSEdInfoHead = NULL;
    m_pFreePhysAddrHead = NULL;
    m_pFreeTransferHead = NULL;
    m_pFreeSTdInfoHead = NULL;

    m_curMaxNumDevices = gcInitialMaxNumDevices;
    m_ppDevices = new SDevice * [gcInitialMaxNumDevices];
    for (index = 0; index < gcInitialMaxNumDevices; index++)
    {
        m_ppDevices[index] = NULL;
    }

    m_pTdProcessList = NULL;
    m_pEdRemovalList = NULL;

    m_hUSBDInstance = NULL;
    m_pAttachProc = NULL;
    m_pDetachProc = NULL;

    m_pFreeThreadParamsHead = NULL;
    m_pActiveThreadParamsHead = NULL;

    InitializeCriticalSection(&m_csSTdInfoListLock);
    InitializeCriticalSection(&m_csThreadParamListLock);
    InitializeCriticalSection(&m_csAddr0Lock);
    InitializeCriticalSection(&m_csDeviceListLock);
    InitializeCriticalSection(&m_csOtherListsLock);
    InitializeCriticalSection(&m_csFrameAdjustment);
    InitializeCriticalSection(&m_csPortPower);
    InitializeCriticalSection(&m_csEdInfoListsLock);
    InitializeCriticalSection(&m_csTdListsLock);
    InitializeCriticalSection(&m_csScheduleLock);

#ifdef USE_CRITICAL_THREAD
    InitializeCriticalSection(&m_csClientInstallCriticalThread);
    InitializeCriticalSection(&m_csCriticalTds);
#endif // USE_CRITICAL_THREAD

    // now we check for certain values to ensure that the HC is present
    __try
    {

		
#ifdef PLAT_STRONGARM
		//edge trigger, active high, 16-bits
		WRITE_REGISTER_USHORT(HcWRHwConfig(m_regBase), 0x2F);
#else
		//Hardware config write, 
		//level trigger, active high, 16-bits
		WRITE_REGISTER_USHORT(HcWRHwConfig(m_regBase), 0x2D);
#endif
		//Hardware config read
		USHORT temp = READ_REGISTER_USHORT(HcRDHwConfig(m_regBase));
				
		RETAILMSG(1, (TEXT("PHCD: Hardware config %x\r\n"), temp));

		if(m_regBase)
        {
			DWORD dwRevision = READ_REGISTER_ULONG(HcRevision(m_regBase));
			
            if((dwRevision & gcHcRevisonMask) != gcHcRevisonNominal)
                m_regBase = 0;
        }
		
        if(m_regBase)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一二三区在线观看| 色88888久久久久久影院按摩| 91精品国产丝袜白色高跟鞋| 亚洲成av人片一区二区梦乃| 欧美日本韩国一区| 免费日本视频一区| 日韩欧美一级片| 国产一区二区精品久久99| 久久久久88色偷偷免费| 不卡视频一二三四| 亚洲午夜在线观看视频在线| 欧美丰满少妇xxxbbb| 激情五月激情综合网| 国产欧美中文在线| 91美女视频网站| 一级日本不卡的影视| 7777精品伊人久久久大香线蕉的| 免费精品视频在线| 欧美国产成人在线| 欧美伊人久久久久久午夜久久久久| 亚洲国产欧美在线人成| 日韩三级av在线播放| 福利电影一区二区三区| 亚洲精品国产一区二区精华液 | 欧美精品一区二| 懂色av一区二区三区免费看| 国产精品久久久久久妇女6080 | 成人免费高清视频在线观看| 亚洲男女一区二区三区| 日韩欧美一区二区久久婷婷| 成人黄色综合网站| 天堂av在线一区| 日本一区二区综合亚洲| 欧美三级韩国三级日本三斤| 韩国视频一区二区| 亚洲最新在线观看| wwww国产精品欧美| 欧美亚洲国产一区在线观看网站 | 精品久久国产老人久久综合| 成人av在线播放网址| 日韩中文字幕不卡| 国产精品欧美一级免费| 欧美一区在线视频| 91视频在线看| 国产精品一区免费视频| 天天亚洲美女在线视频| 国产精品第四页| 日韩欧美在线一区二区三区| 91社区在线播放| 国产精品亚洲一区二区三区在线| 一区二区三区中文字幕精品精品 | 99精品欧美一区二区三区综合在线| 日韩电影在线一区二区| 综合分类小说区另类春色亚洲小说欧美 | 亚洲欧美综合另类在线卡通| 日韩欧美久久久| 欧美日韩免费视频| 91香蕉视频在线| 成人精品一区二区三区四区| 日本在线不卡一区| 亚洲电影激情视频网站| 亚洲视频资源在线| 国产精品电影一区二区| 欧美精品一区二区三区久久久| 欧美日韩久久久| 欧美在线影院一区二区| av动漫一区二区| 福利一区福利二区| 国产乱码字幕精品高清av| 久久福利资源站| 男女激情视频一区| 日韩在线a电影| 午夜天堂影视香蕉久久| 亚洲影视在线播放| 一区二区高清免费观看影视大全 | 欧美午夜宅男影院| 色哟哟欧美精品| 91在线视频播放地址| 播五月开心婷婷综合| 成人精品国产福利| 成人激情动漫在线观看| 99riav一区二区三区| 成人久久视频在线观看| 不卡av电影在线播放| 97精品国产露脸对白| 日本韩国欧美在线| 欧美视频三区在线播放| 欧美日韩久久久| 3d动漫精品啪啪| 日韩免费观看2025年上映的电影| 欧美精品 日韩| 日韩三级精品电影久久久| 精品国产免费人成在线观看| 欧美mv和日韩mv国产网站| 26uuu国产在线精品一区二区| 精品国产免费一区二区三区香蕉| 国产亚洲精品aa午夜观看| 欧美国产欧美亚州国产日韩mv天天看完整| 国产亚洲成av人在线观看导航| 国产亚洲精品福利| 亚洲欧美视频在线观看视频| 亚洲一区二区三区视频在线播放| 亚洲成av人片在www色猫咪| 免费高清不卡av| 国产一区二区三区黄视频| 国产成人免费在线| av欧美精品.com| 欧美三级欧美一级| 精品久久久久久久久久久久久久久久久| 久久综合九色综合97婷婷| 亚洲国产精品激情在线观看| 中文字幕亚洲欧美在线不卡| 亚洲欧美视频在线观看视频| 日韩精品乱码免费| 国产福利一区二区三区视频| 91美女蜜桃在线| 欧美一级淫片007| 亚洲欧洲另类国产综合| 视频在线观看一区| 国产成人在线免费| 欧美性猛交xxxx乱大交退制版| 精品欧美一区二区在线观看| 亚洲天堂av老司机| 麻豆国产一区二区| 91蜜桃传媒精品久久久一区二区| 欧美精品 日韩| 国产精品久久综合| 日韩在线一区二区| 成人免费毛片aaaaa**| 欧美精品在线视频| ●精品国产综合乱码久久久久| 丝袜美腿亚洲一区二区图片| 成人激情校园春色| 91精品国产一区二区三区| 国产精品超碰97尤物18| 日本三级亚洲精品| 色婷婷一区二区| 久久久www免费人成精品| 亚洲国产欧美在线| 成人18精品视频| 欧美精品一区二区蜜臀亚洲| 亚洲综合av网| av在线播放一区二区三区| 日韩精品一区国产麻豆| 亚洲成人av福利| 91在线视频免费观看| 国产午夜精品一区二区三区视频 | 狂野欧美性猛交blacked| 色婷婷av一区二区三区之一色屋| 精品久久国产老人久久综合| 亚洲综合一区二区三区| jiyouzz国产精品久久| 日韩精品一区二区三区四区视频 | 国产精品国产三级国产aⅴ无密码| 美女被吸乳得到大胸91| 欧美日本不卡视频| 亚洲国产中文字幕在线视频综合| 成人av在线网站| 中文天堂在线一区| 成人性生交大片免费看中文 | 国产精品天美传媒| 国产一区中文字幕| 欧美一卡二卡三卡| 日韩—二三区免费观看av| 在线国产电影不卡| 日韩毛片高清在线播放| av在线免费不卡| 亚洲欧洲av在线| 色香蕉久久蜜桃| 亚洲自拍偷拍av| 欧美日韩高清一区二区三区| 亚洲午夜免费视频| 欧美日韩免费电影| 首页国产欧美久久| 日韩精品专区在线影院观看| 麻豆国产精品官网| 精品久久久久久久久久久久久久久久久| 奇米一区二区三区av| 欧美一级片在线看| 麻豆国产一区二区| 久久免费偷拍视频| 成人一区二区三区视频| 中文字幕一区不卡| 91麻豆自制传媒国产之光| 亚洲与欧洲av电影| 正在播放亚洲一区| 免费成人你懂的| 国产日韩精品视频一区| caoporm超碰国产精品| 亚洲欧美激情插| 欧美色成人综合| 久草中文综合在线| 久久久久久免费| 91免费精品国自产拍在线不卡| 伊人婷婷欧美激情| 欧美一区二区三区视频| 国产精品羞羞答答xxdd| 亚洲男人的天堂在线aⅴ视频 | 99re视频精品| 亚洲成人777|