windows-nt/Source/XPSP1/NT/base/published/smbus.h

230 lines
5 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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
);