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

123 lines
3.4 KiB
C++

// $Header: G:/SwDev/WDM/Video/bt848/rcs/Bti2c.h 1.4 1998/04/29 22:43:27 tomz Exp $
#ifndef __I2C_H
#define __I2C_H
#include "regField.h"
#include "viddefs.h"
#include "retcode.h"
#include "i2cerr.h"
//#define HAUPPAUGEI2CPROVIDER
#ifdef HAUPPAUGEI2CPROVIDER
// #include "hcwWDM.h"
// Need to define for brooktree i2c calls
/* Type: Level
* Purpose: used to define a pin state
*/
typedef enum { LevelLow, LevelHi } Level;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLASS I2C
//
// Description:
// This class encapsulates the register fields in the I2C register of the
// Bt848. A complete set of functions are developed to manipulate all the
// register fields in the I2C for the Bt848.
//
/////////////////////////////////////////////////////////////////////////////
class I2C
{
private:
// define which mode the I2C is selected
enum I2CMode { I2CMode_None, I2CMode_HW, I2CMode_SW };
bool initOK; // initialization is successful?
DWORD cycle; // software control of frequency
int errNum; // error number
I2CMode mode; // which mode the I2C is running in
//**************************************************************************
// Structures
//**************************************************************************
union shadow
{
struct _i2c_reg // I2C register structure
{
unsigned int sda:1;
unsigned int scl:1;
unsigned int w3b:1;
unsigned int sync:1;
unsigned int div:4;
unsigned int byte2:8;
unsigned int byte1:8;
unsigned int addr_rw:8;
} i2cShadow;
DWORD Initer;
} sh;
protected:
RegisterDW decRegINT_STAT;
RegField decFieldI2CDONE;
RegField decFieldRACK;
RegisterDW decRegI2C;
RegField decFieldI2CDB0;
RegField decFieldI2CDB1;
RegField decFieldI2CDB2;
RegField decFieldI2CDIV;
RegField decFieldSYNC;
RegField decFieldW3B;
RegField decFieldSCL;
RegField decFieldSDA;
public:
// constructor and destructor
I2C( void );
~I2C();
// member functions
bool IsInitOK( void );
#ifdef HARDWAREI2C
ErrorCode I2CInitHWMode( 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 );
ErrorCode I2CSetSync( State );
int I2CReadSync( void );
#endif
void I2CSetFreq( long freq );
int I2CGetLastError( void );
#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
private:
void I2CResetShadow( void ); // reset register shadow
ErrorCode I2CHWWaitUntilDone( int ); // wait until I2C completes operation
bool I2CHWIsDone( void ); // check interrupt bit for operation done
bool I2CHWReceivedACK( void ); // check interrupt bit for received ACK
void I2CSWBitDelay( void ); // insert delay to simulate frequency
ErrorCode I2CSWWaitForACK( void ); // wait for ACK from receiver using software
};
#endif // __I2C_H