From d065bda3a64de55c350dda7828caa5a46c76fe92 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Sat, 12 Sep 2015 09:48:01 -0400 Subject: [PATCH] hidraw: implement a first dummy parsing of the report descriptor Signed-off-by: Benjamin Tissoires --- src/libratbag-hidraw.c | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/libratbag-hidraw.c b/src/libratbag-hidraw.c index eef1ad1f..ec31134f 100644 --- a/src/libratbag-hidraw.c +++ b/src/libratbag-hidraw.c @@ -36,6 +36,55 @@ #define HID_MAX_BUFFER_SIZE 4096 /* 4kb */ #endif +#define HID_REPORT_ID 0b10000100 + +static int +ratbag_hidraw_parse_report_descriptor(struct ratbag_device *device) +{ + int rc, desc_size = 0; + struct hidraw_report_descriptor report_desc = {0}; + unsigned int i, j; + + rc = ioctl(device->hidraw.fd, HIDIOCGRDESCSIZE, &desc_size); + if (rc < 0) + return rc; + + report_desc.size = desc_size; + rc = ioctl(device->hidraw.fd, HIDIOCGRDESC, &report_desc); + if (rc < 0) + return rc; + + log_buf_error(device->ratbag, + "Report Descriptor:\n", + report_desc.value, report_desc.size); + + i = 0; + while (i < report_desc.size) { + uint8_t value = report_desc.value[i]; + uint8_t hid = value & 0xfc; + uint8_t size = value & 0x3; + + if (size == 3) + size = 4; + + if (i + size >= report_desc.size) + return -EPROTO; + + if (hid == HID_REPORT_ID) + log_error(device->ratbag, "main item: %02x\n", hid); + + for (j = 0; j < size; j++) { + value = report_desc.value[i + j + 1]; + if (hid == HID_REPORT_ID) + log_error(device->ratbag, " %02x\n", value); + } + + i += 1 + j; + } + + return 0; +} + int ratbag_open_hidraw(struct ratbag_device *device) { @@ -61,6 +110,17 @@ ratbag_open_hidraw(struct ratbag_device *device) device->hidraw.fd = fd; + res = ratbag_hidraw_parse_report_descriptor(device); + if (res) { + log_error(device->ratbag, + "Error while parsing the report descriptor: '%s' (%d)\n", + strerror(-res), + res); + device->hidraw.fd = -1; + goto err; + } + + return 0; err: