You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
7.9 KiB
280 lines
7.9 KiB
// $Header: G:/SwDev/WDM/Video/bt848/rcs/Registry.cpp 1.7 1998/05/07 15:24:55 tomz Exp $
|
|
|
|
extern "C" {
|
|
#include <strmini.h>
|
|
}
|
|
#include "device.h"
|
|
|
|
//LONG PsDevice::PinTypes_ [MaxInpPins]; // just allocate maximum possible
|
|
//DWORD PsDevice::xtals_ [2]; // no more than 2 xtals
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Reads the specified registry value
|
|
|
|
Arguments:
|
|
|
|
Handle - handle to the registry key
|
|
KeyNameString - value to read
|
|
KeyNameStringLength - length of string
|
|
Data - buffer to read data into
|
|
DataLength - length of data buffer
|
|
|
|
Return Value:
|
|
|
|
NTSTATUS returned as appropriate
|
|
|
|
--*/
|
|
NTSTATUS GetRegistryValue( IN HANDLE Handle, IN const PUNICODE_STRING KeyName,
|
|
IN PCHAR Data, IN ULONG DataLength )
|
|
{
|
|
NTSTATUS Status = STATUS_INSUFFICIENT_RESOURCES;
|
|
ULONG Length;
|
|
PKEY_VALUE_FULL_INFORMATION FullInfo;
|
|
|
|
Length = sizeof( KEY_VALUE_FULL_INFORMATION ) + DataLength + KeyName->MaximumLength;
|
|
|
|
FullInfo = (struct _KEY_VALUE_FULL_INFORMATION *)ExAllocatePool(PagedPool, Length);
|
|
|
|
if ( FullInfo ) {
|
|
Status = ZwQueryValueKey( Handle, KeyName, KeyValueFullInformation,
|
|
FullInfo, Length, &Length );
|
|
|
|
if ( NT_SUCCESS( Status ) ) {
|
|
|
|
if ( DataLength >= FullInfo->DataLength ) {
|
|
RtlCopyMemory( Data, ((PUCHAR) FullInfo) + FullInfo->DataOffset,
|
|
FullInfo->DataLength );
|
|
|
|
} else {
|
|
Status = STATUS_BUFFER_TOO_SMALL;
|
|
} // buffer right length
|
|
} // if success
|
|
ExFreePool( FullInfo );
|
|
} // if fullinfo
|
|
return Status;
|
|
}
|
|
|
|
/* Function: OpenDriverKey
|
|
* Purpose: Opens the DriverData key off the main driver key
|
|
* Input: PhysicalDeviceObject : DEVICE_OBJECT *
|
|
* Output: Open key handle or NULL
|
|
*/
|
|
HANDLE OpenDriverKey( IN PDEVICE_OBJECT PhysicalDeviceObject )
|
|
{
|
|
NTSTATUS Status;
|
|
HANDLE DevHandle;
|
|
|
|
Status = IoOpenDeviceRegistryKey( PhysicalDeviceObject, PLUGPLAY_REGKEY_DRIVER,
|
|
STANDARD_RIGHTS_ALL, &DevHandle );
|
|
|
|
HANDLE KeyHandle = NULL;
|
|
if ( NT_SUCCESS( Status ) ) {
|
|
OBJECT_ATTRIBUTES attr;
|
|
UNICODE_STRING UDevDataName;
|
|
PWCHAR WDataName = L"DriverData";
|
|
|
|
RtlInitUnicodeString( &UDevDataName, WDataName );
|
|
InitializeObjectAttributes( &attr, &UDevDataName, OBJ_INHERIT, DevHandle,
|
|
NULL );
|
|
|
|
ZwOpenKey( &KeyHandle, KEY_QUERY_VALUE, &attr );
|
|
ZwClose( DevHandle );
|
|
}
|
|
return KeyHandle;
|
|
}
|
|
/* Function: PrepareKeyName
|
|
* Purpose: Creates a UNICODE name for a key
|
|
* Parameters: UKeyName: UNICODE_STRING * - key will be created here
|
|
* name: PCHAR - regular "C" string
|
|
* idx: int - number to append to the name
|
|
* Note: this function is useful in creating numbered key names
|
|
*/
|
|
inline void PrepareKeyName( PUNICODE_STRING UKeyName, PCHAR name, int idx )
|
|
{
|
|
char buf [80];
|
|
ANSI_STRING AKeyName;
|
|
|
|
if ( idx == -1 )
|
|
{
|
|
RtlInitAnsiString( &AKeyName, name );
|
|
}
|
|
else
|
|
{
|
|
sprintf( buf, "%s%d", name, idx );
|
|
RtlInitAnsiString( &AKeyName, buf );
|
|
}
|
|
|
|
RtlAnsiStringToUnicodeString( UKeyName, &AKeyName, TRUE );
|
|
}
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Reads the XBAR registry values for the device
|
|
|
|
Arguments:
|
|
|
|
PhysicalDeviceObject - pointer to the PDO
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
void ReadXBarRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject )
|
|
{
|
|
HANDLE KeyHandle = OpenDriverKey( PhysicalDeviceObject );
|
|
|
|
if ( KeyHandle ) {
|
|
|
|
for ( int i = 0; i < MaxInpPins; i++ ) {
|
|
|
|
UNICODE_STRING UKeyName;
|
|
|
|
PrepareKeyName( &UKeyName, "XBarInPin", i );
|
|
|
|
CHAR buf [10];
|
|
|
|
NTSTATUS Status;
|
|
Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) );
|
|
|
|
RtlFreeUnicodeString( &UKeyName );
|
|
|
|
if ( NT_SUCCESS(Status ) ) {
|
|
DebugOut((1, "ReadRegistry %d\n", i ) );
|
|
PinTypes_ [i] = *(PDWORD)buf;
|
|
} else
|
|
PinTypes_ [i] = -1;
|
|
}
|
|
ZwClose( KeyHandle );
|
|
} else { // just use some default to make life eaiser for the xbar code
|
|
PinTypes_ [0] = KS_PhysConn_Video_SVideo;
|
|
PinTypes_ [1] = KS_PhysConn_Video_Tuner;
|
|
PinTypes_ [2] = KS_PhysConn_Video_Composite;
|
|
PinTypes_ [3] = KS_PhysConn_Audio_Tuner;
|
|
}
|
|
}
|
|
|
|
/* Method: ReadXTalRegistryValues
|
|
* Purpose: Obtains number and types of the crystals for this device
|
|
* Input: DEVICE_OBJECT *
|
|
* Output: None
|
|
*/
|
|
void ReadXTalRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject )
|
|
{
|
|
HANDLE KeyHandle = OpenDriverKey( PhysicalDeviceObject );
|
|
|
|
if ( KeyHandle ) {
|
|
|
|
for ( int i = 0; i < 2; i++ ) {
|
|
|
|
UNICODE_STRING UKeyName;
|
|
|
|
PrepareKeyName( &UKeyName, "XTal", i );
|
|
|
|
CHAR buf [10];
|
|
|
|
NTSTATUS Status;
|
|
Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) );
|
|
|
|
RtlFreeUnicodeString( &UKeyName );
|
|
|
|
if ( NT_SUCCESS(Status ) ) {
|
|
DebugOut((1, "Got Xtal %d\n", i ) );
|
|
xtals_ [i] = *(PDWORD)buf;
|
|
} else
|
|
xtals_ [i] = 28; // is this a good default ? :0)
|
|
}
|
|
ZwClose( KeyHandle );
|
|
} else // just use some default to make life eaiser for the xbar code
|
|
xtals_ [0] = 28; // default to NTSC only
|
|
}
|
|
|
|
TUNER_INFO TunerInfo;
|
|
|
|
void DumpTunerInfo( TUNER_INFO * pTunerInfo )
|
|
{
|
|
DUMPX( pTunerInfo->TunerBrand );
|
|
DUMPX( pTunerInfo->TunerI2CAddress );
|
|
DUMPX( pTunerInfo->TunerBandCtrlLow );
|
|
DUMPX( pTunerInfo->TunerBandCtrlMid );
|
|
DUMPX( pTunerInfo->TunerBandCtrlHigh );
|
|
}
|
|
|
|
void ReadTunerRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject )
|
|
{
|
|
HANDLE KeyHandle = OpenDriverKey( PhysicalDeviceObject );
|
|
|
|
if ( KeyHandle )
|
|
{
|
|
|
|
CHAR buf [10];
|
|
NTSTATUS Status;
|
|
UNICODE_STRING UKeyName;
|
|
BOOL bSuccess = TRUE;
|
|
|
|
PrepareKeyName( &UKeyName, "TunerBrand", -1 );
|
|
Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) );
|
|
if ( bSuccess = NT_SUCCESS(Status ) )
|
|
{
|
|
TunerInfo.TunerBrand = *(PDWORD)buf;
|
|
|
|
PrepareKeyName( &UKeyName, "TunerI2CAddress", -1 );
|
|
Status = GetRegistryValue( KeyHandle, &UKeyName, buf, sizeof( buf ) );
|
|
if ( bSuccess = NT_SUCCESS(Status ) ) {
|
|
TunerInfo.TunerI2CAddress = *(PBYTE)buf;
|
|
}
|
|
else
|
|
{
|
|
DebugOut((0, "Failed GetRegistryValue(TunerI2CAddress)\n"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DebugOut((0, "Failed GetRegistryValue(TunerBrand)\n"));
|
|
}
|
|
|
|
if ( !bSuccess )
|
|
{
|
|
TunerInfo.TunerBrand = TUNER_BRAND_TEMIC;
|
|
TunerInfo.TunerI2CAddress = 0xC2;
|
|
DebugOut((0, "Defaulting to Temic tuner at I2C address 0xC2\n"));
|
|
}
|
|
|
|
RtlFreeUnicodeString( &UKeyName );
|
|
ZwClose( KeyHandle );
|
|
}
|
|
else
|
|
{
|
|
TunerInfo.TunerBrand = TUNER_BRAND_TEMIC;
|
|
TunerInfo.TunerI2CAddress = 0xC2;
|
|
DebugOut((0, "Failed OpenDriverKey()\n"));
|
|
DebugOut((0, "Defaulting to Temic tuner at I2C address 0xC2\n"));
|
|
}
|
|
|
|
switch( TunerInfo.TunerBrand )
|
|
{
|
|
case TUNER_BRAND_PHILIPS:
|
|
TunerInfo.TunerBandCtrlLow = 0xCEA0; // Ctrl code for VHF low
|
|
TunerInfo.TunerBandCtrlMid = 0xCE90; // Ctrl code for VHF high
|
|
TunerInfo.TunerBandCtrlHigh = 0xCE30; // Ctrl code for UHF
|
|
break;
|
|
case TUNER_BRAND_ALPS:
|
|
TunerInfo.TunerBandCtrlLow = 0xC214; // Ctrl code for VHF low
|
|
TunerInfo.TunerBandCtrlMid = 0xC212; // Ctrl code for VHF high
|
|
TunerInfo.TunerBandCtrlHigh = 0xC211; // Ctrl code for UHF
|
|
break;
|
|
case TUNER_BRAND_TEMIC:
|
|
default:
|
|
TunerInfo.TunerBandCtrlLow = 0x8E02; // Ctrl code for VHF low
|
|
TunerInfo.TunerBandCtrlMid = 0x8E04; // Ctrl code for VHF high
|
|
TunerInfo.TunerBandCtrlHigh = 0x8E01; // Ctrl code for UHF
|
|
break;
|
|
}
|
|
|
|
DumpTunerInfo( &TunerInfo );
|
|
}
|