|
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
smbus.h
Abstract:
SMBus Class Driver Header File
Author:
Ken Reneris
Environment:
Notes:
Revision History:
--*/
//
// SMB Request packet
//
#define SMB_MAX_DATA_SIZE 32
typedef struct { UCHAR Status; // Completion status
UCHAR Protocol; UCHAR Address; UCHAR Command; UCHAR BlockLength; UCHAR Data[SMB_MAX_DATA_SIZE]; } SMB_REQUEST, *PSMB_REQUEST;
//
// Protocol values
//
#define SMB_WRITE_QUICK 0x00 // Issue quick command data bit = 0
#define SMB_READ_QUICK 0x01 // Issue quick command data bit = 1
#define SMB_SEND_BYTE 0x02
#define SMB_RECEIVE_BYTE 0x03
#define SMB_WRITE_BYTE 0x04
#define SMB_READ_BYTE 0x05
#define SMB_WRITE_WORD 0x06
#define SMB_READ_WORD 0x07
#define SMB_WRITE_BLOCK 0x08
#define SMB_READ_BLOCK 0x09
#define SMB_PROCESS_CALL 0x0A
#define SMB_BLOCK_PROCESS_CALL 0x0B
#define SMB_MAXIMUM_PROTOCOL 0x0B
//
// SMB Bus Status codes
//
#define SMB_STATUS_OK 0x00
#define SMB_UNKNOWN_FAILURE 0x07
#define SMB_ADDRESS_NOT_ACKNOWLEDGED 0x10
#define SMB_DEVICE_ERROR 0x11
#define SMB_COMMAND_ACCESS_DENIED 0x12
#define SMB_UNKNOWN_ERROR 0x13
#define SMB_DEVICE_ACCESS_DENIED 0x17
#define SMB_TIMEOUT 0x18
#define SMB_UNSUPPORTED_PROTOCOL 0x19
#define SMB_BUS_BUSY 0x1A
//
// Alarm register/deregister requests
//
typedef VOID (*SMB_ALARM_NOTIFY) ( PVOID Context, UCHAR Address, USHORT Data );
// input buffer is SMB_REGISTER_ALARM. output buffer is PVOID handle for registration.
// PVOID is passed in via DEREGISTER request to free registration
typedef struct { UCHAR MinAddress; // Min address for notifications
UCHAR MaxAddress; // Max address for notifications
SMB_ALARM_NOTIFY NotifyFunction; PVOID NotifyContext; } SMB_REGISTER_ALARM, *PSMB_REGISTER_ALARM;
//
// Internal ioctls to SMB class driver
//
#define SMB_BUS_REQUEST CTL_CODE(FILE_DEVICE_UNKNOWN, 0, METHOD_NEITHER, FILE_ANY_ACCESS)
#define SMB_REGISTER_ALARM_NOTIFY CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS)
#define SMB_DEREGISTER_ALARM_NOTIFY CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_NEITHER, FILE_ANY_ACCESS)
//
// Shared SMB Class / Miniport driver structure
//
typedef NTSTATUS (*SMB_RESET_DEVICE)( IN struct _SMB_CLASS *SmbClass, IN PVOID SmbMiniport );
typedef VOID (*SMB_START_IO)( IN struct _SMB_CLASS *SmbClass, IN PVOID SmbMiniport );
typedef NTSTATUS (*SMB_STOP_DEVICE)( IN struct _SMB_CLASS *SmbClass, IN PVOID SmbMiniport );
typedef struct _SMB_CLASS { USHORT MajorVersion; USHORT MinorVersion;
PVOID Miniport; // Miniport extension data
PDEVICE_OBJECT DeviceObject; // Device object for this miniport
PDEVICE_OBJECT PDO; // PDO for this miniport
PDEVICE_OBJECT LowerDeviceObject;
//
// Current IO
//
PIRP CurrentIrp; // current request
PSMB_REQUEST CurrentSmb; // pointer to SMB_REQUEST in the CurrentIrp
//
// Miniport functions
//
SMB_RESET_DEVICE ResetDevice; // Initialize/Reset, start device
SMB_START_IO StartIo; // Perform IO
SMB_STOP_DEVICE StopDevice; // Stop device
} SMB_CLASS, *PSMB_CLASS;
#define SMB_CLASS_MAJOR_VERSION 0x0001
#define SMB_CLASS_MINOR_VERSION 0x0000
//
// Class driver initializtion functions
//
#if !defined(SMBCLASS)
#define SMBCLASSAPI DECLSPEC_IMPORT
#else
#define SMBCLASSAPI
#endif
typedef NTSTATUS (*PSMB_INITIALIZE_MINIPORT) ( IN PSMB_CLASS SmbClass, IN PVOID MiniportExtension, IN PVOID MiniportContext );
NTSTATUS SMBCLASSAPI SmbClassInitializeDevice ( IN ULONG MajorVersion, IN ULONG MinorVersion, IN PDRIVER_OBJECT DriverObject );
NTSTATUS SMBCLASSAPI SmbClassCreateFdo ( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PDO, IN ULONG MiniportExtensionSize, IN PSMB_INITIALIZE_MINIPORT MiniportInitialize, IN PVOID MiniportContext, OUT PDEVICE_OBJECT *FDO );
//
// Class driver interface functions for use by the miniport
//
VOID SMBCLASSAPI SmbClassCompleteRequest ( IN PSMB_CLASS SmbClass );
VOID SMBCLASSAPI SmbClassAlarm ( IN PSMB_CLASS SmbClass, IN UCHAR Address, IN USHORT Data );
VOID SMBCLASSAPI SmbClassLockDevice ( IN PSMB_CLASS SmbClass );
VOID SMBCLASSAPI SmbClassUnlockDevice ( IN PSMB_CLASS SmbClass );
|