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

📄 smi.cpp

📁 Sm501 VGA芯片wince下驱动代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

 		pss->m_pREG = (unsigned char *)VirtualAddress(pss->m_nREGPhysical, pss->RegMemorySize());

		RETAILMSG(1, (TEXT("m_pREG = 0x%08X\r\n"), pss->m_pREG));

		return (TRUE);

// ****************************************************************
#else // For Regular CEPC detection

	PCI_SLOT_NUMBER slotNumber;
	ULONG bus, device, function;
	ULONG length;
	PCI_COMMON_CONFIG pciConfig;
	int nMonNo = nMonitorNo;

	for (bus = 0; bus < PCI_MAX_BUS; bus++)
	{
		for (device = 0; device < PCI_MAX_DEVICES; device++)
		{
			slotNumber.u.bits.DeviceNumber = device;
			for (function = 0; function < PCI_MAX_FUNCTION; function++)
			{
				slotNumber.u.bits.FunctionNumber = function;
				length = HalGetBusDataByOffset(PCIConfiguration, bus,
											   slotNumber.u.AsULONG, &pciConfig,
											   0, sizeof(pciConfig));

				if (length == 0 || pciConfig.VendorID == 0xFFFF)
					break;
				else
				{
					if ((pciConfig.VendorID == PCI_VENDOR_SMI) &&
					    (pciConfig.BaseClass == PCI_CLASS_DISPLAY) &&
						((pciConfig.SubClass == PCI_SUBCLASS_DISPLAY) || (pciConfig.SubClass == 0x80))
						)
					{
						if (pss->isSupportedChipID(pciConfig.DeviceID))
						{
							// Check counter to make sure that we find the
							// correct card instance 
							if (nMonNo-- != 0)
								break;

							length = HalGetBusDataByOffset(PCIConfiguration, bus,
							   slotNumber.u.AsULONG, &pciConfig,
							   0, sizeof(pciConfig));

							// Patch Alpha chip and its ID
							if ((pciConfig.RevisionID == 0xA0) &&
								(pciConfig.DeviceID == CHIPID_SM501ALPHA))  // RevA Patch
							{
								DWORD dwBaseAdd = 0x80000000; //pciConfig.Command | 0x07;
								HalSetBusDataByOffset (PCIConfiguration, bus, 
									slotNumber.u.AsULONG, &dwBaseAdd, 0x10, 0x04);
							
								length = HalGetBusDataByOffset(PCIConfiguration, bus,
								   slotNumber.u.AsULONG, &pciConfig,
								   0, sizeof(pciConfig));
							}

							if (pciConfig.DeviceID == CHIPID_SM501ALPHA)
								pciConfig.DeviceID = CHIPID_SM501;

							pss->m_nChipID = pciConfig.DeviceID;
							pss->m_IRQ = pciConfig.u.type0.InterruptLine;
							pss->m_nLAWPhysical = pciConfig.u.type0.BaseAddresses[0];
							pss->m_nREGPhysical = pciConfig.u.type0.BaseAddresses[1];
							
							pss->m_nBusNo = bus;
							pss->m_nSlotNo = slotNumber.u.AsULONG;

				   	 		pss->m_pLAW = VirtualAddress(pss->m_nLAWPhysical,
				   	 							pss->MaxVideoMemorySize());
							if (pss->m_pLAW == NULL)
								return (FALSE);
							
				   	 		pss->m_pREG = VirtualAddress(pss->m_nREGPhysical,
				   	 							pss->RegMemorySize());
							if (pss->m_pREG == NULL)
								return (FALSE);
							
							// make sure the card is enabled 
							// -- some platforms may only enable one video card
							USHORT newCommand = 0x1E; //pciConfig.Command | 0x07;
							HalSetBusDataByOffset (PCIConfiguration, bus, 
								slotNumber.u.AsULONG, &newCommand, 0x04, 0x02);

							return (TRUE);
						}
					}
				}
			}
		}
	}

	return (FALSE);

#endif // WCEFA

}


