?? hcddrv.cpp
字號:
//
// 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:
// uhcddrv.cpp
//
// Abstract:
//
// Notes:
//
#include "globals.hpp"
#include "Hcd.hpp"
#include <cphysmem.hpp>
#include <cardserv.h>
#include <devload.h>
// Debug Zones.
#ifdef DEBUG
#define DBG_UHCD (1 << 0)
#define DBG_INIT (1 << 1)
#define DBG_REGISTERS (1 << 2)
#define DBG_HUB (1 << 3)
#define DBG_ATTACH (1 << 4)
#define DBG_DESCRIPTORS (1 << 5)
#define DBG_FUNCTION (1 << 6)
#define DBG_PIPE (1 << 7)
#define DBG_TRANSFER (1 << 8)
#define DBG_QH (1 << 9)
#define DBG_TD (1 << 10)
#define DBG_CPHYSMEM (1 << 11)
#define DBG_VERBOSE (1 << 12)
#define DBG_WARNING (1 << 13)
#define DBG_ERROR (1 << 14)
#define DBG_UNUSED (1 << 15)
DBGPARAM dpCurSettings = {
TEXT("USB HCD"),
{
TEXT("Uhcd"),
TEXT("Init"),
TEXT("Registers"),
TEXT("Hub"),
TEXT("Attach"),
TEXT("Descriptors"),
TEXT("Function"),
TEXT("Pipe"),
TEXT("Transfer"),
TEXT("QH"),
TEXT("TD"),
TEXT("CPhysMem"),
TEXT("Verbose"),
TEXT("Warning"),
TEXT("Error"),
TEXT("Unused")
},
DBG_INIT | DBG_ATTACH | DBG_WARNING | DBG_ERROR
};
#endif
extern "C" HINSTANCE g_hInstance;
DWORD g_IstThreadPriority;
extern HCD_FUNCS gc_HcdFuncs =
{
sizeof(HCD_FUNCS), //DWORD dwCount;
&HcdGetFrameNumber, //LPHCD_GET_FRAME_NUMBER lpGetFrameNumber;
&HcdGetFrameLength, //LPHCD_GET_FRAME_LENGTH lpGetFrameLength;
&HcdSetFrameLength, //LPHCD_SET_FRAME_LENGTH lpSetFrameLength;
&HcdStopAdjustingFrame, //LPHCD_STOP_ADJUSTING_FRAME lpStopAdjustingFrame;
&HcdOpenPipe, //LPHCD_OPEN_PIPE lpOpenPipe;
&HcdClosePipe, //LPHCD_CLOSE_PIPE lpClosePipe;
&HcdResetPipe, //LPHCD_RESET_PIPE lpResetPipe;
&HcdIsPipeHalted, //LPHCD_IS_PIPE_HALTED lpIsPipeHalted;
&HcdIssueTransfer, //LPHCD_ISSUE_TRANSFER lpIssueTransfer;
&HcdAbortTransfer //LPHCD_ABORT_TRANSFER lpAbortTransfer;
};
BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
if ( dwReason == DLL_PROCESS_ATTACH ) {
DEBUGREGISTER((HINSTANCE)hinstDLL);
DEBUGMSG (ZONE_INIT,(TEXT("UHCD driver DLL attach\r\n")));
DisableThreadLibraryCalls((HMODULE) hinstDLL);
}
return HcdPdd_DllMain(hinstDLL, dwReason, lpvReserved);
}
static BOOL HcdGetFrameNumber(LPVOID lpvHcd, LPDWORD lpdwFrameNumber)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->GetFrameNumber(lpdwFrameNumber);
}
static BOOL HcdGetFrameLength(LPVOID lpvHcd, LPUSHORT lpuFrameLength)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->GetFrameLength(lpuFrameLength);
}
static BOOL HcdSetFrameLength(LPVOID lpvHcd, HANDLE hEvent, USHORT uFrameLength)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->SetFrameLength(hEvent, uFrameLength);
}
static BOOL HcdStopAdjustingFrame(LPVOID lpvHcd)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->StopAdjustingFrame();
}
static BOOL HcdOpenPipe(LPVOID lpvHcd, UINT iDevice,
LPCUSB_ENDPOINT_DESCRIPTOR lpEndpointDescriptor,
LPUINT lpiEndpointIndex)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->OpenPipe(iDevice, lpEndpointDescriptor, lpiEndpointIndex);
}
static BOOL HcdClosePipe(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->ClosePipe(iDevice, iEndpointIndex);
}
static BOOL HcdResetPipe(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->ResetPipe(iDevice, iEndpointIndex);
}
static BOOL HcdIsPipeHalted(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex, LPBOOL lpbHalted)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->IsPipeHalted(iDevice, iEndpointIndex, lpbHalted);
}
static BOOL HcdIssueTransfer(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex,
LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
DWORD dwFlags, LPCVOID lpvControlHeader,
DWORD dwStartingFrame, DWORD dwFrames, LPCDWORD aLengths,
DWORD dwBufferSize, LPVOID lpvBuffer, ULONG paBuffer,
LPCVOID lpvCancelId, LPDWORD adwIsochErrors, LPDWORD adwIsochLengths,
LPBOOL lpfComplete, LPDWORD lpdwBytesTransfered, LPDWORD lpdwError)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->IssueTransfer(iDevice, iEndpointIndex, lpStartAddress,
lpParameter, dwFlags, lpvControlHeader, dwStartingFrame, dwFrames,
aLengths, dwBufferSize, lpvBuffer, paBuffer, lpvCancelId,
adwIsochErrors, adwIsochLengths,lpfComplete, lpdwBytesTransfered,
lpdwError);
}
static BOOL HcdAbortTransfer(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex,
LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
LPCVOID lpvCancelId)
{
CHcd * const pHcd = (CHcd *)lpvHcd;
return pHcd->AbortTransfer(iDevice, iEndpointIndex, lpStartAddress,
lpParameter, lpvCancelId);
}
#ifdef CE_PREv3
// This constant is private in the device manager and I'm lazy
// enough to want to avoid dynamic allocation.
#define REG_PATH_LEN 256
// This is a back port for a new function in CE 3.0
HKEY OpenDeviceKey( LPCTSTR lpszActiveKey )
{
LONG keyStatus;
HKEY hKey;
TCHAR szKeyName[REG_PATH_LEN];
DWORD dwKeyLen = REG_PATH_LEN;
// lpszActiveKey is the key to this driver's active settings area
// Within this area, the value of DEVLOAD_DEVKEY_VALNAME points to the
// builtin driver area, where OEM settings were placed.
keyStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
lpszActiveKey,
0,
KEY_ALL_ACCESS,
&hKey);
if ( keyStatus != ERROR_SUCCESS ) {
return NULL;
}
keyStatus = RegQueryValueEx(hKey,
DEVLOAD_DEVKEY_VALNAME,
NULL,
NULL, // don't care about the type - it better be REG_SZ
(PBYTE) szKeyName,
&dwKeyLen);
RegCloseKey( hKey );
if ( keyStatus != ERROR_SUCCESS ) {
return NULL;
}
keyStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
szKeyName,
0,
KEY_ALL_ACCESS,
&hKey);
if ( keyStatus != ERROR_SUCCESS ) {
return NULL;
}
return hKey;
}
#endif
// -----------------------------------------------------------------------------
// Function to read the interrupt thread priority from the registry.
// If it is not in the registry then a default value is returned.
// -----------------------------------------------------------------------------
static DWORD
GetInterruptThreadPriority(
LPWSTR lpszActiveKey
)
{
HKEY hDevKey;
DWORD dwValType;
DWORD dwValLen;
DWORD dwPrio;
dwPrio = DEFAULT_UHCD_IST_PRIORITY;
hDevKey = OpenDeviceKey(lpszActiveKey);
if (hDevKey) {
dwValLen = sizeof(DWORD);
RegQueryValueEx(
hDevKey,
TEXT("Priority256"),
NULL,
&dwValType,
(PUCHAR)&dwPrio,
&dwValLen);
RegCloseKey(hDevKey);
}
return dwPrio;
}
extern "C" LPVOID HcdMdd_CreateMemoryObject(DWORD cbSize, DWORD cbHighPrioritySize,
PUCHAR pVirtAddr, PUCHAR pPhysAddr)
{
//
// We need at least a USBPAGE for Special allocation and a PAGE for normal
// allocation.
//
ASSERT((cbHighPrioritySize + (2*USBPAGESIZE)) < cbSize);
CPhysMem * pobMem = new CPhysMem(cbSize,cbHighPrioritySize,pVirtAddr,pPhysAddr);
if (pobMem)
if ( ! pobMem->InittedOK() ) {
delete pobMem;
pobMem = 0;
}
return pobMem;
}
extern "C" LPVOID HcdMdd_CreateHcdObject(LPVOID lpvUhcdPddObject,
LPVOID lpvMemoryObject, LPCWSTR szRegKey, PUCHAR ioPortBase,
DWORD dwSysIntr)
{
CHcd * pobUhcd = CreateHCDObject(lpvUhcdPddObject,(CPhysMem *)lpvMemoryObject,szRegKey,ioPortBase,dwSysIntr);
if ( pobUhcd != NULL ) {
if ( !pobUhcd->DeviceInitialize( )) {
delete pobUhcd;
pobUhcd = NULL;
}
}
return pobUhcd;
}
extern "C" BOOL HcdMdd_DestroyHcdObject(LPVOID lpvUhcdObject)
{
CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
delete pobUhcd;
return TRUE;
}
extern "C" BOOL HcdMdd_DestroyMemoryObject(LPVOID lpvMemoryObject)
{
CPhysMem * pobMem = (CPhysMem *)lpvMemoryObject;
delete pobMem;
return TRUE;
}
extern "C" BOOL HcdMdd_PowerUp(LPVOID lpvUhcdObject)
{
CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
pobUhcd->PowerMgmtCallback(FALSE);
return TRUE;
}
extern "C" BOOL HcdMdd_PowerDown(LPVOID lpvUhcdObject)
{
CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
pobUhcd->PowerMgmtCallback(TRUE);
return TRUE;
}
extern "C" DWORD HcdMdd_SetCapability (LPVOID lpvUhcdObject, DWORD dwCapability )
{
CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
return pobUhcd->SetCapability(dwCapability);
}
// Stream functions
extern "C" DWORD HCD_Init(DWORD dwContext)
{
HKEY ActiveKey;
WCHAR RegKeyPath[DEVKEY_LEN];
DWORD status;
DWORD ValType;
DWORD ValLen;
DEBUGMSG (ZONE_INIT, (TEXT("UHCD!HCD_Init\r\n")));
// Open driver's ACTIVE key
status = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
(LPCWSTR)dwContext,
0,
0,
&ActiveKey);
if (status != ERROR_SUCCESS) {
DEBUGMSG(ZONE_INIT|ZONE_ERROR,
(TEXT("UHCD!HCD_Init RegOpenKeyEx(%s) returned %d.\r\n"),
(LPCWSTR)dwContext, status));
return NULL;
}
// Get Key value, which points to driver's key
ValLen = sizeof(RegKeyPath);
status = RegQueryValueEx(
ActiveKey,
DEVLOAD_DEVKEY_VALNAME,
NULL,
&ValType,
(PUCHAR)RegKeyPath,
&ValLen);
if (status != ERROR_SUCCESS) {
DEBUGMSG(ZONE_INIT|ZONE_ERROR,
(TEXT("UHCD!HCD_Init RegQueryValueEx(%s\\%s) returned %d\r\n"),
(LPCWSTR)dwContext, DEVLOAD_DEVKEY_VALNAME, status));
RegCloseKey(ActiveKey);
return NULL;
}
RegCloseKey(ActiveKey);
g_IstThreadPriority = GetInterruptThreadPriority(RegKeyPath);
return HcdPdd_Init((DWORD)RegKeyPath);
}
extern "C" void HCD_PowerUp(DWORD hDeviceContext)
{
HcdPdd_PowerUp(hDeviceContext);
return;
}
extern "C" void HCD_PowerDown(DWORD hDeviceContext)
{
HcdPdd_PowerDown(hDeviceContext);
return;
}
extern "C" BOOL HCD_Deinit(DWORD hDeviceContext)
{
DEBUGMSG (ZONE_INIT, (TEXT("UHCD: HCD_Deinit\r\n")));
return HcdPdd_Deinit(hDeviceContext);
}
extern "C" DWORD HCD_Open(DWORD hDeviceContext, DWORD AccessCode,
DWORD ShareMode)
{
return HcdPdd_Open(hDeviceContext, AccessCode, ShareMode);
}
extern "C" BOOL HCD_Close(DWORD hOpenContext)
{
return HcdPdd_Close(hOpenContext);
}
extern "C" DWORD HCD_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
return HcdPdd_Read(hOpenContext, pBuffer, Count);
}
extern "C" DWORD HCD_Write(DWORD hOpenContext, LPCVOID pSourceBytes,
DWORD NumberOfBytes)
{
return HcdPdd_Write(hOpenContext, pSourceBytes, NumberOfBytes);
}
extern "C" DWORD HCD_Seek(DWORD hOpenContext, LONG Amount, DWORD Type)
{
return HcdPdd_Seek(hOpenContext, Amount, Type);
}
extern "C" BOOL HCD_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn,
DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
return HcdPdd_IOControl(hOpenContext, dwCode, pBufIn, dwLenIn, pBufOut,
dwLenOut, pdwActualOut);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -