text: // $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
  
  
  