亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
成人av网在线| 欧美国产丝袜视频| 国产精品护士白丝一区av| 樱花草国产18久久久久| 韩国女主播成人在线| 欧美亚洲动漫制服丝袜| 国产日韩影视精品| 久久99九九99精品| 欧美特级限制片免费在线观看| 久久久久久免费网| 蜜桃一区二区三区在线| 色八戒一区二区三区| 欧美国产成人精品| 国产成人精品影视| 久久综合九色综合97婷婷女人| 亚洲成va人在线观看| 色婷婷久久久亚洲一区二区三区| 久久精品人人爽人人爽| 裸体歌舞表演一区二区| 欧美一区二区三区免费视频| 亚洲精品国产一区二区精华液 | 亚洲黄色尤物视频| 99精品视频在线播放观看| 国产日本欧洲亚洲| 国产福利精品导航| 久久久精品国产免大香伊 | 色综合久久久久综合99| 国产午夜精品福利| 大尺度一区二区| 国产精品女同互慰在线看| 国产成人aaaa| 国产精品美女一区二区三区| 国产不卡视频在线观看| 中文字幕国产精品一区二区| 成人av资源下载| 亚洲乱码国产乱码精品精小说| 成人一级视频在线观看| 欧美国产禁国产网站cc| 成人黄色在线视频| 亚洲黄一区二区三区| 欧美吻胸吃奶大尺度电影| 亚洲图片欧美综合| 9191精品国产综合久久久久久| 日本vs亚洲vs韩国一区三区| 日韩欧美区一区二| 欧美绝品在线观看成人午夜影视| 亚洲一区二区免费视频| 欧美一三区三区四区免费在线看| 久久福利资源站| 国产欧美精品一区二区三区四区| 不卡的av网站| 亚洲国产成人91porn| 日韩欧美卡一卡二| 成人激情免费视频| 亚洲高清免费一级二级三级| 欧美一区二区福利视频| 国产成人在线观看| 亚洲免费在线看| 欧美一区二区三区免费| 成人精品小蝌蚪| 午夜不卡av在线| 国产农村妇女毛片精品久久麻豆| 91丨porny丨最新| 日韩精品一区第一页| 国产欧美精品区一区二区三区 | 国产乱码精品1区2区3区| 亚洲欧洲精品天堂一级| 欧美日韩1区2区| 国产a区久久久| 午夜a成v人精品| 国产精品看片你懂得| 欧美精品粉嫩高潮一区二区| 国产黄色91视频| 免费日本视频一区| 亚洲精品美国一| 在线亚洲高清视频| 国产一区二区三区免费播放| 一区二区三区日本| 国产日韩v精品一区二区| 这里是久久伊人| 成人国产视频在线观看| 美女看a上一区| 亚洲国产成人tv| 日韩理论片网站| 国产亚洲一区二区在线观看| 欧美区一区二区三区| 91在线国产福利| 不卡av电影在线播放| 老司机精品视频在线| 亚洲最快最全在线视频| 欧美激情一区二区三区蜜桃视频| 91精品国产欧美日韩| 在线影院国内精品| 91丨九色丨蝌蚪丨老版| 国产成人av一区| 国产美女视频一区| 蜜桃一区二区三区在线| 日韩主播视频在线| 亚洲一区二区综合| 亚洲人成网站精品片在线观看| 国产日产欧产精品推荐色| 欧美成人欧美edvon| 日韩午夜激情av| 欧美日韩国产美| 欧美久久高跟鞋激| 在线观看亚洲成人| 99riav一区二区三区| 不卡电影免费在线播放一区| 岛国一区二区在线观看| 国产99一区视频免费| 国产一区高清在线| 国产麻豆视频精品| 精品影视av免费| 精品一区在线看| 国内精品自线一区二区三区视频| 久久精品噜噜噜成人88aⅴ | 欧美高清视频不卡网| 欧美精品v日韩精品v韩国精品v| 91豆麻精品91久久久久久| 在线观看91视频| 69精品人人人人| 制服丝袜中文字幕亚洲| 欧美一区二区免费视频| 欧美mv日韩mv国产网站app| 欧美一区二区三区电影| 日韩欧美一二区| 久久久国产精品麻豆| 中文字幕在线观看不卡视频| 亚洲女子a中天字幕| 亚洲国产综合色| 精一区二区三区| 成人在线视频一区| 91啪在线观看| 欧美日免费三级在线| 精品国产91乱码一区二区三区 | 丝袜亚洲另类丝袜在线| 美腿丝袜亚洲综合| 国产福利一区二区三区| 色嗨嗨av一区二区三区| 欧美一区二区三区免费在线看| 久久久精品免费网站| 亚洲人被黑人高潮完整版| 亚州成人在线电影| 国产综合色视频| 在线国产亚洲欧美| 日韩精品一区在线| 亚洲激情网站免费观看| 久久99深爱久久99精品| 成人avav影音| 337p亚洲精品色噜噜狠狠| 国产日韩一级二级三级| 亚洲一区二区三区爽爽爽爽爽| 久久精品免费看| 在线免费观看成人短视频| 日韩丝袜情趣美女图片| 成人欧美一区二区三区黑人麻豆 | 美腿丝袜亚洲一区| 91网上在线视频| 精品国产区一区| 一区二区国产视频| 国产麻豆精品久久一二三| 欧美日韩久久一区二区| 国产精品无人区| 久久69国产一区二区蜜臀| 在线观看日韩一区| 国产日韩欧美一区二区三区乱码| 亚洲成人一二三| 91亚洲男人天堂| 中文字幕成人av| 国产制服丝袜一区| 在线播放/欧美激情| 亚洲天堂精品视频| 国产成人精品三级麻豆| 日韩一区二区三区在线观看 | 在线免费av一区| 国产精品乱人伦| 国内精品伊人久久久久影院对白| 欧美绝品在线观看成人午夜影视| 中文字幕一区二区视频| 国产一区视频导航| 日韩欧美成人一区二区| 亚洲亚洲人成综合网络| www.亚洲精品| 欧美国产一区在线| 国产乱人伦偷精品视频不卡| 91精品国产日韩91久久久久久| 亚洲一区二区三区四区五区中文| 99久久99久久精品免费观看| 国产欧美一区二区精品忘忧草 | 国产欧美精品日韩区二区麻豆天美| 麻豆国产精品777777在线| 欧美日韩成人一区| 亚洲午夜视频在线| 欧美日韩一区国产| 五月激情综合色| 欧美日韩国产首页| 亚洲超碰精品一区二区| 欧美三级电影网站| 午夜精品视频一区| 91精品中文字幕一区二区三区|