summaryrefslogtreecommitdiff
path: root/hidraw.c
diff options
context:
space:
mode:
authorPeter Wu <lekensteyn@gmail.com>2013-04-30 17:39:23 +0200
committerPeter Wu <lekensteyn@gmail.com>2013-04-30 17:39:23 +0200
commitcfbf072a9ccf05b563cf03ef7536a1d76bb3aeca (patch)
treec1f905aad2afe9cb4704d5a339fa10d5a66f8ece /hidraw.c
parent793070ba8279305bc565a6bab353e44ccde343a2 (diff)
downloadltunify-cfbf072a9ccf05b563cf03ef7536a1d76bb3aeca.tar.gz
hidraw: annotate HID++ 2.0 errors and IRoot feature
Diffstat (limited to 'hidraw.c')
-rwxr-xr-xhidraw.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/hidraw.c b/hidraw.c
index 17eff9e..a60b97c 100755
--- a/hidraw.c
+++ b/hidraw.c
@@ -51,6 +51,7 @@ struct report {
} __attribute__((__packed__));
static const char * report_types[0x100] = {
+ [0x00] = "_HIDPP20", // fake type
// 0x00 - 0x3F HID reports
[0x01] = "KEYBOARD",
[0x02] = "MOUSE",
@@ -76,6 +77,7 @@ static const char * report_types[0x100] = {
[0x82] = "SET_LONG_REG",
[0x83] = "GET_LONG_REG",
[0x8F] = "_ERROR_MSG",
+ [0xFF] = "_HIDPP20_ERROR_MSG",
};
static const char * error_messages[0x100] = {
@@ -95,6 +97,20 @@ static const char * error_messages[0x100] = {
[0x0d] = "WRONG_PIN_CODE",
};
+// I don't know the upper bound, perhaps 0x10 is enough
+static const char * error_messages_hidpp20[0x100] = {
+ [0x00] = "NoError",
+ [0x01] = "Unknown",
+ [0x02] = "InvalidArgument",
+ [0x03] = "OutOfRange",
+ [0x04] = "HWError",
+ [0x05] = "Logitech internal",
+ [0x06] = "INVALID_FEATURE_INDEX",
+ [0x07] = "INVALID_FUNCTION_ID",
+ [0x08] = "Busy",
+ [0x09] = "Unsupported",
+};
+
// everything with a '?' is guessed
static const char * registers[0x100] = {
[0x00] = "ENABLED_NOTIFS",
@@ -129,6 +145,10 @@ const char *error_str(u8 er) {
const char * str = error_messages[er];
return str ? str : "";
}
+const char *error_str_hidpp20(u8 er) {
+ const char * str = error_messages_hidpp20[er];
+ return str ? str : "";
+}
const char *register_str(u8 reg) {
const char * str = registers[reg];
return str ? str : "";
@@ -138,7 +158,25 @@ void process_msg_payload(struct report *r, u8 data_len) {
u8 pos, i;
u8 * bytes = (u8 *) &r->s;
+ pos = 0; // nothing has been processed
+
switch (r->sub_id) {
+ case 0x00: // assume HID++ 2.0 request/response for feature IRoot
+ if (data_len == 4 || data_len == 17) {
+ printf("func=%X ", bytes[0] >> 4);
+ printf("swId=%X ", bytes[0] & 0xF);
+ pos = 1;
+ }
+ break;
+ case 0xFF: // assume HID++ 2.0 error
+ if (data_len == 17) {
+ printf("feat=%X ", bytes[0]);
+ printf("func=%X ", bytes[1] >> 4);
+ printf("swId=%X ", bytes[1] & 0xF);
+ printf("err=%02X %s ", bytes[2], error_str_hidpp20(bytes[2]));
+ pos = 3;
+ }
+ break;
case 0x8F: // error
// TODO: length check
printf("SubID=%02X %s ", bytes[0], report_type_str(bytes[0]));
@@ -153,9 +191,6 @@ void process_msg_payload(struct report *r, u8 data_len) {
printf("reg=%02X %s ", bytes[0], register_str(bytes[0]));
pos = 1;
break;
- default:
- pos = 0; // nothing has been processed
- break;
}
if (pos < data_len) {