|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
device.cpp
Abstract:
Device driver core, initialization, etc.
--*/
#define KSDEBUG_INIT
#include "PhilTune.h"
#include "wdmdebug.h"
#ifdef ALLOC_DATA_PRAGMA
#pragma const_seg("PAGECONST")
#endif // ALLOC_DATA_PRAGMA
#ifdef ALLOC_PRAGMA
#pragma code_seg("PAGE")
#endif // ALLOC_PRAGMA
extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPathName ) /*++
Routine Description:
Sets up the driver object.
Arguments:
DriverObject - Driver object for this instance.
RegistryPathName - Contains the registry path which was used to load this instance.
Return Values:
Returns STATUS_SUCCESS if the driver was initialized.
--*/ { NTSTATUS Status = STATUS_SUCCESS;
_DbgPrintF(DEBUGLVL_VERBOSE,("DriverEntry"));
// DEBUG_BREAK;
Status = KsInitializeDriver( DriverObject, RegistryPathName, &DeviceDescriptor);
// DEBUG_BREAK;
return Status; }
STDMETHODIMP_(NTSTATUS) CDevice:: Create( IN PKSDEVICE Device ) { NTSTATUS Status = STATUS_SUCCESS; CDevice * pDevice = NULL;
// DEBUG_BREAK;
_DbgPrintF(DEBUGLVL_VERBOSE,("CDevice::Create"));
ASSERT(Device);
// Allocate memory for the our device class.
//
pDevice = new(NonPagedPool,'IDsK') CDevice; if (pDevice) { Device->Context = pDevice; } else { Status = STATUS_INSUFFICIENT_RESOURCES; goto errExit; }
// Point back to the KSDEVICE.
//
pDevice->m_pKSDevice = Device; pDevice->m_pDemod = NULL; pDevice->m_pTuner = NULL;
errExit: return Status; }
STDMETHODIMP_(NTSTATUS) CDevice:: Start( IN PKSDEVICE pKSDevice, IN PIRP pIrp, IN PCM_RESOURCE_LIST pTranslatedResourceList OPTIONAL, IN PCM_RESOURCE_LIST pUntranslatedResourceList OPTIONAL ) { NTSTATUS Status = STATUS_SUCCESS; CDevice * pDevice; PDEVICE_OBJECT pPhysicalDeviceObject; CI2CScript * pI2CScript; CGpio * pCGpio;
// DEBUG_BREAK;
_DbgPrintF( DEBUGLVL_VERBOSE, ("CDevice::Start")); ASSERT( pKSDevice);
// DEBUG_BREAK;
pDevice = reinterpret_cast<CDevice *>(pKSDevice->Context); ASSERT(pDevice);
pDevice->m_bHangCheckFlag = TRUE; pDevice->m_bQualityCheckActiveFlag = FALSE; pDevice->m_uiOutputMode = VSB_OUTPUT_MODE_NORMAL;
// Delete any existing tuner and VSB objects
if (pDevice->m_pTuner != NULL) { delete(pDevice->m_pTuner); pDevice->m_pTuner = NULL; }
if (pDevice->m_pDemod != NULL) { // Create a demodulator object based on VSB chip type
if((VSBCHIPTYPE)(pDevice->m_BoardInfo.uiVsbChipVersion >> 8) == VSB1) { CVSB1Demod *p_Demod = (CVSB1Demod *)(pDevice->m_pDemod); delete (p_Demod); } else { CVSB2Demod *p_Demod = (CVSB2Demod *)(pDevice->m_pDemod); delete (p_Demod); } pDevice->m_pDemod = NULL; }
// Get the Device capabilities, etc, from the registry.
//
Status = pDevice->InitFromRegistry();
// Get the GPIO interface on the parent device.
//
// The GPIO interface is used by a child device to control specific
// pins on the parent PIO hardware. The tuner minidriver uses
// PIO pins to control the mode of the tuner hardware and to reset
// the tuner hardware.
//
pCGpio = (CGpio *) new(NonPagedPool,'oipG') CGpio( pKSDevice->PhysicalDeviceObject, &Status); if (Status != STATUS_SUCCESS) { _DbgPrintF( DEBUGLVL_ERROR, ("CGPIO creation failure.")); goto errExit; } else _DbgPrintF( DEBUGLVL_VERBOSE, ("CGPIO created."));
pDevice->m_pGpio = pCGpio;
// Get the I2C interface on the parent device.
//
// The I2C interface is used by a child device to exchange data
// with a chip on the parents I2C bus. The tuner minidriver uses
// the I2C bus to set a frequency and control code on the RF
// tuner device as well as to initialize the 8VSB decoder.
//
pI2CScript = (CI2CScript *) new(NonPagedPool,' C2I') CI2CScript( pKSDevice->PhysicalDeviceObject, &Status ); if (Status != STATUS_SUCCESS) { _DbgPrintF( DEBUGLVL_ERROR, ("I2CScript creation failure.")); goto errExit; } else if (!pI2CScript) { Status = STATUS_NO_MEMORY; _DbgPrintF( DEBUGLVL_ERROR, ("I2CScript creation failure.")); goto errExit; } else _DbgPrintF( DEBUGLVL_VERBOSE, ("I2CScript created."));
pDevice->m_pI2CScript = pI2CScript;
// Set the board and initialize all required data structures pertaining
// to the board
Status = pDevice->SetBoard(pDevice->m_BoardInfo.uiBoardID); if (Status != STATUS_SUCCESS) { goto errExit; }
/*
// Initialize the tuner hardware.
//
Status = pDevice->Initialize(); if (Status != STATUS_SUCCESS) { goto errExit; } */
// Create the the Tuner Filter Factory. This factory is used to
// create instances of the tuner filter.
//
Status = BdaCreateFilterFactory( pKSDevice, &InitialTunerFilterDescriptor, &TunerBdaFilterTemplate ); if (!NT_SUCCESS(Status)) { goto errExit; }
errExit: return Status; }
NTSTATUS CDevice:: InitFromRegistry() { NTSTATUS Status = STATUS_SUCCESS; HANDLE hRegistry; UNICODE_STRING KeyName; ULONG rgulValueInfo[10]; ULONG ulcbValueInfo; PKEY_VALUE_PARTIAL_INFORMATION pPartialValueInfo; PULONG pulData;
ASSERT(KeGetCurrentIrql() <= PASSIVE_LEVEL);
pPartialValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION) rgulValueInfo; pulData = (PULONG) pPartialValueInfo->Data;
// Open the registry key for this device.
//
Status = IoOpenDeviceRegistryKey( m_pKSDevice->PhysicalDeviceObject, PLUGPLAY_REGKEY_DRIVER, STANDARD_RIGHTS_ALL, &hRegistry ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("Can't open device registry key.")); return Status; }
// Get the I2C address of the tuner chip.
//
RtlInitUnicodeString(&KeyName, L"TunerI2cAddress"); Status = ZwQueryValueKey( hRegistry, &KeyName, KeyValuePartialInformation, (PVOID) rgulValueInfo, sizeof( rgulValueInfo), &ulcbValueInfo ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("Tuner I2C address is not in registry.")); goto errExit; }
ASSERT( ulcbValueInfo >= sizeof( KEY_VALUE_PARTIAL_INFORMATION));
// Make sure the date is of the correct type.
//
if ( ( (pPartialValueInfo->Type != REG_DWORD) && (pPartialValueInfo->Type != REG_BINARY)) || (pPartialValueInfo->DataLength != sizeof( DWORD)) || (*pulData >= 256) ) { _DbgPrintF( DEBUGLVL_ERROR, ("Invalid tuner I2C address in registry.")); goto errExit; }
m_BoardInfo.ucTunerAddress = (UCHAR) (*pulData);
// Get the I2C address of the 8VSB demodulator chip.
//
// Get the I2C address of the tuner chip.
//
RtlInitUnicodeString(&KeyName, L"8VsbI2cAddress"); Status = ZwQueryValueKey( hRegistry, &KeyName, KeyValuePartialInformation, (PVOID) rgulValueInfo, sizeof( rgulValueInfo), &ulcbValueInfo ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("8VSB I2C address is not in registry.")); goto errExit; }
ASSERT( ulcbValueInfo >= sizeof( KEY_VALUE_PARTIAL_INFORMATION));
// Make sure the date is of the correct type.
//
if ( ( (pPartialValueInfo->Type != REG_DWORD) && (pPartialValueInfo->Type != REG_BINARY)) || (pPartialValueInfo->DataLength != sizeof( DWORD)) || (*pulData >= 256) ) { _DbgPrintF( DEBUGLVL_ERROR, ("Invalid 8VSB I2C address in registry.")); goto errExit; }
m_BoardInfo.ucVsbAddress = (UCHAR) (*pulData);
#ifdef NEVER
// Get the I2C address of the parallel port.
//
RtlInitUnicodeString(&KeyName, L"ParallelPortI2cAddress"); Status = ZwQueryValueKey( hRegistry, &KeyName, KeyValuePartialInformation, (PVOID) rgulValueInfo, sizeof( rgulValueInfo), &ulcbValueInfo ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("Parallel port I2C address is not in registry.")); goto errExit; }
ASSERT( ulcbValueInfo >= sizeof( KEY_VALUE_PARTIAL_INFORMATION));
// Make sure the date is of the correct type.
//
if ( ( (pPartialValueInfo->Type != REG_DWORD) && (pPartialValueInfo->Type != REG_BINARY)) || (pPartialValueInfo->DataLength != sizeof( DWORD)) || (*pulData >= 256) ) { _DbgPrintF( DEBUGLVL_ERROR, ("Invalid parallel port I2C address in registry.")); goto errExit; }
m_BoardInfo.ucParallelPortI2cAddress = (UCHAR) (*pulData);
#endif // NEVER
// Get the tuner type identifier.
//
RtlInitUnicodeString(&KeyName, L"TunerType"); Status = ZwQueryValueKey( hRegistry, &KeyName, KeyValuePartialInformation, (PVOID) rgulValueInfo, sizeof( rgulValueInfo), &ulcbValueInfo ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("Tuner type is not in registry.")); goto errExit; }
ASSERT( ulcbValueInfo >= sizeof( KEY_VALUE_PARTIAL_INFORMATION));
// Make sure the date is of the correct type.
//
if (pPartialValueInfo->Type != REG_SZ) { _DbgPrintF( DEBUGLVL_ERROR, ("Tuner type in registry is not REG_SZ.")); goto errExit; }
if((StringsEqual((PWCHAR)(pPartialValueInfo->Data), L"TD1536"))) { m_BoardInfo.uiTunerID = TD1536; Status = STATUS_SUCCESS; } else { Status = STATUS_DEVICE_CONFIGURATION_ERROR ; _DbgPrintF( DEBUGLVL_ERROR, ("Unknown tuner type in registry.")); goto errExit; }
RtlInitUnicodeString(&KeyName, L"BoardType"); Status = ZwQueryValueKey( hRegistry, &KeyName, KeyValuePartialInformation, (PVOID) rgulValueInfo, sizeof( rgulValueInfo), &ulcbValueInfo ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("Board type is not in registry.")); goto errExit; }
ASSERT( ulcbValueInfo >= sizeof( KEY_VALUE_PARTIAL_INFORMATION));
//
if ( ( (pPartialValueInfo->Type != REG_DWORD) && (pPartialValueInfo->Type != REG_BINARY)) || (pPartialValueInfo->DataLength != sizeof( DWORD)) ) { _DbgPrintF( DEBUGLVL_ERROR, ("Invalid Board type in registry.")); goto errExit; }
m_BoardInfo.uiBoardID = (UINT)(*pulData);
_DbgPrintF( DEBUGLVL_VERBOSE, ("CDevice: Board ID = %d", m_BoardInfo.uiBoardID));
errExit: ZwClose( hRegistry);
return Status; }
NTSTATUS CDevice:: GetRegistryULONG( PWCHAR pwcKeyName, PULONG pulValue ) { NTSTATUS Status = STATUS_SUCCESS; HANDLE hRegistry; UNICODE_STRING KeyName; ULONG rgulValueInfo[10]; ULONG ulcbValueInfo; PKEY_VALUE_PARTIAL_INFORMATION pPartialValueInfo; PULONG pulData;
ASSERT(KeGetCurrentIrql() <= PASSIVE_LEVEL);
pPartialValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION) rgulValueInfo; pulData = (PULONG) pPartialValueInfo->Data;
// Open the registry key for this device.
//
Status = IoOpenDeviceRegistryKey( m_pKSDevice->PhysicalDeviceObject, PLUGPLAY_REGKEY_DRIVER, STANDARD_RIGHTS_ALL, &hRegistry ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("Can't open device registry key.")); goto errExit; }
// Get the registry entry.
//
RtlInitUnicodeString(&KeyName, pwcKeyName); Status = ZwQueryValueKey( hRegistry, &KeyName, KeyValuePartialInformation, (PVOID) rgulValueInfo, sizeof( rgulValueInfo), &ulcbValueInfo ); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR, ("Key is not in registry.")); ZwClose( hRegistry); goto errExit; }
ASSERT( ulcbValueInfo >= sizeof( KEY_VALUE_PARTIAL_INFORMATION));
if ( ( (pPartialValueInfo->Type != REG_DWORD) && (pPartialValueInfo->Type != REG_BINARY)) || (pPartialValueInfo->DataLength != sizeof( DWORD)) ) { _DbgPrintF( DEBUGLVL_ERROR, ("Invalid key value in registry.")); ZwClose( hRegistry); goto errExit; }
*pulValue = *pulData;
ZwClose( hRegistry);
errExit: return Status; }
NTSTATUS CDevice:: AcquireResources( PPHILIPS_TUNER_RESOURCE pNewTunerResource, PULONG pulAquiredResourceID ) { NTSTATUS Status = STATUS_SUCCESS; TunerStatusType tunerStatus; VsbStatusType vsbStatus;
//$Review - Add resource managment code here.
//
//Status = STATUS_RESOURCE_NOT_OWNED;
// Only ATSC mode is supported for now. Just check that
// ATSC mode is requested.
//
if (!IsEqualGUID( &pNewTunerResource->guidDemodulatorNode, &KSNODE_BDA_8VSB_DEMODULATOR) ) { Status = STATUS_NOT_IMPLEMENTED; goto errExit; }
// If we haven't yet set ATSC mode, then go ahead and set it.
//
if (!IsEqualGUID( &m_CurTunerResource.guidDemodulatorNode, &KSNODE_BDA_8VSB_DEMODULATOR) ) { Status = SetTunerMode(KSPROPERTY_TUNER_MODE_ATSC); if (!NT_SUCCESS( Status)) { goto errExit; } m_CurTunerResource.guidDemodulatorNode = KSNODE_BDA_8VSB_DEMODULATOR; }
// Set a new tuner frequency if it is different.
//
if (pNewTunerResource->ulhzCarrierFrequency != m_CurTunerResource.ulhzCarrierFrequency) { m_CurTunerResource.ulhzCarrierFrequency = pNewTunerResource->ulhzCarrierFrequency; SetTunerFrequency( &m_CurTunerResource.ulhzCarrierFrequency); }
// Get the Tuner and VSB status
//
GetTunerStatus(&tunerStatus); m_pDemod->GetStatus(&vsbStatus);
errExit: return Status; }
NTSTATUS CDevice:: ReleaseResources( ULONG ulAquiredResourceID ) { NTSTATUS Status = STATUS_SUCCESS;
//$REVIEW - Put Resource management code here.
return Status; }
/*
* SetBoard() */ NTSTATUS CDevice::SetBoard(UINT uiBoardID) { NTSTATUS Status = STATUS_SUCCESS;
if(uiBoardID == BOARD_CONEY) { // if IF type = 0, then the IF is not MPOC
// else IF is MPOC
m_BoardInfo.uiBoardID = uiBoardID; m_BoardInfo.uiIFStage = IF_OTHER; m_BoardInfo.uiVsbChipVersion = VSB1 << 8; m_BoardInfo.ulSupportedModes = KSPROPERTY_TUNER_MODE_TV | KSPROPERTY_TUNER_MODE_ATSC; m_BoardInfo.ulNumSupportedModes = 2; // m_ulNumberOfPins = 4;
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::Loading Coney Drivers\n"));
} else if(uiBoardID == BOARD_CATALINA) { // if IF type = 0, then the IF is not MPOC
// else IF is MPOC
m_BoardInfo.uiBoardID = uiBoardID; m_BoardInfo.uiIFStage = IF_MPOC; m_BoardInfo.uiVsbChipVersion = VSB2 << 8; m_BoardInfo.ulSupportedModes = KSPROPERTY_TUNER_MODE_TV | KSPROPERTY_TUNER_MODE_ATSC; m_BoardInfo.ulNumSupportedModes = 2; // m_ulNumberOfPins = 4;
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::Loading Catalina Drivers\n"));
} else if(uiBoardID == BOARD_CORONADO) { // if IF type = 0, then the IF is not MPOC
// else IF is MPOC
m_BoardInfo.uiBoardID = uiBoardID; m_BoardInfo.uiIFStage = IF_OTHER; m_BoardInfo.uiVsbChipVersion = VSB1 << 8; m_BoardInfo.ulSupportedModes = KSPROPERTY_TUNER_MODE_TV | KSPROPERTY_TUNER_MODE_ATSC; m_BoardInfo.ulNumSupportedModes = 2; // m_ulNumberOfPins = 4;
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::Loading Coronado Drivers\n")); } else if(uiBoardID == BOARD_CES) { // if IF type = 0, then the IF is not MPOC
// else IF is MPOC
m_BoardInfo.uiBoardID = uiBoardID; m_BoardInfo.uiIFStage = IF_OTHER; m_BoardInfo.uiVsbChipVersion = VSB1 << 8; m_BoardInfo.ulSupportedModes = KSPROPERTY_TUNER_MODE_ATSC; m_BoardInfo.ulNumSupportedModes = 1; // m_ulNumberOfPins = 4;
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::Loading CES Drivers\n")); } else if(uiBoardID == BOARD_CORFU) { // if IF type = 0, then the IF is not MPOC
// else IF is MPOC
m_BoardInfo.uiBoardID = uiBoardID; m_BoardInfo.uiIFStage = IF_OTHER; m_BoardInfo.uiVsbChipVersion = VSB2 << 8; m_BoardInfo.ulSupportedModes = KSPROPERTY_TUNER_MODE_ATSC; m_BoardInfo.ulNumSupportedModes = 1; // m_ulNumberOfPins = 4;
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::Loading Corfu Drivers\n"));
} else { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::Invalid Board ID\n")); Status = STATUS_DEVICE_CONFIGURATION_ERROR; goto errexit; }
// Create a tuner object
// m_pTuner = new CTuner(&m_I2CScript);
m_pTuner = new(NonPagedPool,'Tune') CTuner(m_pI2CScript, &m_BoardInfo, &Status); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::Could not create Tuner Object\n")); goto errexit; } if (!m_pTuner) { Status = STATUS_NO_MEMORY; goto errexit; }
// Create a demodulator object based on VSB chip type
if((VSBCHIPTYPE)(m_BoardInfo.uiVsbChipVersion >> 8) == VSB1) // m_pDemod = (CVSBDemod *)(new CVSB1Demod(&m_I2CScript));
m_pDemod = (CVSBDemod *)(new(NonPagedPool,'VSB1') CVSB1Demod(m_pI2CScript, &m_BoardInfo, &Status)); else // m_pDemod = (CVSBDemod *)(new CVSB2Demod(&m_I2CScript));
m_pDemod = (CVSBDemod *)(new(NonPagedPool,'VSB2')CVSB2Demod(m_pI2CScript, &m_BoardInfo, &Status));
if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::Could not create VSB Object\n")); goto errexit; }
#if 0
// Set tuner capabilities (RO properties) based upon the TunerId
if(!m_pTuner->SetCapabilities(&m_BoardInfo)) { // there is unsupported hardware was found
Status = STATUS_ADAPTER_HARDWARE_ERROR; goto errexit; } #endif
// If board initialize fails, don't return FALSE as this could affect
// the non-PnP devices such as PP boards from loading. We would like these
// Non PnP drivers to load and when the devices are attached to the PP,
// we would like it to function as a pseudo PnP device.
// Initialize the board
BoardInitialize();
m_bFirstEntry = TRUE; _DbgPrintF( DEBUGLVL_VERBOSE,("CDevice:SetBoard() ok\n"));
errexit: return Status;
}
/*
* BoardInitialize() * Purpose: Initialize the board * * Inputs : * Outputs: BOOL - FALSE if board initialization fails, else TRUE * Author : MM */ NTSTATUS CDevice::BoardInitialize() { NTSTATUS Status = STATUS_SUCCESS; ULONG ulhzFrequency = 373250000;
if(m_BoardInfo.uiIFStage == IF_MPOC) { // Get MPOC interface
//GetIFInterface();
Status = MpocInit(); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::MPOC Initialization failure\n")); goto errexit; } Status = GetMpocVersion(&m_BoardInfo.uiMpocVersion); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::MPOC Version failure\n")); goto errexit; } } // Initialize mode register
Status = ModeInit(); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::Mode Initialization failure\n")); goto errexit; }
// DO a VSB hardware reset
Status = VsbReset(HARDWARE_RESET); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::Hardware reset failure\n")); goto errexit; }
// DO a VSB software reset
Status = VsbReset(VSB_INITIAL_RESET); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::Software reset failure\n")); goto errexit; }
// Set TV System to NTSC
Status = SetTunerMode(KSPROPERTY_TUNER_MODE_ATSC); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::TV System change failure\n")); goto errexit; }
// Get the initial tuner frequency from the registry.
// Set it to 37325000 if registry value is absent.
//
// ulhzFrequency = 615250000;
// ulhzFrequency = 531250000;
// ulhzFrequency = 307250000;
//
Status = GetRegistryULONG( L"InitialFrequency", &ulhzFrequency);
// Set the intial frequency on the tuner.
//
Status = SetTunerFrequency( &ulhzFrequency); if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice::Channel change failure\n")); goto errexit; } if((m_BoardInfo.uiBoardID == BOARD_CATALINA) || (m_BoardInfo.uiBoardID == BOARD_CONEY)) {
#define BTSC_CONTROL_REGISTER 0xB6
//Mini: Adding Initialization of BTSC decoder here so that it functions
// 2/17/2000
// BTSC decoder settings:
// AVL Attack time = 420ohm
// Normal load current
// Automatic Volume control ON
// No Mute
// Stereo bit 0
UCHAR ucDataWr = 0x4; m_pI2CScript->WriteSeq(BTSC_CONTROL_REGISTER, &ucDataWr, 1); }
errexit: return Status; }
UCHAR ConeyModeInitArray[1]= { 0x3F, };
UCHAR CatalinaModeInitArray[1]= { 0x02, };
/*
* ModeInit() * Input * Output : TRUE - mode initialization succeeds * FALSE - if there is an I2C error & mode initialization fails * Description: Initialize mode register */ NTSTATUS CDevice::ModeInit() { NTSTATUS Status = STATUS_SUCCESS;
_DbgPrintF( DEBUGLVL_VERBOSE,("CDevice::ModeInit(): Inside\n"));
if(m_BoardInfo.uiBoardID == BOARD_CONEY) { m_ucModeInit = ConeyModeInitArray[0]; if(!m_pI2CScript->WriteSeq(CONEY_I2C_PARALLEL_PORT, ConeyModeInitArray, sizeof (ConeyModeInitArray))) Status = STATUS_ADAPTER_HARDWARE_ERROR; } else if (m_BoardInfo.uiBoardID == BOARD_CATALINA) { m_ucModeInit = CatalinaModeInitArray[0]; // CATALINA specific initializations
if(!m_pI2CScript->WriteSeq(CATALINA_MISC_CONTROL_REGISTER, CatalinaModeInitArray, sizeof (CatalinaModeInitArray))) Status = STATUS_ADAPTER_HARDWARE_ERROR; } else { }
if (!NT_SUCCESS( Status)) { _DbgPrintF( DEBUGLVL_ERROR,("CDevice: Demodulator Mode Init FAILED !!! ------------ \n")); } else { _DbgPrintF( DEBUGLVL_TERSE,("CDevice: Demodulator Mode Init PASSED !!! ------------ \n")); } return Status; }
|