/*++ Copyright (c) 1998 Microsoft Corporation Module Name: smbbattp.h Abstract: Smart Battery Class Driver Header File Author: Ken Reneris Environment: Notes: Revision History: --*/ #ifndef FAR #define FAR #endif #include #include #include #include #include // // Debugging // #define DEBUG DBG #if DEBUG extern ULONG SMBBattDebug; #define BattPrint(l,m) if(l & SMBBattDebug) DbgPrint m #else #define BattPrint(l,m) #endif #define BAT_TRACE 0x00000400 #define BAT_STATE 0x00000200 #define BAT_IRPS 0x00000100 #define BAT_IO 0x00000040 #define BAT_DATA 0x00000020 #define BAT_ALARM 0x00000010 #define BAT_NOTE 0x00000008 #define BAT_WARN 0x00000004 #define BAT_ERROR 0x00000002 #define BAT_BIOS_ERROR 0x00000001 // // Driver supports the following class driver version // #define SMB_BATTERY_MAJOR_VERSION 0x0001 #define SMB_BATTERY_MINOR_VERSION 0x0000 // // Smart battery device driver tag for memory allocations: "BatS" // #define SMB_BATTERY_TAG 'StaB' // // Globals // extern UNICODE_STRING GlobalRegistryPath; // // Remove Lock parameters for checked builds // #define REMOVE_LOCK_MAX_LOCKED_MINUTES 1 #define REMOVE_LOCK_HIGH_WATER_MARK 64 // // Driver Device Names (FDO) // #define BatterySubsystemName L"\\Device\\SmartBatterySubsystem" #define SmbBattDeviceName L"\\Device\\SmartBattery" // // Query ID Names // #define SubSystemIdentifier L"SMBUS\\SMBBATT" #define BatteryInstance L"Battery" #define HidSmartBattery L"SMBBATT\\SMART_BATTERY" // // Structure for input from private Ioctls to read from devices on smbus // typedef struct { UCHAR Address; UCHAR Command; union { USHORT Block [2]; ULONG Ulong; } Data; } SMBBATT_DATA_STRUCT, *PSMBBATT_DATA_STRUCT; typedef union { USHORT Block [2]; ULONG Ulong; } _SMBBATT_DATA_STRUCT_UNION; #define SMBBATT_DATA_STRUCT_SIZE sizeof (SMBBATT_DATA_STRUCT) - sizeof (_SMBBATT_DATA_STRUCT_UNION) // // Private Ioctls for test engines // #define IOCTL_SMBBATT_DATA \ CTL_CODE(FILE_DEVICE_BATTERY, 0x100, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) // // Definitions for the selector state lookup table // typedef struct { UCHAR BatteryIndex; BOOLEAN ReverseLogic; } SELECTOR_STATE_LOOKUP; extern const SELECTOR_STATE_LOOKUP SelectorBits []; extern const SELECTOR_STATE_LOOKUP SelectorBits4 []; // // Definitions for control method names neede by the smart battery // #define SMBATT_SBS_METHOD (ULONG) ('SBS_') // control method "_SBS" #define SMBATT_GLK_METHOD (ULONG) ('KLG_') // control method "_GLK" // // Definitions for some string lengths // #define MAX_DEVICE_NAME_LENGTH 100 #define MAX_CHEMISTRY_LENGTH 4 // // Maximum number of smart batteries supported by this driver // #define MAX_SMART_BATTERIES_SUPPORTED 4 // // Types for the FDOs hnadled by this driver: // Smart battery subsystem FDO // Smart Battery FDO // Smart battery PDO // typedef enum { SmbTypeSubsystem, SmbTypeBattery, SmbTypePdo } SMB_FDO_TYPE; // // SMB Host Controller Device object extenstion // // // Cached battery info // typedef struct { ULONG Tag; UCHAR Valid; BATTERY_INFORMATION Info; UCHAR ManufacturerNameLength; UCHAR ManufacturerName[SMB_MAX_DATA_SIZE]; UCHAR DeviceNameLength; UCHAR DeviceName[SMB_MAX_DATA_SIZE]; BATTERY_MANUFACTURE_DATE ManufacturerDate; ULONG SerialNumber; ULONG PowerState; ULONG Capacity; ULONG VoltageScale; ULONG CurrentScale; ULONG PowerScale; } STATIC_BAT_INFO, *PSTATIC_BAT_INFO; #define VALID_TAG_DATA 0x01 // manufacturer, device, serial # #define VALID_MODE 0x02 #define VALID_OTHER 0x04 #define VALID_CYCLE_COUNT 0x08 #define VALID_SANITY_CHECK 0x10 #define VALID_TAG 0x80 #define VALID_ALL 0x1F // (does not include tag) // // Selector information structure // typedef struct _BATTERY_SELECTOR { // // Addressing and command information. This can change based whether or // not the selector is stand alone or part of the charger. // UCHAR SelectorAddress; UCHAR SelectorStateCommand; UCHAR SelectorPresetsCommand; UCHAR SelectorInfoCommand; // // Mutex to keep only one person talking with the selector at a time // FAST_MUTEX Mutex; // // Cached information. We will get notifications when these change. // ULONG SelectorState; ULONG SelectorPresets; ULONG SelectorInfo; } BATTERY_SELECTOR, *PBATTERY_SELECTOR; typedef struct { ULONG Setting; ULONG Skip; LONG Delta; LONG AllowedFudge; } BAT_ALARM_INFO, *PBAT_ALARM_INFO; typedef struct { UCHAR Address; USHORT Data; LIST_ENTRY Alarms; } SMB_ALARM_ENTRY, *PSMB_ALARM_ENTRY; // // Non-pagable device extension for smart battery FDO // (Created by IoCreateDevice SMB_NP_BATT for each battery) // typedef struct { SMB_FDO_TYPE SmbBattFdoType; // Device object type IO_REMOVE_LOCK RemoveLock; // // All elements above this point must be identical in // SMB_NP_BATT, SMB_BATT_SUBSYSTEM, and SMB_BATT_PDO structures. // FAST_MUTEX Mutex; // lets either battery OR subsystem // have access to batt PVOID Class; // Battery Class handle struct _SMB_BATT *Batt; // Battery pageable extension PDEVICE_OBJECT LowerDevice; // Battery Subsystem PDO WMILIB_CONTEXT WmiLibContext; } SMB_NP_BATT, *PSMB_NP_BATT; // // Pagable device extension for smart battery FDO // (Allocated Extra Memory for device information) // typedef struct _SMB_BATT { // // // PSMB_NP_BATT NP; // Battery device object extension PDEVICE_OBJECT DeviceObject; // Battery Fdo PDEVICE_OBJECT PDO; // Battery Pdo // SMB host controller PDEVICE_OBJECT SmbHcFdo; // SM bus Fdo // // Selector // PBATTERY_SELECTOR Selector; // Selector for battery // // For handling multiple batteries // BOOLEAN SelectorPresent; ULONG SelectorBitPosition; // // Battery // ULONG TagCount; // Tag for next battery STATIC_BAT_INFO Info; BAT_ALARM_INFO AlarmLow; } SMB_BATT, *PSMB_BATT; // // Device extension for the smart battery subsystem FDO // (Created by first AddDevice command from ACPI PDO) // typedef struct _SMB_BATT_SUBSYSTEM { SMB_FDO_TYPE SmbBattFdoType; // Device object type IO_REMOVE_LOCK RemoveLock; // // All elements above this point must be identical in // SMB_NP_BATT, SMB_BATT_SUBSYSTEM, and SMB_BATT_PDO structures. // PVOID SmbAlarmHandle; // handle for SmbAlarm registration PDEVICE_OBJECT LowerDevice; // Subsystem PDO PDEVICE_OBJECT DeviceObject; // Subsystem FDO PDEVICE_OBJECT SmbHcFdo; // SMBus Fdo ULONG NumberOfBatteries; // Number of batteries supported BOOLEAN SelectorPresent; // Is there a selector present PBATTERY_SELECTOR Selector; // Selector specific info // // Stuff for handling the SMB alarms for the smart battery subsystem // LIST_ENTRY AlarmList; KSPIN_LOCK AlarmListLock; PIO_WORKITEM WorkerThread; // WORK_QUEUE to get worker thread ULONG WorkerActive; // // Keep a list of the battery PDOs I "discover" // PDEVICE_OBJECT BatteryPdoList[MAX_SMART_BATTERIES_SUPPORTED]; } SMB_BATT_SUBSYSTEM, *PSMB_BATT_SUBSYSTEM; // // Device extension for the smart battery PDOs // (Created by IoCreateDevice SMB_BATT_PDO for each battery) // typedef struct _SMB_BATT_PDO { SMB_FDO_TYPE SmbBattFdoType; // Device object type IO_REMOVE_LOCK RemoveLock; // // All elements above this point must be identical in // SMB_NP_BATT, SMB_BATT_SUBSYSTEM, and SMB_BATT_PDO structures. // PDEVICE_OBJECT DeviceObject; // Battery PDO PDEVICE_OBJECT Fdo; // Battery FDO layered on top of PDO PDEVICE_OBJECT SubsystemFdo; // Smart Battery subsystem FDO ULONG BatteryNumber; // Used by subsystem during battery // FDO init } SMB_BATT_PDO, *PSMB_BATT_PDO; // // SMBus Smart battery addresses and registers // #define SMB_HOST_ADDRESS 0x8 // Address on bus (10H) #define SMB_CHARGER_ADDRESS 0x9 // Address on bus (12H) #define SMB_SELECTOR_ADDRESS 0xa // Address on bus (14H) #define SMB_BATTERY_ADDRESS 0xb // Address on bus (16H) #define SMB_ALERT_ADDRESS 0xc // Address on bus (18H) // // Smart Battery command codes // #define BAT_REMAINING_CAPACITY_ALARM 0x01 // word #define BAT_REMAINING_TIME_ALARM 0x02 // word #define BAT_BATTERY_MODE 0x03 // word #define BAT_AT_RATE 0x04 // word #define BAT_RATE_TIME_TO_FULL 0x05 // word #define BAT_RATE_TIME_TO_EMPTY 0x06 // word #define BAT_RATE_OK 0x07 // word #define BAT_TEMPERATURE 0x08 // word #define BAT_VOLTAGE 0x09 // word #define BAT_CURRENT 0x0a // word #define BAT_AVERAGE_CURRENT 0x0b // word #define BAT_MAX_ERROR 0x0c // word #define BAT_RELATIVE_STATE_OF_CHARGE 0x0d // word #define BAT_ABSOLUTE_STATE_OF_CHARGE 0x0e // word #define BAT_REMAINING_CAPACITY 0x0f // word #define BAT_FULL_CHARGE_CAPACITY 0x10 // word #define BAT_RUN_TO_EMPTY 0x11 // word #define BAT_AVERAGE_TIME_TO_EMPTY 0x12 // word #define BAT_AVERAGE_TIME_TO_FULL 0x13 // word #define BAT_STATUS 0x16 // word #define BAT_CYCLE_COUNT 0x17 // word #define BAT_DESIGN_CAPACITY 0x18 // word #define BAT_DESIGN_VOLTAGE 0x19 // word #define BAT_SPECITICATION_INFO 0x1a // word #define BAT_MANUFACTURER_DATE 0x1b // word #define BAT_SERIAL_NUMBER 0x1c // word #define BAT_MANUFACTURER_NAME 0x20 // block #define BAT_DEVICE_NAME 0x21 // block #define BAT_CHEMISTRY 0x22 // block #define BAT_MANUFACTURER_DATA 0x23 // block // // Battery Mode Definitions // #define CAPACITY_WATTS_MODE 0x8000 // // Battery Scale Factors // #define BSCALE_FACTOR_0 1 #define BSCALE_FACTOR_1 10 #define BSCALE_FACTOR_2 100 #define BSCALE_FACTOR_3 1000 #define BATTERY_VSCALE_MASK 0x0f00 #define BATTERY_IPSCALE_MASK 0xf000 #define BATTERY_VSCALE_SHIFT 8 #define BATTERY_IPSCALE_SHIFT 12 // // Selector command codes // #define SELECTOR_SELECTOR_STATE 0x01 // word #define SELECTOR_SELECTOR_PRESETS 0x02 // word #define SELECTOR_SELECTOR_INFO 0x04 // word // // Selector Equates // #define SELECTOR_SHIFT_CHARGE 4 #define SELECTOR_SHIFT_POWER 8 #define SELECTOR_SHIFT_COM 12 #define SELECTOR_STATE_PRESENT_MASK 0x000F #define SELECTOR_STATE_CHARGE_MASK 0x00F0 #define SELECTOR_STATE_POWER_BY_MASK 0x0F00 #define SELECTOR_STATE_SMB_MASK 0xF000 #define SELECTOR_SET_COM_MASK 0x0FFF #define SELECTOR_SET_POWER_BY_MASK 0xF0FF #define SELECTOR_SET_CHARGE_MASK 0xFF0F #define BATTERY_A_PRESENT 0x0001 #define BATTERY_B_PRESENT 0x0002 #define BATTERY_C_PRESENT 0x0004 #define BATTERY_D_PRESENT 0x0008 #define SELECTOR_STATE_PRESENT_CHANGE 0x1 #define SELECTOR_STATE_CHARGE_CHANGE 0x2 #define SELECTOR_STATE_POWER_BY_CHANGE 0x4 #define SELECTOR_STATE_SMB_CHANGE 0x8 #define SELECTOR_PRESETS_OKTOUSE_MASK 0x000F #define SELECTOR_PRESETS_USENEXT_MASK 0x00F0 #define SELECTOR_SHIFT_USENEXT 4 #define SELECTOR_INFO_SUPPORT_MASK 0x000F #define SELECTOR_INFO_SPEC_REVISION_MASK 0x00F0 #define SELECTOR_INFO_CHARGING_INDICATOR_BIT 0x0100 #define SELECTOR_SHIFT_REVISION 4 // // Charger command codes // #define CHARGER_SPEC_INFO 0x11 // word #define CHARGER_MODE 0x12 // word #define CHARGER_STATUS 0x13 // word #define CHARGER_CHARGING_CURRENT 0x14 // word #define CHARGER_CHARGING_VOLTAGE 0x15 // word #define CHARGER_ALARM_WARNING 0x16 // word #define CHARGER_SELECTOR_COMMANDS 0x20 #define CHARGER_SELECTOR_STATE CHARGER_SELECTOR_COMMANDS | \ SELECTOR_SELECTOR_STATE #define CHARGER_SELECTOR_PRESETS CHARGER_SELECTOR_COMMANDS | \ SELECTOR_SELECTOR_PRESETS #define CHARGER_SELECTOR_INFO CHARGER_SELECTOR_COMMANDS | \ SELECTOR_SELECTOR_INFO // // Charger Status Definitions // #define CHARGER_STATUS_BATTERY_PRESENT_BIT 0x4000 #define CHARGER_STATUS_AC_PRESENT_BIT 0x8000 // // Charger Specification Info Definitions // #define CHARGER_SELECTOR_SUPPORT_BIT 0x0010 // // SelectorState ReverseLogic Equates // #define INVALID 0xFF #define BATTERY_A 0x00 #define BATTERY_B 0x01 #define BATTERY_C 0x02 #define BATTERY_D 0x03 #define MULTIBATT_AB 0x04 #define MULTIBATT_AC 0x08 #define MULTIBATT_BC 0x09 #define MULTIBATT_ABC 0x24 #define BATTERY_NONE 0xFF // word to byte helpers #define WORD_MSB_SHIFT 8 #define WORD_LSB_MASK 0xFF // // Function Prototypes // VOID SmbBattLockDevice ( IN PSMB_BATT SmbBatt ); VOID SmbBattUnlockDevice ( IN PSMB_BATT SmbBatt ); VOID SmbBattRequest ( IN PSMB_BATT SmbBatt, IN PSMB_REQUEST SmbReq ); NTSTATUS SmbBattSynchronousRequest ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ); VOID SmbBattRB( IN PSMB_BATT SmbBatt, IN UCHAR SmbCmd, OUT PUCHAR Buffer, OUT PUCHAR BufferLength ); VOID SmbBattRW( IN PSMB_BATT SmbBatt, IN UCHAR SmbCmd, OUT PULONG Result ); VOID SmbBattRSW( IN PSMB_BATT SmbBatt, IN UCHAR SmbCmd, OUT PLONG Result ); VOID SmbBattWW( IN PSMB_BATT SmbBatt, IN UCHAR SmbCmd, IN ULONG Data ); UCHAR SmbBattGenericRW( IN PDEVICE_OBJECT SmbHcFdo, IN UCHAR Address, IN UCHAR SmbCmd, OUT PULONG Result ); UCHAR SmbBattGenericWW( IN PDEVICE_OBJECT SmbHcFdo, IN UCHAR Address, IN UCHAR SmbCmd, IN ULONG Data ); VOID SmbBattGenericRequest ( IN PDEVICE_OBJECT SmbHcFdo, IN PSMB_REQUEST SmbReq ); VOID SmbBattAlarm ( IN PVOID Context, IN UCHAR Address, IN USHORT Data ); BOOLEAN SmbBattVerifyStaticInfo ( IN PSMB_BATT SmbBatt, IN ULONG BatteryTag ); NTSTATUS SmbBattPowerDispatch( IN PDEVICE_OBJECT Fdo, IN PIRP Irp ); NTSTATUS SmbBattPnpDispatch( IN PDEVICE_OBJECT Fdo, IN PIRP Irp ); NTSTATUS SmbBattRegisterForAlarm( IN PDEVICE_OBJECT Fdo ); NTSTATUS SmbBattUnregisterForAlarm( IN PDEVICE_OBJECT Fdo ); NTSTATUS SmbBattSetSelectorComm ( IN PSMB_BATT SmbBatt, OUT PULONG OldSelectorState ); NTSTATUS SmbBattResetSelectorComm ( IN PSMB_BATT SmbBatt, IN ULONG OldSelectorState ); NTSTATUS SmbGetSBS ( IN PULONG NumberOfBatteries, IN PBOOLEAN SelectorPresent, IN PDEVICE_OBJECT LowerDevice ); NTSTATUS SmbGetGLK ( IN PBOOLEAN GlobalLockRequired, IN PDEVICE_OBJECT LowerDevice ); NTSTATUS SmbBattCreatePdos( IN PDEVICE_OBJECT SubsystemFdo ); NTSTATUS SmbBattBuildDeviceRelations( IN PSMB_BATT_SUBSYSTEM SubsystemExt, IN PDEVICE_RELATIONS *DeviceRelations ); NTSTATUS SmbBattQueryDeviceRelations( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SmbBattRemoveDevice( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SmbBattQueryId( IN PDEVICE_OBJECT Pdo, IN PIRP Irp ); NTSTATUS SmbBattQueryCapabilities( IN PDEVICE_OBJECT Pdo, IN PIRP Irp ); SmbBattBuildSelectorStruct( IN PDEVICE_OBJECT SubsystemFdo ); VOID SmbBattWorkerThread ( IN PDEVICE_OBJECT Fdo, IN PVOID Context ); VOID SmbBattLockSelector ( IN PBATTERY_SELECTOR Selector ); VOID SmbBattUnlockSelector ( IN PBATTERY_SELECTOR Selector ); ULONG SmbBattGetSelectorDeltas ( IN ULONG OriginalSelectorState, IN ULONG NewSelectorState ); VOID SmbBattProcessPresentChanges ( IN PSMB_BATT_SUBSYSTEM SubsystemExt, IN ULONG OriginalSelectorState, IN ULONG NewSelectorState ); VOID SmbBattProcessChargeChange ( IN PSMB_BATT_SUBSYSTEM SubsystemExt, IN ULONG OriginalSelectorState, IN ULONG NewSelectorState ); VOID SmbBattProcessPowerByChange ( IN PSMB_BATT_SUBSYSTEM SubsystemExt, IN ULONG OriginalSelectorState, IN ULONG NewSelectorState ); VOID SmbBattNotifyClassDriver ( IN PSMB_BATT_SUBSYSTEM SubsystemExt, IN ULONG BatteryIndex ); NTSTATUS SmbBattDirectDataAccess ( IN PSMB_NP_BATT DeviceExtension, IN PSMBBATT_DATA_STRUCT IoBuffer, IN ULONG InputLen, IN ULONG OutputLen ); VOID SmbBattProcessChargerAlarm ( IN PSMB_BATT_SUBSYSTEM SubsystemExt, IN ULONG ChargerStatus ); NTSTATUS SmbBattSetInformation ( IN PVOID Context, IN ULONG BatteryTag, IN BATTERY_SET_INFORMATION_LEVEL Level, IN PVOID Buffer OPTIONAL ); UCHAR SmbBattIndex ( IN PBATTERY_SELECTOR Selector, IN ULONG SelectorNibble, IN UCHAR SimultaneousIndex ); BOOLEAN SmbBattReverseLogic ( IN PBATTERY_SELECTOR Selector, IN ULONG SelectorNibble ); extern BOOLEAN SmbBattUseGlobalLock; NTSTATUS SmbBattAcquireGlobalLock ( IN PDEVICE_OBJECT LowerDeviceObject, OUT PACPI_MANIPULATE_GLOBAL_LOCK_BUFFER GlobalLock ); NTSTATUS SmbBattReleaseGlobalLock ( IN PDEVICE_OBJECT LowerDeviceObject, IN PACPI_MANIPULATE_GLOBAL_LOCK_BUFFER GlobalLock ); NTSTATUS SmbBattSystemControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS SmbBattWmiRegistration( PSMB_NP_BATT SmbNPBatt ); NTSTATUS SmbBattWmiDeRegistration( PSMB_NP_BATT SmbNPBatt );