⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kbdmouse.cpp

📁 三星2410的BSP开发包
💻 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.

*/

#include <windows.h>
#include <ceddk.h>
#include <ddkreg.h>

#include "ps2port.hpp"
#include "ps2mouse.hpp"
#include "ps2keybd.hpp"

#include "keybddbg.h"

extern Ps2Keybd *v_pp2k;


static Ps2Port  *v_pp2p;
static Ps2Mouse *v_pp2m;

// Attempt to read I/O window configuration from both the keyboard and the mouse
// configuration keys, since either one may be missing based on sysgen settings.
// Return TRUE if we find an I/O window, FALSE otherwise.
BOOL
Read_IoWindowInfo(PDDKWINDOWINFO pdwi)
{
	HKEY hkReg;
	BOOL fStatus = FALSE;
	LPCTSTR pszKeys[] = {
		_T("HARDWARE\\DEVICEMAP\\KEYBD"),
		_T("HARDWARE\\DEVICEMAP\\MOUSE"),
		NULL
	};
	int i;

	// look for configuration data
	for(i = 0; fStatus == FALSE && pszKeys[i] != NULL; i++) {
		DWORD dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pszKeys[i], 0, 0, &hkReg);
		if(dwStatus == ERROR_SUCCESS) {
			pdwi->cbSize = sizeof(*pdwi);
			if(DDKReg_GetWindowInfo(hkReg, pdwi) == ERROR_SUCCESS && pdwi->dwNumIoWindows == 1) {
				// found a window configuration
				DEBUGMSG(ZONE_INIT, (_T("Read_IoWindowInfo(): found window 0x%08x / 0x%x in '%s'\r\n"), pdwi->ioWindows[0].dwBase,
					pdwi->ioWindows[0].dwLen, pszKeys[i]));
				fStatus = TRUE;
			}
			RegCloseKey(hkReg);
		}
	}

	return fStatus;
}

BOOL
WINAPI
DllMain(
    HANDLE  hinstDll,
    DWORD   dwReason,
    LPVOID  lpReserved
    )
{
    BOOL    bRet = FALSE;
	
    unsigned int        iopBase;
    ULONG               inIoSpace = 1;
    PHYSICAL_ADDRESS    ioPhysicalBase;
	DDKWINDOWINFO		dwi;
	
    switch ( dwReason )
	{
	case DLL_PROCESS_ATTACH:
		DEBUGREGISTER((HINSTANCE) hinstDll);
		DEBUGMSG(ZONE_INIT, 
			(_T("PS/2 Keyboard-mouse : DLL_PROCESS_ATTACH\r\n")));

		if ( v_pp2p )
		{
			bRet = TRUE;
			goto leave;
		}

		if(Read_IoWindowInfo(&dwi) == FALSE) {
			DEBUGMSG(TRUE, (_T("KbdMouse: DllMain: Read_IoWindowInfo() failed\r\n")));
			goto leave;
		}

		ioPhysicalBase.LowPart = dwi.ioWindows[0].dwBase;
		ioPhysicalBase.HighPart = 0;
		if ( HalTranslateBusAddress(
			(INTERFACE_TYPE) dwi.dwInterfaceType,
			dwi.dwBusNumber,
			ioPhysicalBase,
			&inIoSpace,
			&ioPhysicalBase) )
		{
			
			if ( inIoSpace )
			{
				iopBase = ioPhysicalBase.LowPart;
			}
			else if ((iopBase = (UINT)MmMapIoSpace(ioPhysicalBase, dwi.ioWindows[0].dwLen, FALSE)) == NULL)
			{
				ERRORMSG(1, (TEXT("Error mapping I/O Ports.\r\n")));
				goto leave;
			}
		}
		else
		{
			ERRORMSG(1, (TEXT("Error translating I/O Ports.\r\n")));
			goto leave;
		}
		
		v_pp2p = new Ps2Port;
		if ( v_pp2p == NULL || !v_pp2p -> Initialize(iopBase) )
		{
			ERRORMSG(1, (TEXT("Could not initialize ps2 port.\r\n")));
			if (v_pp2p != NULL)
				delete v_pp2p;
			v_pp2p = NULL;
			goto leave;
		}
		
		//  We always assume that there is a keyboard.
		v_pp2k = new Ps2Keybd;
		if ( v_pp2k != NULL && v_pp2k -> Initialize(v_pp2p) )
		{
			v_pp2k -> IsrThreadStart();
		}
		else
		{
			ERRORMSG(1, (TEXT("Could not initialize ps2 keyboard.\r\n")));
			if (v_pp2k != NULL)
				delete v_pp2k;
			v_pp2k = NULL;
		}
		
		if ( v_pp2p -> bMouseFound() )
		{
			v_pp2m = new Ps2Mouse;
			
			if ( v_pp2m -> Initialize(v_pp2p) )
			{
				v_pp2m -> IsrThreadStart();
			}
			else
			{
				ERRORMSG(1, (TEXT("Could not initialize ps2 mouse\r\n")));
				delete v_pp2m;
				v_pp2m = NULL;
			}
		}
		
		DisableThreadLibraryCalls((HMODULE) hinstDll);
		
		bRet = TRUE;
		break;
	}
	
leave:
    return bRet;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -