From 51f939d29f65aae6f8c9d01f04d655e9a2ede21c Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Thu, 20 Aug 2015 10:45:40 -0400 Subject: [PATCH] hidraw: Implement ratbag_hidraw_read_input_report and ratbag_hidraw_output_report Logitech devices are using raw input/output reports, so we need this. Signed-off-by: Benjamin Tissoires --- src/libratbag-hidraw.c | 21 ++++++++++++++++++++- src/libratbag-hidraw.h | 11 +++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/libratbag-hidraw.c b/src/libratbag-hidraw.c index 0c32bee2..8e38fb8f 100644 --- a/src/libratbag-hidraw.c +++ b/src/libratbag-hidraw.c @@ -129,8 +129,27 @@ ratbag_hidraw_raw_request(struct ratbag_device *ratbag, unsigned char reportnum, int ratbag_hidraw_output_report(struct ratbag_device *ratbag, uint8_t *buf, size_t len) { + int rc; + if (len < 1 || len > HID_MAX_BUFFER_SIZE || !buf || ratbag->hidraw_fd < 0) return -EINVAL; - return -ENOTSUP; + rc = write(ratbag->hidraw_fd, buf, len); + + if (rc < 0) + return rc; + + if (rc != (int)len) + return -EIO; + + return 0; +} + +int +ratbag_hidraw_read_input_report(struct ratbag_device *ratbag, uint8_t *buf, size_t len) +{ + if (len < 1 || !buf || ratbag->hidraw_fd < 0) + return -EINVAL; + + return read(ratbag->hidraw_fd, buf, len); } diff --git a/src/libratbag-hidraw.h b/src/libratbag-hidraw.h index a8ffa736..15bf5583 100644 --- a/src/libratbag-hidraw.h +++ b/src/libratbag-hidraw.h @@ -65,4 +65,15 @@ int ratbag_hidraw_raw_request(struct ratbag_device *ratbag, unsigned char report */ int ratbag_hidraw_output_report(struct ratbag_device *ratbag, uint8_t *buf, size_t len); +/** + * ratbag_hidraw_read_input_report - read an input report from the device + * + * @hdev: hid device + * @buf: resulting raw data + * @len: length of buf + * + * @return: count of data transfered, negative if error + */ +int ratbag_hidraw_read_input_report(struct ratbag_device *ratbag, uint8_t *buf, size_t len); + #endif /* LIBRATBAG_HIDRAW_H */