diff --git a/data/devices/logitech-g305.device b/data/devices/logitech-g305.device new file mode 100644 index 00000000..ac836597 --- /dev/null +++ b/data/devices/logitech-g305.device @@ -0,0 +1,7 @@ +[Device] +Name=Logitech Gaming Mouse G305 +DeviceMatch=usb:046d:4074 +Driver=hidpp20 + +[Driver/hidpp20] +Quirk=G305 diff --git a/meson.build b/meson.build index ae40bf24..a474a74b 100644 --- a/meson.build +++ b/meson.build @@ -294,6 +294,7 @@ data_files = files( 'data/devices/logitech-g300.device', 'data/devices/logitech-g302.device', 'data/devices/logitech-g303.device', + 'data/devices/logitech-g305.device', 'data/devices/logitech-g402.device', 'data/devices/logitech-g403-hero.device', 'data/devices/logitech-g403-wireless.device', diff --git a/src/hidpp20.c b/src/hidpp20.c index 058f3c06..9f08366c 100644 --- a/src/hidpp20.c +++ b/src/hidpp20.c @@ -2620,6 +2620,15 @@ hidpp20_onboard_profiles_initialize(struct hidpp20_device *device, HIDPP20_USER_PROFILES_G402, profiles->sector_size, data); + + if (rc && device->quirk != HIDPP20_QUIRK_G305) { + /* The G305 has a bug where it throws an ERR_INVALID_ARGUMENT + if the sector has not been written to yet. If this happens + we will read the ROM profiles.*/ + read_userdata = false; + goto read_profiles; + } + if (rc < 0) return rc; // ignore_clang_sa_mem_leak @@ -2653,6 +2662,7 @@ hidpp20_onboard_profiles_initialize(struct hidpp20_device *device, read_userdata = false; } +read_profiles: for (i = 0; i < profiles->num_profiles; i++) { if (read_userdata) { hidpp_log_debug(&device->base, "Parsing profile %u\n", i); diff --git a/src/hidpp20.h b/src/hidpp20.h index 743145b3..759872f8 100644 --- a/src/hidpp20.h +++ b/src/hidpp20.h @@ -83,8 +83,8 @@ hidpp20_device_destroy(struct hidpp20_device *device); enum { HIDPP20_QUIRK_NONE, + HIDPP20_QUIRK_G305, } -#define HIDPP20_QUIRK_G305 1 /* -------------------------------------------------------------------------- */ /* 0x0000: Root */ diff --git a/src/libratbag-data.c b/src/libratbag-data.c index 7bef8ec5..738d56d0 100644 --- a/src/libratbag-data.c +++ b/src/libratbag-data.c @@ -166,6 +166,10 @@ init_data_hidpp20(struct ratbag *ratbag, str = g_key_file_get_string(keyfile, group, "Quirk", NULL); data->hidpp20.quirk = HIDPP20_QUIRK_NONE; + if (str) { + if (streq(str, "G305")) + data->hidpp20.quirk = HIDPP20_QUIRK_G305; + } } static void