151 lines
5.8 KiB
C++
151 lines
5.8 KiB
C++
//==========================================================================;
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
// PURPOSE.
|
|
//
|
|
// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// I2CSCRPT.H
|
|
// I2CScript class definitions.
|
|
// Main Include Module.
|
|
//==========================================================================;
|
|
|
|
#ifndef _I2CSCRPT_H_
|
|
#define _I2CSCRPT_H_
|
|
|
|
|
|
//#include "i2c.h"
|
|
#include "i2cgpio.h"
|
|
|
|
|
|
#define I2CSCRIPT_LENGTH_MAXIMUM 100
|
|
#define I2C_FIXED_CLOCK_RATE 10000
|
|
|
|
|
|
// The I2CScript is build from the following primitives
|
|
typedef struct tagI2CScriptPrimitive
|
|
{
|
|
BYTE byData; // Data to be used in the I2C operation
|
|
BYTE byORData; // Data to be used for a logical OR operation
|
|
BYTE byANDData; // Data to be used for a logical AND operation
|
|
BYTE byFlags; // implementation specific internal Script flags for I2C operation
|
|
ULONG ulProviderFlags; // I2CProvider specific flags
|
|
ULONG ulCommand; // I2CProvider specific command
|
|
|
|
} I2CScriptPrimitive, * PI2CScriptPrimitive;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR uchModifyORValue;
|
|
UCHAR uchModifyANDValue;
|
|
|
|
} I2C_MODIFY_VALUES, * PI2C_MODIFY_VALUES;
|
|
|
|
// New I2CScript control structure - extension to the old I2C access structure
|
|
typedef struct tagI2CPacket
|
|
{
|
|
UCHAR uchChipAddress; // I2C Address
|
|
UCHAR uchI2CResult; // valid in synchronous operation only
|
|
USHORT cbWriteCount; // bytes to write ( included SubAddress, if exist)
|
|
USHORT cbReadCount; // bytes to read ( usually one)
|
|
USHORT usFlags; // describes the desired operation
|
|
PUCHAR puchWriteBuffer; // buffer to write
|
|
PUCHAR puchReadBuffer; // buffer to read
|
|
UCHAR uchORValue; // applied only in Read-Modify-Write cycle
|
|
UCHAR uchANDValue; // applied only in Read-Modify-Write cycle
|
|
USHORT usReserved; //
|
|
|
|
} I2CPacket, * PI2CPacket;
|
|
|
|
// possible flags applied to usFlags
|
|
#define I2COPERATION_READ 0x0001 // might not be needed - use bcReadCount
|
|
#define I2COPERATION_WRITE 0x0002 // might be not needed - use bcReadCount
|
|
#define I2COPERATION_READWRITE 0x0004
|
|
#define I2COPERATION_RANDOMACCESS 0x0100 // to indicate 16 bits emulation to provide
|
|
// built-in support for ITT decoder and ST24 series
|
|
// of I2C driven EEPROM
|
|
|
|
extern "C"
|
|
{
|
|
typedef VOID (__stdcall * PHWCompletionRoutine)( IN PIRP pIrp);
|
|
}
|
|
|
|
class CI2CScript
|
|
{
|
|
public:
|
|
CI2CScript ( PDEVICE_OBJECT pDeviceObject, NTSTATUS * pStatus);
|
|
// PVOID operator new ( UINT size_t, PVOID pAllocation);
|
|
|
|
// Attributes
|
|
public:
|
|
|
|
private:
|
|
// I2C Provider related
|
|
I2CINTERFACE m_i2cProviderInterface;
|
|
PDEVICE_OBJECT m_pdoDriver;
|
|
ULONG m_ulI2CAccessClockRate;
|
|
DWORD m_dwI2CAccessKey;
|
|
LARGE_INTEGER m_liOperationStartTime;
|
|
|
|
// I2CScript management related
|
|
BOOL m_bExecutionInProcess;
|
|
UINT m_nExecutionIndex;
|
|
UINT m_nCompletionIndex;
|
|
UINT m_nScriptLength;
|
|
PHWCompletionRoutine m_pfnReturnWhenDone;
|
|
I2CScriptPrimitive m_i2cScript[I2CSCRIPT_LENGTH_MAXIMUM];
|
|
|
|
// Implementation
|
|
public:
|
|
BOOL LockI2CProviderEx ( void);
|
|
BOOL ReleaseI2CProvider ( void);
|
|
|
|
BOOL ExecuteI2CPacket ( IN OUT PI2CPacket);
|
|
BOOL PerformI2CPacketOperation ( IN OUT PI2CPacket pI2CPacket);
|
|
|
|
BOOL AppendToScript ( IN PI2CPacket);
|
|
void ClearScript ( void);
|
|
BOOL ExecuteScript ( IN PIRP pIrp,
|
|
IN PHWCompletionRoutine pfnScriptCompletion);
|
|
void InterpreterScript ( void);
|
|
UINT GetScriptResults ( PUINT puiReadCount, PUCHAR puchReadBuffer);
|
|
BOOL CombinedSeq(UCHAR addr, UCHAR seqWr[], USHORT lenWr, UCHAR seqRd[], USHORT lenRd);
|
|
BOOL ReadSeq(UCHAR addr, UCHAR *p_seq, USHORT len) ;
|
|
BOOL WriteSeq(UCHAR addr, UCHAR *p_seq, USHORT len) ;
|
|
|
|
private:
|
|
BOOL LockI2CProvider ( void);
|
|
UINT AccessI2CProvider ( PDEVICE_OBJECT pdoClient, PI2CControl pi2cAccessBlock);
|
|
BOOL InitializeAttachI2CProvider ( I2CINTERFACE * pI2CInterface, PDEVICE_OBJECT pDeviceObject);
|
|
BOOL LocateAttachI2CProvider ( I2CINTERFACE * pI2CInterface, PDEVICE_OBJECT pDeviceObject, int nIrpMajorFunction);
|
|
UINT CheckI2CScriptPacket ( IN PI2CPacket pI2CPacket);
|
|
BOOL GetI2CProviderLockStatus ( void);
|
|
BOOL CheckInterface(UCHAR addr) ;
|
|
};
|
|
|
|
|
|
extern "C"
|
|
NTSTATUS I2CScriptIoSynchCompletionRoutine ( IN PDEVICE_OBJECT pDeviceObject,
|
|
IN PIRP pIrp,
|
|
IN PVOID Event);
|
|
|
|
// errors definition for internal use
|
|
#define I2CSCRIPT_NOERROR 0x00
|
|
#define I2CSCRIPT_ERROR_NOPROVIDER 0x01
|
|
#define I2CSCRIPT_ERROR_NODATA 0x02
|
|
#define I2CSCRIPT_ERROR_NOBUFFER 0x03
|
|
#define I2CSCRIPT_ERROR_READWRITE 0x04
|
|
#define I2CSCRIPT_ERROR_OVERFLOW 0x05
|
|
|
|
// time definitions
|
|
#define I2CSCRIPT_DELAY_OPENPROVIDER -2000
|
|
#define I2CSCRIPT_DELAY_GETPROVIDERSTATUS -2000
|
|
|
|
// time limits
|
|
#define I2CSCRIPT_TIMELIMIT_OPENPROVIDER 50000000 // 5 seconds in 100 nsec.
|
|
|
|
|
|
#endif // _I2CSCRPT_H_
|