windows-nt/Source/XPSP1/NT/drivers/wdm/capture/mini/bt848/device.h
2020-09-26 16:20:57 +08:00

289 lines
7.8 KiB
C++

// $Header: G:/SwDev/WDM/Video/bt848/rcs/Device.h 1.10 1998/05/11 20:27:07 tomz Exp $
#ifndef __DEVICE_H
#define __DEVICE_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _STREAM_H
#include "strmini.h"
#endif
#ifdef __cplusplus
}
#endif
#ifndef __PISCES_H
#include "pisces.h"
#endif
#ifndef __MYTYPES_H
#include "mytypes.h"
#endif
#ifndef __VIDCH_H
#include "vidch.h"
#endif
#ifndef __I2C_H
#include "bti2c.h"
#endif
#ifndef __GPIO_H
#include "gpio.h"
#endif
#include "xbar.h"
#ifndef __I2C_H__
#include <i2cgpio.h>
#endif
#define TUNER_BRAND_TEMIC 1
#define TUNER_BRAND_PHILIPS 2
#define TUNER_BRAND_ALPS 3
typedef struct _TUNER_INFO
{
ULONG TunerBrand; // Brand of tuner
BYTE TunerI2CAddress; // I2C address for Temic tuner
WORD TunerBandCtrlLow; // Ctrl code for VHF low
WORD TunerBandCtrlMid; // Ctrl code for VHF high
WORD TunerBandCtrlHigh; // Ctrl code for UHF
} TUNER_INFO, *PTUNER_INFO;
extern LONG PinTypes_ []; // just allocate maximum possible
extern DWORD xtals_ []; // no more than 2 xtals
extern TUNER_INFO TunerInfo;
void ReadXBarRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject );
void ReadXTalRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject );
void ReadTunerRegistryValues( IN PDEVICE_OBJECT PhysicalDeviceObject );
VOID AdapterSetCrossbarProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
VOID AdapterGetCrossbarProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterSetVideoProcAmpProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterGetVideoProcAmpProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterSetVideoDecProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterGetVideoDecProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterSetTunerProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterGetTunerProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterSetTVAudioProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void AdapterGetTVAudioProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void HandleIRP( PHW_STREAM_REQUEST_BLOCK pSrb );
// Forward declarations
class PsDevice;
extern void SetCurrentDevice( PsDevice *dev );
extern BYTE *GetBase();
extern void SetBase(BYTE *base);
/* Class: PsDevice
* Purpose: This is the class that encapsulates the adapter in the WDM model.
*/
class PsDevice
{
public:
PsDevice( DWORD dwBase );
~PsDevice();
void *operator new( size_t, void *buf ) { return buf; }
void operator delete( void *, size_t ) {}
LPBYTE GetBaseAddress() { return BaseAddress_; }
bool InitOK();
PDEVICE_OBJECT PDO; // Physical Device Object
State Interrupt() { return CaptureContrll_.Interrupt(); }
ErrorCode OpenChannel( PVOID pStrmEx, VideoStream st );
void CloseChannel( VideoChannel *ToClose );
ErrorCode OpenInterChannel( PVOID pStrmEx, VideoStream st );
ErrorCode OpenAlterChannel( PVOID pStrmEx, VideoStream st );
ErrorCode OpenVBIChannel( PVOID pStrmEx );
void ClosePairedChannel( VideoChannel *ToClose );
bool IsVideoChannel( VideoChannel &aChan );
bool IsVBIChannel( VideoChannel &aChan );
bool IsOurChannel( VideoChannel &aChan );
ErrorCode DoOpen( VideoStream st );
void AddBuffer( VideoChannel &aChan, PHW_STREAM_REQUEST_BLOCK );
ErrorCode Create( VideoChannel &VidChan );
void Start( VideoChannel &VidChan );
void Stop( VideoChannel &VidChan );
void Pause( VideoChannel &VidChan );
void EnableAudio( State s );
void SetVideoState( PHW_STREAM_REQUEST_BLOCK pSrb );
void GetVideoState( PHW_STREAM_REQUEST_BLOCK pSrb );
void SetClockMaster( PHW_STREAM_REQUEST_BLOCK pSrb );
// tuner methods
void SetChannel( long lFreq );
int GetPllOffset( PULONG busy, ULONG &lastFreq );
I2C i2c;
GPIO gpio;
BtPisces CaptureContrll_;
CrossBar xBar;
void SetSaturation( LONG Data );
void SetHue( LONG Data );
void SetBrightness( LONG Data );
void SetSVideo( LONG Data );
void SetContrast( LONG Data );
void SetFormat( LONG Data );
void SetConnector( LONG Data );
LONG GetSaturation();
LONG GetHue();
LONG GetBrightness();
LONG GetSVideo();
LONG GetContrast();
LONG GetFormat();
LONG GetConnector();
public:
// this should be before the capture controller, as CapCtrl uses the base address
LPBYTE BaseAddress_;
VideoChannel *videochannels [4];
long LastFreq_;
DWORD dwCurCookie_;
BYTE I2CAddr_;
#ifdef HAUPPAUGEI2CPROVIDER
// new private members of PsDevice for Hauppauge I2C Provider:
LARGE_INTEGER LastI2CAccessTime;
DWORD dwExpiredCookie;
DWORD dwI2CClientTimeout;
#endif
static void STREAMAPI CreateVideo( PHW_STREAM_REQUEST_BLOCK pSrb );
static void STREAMAPI DestroyVideo( PHW_STREAM_REQUEST_BLOCK pSrb );
static void STREAMAPI DestroyVideoNoComplete( PHW_STREAM_REQUEST_BLOCK pSrb );
static void STREAMAPI StartVideo( PHW_STREAM_REQUEST_BLOCK pSrb );
// tuner and video standard notifications are handled here
void ChangeNotifyChannels( IN PHW_STREAM_REQUEST_BLOCK pSrb );
static NTSTATUS STDMETHODCALLTYPE I2COpen( PDEVICE_OBJECT, ULONG, PI2CControl );
static NTSTATUS STDMETHODCALLTYPE I2CAccess( PDEVICE_OBJECT, PI2CControl );
// callbacks
LONG GetSupportedStandards();
void GetStreamProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void SetStreamProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void GetStreamConnectionProperty( PHW_STREAM_REQUEST_BLOCK pSrb );
void ProcessSetDataFormat( PHW_STREAM_REQUEST_BLOCK pSrb );
//void *operator new( size_t, void *buf ) { return buf; }
//void operator delete( void *, size_t ) {}
// I2C API
bool I2CIsInitOK( void );
#ifdef HARDWAREI2C
ErrorCode I2CInitHWMode( long freq );
void I2CSetFreq( long freq );
int I2CReadDiv( void );
ErrorCode I2CHWRead( BYTE address, BYTE *value );
ErrorCode I2CHWWrite2( BYTE address, BYTE value1 );
ErrorCode I2CHWWrite3( BYTE address, BYTE value1, BYTE value2 );
int I2CReadSync( void );
#else
// tuner.cpp contains code to fake these using Software I2C just
// to make the older tuner code work until it is seperated out
ErrorCode I2CHWRead( BYTE address, BYTE *value );
ErrorCode I2CHWWrite3( BYTE address, BYTE value1, BYTE value2 );
#endif
int I2CGetLastError( void );
void StoreI2CAddress( BYTE addr );
BYTE GetI2CAddress();
#ifdef HAUPPAUGEI2CPROVIDER
ErrorCode I2CInitSWMode( long freq );
ErrorCode I2CSWStart( void );
ErrorCode I2CSWStop( void );
ErrorCode I2CSWRead( BYTE * value );
ErrorCode I2CSWWrite( BYTE value );
ErrorCode I2CSWSendACK( void );
ErrorCode I2CSWSendNACK( void );
// ErrorCode I2CSWSetSCL( Level );
// int I2CSWReadSCL( void );
// ErrorCode I2CSWSetSDA( Level );
// int I2CSWReadSDA( void );
#endif
// GPIO API
bool GPIOIsInitOK( void );
void SetGPCLKMODE( State s );
int GetGPCLKMODE( void );
void SetGPIOMODE( GPIOMode mode );
int GetGPIOMODE( void );
void SetGPWEC( State s );
int GetGPWEC( void );
void SetGPINTI( State s );
int GetGPINTI( void );
void SetGPINTC( State s );
int GetGPINTC( void );
ErrorCode SetGPOEBit( int bit, State s );
void SetGPOE( DWORD value );
int GetGPOEBit( int bit );
DWORD GetGPOE( void );
ErrorCode SetGPIEBit( int bit , State s );
void SetGPIE( DWORD value );
int GetGPIEBit( int bit );
DWORD GetGPIE( void );
ErrorCode SetGPDATA( GPIOReg *data, int size, int offset );
ErrorCode GetGPDATA( GPIOReg *data, int size, int offset );
ErrorCode SetGPDATABits( int fromBit, int toBit, DWORD value, int offset );
ErrorCode GetGPDATABits( int fromBit, int toBit, DWORD *value, int offset );
};
inline void PsDevice::StoreI2CAddress( BYTE addr )
{
I2CAddr_ = addr;
}
inline BYTE PsDevice::GetI2CAddress()
{
return I2CAddr_;
}
#endif