// $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 #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