// 
// GetSingleSYSINTR
//
// Inputs:		hkDrv	= registry key handle
//				VarName	= name of the registry variable
//
// Outputs:		SYSINTR value
//
// Returns:		None
//
DWORD GetSingleValue(HKEY hkDrv, LPCTSTR lpszVarName, ULONG dwDefault = 0)
{
	DWORD dwType;
	DWORD dwVal;
	DWORD dwSize = sizeof(DWORD);

	if (RegQueryValueEx(hkDrv, lpszVarName, NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		return dwVal;
	}
	else
	{
		return dwDefault;
	}
}


// 
// QueryRegistrySetting
//
// Inputs:		lpRegString	= The Windows CE registry key for the settings
//				lpSettings	= Pointer to SMISETTINGS class
//
// Outputs:		lpSettings	= Contains the registry settings
//
// Returns:		None
//
void QueryRegistrySetting(LPCTSTR lpRegString, SMISETTINGS *lpSettings)
{
	HKEY hkDrv = NULL;
	DWORD dwType, dwSize, dwVal;
	DWORD dwStatus;

	// open a handle to Driver configuration information
	dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRegString, 0, 0, &hkDrv);
	if(dwStatus != ERROR_SUCCESS) 
		return;

	dwSize = sizeof(DWORD);

	// Read the bpp of the display(s)
	if (RegQueryValueEx(hkDrv, TEXT("Bpp"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Bpp = %d.\r\n"),
				dwVal));
		lpSettings->m_dwBpp = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CxScreen"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Screen Width = %d.\r\n"),
				dwVal));
		lpSettings->m_dwCxScreen = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CyScreen"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Screen Height = %d.\r\n"),
				dwVal));
		lpSettings->m_dwCyScreen = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CxPanel"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Panel Width = %d.\r\n"),
				dwVal));
		lpSettings->m_dwCxPanel = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CyPanel"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Panel Height = %d.\r\n"),
				dwVal));
		lpSettings->m_dwCyPanel = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("PanningX"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Panel Origin X = %d.\r\n"),
				dwVal));
		lpSettings->m_dwPanningX = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("PanningY"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Panning Origin Y = %d.\r\n"),
				dwVal));
		lpSettings->m_dwPanningY = dwVal;
	}

	// Read all special feature here in form of
	// "F<FeatureName>" ie. FDualApp, FRotation, FRotationAngle, etc
	if (RegQueryValueEx(hkDrv, TEXT("Angle"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Rotation Angle = %d.\r\n"),
				dwVal));
		lpSettings->m_nRotateAngle = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("RefreshRate"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Refresh Rate = %d.\r\n"),
				dwVal));
		lpSettings->m_nFrequency = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("TestClock"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - TestClock = %d.\r\n"),
				dwVal));
		lpSettings->m_nTestClock = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CxZoom"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - CxZoom = %d.\r\n"),
				dwVal));
		lpSettings->m_dwCxZoom = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CyZoom"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - CyZoom = %d.\r\n"),
				dwVal));
		lpSettings->m_dwCyZoom = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CursorZoom"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - CursorZoom = %d.\r\n"),
				dwVal));
		lpSettings->m_nCursorZoomEnabled = dwVal;
	}

    // Query the "DisplayType" setting in the registry. Default is PANEL_OUTPUT.
    if (RegQueryValueEx(hkDrv, TEXT("DisplayType"), NULL, &dwType,
                        (LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
    {
        DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - DisplayType = %d.\r\n"),
                 dwVal));
        lpSettings->m_nDisplayType = (BOOL) dwVal;
    }

    // Query the "SaveRestore" setting in the registry. Default is 0.
    if (RegQueryValueEx(hkDrv, TEXT("SaveRestore"), NULL, &dwType,
                        (LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
    {
        DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - SaveRestore = %d.\r\n"),
                 dwVal));
        lpSettings->m_nSaveRestoreEnabled = (BOOL) dwVal;
    }

    // Query the "SaveSurface" setting in the registry. Default is FALSE.
    if (RegQueryValueEx(hkDrv, TEXT("SaveSurface"), NULL, &dwType,
                        (LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
    {
        DEBUGMSG(GPE_ZONE_INIT, (TEXT("Selecting SaveSurface mode = %d.\r\n"),
                 dwVal));
        g_bSaveSurface = (BOOL) dwVal;
    }

	// Read all special panel here in form of
	// "P<Company><Width>x<Height><Model/Customer>" ie. PTosh400x234N (N for Nextech)

	// The following 2 options are deprecated
	if (RegQueryValueEx(hkDrv, TEXT("MSTN320x240"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - MSTN320x240 = %d.\r\n"),
				dwVal));
		if (dwVal != 0)
			lpSettings->SetPanelType(SSP_HITACHI320x240MSTN);
	}

	if (RegQueryValueEx(hkDrv, TEXT("Plexus_800x600TFT"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Plexus_800x600TFT = %d.\r\n"),
				dwVal));
		if (dwVal != 0)
			lpSettings->SetPanelType(SSP_PLEXUS800x600TFT);
	}

	// This is the new method
	if (RegQueryValueEx(hkDrv, TEXT("PanelType"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - PanelType = 0x%08X.\r\n"),
				dwVal));
		lpSettings->SetPanelType(dwVal);
	}

	// Read back special mode table register data
	DWORD dwBuf[SSS_MAX];
	DWORD dwBufSize = SSS_MAX*sizeof(DWORD);
	ZeroMemory(dwBuf, dwBufSize);
	if (RegQueryValueEx(hkDrv, TEXT("PanelSettings"), NULL, &dwType,
						(LPBYTE)dwBuf, &dwBufSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - PanelSettings = 0x%08X.\r\n"),
				dwBuf[0]));
		lpSettings->SetPanelSettings(dwBuf);
	}


	if (RegQueryValueEx(hkDrv, TEXT("Gamma"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Gamma = %d.\r\n"),
				dwVal));
		lpSettings->m_nGamma = dwVal;
	}


	if (RegQueryValueEx(hkDrv, TEXT("OverlayDisabled"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - OverlayDisabled = %d.\r\n"),
				dwVal));
		lpSettings->m_bOverlayDisabled = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CSCDisabled"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - CSCDisabled = %d.\r\n"),
				dwVal));
		lpSettings->m_bCSCDisabled = dwVal;
	}


	if (RegQueryValueEx(hkDrv, TEXT("CrystalFrequency"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - CrystalFreqency = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - CrystalFreqency = 0x%08X.\r\n"),
				dwVal));
		g_CrystalFreqency = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("VideoInterpolation"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - VideoInterpolation = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - VideoInterpolation = 0x%08X.\r\n"),
				dwVal));
		g_VideoInterpolation = dwVal;
	}
    
	if (RegQueryValueEx(hkDrv, TEXT("FixedColorKey"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - FixedColorKey = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - FixedColorKey = 0x%08X.\r\n"),
				dwVal));
		g_FixedColorKey = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("WaitVsync"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - WaitVsync = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - WaitVsync = 0x%08X.\r\n"),
				dwVal));
		g_WaitVsync = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("SetPowerCEPC"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - SetPowerCEPC = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - SetPowerCEPC = 0x%08X.\r\n"),
				dwVal));
		g_SetPowerCEPC = dwVal;
	}

#if defined(HOST_ENABLE)
	if (RegQueryValueEx(hkDrv, TEXT("FB_BASE"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - FrameBuffer Base = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - FrameBuffer Base = 0x%08X.\r\n"),
				dwVal));
		lpSettings->m_nLAWPhysical = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("FG_BASE"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - Register Base = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - Register Base = 0x%08X.\r\n"),
				dwVal));
		lpSettings->m_nREGPhysical = dwVal;
	}	
#endif

#ifdef CMDLIST
	if (RegQueryValueEx(hkDrv, TEXT("CMDLISTBUF_ADDR"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - CMDlist buffer Base = %d.\r\n"),
				dwVal));
		RETAILMSG(1, (TEXT("SMIVGX - CMDlist buffer Base = 0x%08X.\r\n"),
				dwVal));
		lpSettings->m_cmdlist_address = dwVal;
	}

	if (RegQueryValueEx(hkDrv, TEXT("CMDLISTBUF_SIZE"), NULL, &dwType,
						(LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
	{
		DEBUGMSG(GPE_ZONE_INIT, (TEXT("SMIVGX - CMDlist buffer size = %d.\r\n"),

⌨️ 快捷键说明

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