CyberPower UPS USB Protocol
From Eleccelerator Wiki
Contents |
CyberPower CP850PFCLCD
I got this UPS for my computer. I want to use it as a starting point to build my another DIY battery backup for my NAS. My NAS supports many UPS, it can shutdown cleanly when the battery gets too low. In order to enable this kind of feature in my own DIY implementation, I need to learn about the protocol used in a supported UPS.
Descriptors
Device Descriptor
0x12, // bLength 0x01, // bDescriptorType (Device) 0x00, 0x02, // bcdUSB 2.00 0x00, // bDeviceClass (Use class information in the Interface Descriptors) 0x00, // bDeviceSubClass 0x00, // bDeviceProtocol 0x40, // bMaxPacketSize0 64 0x64, 0x07, // idVendor 0x0764 0x01, 0x05, // idProduct 0x0501 0x01, 0x00, // bcdDevice 0.01 0x03, // iManufacturer (String Index) 0x01, // iProduct (String Index) 0x02, // iSerialNumber (String Index) 0x01, // bNumConfigurations 1
Configuration Descriptor
0x09, // bLength 0x02, // bDescriptorType (Configuration) 0x22, 0x00, // wTotalLength 34 0x01, // bNumInterfaces 1 0x01, // bConfigurationValue 0x00, // iConfiguration (String Index) 0xC0, // bmAttributes Self Powered 0x01, // bMaxPower 2mA 0x09, // bLength 0x04, // bDescriptorType (Interface) 0x00, // bInterfaceNumber 0 0x00, // bAlternateSetting 0x01, // bNumEndpoints 1 0x03, // bInterfaceClass 0x00, // bInterfaceSubClass 0x00, // bInterfaceProtocol 0x00, // iInterface (String Index) 0x09, // bLength 0x21, // bDescriptorType (HID) 0x10, 0x01, // bcdHID 1.10 0x21, // bCountryCode 0x01, // bNumDescriptors 0x22, // bDescriptorType[0] (HID) 0xB7, 0x01, // wDescriptorLength[0] 439 0x07, // bLength 0x05, // bDescriptorType (Endpoint) 0x81, // bEndpointAddress (IN/D2H) 0x03, // bmAttributes (Interrupt) 0x40, 0x00, // wMaxPacketSize 64 0x0A, // bInterval 10 (unit depends on device speed) // 34 bytes
HID Report Descriptor
0x05, 0x84, // Usage Page (Power Pages) 0x09, 0x04, // Usage (0x04) 0xA1, 0x01, // Collection (Application) 0x09, 0x24, // Usage (0x24) 0xA1, 0x00, // Collection (Physical) 0x85, 0x01, // Report ID (1) 0x09, 0xFE, // Usage (0xFE) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x02, // Report ID (2) 0x09, 0xFF, // Usage (0xFF) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x1B, // Report ID (27) 0x06, 0x01, 0xFF, // Usage Page (Vendor Defined 0xFF01) 0x09, 0xD0, // Usage (0xD0) 0xB1, 0x22, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x03, // Report ID (3) 0x05, 0x85, // Usage Page (Power Pages) 0x09, 0x89, // Usage (0x89) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x04, // Report ID (4) 0x09, 0x8F, // Usage (0x8F) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x05, // Report ID (5) 0x09, 0x8B, // Usage (0x8B) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x06, // Report ID (6) 0x09, 0x2C, // Usage (0x2C) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x07, // Report ID (7) 0x75, 0x08, // Report Size (8) 0x95, 0x06, // Report Count (6) 0x25, 0x64, // Logical Maximum (100) 0x09, 0x83, // Usage (0x83) 0x09, 0x8D, // Usage (0x8D) 0x09, 0x8E, // Usage (0x8E) 0x09, 0x8C, // Usage (0x8C) 0x09, 0x29, // Usage (0x29) 0x09, 0x67, // Usage (0x67) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x08, // Report ID (8) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x65, 0x00, // Unit (None) 0x09, 0x66, // Usage (0x66) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0x66, // Usage (0x66) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x68, // Usage (0x68) 0x75, 0x10, // Report Size (16) 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65535) 0x66, 0x01, 0x10, // Unit (System: SI Linear, Time: Seconds) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0x68, // Usage (0x68) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x2A, // Usage (0x2A) 0x26, 0x58, 0x02, // Logical Maximum (600) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0x2A, // Usage (0x2A) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x85, 0x09, // Report ID (9) 0x75, 0x08, // Report Size (8) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x05, 0x84, // Usage Page (Power Pages) 0x09, 0x40, // Usage (0x40) 0x67, 0x21, 0xD1, 0xF0, 0x00, // Unit (System: SI Linear, Length: Radians, Mass: Gram) 0x55, 0x06, // Unit Exponent (6) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x0A, // Report ID (10) 0x09, 0x30, // Usage (0x30) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x02, // Usage (0x02) 0xA1, 0x02, // Collection (Logical) 0x65, 0x00, // Unit (None) 0x55, 0x00, // Unit Exponent (0) 0x85, 0x0B, // Report ID (11) 0x75, 0x01, // Report Size (1) 0x95, 0x06, // Report Count (6) 0x25, 0x01, // Logical Maximum (1) 0x05, 0x85, // Usage Page (Power Pages) 0x09, 0xD0, // Usage (0xD0) 0x09, 0x44, // Usage (0x44) 0x09, 0x45, // Usage (0x45) 0x09, 0x42, // Usage (0x42) 0x09, 0x46, // Usage (0x46) 0x09, 0x43, // Usage (0x43) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0xD0, // Usage (0xD0) 0x09, 0x44, // Usage (0x44) 0x09, 0x45, // Usage (0x45) 0x09, 0x42, // Usage (0x42) 0x09, 0x46, // Usage (0x46) 0x09, 0x43, // Usage (0x43) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x75, 0x02, // Report Size (2) 0x95, 0x01, // Report Count (1) 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xB1, 0x01, // Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0xC0, // End Collection 0x85, 0x0C, // Report ID (12) 0x05, 0x84, // Usage Page (Power Pages) 0x09, 0x5A, // Usage (0x5A) 0x75, 0x08, // Report Size (8) 0x15, 0x01, // Logical Minimum (1) 0x25, 0x03, // Logical Maximum (3) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x5A, // Usage (0x5A) 0x81, 0x22, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x85, 0x0D, // Report ID (13) 0x09, 0xFD, // Usage (0xFD) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0xC0, // End Collection 0x05, 0x84, // Usage Page (Power Pages) 0x09, 0x1A, // Usage (0x1A) 0xA1, 0x00, // Collection (Physical) 0x85, 0x0E, // Report ID (14) 0x05, 0x84, // Usage Page (Power Pages) 0x09, 0x40, // Usage (0x40) 0x75, 0x08, // Report Size (8) 0x67, 0x21, 0xD1, 0xF0, 0x00, // Unit (System: SI Linear, Length: Radians, Mass: Gram) 0x55, 0x07, // Unit Exponent (7) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x0F, // Report ID (15) 0x75, 0x10, // Report Size (16) 0x09, 0x30, // Usage (0x30) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x85, 0x10, // Report ID (16) 0x09, 0x53, // Usage (0x53) 0x15, 0x4E, // Logical Minimum (78) 0x25, 0x58, // Logical Maximum (88) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x53, // Usage (0x53) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0x54, // Usage (0x54) 0x16, 0x88, 0x00, // Logical Minimum (136) 0x26, 0x8E, 0x00, // Logical Maximum (142) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x54, // Usage (0x54) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0xC0, // End Collection 0x09, 0x1C, // Usage (0x1C) 0xA1, 0x00, // Collection (Physical) 0x85, 0x12, // Report ID (18) 0x09, 0x30, // Usage (0x30) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x75, 0x08, // Report Size (8) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x65, 0x00, // Unit (None) 0x55, 0x00, // Unit Exponent (0) 0x85, 0x13, // Report ID (19) 0x09, 0x35, // Usage (0x35) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x85, 0x14, // Report ID (20) 0x09, 0x58, // Usage (0x58) 0x25, 0x06, // Logical Maximum (6) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x58, // Usage (0x58) 0x81, 0x22, // Input (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x85, 0x15, // Report ID (21) 0x09, 0x57, // Usage (0x57) 0x75, 0x10, // Report Size (16) 0x15, 0xFF, // Logical Minimum (255) 0x26, 0xFF, 0x7F, // Logical Maximum (32767) 0x35, 0xC4, // Physical Minimum (196) 0x47, 0xC4, 0xFF, 0x1D, 0x00, // Physical Maximum (1966020) 0x66, 0x01, 0x10, // Unit (System: SI Linear, Time: Seconds) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x85, 0x16, // Report ID (22) 0x09, 0x56, // Usage (0x56) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x85, 0x17, // Report ID (23) 0x09, 0x6E, // Usage (0x6E) 0x75, 0x01, // Report Size (1) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x35, 0x00, // Physical Minimum (0) 0x45, 0x00, // Physical Maximum (0) 0x65, 0x00, // Unit (None) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x65, // Usage (0x65) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x75, 0x06, // Report Size (6) 0xB1, 0x01, // Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0x85, 0x18, // Report ID (24) 0x75, 0x10, // Report Size (16) 0x09, 0x44, // Usage (0x44) 0x26, 0x84, 0x03, // Logical Maximum (900) 0x66, 0x21, 0xD1, // Unit (System: SI Linear, Length: Radians, Mass: Gram) 0x55, 0x07, // Unit Exponent (7) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x85, 0x1A, // Report ID (26) 0x06, 0x01, 0xFF, // Usage Page (Vendor Defined 0xFF01) 0x65, 0x00, // Unit (None) 0x55, 0x00, // Unit Exponent (0) 0x75, 0x08, // Report Size (8) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x02, // Logical Maximum (2) 0x09, 0x43, // Usage (0x43) 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x43, // Usage (0x43) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0xC0, // End Collection 0xC0, // End Collection // 439 bytes
Initialization
Once the enumeration completes, the following Control Transfers occur:
Setup: A1 01 06 03 00 00 08 00 IN EP0: 06 02 Setup: A1 01 0A 03 00 00 08 00 IN EP0: 0A F0 Setup: A1 01 0A 03 00 00 08 00 IN EP0: 0A F0 Setup: A1 01 07 03 00 00 08 00 IN EP0: 07 64 05 0A 14 0A 64
Sample Communication
Once every second, two different reports are sent repeatedly:
During Charging
IN EP1: 08 2B 98 01 2C 01 IN EP1: 0B 03 ... pause 1 second IN EP1: 08 2B 62 01 2C 01 IN EP1: 0B 03 ... later IN EP1: 08 2E A6 02 2C 01 IN EP1: 0B 03 ... later IN EP1: 08 2E D4 02 2C 01 IN EP1: 0B 03 ... later IN EP1: 08 2E E3 01 2C 01 IN EP1: 0B 03
Power Outage Event
IN EP1: 08 2E 78 02 2C 01 IN EP1: 0B 03 ... pause IN EP1: 08 64 C9 04 2C 01 IN EP1: 0B 04 ... pause SETUP: A1 01 0B 03 00 00 08 00 IN EP0: 0B 04 SETUP: A1 01 0B 03 00 00 08 00 IN EP0: 0B 04 SETUP: A1 01 0B 03 00 00 08 00 IN EP0: 0B 04 SETUP: A1 01 0B 03 00 00 08 00 IN EP0: 0B 04 SETUP: A1 01 08 03 00 00 08 00 IN EP0: 08 64 C9 04 2C 01 SETUP: A1 01 08 03 00 00 08 00 IN EP0: 08 64 C9 04 2C 01 SETUP: A1 01 08 03 00 00 08 00 IN EP0: 08 64 C9 04 2C 01 SETUP: A1 01 08 03 00 00 08 00 IN EP0: 08 64 C9 04 2C 01 ... pause IN EP1: 08 59 FF 03 2C 01 IN EP1: 0B 04 ... pause IN EP1: 08 51 3E 03 2C 01 IN EP1: 0B 04
The burst of control endpoint transactions here are probably just the Windows driver being triggered by the sudden change in status. A proper request handler should be able to handle these easily
During Discharging
08 2B 98 01 2C 01 0B 03 ... pause 08 2B A3 01 2C 01 0B 03 ... pause 08 2B 8D 01 2C 01 0B 03 ... pause 08 2B A3 01 2C 01 0B 03 ... pause 08 2B 98 01 2C 01 0B 03 ... pause 08 2B 62 01 2C 01 0B 03 ... later 08 2E A6 02 2C 01 0B 03 ... later 08 2E E3 01 2C 01 0B 03 ... later 08 2E BD 02 2C 01 0B 03
Power Restored Event
08 20 40 01 2C 01 0B 04 ... pause 08 21 E6 01 2C 01 0B 05 ... device resets and re-enumerates, goes into charging state
Basic Report Breakdown
For the Power Pages, check http://www.usb.org/developers/hidpage/pdcv10.pdf
Report ID 0x08
Previous Usage Page: 0x85, Battery System 0x85, 0x08, // Report ID (8) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x65, 0x00, // Unit (None) 0x09, 0x66, // Usage (0x66) // RemainingCapacity 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0x66, // Usage (0x66) // RemainingCapacity 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x68, // Usage (0x68) // RunTimeToEmpty 0x75, 0x10, // Report Size (16) 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65535) 0x66, 0x01, 0x10, // Unit (System: SI Linear, Time: Seconds) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0x68, // Usage (0x68) // RunTimeToEmpty 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x09, 0x2A, // Usage (0x2A) // RemainingTimeLimit 0x26, 0x58, 0x02, // Logical Maximum (600) 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0x2A, // Usage (0x2A) // RemainingTimeLimit 0xB1, 0xA2, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile)
Report ID 0x0B
Previous Usage Page: 0x84, Power Device 0x85, 0x0B, // Report ID (11) 0x75, 0x01, // Report Size (1) 0x95, 0x06, // Report Count (6) 0x25, 0x01, // Logical Maximum (1) 0x05, 0x85, // Usage Page (Power Pages) // Actually Battery System 0x09, 0xD0, // Usage (0xD0) // ACPresent 0x09, 0x44, // Usage (0x44) // Charging 0x09, 0x45, // Usage (0x45) // Discharging 0x09, 0x42, // Usage (0x42) // BelowRemainingCapacityLimit 0x09, 0x46, // Usage (0x46) // FullyCharged 0x09, 0x43, // Usage (0x43) // RemainingTimeLimitExpired 0x81, 0x23, // Input (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position) 0x09, 0xD0, // Usage (0xD0) 0x09, 0x44, // Usage (0x44) 0x09, 0x45, // Usage (0x45) 0x09, 0x42, // Usage (0x42) 0x09, 0x46, // Usage (0x46) 0x09, 0x43, // Usage (0x43) 0xB1, 0xA3, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Volatile) 0x75, 0x02, // Report Size (2) 0x95, 0x01, // Report Count (1) 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position) 0xB1, 0x01, // Feature (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
Report ID 0x07
Previous Usage Page: 0x85, Battery System 0x85, 0x07, // Report ID (7) 0x75, 0x08, // Report Size (8) 0x95, 0x06, // Report Count (6) 0x25, 0x64, // Logical Maximum (100) 0x09, 0x83, // Usage (0x83) // DesignCapacity 0x09, 0x8D, // Usage (0x8D) // CapacityGranularity1 0x09, 0x8E, // Usage (0x8E) // CapacityGranularity2 0x09, 0x8C, // Usage (0x8C) // WarningCapacityLimit 0x09, 0x29, // Usage (0x29) // RemainingTimeLimit 0x09, 0x67, // Usage (0x67) // FullChargeCapacity 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)
Report ID 1 through 6
0x05, 0x84, // Usage Page (Power Pages) // Power Device 0x09, 0x04, // Usage (0x04) // UPS 0xA1, 0x01, // Collection (Application) 0x09, 0x24, // Usage (0x24) // PowerSummary 0xA1, 0x00, // Collection (Physical) 0x85, 0x01, // Report ID (1) 0x09, 0xFE, // Usage (0xFE) // iProduct 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x02, // Report ID (2) 0x09, 0xFF, // Usage (0xFF) // iserialNumber 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x1B, // Report ID (27) 0x06, 0x01, 0xFF, // Usage Page (Vendor Defined 0xFF01) 0x09, 0xD0, // Usage (0xD0) 0xB1, 0x22, // Feature (Data,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x03, // Report ID (3) 0x05, 0x85, // Usage Page (Power Pages) // Battery System 0x09, 0x89, // Usage (0x89) // iDeviceChemistery 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x04, // Report ID (4) 0x09, 0x8F, // Usage (0x8F) // iOEMInformation 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x05, // Report ID (5) 0x09, 0x8B, // Usage (0x8B) // Rechargable 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile) 0x85, 0x06, // Report ID (6) 0x09, 0x2C, // Usage (0x2C) // CapacityMode 0xB1, 0x23, // Feature (Const,Var,Abs,No Wrap,Linear,No Preferred State,No Null Position,Non-volatile)