From c1bf3be48ef3c5712844eb10e50ed05d725cb733 Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Tue, 10 May 2016 11:13:34 +0200 Subject: [PATCH] hidpp20: read/write the whole dictionary, not just the first 16 bytes The G900 advertises 5 profiles, which do not fit in only 16 bytes. We need to read at least 32 bytes, so be it. Signed-off-by: Benjamin Tissoires --- src/hidpp20.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/hidpp20.c b/src/hidpp20.c index 0a534fc7..c999fd52 100644 --- a/src/hidpp20.c +++ b/src/hidpp20.c @@ -1468,13 +1468,29 @@ hidpp20_onboard_profiles_parse_macro(struct hidpp20_device *device, return 0; } +static unsigned int +hidpp20_onboard_profiles_compute_dict_size(struct hidpp20_device *device, + struct hidpp20_profiles *profiles) +{ + unsigned p, num_offset; + + num_offset = 0; + p = profiles->num_profiles; + while (p) { + p >>= 2; + num_offset += 16; + } + + return num_offset; +} + int hidpp20_onboard_profiles_allocate(struct hidpp20_device *device, struct hidpp20_profiles **profiles_list) { - unsigned i; + unsigned i, offset, num_offset; int rc; - uint8_t data[16] = {0}; + uint8_t data[HIDPP20_PAGE_SIZE] = {0}; struct hidpp20_profiles *profiles = NULL; rc = hidpp20_onboard_profiles_initialize(device, @@ -1484,16 +1500,21 @@ hidpp20_onboard_profiles_allocate(struct hidpp20_device *device, assert(profiles); - rc = hidpp20_onboard_profiles_read_memory(device, - 0x00, - 0x00, - 0x00, - data); - if (rc < 0) - return rc; + num_offset = hidpp20_onboard_profiles_compute_dict_size(device, + profiles); + + for (offset = 0; offset < num_offset; offset += 16) { + rc = hidpp20_onboard_profiles_read_memory(device, + 0x00, + 0x00, + offset, + data + offset); + if (rc < 0) + return rc; + } for (i = 0; i < profiles->num_profiles; i++) { - uint8_t *d = data + 4 * i; + uint8_t *d = data + offset + 4 * i; if (d[0] == 0xFF && d[1] == 0xFF) break; @@ -1600,7 +1621,7 @@ hidpp20_onboard_profiles_enable_profile(struct hidpp20_device *device, profiles_list->profiles[index].index = index + 1; profiles_list->profiles[index].enabled = 0x01; - for (i = 0; i < 3; i++) { + for (i = 0; i < profiles_list->num_profiles; i++) { data[buffer_index++] = 0x00; data[buffer_index++] = i + 1; data[buffer_index++] = profiles_list->profiles[i].enabled; @@ -1615,7 +1636,11 @@ hidpp20_onboard_profiles_enable_profile(struct hidpp20_device *device, memset(data + buffer_index, 0xff, sizeof(data) - buffer_index); - hidpp_log_buf_error(&device->base, "dictionary: ", data, 16); + hidpp_log_buf_debug(&device->base, + "dictionary: ", + data, + hidpp20_onboard_profiles_compute_dict_size(device, + profiles_list)); return hidpp20_onboard_profiles_write_page(device, 0x00, data); }