From 179f433da3c2efa62e5e079870c17e1155953520 Mon Sep 17 00:00:00 2001 From: nightsky30 <6024315+nightsky30@users.noreply.github.com> Date: Sat, 25 Apr 2020 20:31:14 -0500 Subject: [PATCH] Add support for Razer Cynosa Chroma Pro --- README.md | 1 + daemon/openrazer_daemon/hardware/keyboards.py | 20 ++++++++++++++++++ driver/razerkbd_driver.c | 20 ++++++++++++++++++ driver/razerkbd_driver.h | 1 + ...io.github.openrazer.openrazer.metainfo.xml | 1 + install_files/udev/99-razer.rules | 2 +- .../_fake_driver/razercynosachromapro.cfg | 21 +++++++++++++++++++ 7 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 pylib/openrazer/_fake_driver/razercynosachromapro.cfg diff --git a/README.md b/README.md index 57ca21d2..403ac29f 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,7 @@ The devices below are fully feature supported by OpenRazer, which means all avai | Razer Huntsman | 1532:0227 | | Razer BlackWidow Elite | 1532:0228 | | Razer Cynosa Chroma | 1532:022A | +| Razer Cynosa Chroma Pro | 1532:022C | | Razer Blade Stealth (Mid 2017) | 1532:022D | | Razer Blade Pro FullHD (2017) | 1532:022F | | Razer Blade Stealth (Late 2017) | 1532:0232 | diff --git a/daemon/openrazer_daemon/hardware/keyboards.py b/daemon/openrazer_daemon/hardware/keyboards.py index cf1dd4c0..c2aa9656 100644 --- a/daemon/openrazer_daemon/hardware/keyboards.py +++ b/daemon/openrazer_daemon/hardware/keyboards.py @@ -733,6 +733,26 @@ class RazerCynosaChroma(_RippleKeyboard): DEVICE_IMAGE = "https://assets.razerzone.com/eeimages/support/products/1256/1256_cynosa_chroma.png" +class RazerCynosaChromaPro(_RippleKeyboard): + """ + Class for the Razer Cynosa Chroma Pro + """ + EVENT_FILE_REGEX = re.compile(r'.*Cynosa_Chroma_Pro(-if01)?-event-kbd') + + USB_VID = 0x1532 + USB_PID = 0x022C + HAS_MATRIX = True + WAVE_DIRS = (0, 1) + MATRIX_DIMS = [6, 22] + METHODS = ['get_device_type_keyboard', 'set_wave_effect', 'set_static_effect', 'set_spectrum_effect', + 'set_reactive_effect', 'set_none_effect', 'set_breath_random_effect', 'set_breath_single_effect', 'set_breath_dual_effect', + 'set_custom_effect', 'set_key_row', 'get_game_mode', 'set_game_mode', 'get_macro_mode', 'set_macro_mode', + 'get_macro_effect', 'set_macro_effect', 'get_macros', 'delete_macro', 'add_macro', + 'set_starlight_random_effect', 'set_starlight_single_effect', 'set_starlight_dual_effect'] + + DEVICE_IMAGE = "https://assets.razerzone.com/eeimages/support/products/1257/1257_cynosa_chroma_pro_alt.png" + + class RazerCynosaV2(_RippleKeyboard): """ Class for the Razer Cynosa V2 diff --git a/driver/razerkbd_driver.c b/driver/razerkbd_driver.c index b30a244e..8f177092 100644 --- a/driver/razerkbd_driver.c +++ b/driver/razerkbd_driver.c @@ -230,6 +230,7 @@ static void razer_set_device_mode(struct usb_device *usb_dev, unsigned char mode case USB_DEVICE_ID_RAZER_ORNATA_CHROMA: case USB_DEVICE_ID_RAZER_ORNATA_CHROMA_V2: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: report.transaction_id.id = 0x3F; break; @@ -556,6 +557,10 @@ static ssize_t razer_attr_read_device_type(struct device *dev, struct device_att device_type = "Razer Cynosa Chroma\n"; break; + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: + device_type = "Razer Cynosa Chroma Pro\n"; + break; + case USB_DEVICE_ID_RAZER_CYNOSA_LITE: device_type = "Razer Cynosa Lite\n"; break; @@ -602,6 +607,7 @@ static ssize_t razer_attr_write_mode_macro_effect(struct device *dev, struct dev case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: report = razer_chroma_standard_set_led_effect(NOSTORE, MACRO_LED, enabled); report.transaction_id.id = 0x3F; @@ -900,6 +906,7 @@ static ssize_t razer_attr_write_mode_none(struct device *dev, struct device_attr case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: report = razer_chroma_extended_matrix_effect_none(VARSTORE, BACKLIGHT_LED); break; @@ -955,6 +962,7 @@ static ssize_t razer_attr_write_mode_wave(struct device *dev, struct device_attr case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: report = razer_chroma_extended_matrix_effect_wave(VARSTORE, BACKLIGHT_LED, direction); break; @@ -999,6 +1007,7 @@ static ssize_t razer_attr_write_mode_spectrum(struct device *dev, struct device_ case USB_DEVICE_ID_RAZER_BLACKWIDOW_2019: case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: report = razer_chroma_extended_matrix_effect_spectrum(VARSTORE, BACKLIGHT_LED); break; @@ -1057,6 +1066,7 @@ static ssize_t razer_attr_write_mode_reactive(struct device *dev, struct device_ case USB_DEVICE_ID_RAZER_BLACKWIDOW_2019: case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: report = razer_chroma_extended_matrix_effect_reactive(VARSTORE, BACKLIGHT_LED, speed, (struct razer_rgb*)&buf[1]); break; @@ -1180,6 +1190,7 @@ static ssize_t razer_attr_write_mode_static(struct device *dev, struct device_at case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: if(count == 3) { report = razer_chroma_extended_matrix_effect_static(VARSTORE, BACKLIGHT_LED, (struct razer_rgb*)&buf[0]); @@ -1256,6 +1267,7 @@ static ssize_t razer_attr_write_mode_starlight(struct device *dev, struct device case USB_DEVICE_ID_RAZER_BLACKWIDOW_2019: case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: if(count == 7) { report = razer_chroma_extended_matrix_effect_starlight_dual(VARSTORE, BACKLIGHT_LED, buf[0], (struct razer_rgb*)&buf[1], (struct razer_rgb*)&buf[4]); razer_send_payload(usb_dev, &report); @@ -1405,6 +1417,7 @@ static ssize_t razer_attr_write_mode_breath(struct device *dev, struct device_at case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: switch(count) { case 3: // Single colour mode @@ -1582,6 +1595,7 @@ static ssize_t razer_attr_write_mode_custom(struct device *dev, struct device_at case USB_DEVICE_ID_RAZER_BLACKWIDOW_2019: case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: report = razer_chroma_extended_matrix_effect_custom_frame(); break; @@ -1677,6 +1691,7 @@ static ssize_t razer_attr_write_set_brightness(struct device *dev, struct device case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: report = razer_chroma_extended_matrix_brightness(VARSTORE, BACKLIGHT_LED, brightness); break; @@ -1738,6 +1753,7 @@ static ssize_t razer_attr_read_set_brightness(struct device *dev, struct device_ case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_CYNOSA_LITE: report = razer_chroma_extended_matrix_get_brightness(VARSTORE, BACKLIGHT_LED); break; @@ -1870,6 +1886,7 @@ static ssize_t razer_attr_write_matrix_custom_frame(struct device *dev, struct d case USB_DEVICE_ID_RAZER_BLACKWIDOW_2019: case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: report = razer_chroma_extended_matrix_set_custom_frame(row_id, start_col, stop_col, (unsigned char*)&buf[offset]); break; @@ -2403,6 +2420,7 @@ static int razer_kbd_probe(struct hid_device *hdev, const struct hid_device_id * case USB_DEVICE_ID_RAZER_BLACKWIDOW_2019: case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ELITE: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_BLACKWIDOW_CHROMA_V2: @@ -2742,6 +2760,7 @@ static void razer_kbd_disconnect(struct hid_device *hdev) case USB_DEVICE_ID_RAZER_BLACKWIDOW_2019: case USB_DEVICE_ID_RAZER_HUNTSMAN: case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA: + case USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ELITE: case USB_DEVICE_ID_RAZER_BLACKWIDOW_ESSENTIAL: case USB_DEVICE_ID_RAZER_BLACKWIDOW_CHROMA_V2: @@ -2904,6 +2923,7 @@ static const struct hid_device_id razer_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_ORNATA_CHROMA) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_ORNATA_CHROMA_V2) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_CYNOSA_CHROMA) }, + { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_CYNOSA_LITE) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_CYNOSA_V2) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_BLACKWIDOW_LITE) }, diff --git a/driver/razerkbd_driver.h b/driver/razerkbd_driver.h index 7b7df93b..3efc8d95 100644 --- a/driver/razerkbd_driver.h +++ b/driver/razerkbd_driver.h @@ -47,6 +47,7 @@ #define USB_DEVICE_ID_RAZER_BLACKWIDOW_ELITE 0x0228 #define USB_DEVICE_ID_RAZER_CYNOSA_CHROMA 0x022A #define USB_DEVICE_ID_RAZER_TARTARUS_V2 0x022B +#define USB_DEVICE_ID_RAZER_CYNOSA_CHROMA_PRO 0x022C #define USB_DEVICE_ID_RAZER_BLADE_STEALTH_MID_2017 0x022D #define USB_DEVICE_ID_RAZER_BLADE_PRO_2017_FULLHD 0x022F #define USB_DEVICE_ID_RAZER_BLADE_STEALTH_LATE_2017 0x0232 diff --git a/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml b/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml index a9b5f585..0182b665 100644 --- a/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml +++ b/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml @@ -105,6 +105,7 @@ <modalias>usb:v1532p0228d*</modalias> <modalias>usb:v1532p022Ad*</modalias> <modalias>usb:v1532p022Bd*</modalias> + <modalias>usb:v1532p022Cd*</modalias> <modalias>usb:v1532p022Dd*</modalias> <modalias>usb:v1532p022Fd*</modalias> <modalias>usb:v1532p0232d*</modalias> diff --git a/install_files/udev/99-razer.rules b/install_files/udev/99-razer.rules index 4155ce42..828ddbb9 100644 --- a/install_files/udev/99-razer.rules +++ b/install_files/udev/99-razer.rules @@ -10,7 +10,7 @@ ATTRS{idProduct}=="0013|0016|0020|0024|0025|002e|002f|0032|0034|0036|0037|0038|0 ENV{ID_RAZER_CHROMA}="1", ENV{RAZER_DRIVER}="razermouse" # Keyboards -ATTRS{idProduct}=="010d|010e|010f|0111|0113|011a|011b|0201|0202|0203|0204|0205|0207|0208|0209|020f|0210|0211|0214|0216|0217|021a|021e|021f|0220|0221|0224|0225|0226|0227|0228|022a|022b|022d|022f|0232|0233|0234|0235|0237|0239|023a|023b|023f|0240|0241|0243|0245|0246|024a|024c|024d|0252|0253|0255|0259|025d|025e|026a", \ +ATTRS{idProduct}=="010d|010e|010f|0111|0113|011a|011b|0201|0202|0203|0204|0205|0207|0208|0209|020f|0210|0211|0214|0216|0217|021a|021e|021f|0220|0221|0224|0225|0226|0227|0228|022a|022b|022c|022d|022f|0232|0233|0234|0235|0237|0239|023a|023b|023f|0240|0241|0243|0245|0246|024a|024c|024d|0252|0253|0255|0259|025d|025e|026a", \ ATTRS{idVendor}=="1532", \ ENV{ID_RAZER_CHROMA}="1", ENV{RAZER_DRIVER}="razerkbd" diff --git a/pylib/openrazer/_fake_driver/razercynosachromapro.cfg b/pylib/openrazer/_fake_driver/razercynosachromapro.cfg new file mode 100644 index 00000000..3e41ad71 --- /dev/null +++ b/pylib/openrazer/_fake_driver/razercynosachromapro.cfg @@ -0,0 +1,21 @@ +[device] +dir_name = 0003:1532:022C.0001 +name = Razer Cynosa Chroma Pro +files = r,device_serial,XX000000022C + r,device_type,%(name)s + r,firmware_version,v1.0 + rw,game_led_state,0 + r,kbd_layout,01 + rw,macro_led_effect,0 + rw,macro_led_state,0 + rw,matrix_brightness,0 + w,matrix_custom_frame + w,matrix_effect_breath + w,matrix_effect_custom + w,matrix_effect_none + w,matrix_effect_reactive + w,matrix_effect_spectrum + w,matrix_effect_starlight + w,matrix_effect_static + w,matrix_effect_wave + r,version,1.0.0 -- GitLab