230 lines
5.0 KiB
C
230 lines
5.0 KiB
C
|
/*++
|
||
|
|
||
|
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
|
||
|
);
|