176 lines
6.3 KiB
C
176 lines
6.3 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) 1996 - 1997 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
//@@BEGIN_DDKSPLIT
|
|
//
|
|
// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
|
//
|
|
// The files
|
|
// \wdm10\ddk\inc\i2cgpio.h
|
|
// \dev\ddk\inc\i2cgpio.h
|
|
// Are the same.
|
|
//
|
|
// When changing either file, be sure to update the other file in the other
|
|
// directory. This has been done to ensure that the DirectX DDK can pull
|
|
// I2CGPIO.H into its DDK from \dev\ddk\inc, and not have to enlist in the
|
|
// \wdm10 ddk.
|
|
//
|
|
//@@END_DDKSPLIT
|
|
//==========================================================================;
|
|
|
|
#if 0
|
|
To access the IO functionality in a WDM driver or the VDD, WDM driver sends
|
|
the following IRP to its parent.
|
|
|
|
MajorFunction = IRP_MJ_PNP;
|
|
MinorFunction = IRP_MN_QUERY_INTERFACE;
|
|
|
|
Guid = DEFINE_GUID( GUID_GPIO_INTERFACE,
|
|
0x02295e87L, 0xbb3f, 0x11d0, 0x80, 0xce, 0x0, 0x20, 0xaf, 0xf7, 0x49, 0x1e);
|
|
|
|
The QUERY_INTERFACE Irp will return an interface (set of function pointers)
|
|
of the type xxxxINTERFACE, defined below. This is essentially a table of
|
|
function pointers.
|
|
|
|
#endif
|
|
|
|
#ifndef __I2CGPIO_H__
|
|
#define __I2CGPIO_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // __cplusplus
|
|
|
|
// Guids
|
|
//
|
|
// DEFINE_GUID requires that you include wdm.h before this file.
|
|
// #define INITGUID to actually initialize the guid in memory.
|
|
//
|
|
DEFINE_GUID( GUID_I2C_INTERFACE, 0x02295e86L, 0xbb3f, 0x11d0, 0x80, 0xce, 0x0, 0x20, 0xaf, 0xf7, 0x49, 0x1e);
|
|
DEFINE_GUID( GUID_GPIO_INTERFACE,0x02295e87L, 0xbb3f, 0x11d0, 0x80, 0xce, 0x0, 0x20, 0xaf, 0xf7, 0x49, 0x1e);
|
|
DEFINE_GUID( GUID_COPYPROTECTION_INTERFACE, 0x02295e88L, 0xbb3f, 0x11d0, 0x80, 0xce, 0x0, 0x20, 0xaf, 0xf7, 0x49, 0x1e);
|
|
|
|
//==========================================================================;
|
|
// used below if neccessary
|
|
#ifndef BYTE
|
|
#define BYTE UCHAR
|
|
#endif
|
|
#ifndef DWORD
|
|
#define DWORD ULONG
|
|
#endif
|
|
//==========================================================================;
|
|
//
|
|
// I2C section
|
|
//
|
|
// I2C Commands
|
|
#define I2C_COMMAND_NULL 0X0000
|
|
#define I2C_COMMAND_READ 0X0001
|
|
#define I2C_COMMAND_WRITE 0X0002
|
|
#define I2C_COMMAND_STATUS 0X0004
|
|
#define I2C_COMMAND_RESET 0X0008
|
|
|
|
// The following flags are provided on a READ or WRITE command
|
|
#define I2C_FLAGS_START 0X0001 // START + addx
|
|
#define I2C_FLAGS_STOP 0X0002 // STOP
|
|
#define I2C_FLAGS_DATACHAINING 0X0004 // STOP, START + addx
|
|
#define I2C_FLAGS_ACK 0X0010 // ACKNOWLEDGE (normally set)
|
|
|
|
// The following status flags are returned on completion of the operation
|
|
#define I2C_STATUS_NOERROR 0X0000
|
|
#define I2C_STATUS_BUSY 0X0001
|
|
#define I2C_STATUS_ERROR 0X0002
|
|
|
|
typedef struct _I2CControl {
|
|
ULONG Command; // I2C_COMMAND_*
|
|
DWORD dwCookie; // Context identifier returned on Open
|
|
BYTE Data; // Data to write, or returned byte
|
|
BYTE Reserved[3]; // Filler
|
|
ULONG Flags; // I2C_FLAGS_*
|
|
ULONG Status; // I2C_STATUS_*
|
|
ULONG ClockRate; // Bus clockrate in Hz.
|
|
} I2CControl, *PI2CControl;
|
|
|
|
// this is the Interface definition for I2C
|
|
//
|
|
typedef NTSTATUS (STDMETHODCALLTYPE *I2COPEN)(PDEVICE_OBJECT, ULONG, PI2CControl);
|
|
typedef NTSTATUS (STDMETHODCALLTYPE *I2CACCESS)(PDEVICE_OBJECT, PI2CControl);
|
|
|
|
typedef struct {
|
|
INTERFACE _vddInterface;
|
|
I2COPEN i2cOpen;
|
|
I2CACCESS i2cAccess;
|
|
} I2CINTERFACE;
|
|
|
|
//==========================================================================;
|
|
//
|
|
// GPIO section
|
|
//
|
|
// GPIO Commands
|
|
|
|
#define GPIO_COMMAND_QUERY 0X0001 // get #pins and nBufferSize
|
|
#define GPIO_COMMAND_OPEN 0X0001 // old open
|
|
#define GPIO_COMMAND_OPEN_PINS 0X0002 // get dwCookie
|
|
#define GPIO_COMMAND_CLOSE_PINS 0X0004 // invalidate cookie
|
|
#define GPIO_COMMAND_READ_BUFFER 0X0008
|
|
#define GPIO_COMMAND_WRITE_BUFFER 0X0010
|
|
|
|
// The following flags are provided on a READ_BUFFER or WRITE_BUFFER command
|
|
// lpPins bits set MUST have contiguous bits set for a read/write command.
|
|
//
|
|
// On a READ, if the number of pins set in the bitmask does not fill a
|
|
// byte/word/dword, then zeros are returned for those positions.
|
|
// on a WRITE, if the number of pins set in the bitmask does not fill a
|
|
// byte/word/dword, a read/modify/write is done on the port/mmio position
|
|
// that represents those bits.
|
|
|
|
#define GPIO_FLAGS_BYTE 0x0001 // do byte read/write
|
|
#define GPIO_FLAGS_WORD 0x0002 // do word read/write
|
|
#define GPIO_FLAGS_DWORD 0x0004 // do dword read/write
|
|
|
|
// The following status flags are returned on completion of the operation
|
|
#define GPIO_STATUS_NOERROR 0X0000
|
|
#define GPIO_STATUS_BUSY 0X0001
|
|
#define GPIO_STATUS_ERROR 0X0002
|
|
#define GPIO_STATUS_NO_ASYNCH 0X0004 // gpio provider does not do asynch xfer
|
|
|
|
typedef struct _GPIOControl {
|
|
ULONG Command; // GPIO_COMMAND_*
|
|
ULONG Flags; // GPIO_FLAGS_*
|
|
DWORD dwCookie; // Context identifier returned on Open
|
|
ULONG Status; // GPIO_STATUS_*
|
|
ULONG nBytes; // # of bytes to send or recieved
|
|
ULONG nBufferSize; // max size of buffer
|
|
ULONG nPins; // number of GPIO pins returned by Open
|
|
UCHAR *Pins; // pointer to bitmask of pins to read/write
|
|
UCHAR *Buffer; // pointer to GPIO data to send/recieve
|
|
void (*AsynchCompleteCallback)(UCHAR *Buffer);
|
|
// NULL if synchronous xfer, valid ptr if asynch.
|
|
GUID PrivateInterfaceType;
|
|
void (*PrivateInterface)();
|
|
|
|
} GPIOControl, *PGPIOControl;
|
|
|
|
// This is the GPIO interface
|
|
//
|
|
typedef NTSTATUS (STDMETHODCALLTYPE *GPIOOPEN)(PDEVICE_OBJECT, ULONG, PGPIOControl);
|
|
typedef NTSTATUS (STDMETHODCALLTYPE *GPIOACCESS)(PDEVICE_OBJECT, PGPIOControl);
|
|
|
|
typedef struct {
|
|
INTERFACE _vddInterface;
|
|
GPIOOPEN gpioOpen;
|
|
GPIOACCESS gpioAccess;
|
|
} GPIOINTERFACE;
|
|
|
|
//==========================================================================;
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif // __cplusplus
|
|
|
|
#endif //__I2CGPIO_H__
|