diff --git a/README.md b/README.md index 23f47ee3ab41651cfc15e7f93fde192cf89ca10c..668dcffb37d181ed1756827ae6d0278ba0fbd37e 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,7 @@ The devices below are fully feature supported by OpenRazer, which means all avai | Razer Basilisk X HyperSpeed | 1532:0083 | | Razer DeathAdder V2 | 1532:0084 | | Razer Viper Mini | 1532:008A | +| Razer DeathAdder V2 Mini | 1532:008C | ### Mousemats | Device | USB VID:PID | diff --git a/daemon/openrazer_daemon/hardware/mouse.py b/daemon/openrazer_daemon/hardware/mouse.py index 21257258cba9e8548dec7e409e1d14106d51156a..49c26471daad8da1f8eddfd48227fff6db47752e 100644 --- a/daemon/openrazer_daemon/hardware/mouse.py +++ b/daemon/openrazer_daemon/hardware/mouse.py @@ -2206,3 +2206,51 @@ class RazerBasiliskXHyperSpeed(__RazerDevice): def _suspend_device(self): self.logger.debug("Device doesn't have suspend/resume") + + +class RazerDeathAdderV2Mini(__RazerDeviceSpecialBrightnessSuspend): + """ + Class for the Razer DeathAdder V2 Mini + """ + EVENT_FILE_REGEX = re.compile(r'.*Razer_DeathAdder_V2_Mini-if0(1|2)-event-kbd') + METHODS = ['get_device_type_mouse', 'max_dpi', 'get_dpi_xy', 'set_dpi_xy', + 'get_dpi_stages', 'set_dpi_stages', + 'get_poll_rate', 'set_poll_rate', + 'get_logo_brightness', 'set_logo_brightness', + # Logo + 'set_logo_static_naga_hex_v2', 'set_logo_spectrum_naga_hex_v2', 'set_logo_none_naga_hex_v2', 'set_logo_reactive_naga_hex_v2', + 'set_logo_breath_random_naga_hex_v2', 'set_logo_breath_single_naga_hex_v2', 'set_logo_breath_dual_naga_hex_v2', + # Custom frame + 'set_custom_effect', 'set_key_row'] + + USB_VID = 0x1532 + USB_PID = 0x008C + DEVICE_IMAGE = "https://assets.razerzone.com/eeimages/support/products/1692/deathadder-v2-mini.png" + + DPI_MAX = 8500 + + def _suspend_device(self): + """ + Suspend the device + + Get the current brightness level, store it for later and then set the brightness to 0 + """ + self.suspend_args.clear() + self.suspend_args['brightness'] = _da_get_logo_brightness(self) + + # Todo make it context? + self.disable_notify = True + _da_set_logo_brightness(self, 0) + self.disable_notify = False + + def _resume_device(self): + """ + Resume the device + + Get the last known brightness and then set the brightness + """ + logo_brightness = self.suspend_args.get('brightness', (100, 100))[0] + + self.disable_notify = True + _da_set_logo_brightness(self, logo_brightness) + self.disable_notify = False diff --git a/driver/razermouse_driver.c b/driver/razermouse_driver.c index 865c335880b5c52dc44fca0d8cfa22e4e3d7217e..bfe8b42627e157e7f788efb0ce4456c0899eb528 100644 --- a/driver/razermouse_driver.c +++ b/driver/razermouse_driver.c @@ -406,6 +406,10 @@ static ssize_t razer_attr_read_device_type(struct device *dev, struct device_att device_type = "Razer DeathAdder V2 Pro (Wireless)\n"; break; + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: + device_type = "Razer DeathAdder V2 Mini\n"; + break; + case USB_DEVICE_ID_RAZER_DEATHADDER_2000: device_type = "Razer DeathAdder 2000\n"; break; @@ -463,6 +467,7 @@ static ssize_t razer_attr_read_get_firmware_version(struct device *dev, struct d case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report.transaction_id.id = 0x3f; break; } @@ -547,6 +552,7 @@ static ssize_t razer_attr_write_mode_custom(struct device *dev, struct device_at case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: case USB_DEVICE_ID_RAZER_VIPER: case USB_DEVICE_ID_RAZER_VIPER_MINI: case USB_DEVICE_ID_RAZER_VIPER_ULTIMATE_WIRED: @@ -782,6 +788,7 @@ static ssize_t razer_attr_read_get_serial(struct device *dev, struct device_attr case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report.transaction_id.id = 0x3f; break; @@ -957,6 +964,7 @@ static ssize_t razer_attr_read_poll_rate(struct device *dev, struct device_attri case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report.transaction_id.id = 0x3f; break; @@ -1024,6 +1032,7 @@ static ssize_t razer_attr_write_poll_rate(struct device *dev, struct device_attr case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report.transaction_id.id = 0x3f; break; @@ -1250,6 +1259,7 @@ static ssize_t razer_attr_write_mouse_dpi(struct device *dev, struct device_attr case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report.transaction_id.id = 0x3f; break; @@ -1336,6 +1346,7 @@ static ssize_t razer_attr_read_mouse_dpi(struct device *dev, struct device_attri case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report = razer_chroma_misc_get_dpi_xy(NOSTORE); report.transaction_id.id = 0x3f; break; @@ -1639,6 +1650,7 @@ static ssize_t razer_attr_write_set_key_row(struct device *dev, struct device_at case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: case USB_DEVICE_ID_RAZER_VIPER: case USB_DEVICE_ID_RAZER_VIPER_MINI: case USB_DEVICE_ID_RAZER_VIPER_ULTIMATE_WIRED: @@ -1707,6 +1719,7 @@ static ssize_t razer_attr_write_device_mode(struct device *dev, struct device_at case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report.transaction_id.id = 0x3f; break; } @@ -1749,6 +1762,7 @@ static ssize_t razer_attr_read_device_mode(struct device *dev, struct device_att case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: case USB_DEVICE_ID_RAZER_MAMBA_WIRELESS_RECEIVER: case USB_DEVICE_ID_RAZER_MAMBA_WIRELESS_WIRED: report.transaction_id.id = 0x3f; @@ -1900,6 +1914,7 @@ static ssize_t razer_attr_read_logo_led_brightness(struct device *dev, struct de case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report = razer_chroma_extended_matrix_get_brightness(VARSTORE, LOGO_LED); break; @@ -1954,6 +1969,7 @@ static ssize_t razer_attr_write_logo_led_brightness(struct device *dev, struct d case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report = razer_chroma_extended_matrix_brightness(VARSTORE, LOGO_LED, brightness); break; @@ -2702,6 +2718,7 @@ static ssize_t razer_attr_write_logo_mode_spectrum(struct device *dev, struct de case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report = razer_chroma_extended_matrix_effect_spectrum(VARSTORE, LOGO_LED); break; @@ -2757,6 +2774,7 @@ static ssize_t razer_attr_write_logo_mode_reactive(struct device *dev, struct de case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report = razer_chroma_extended_matrix_effect_reactive(VARSTORE, LOGO_LED, speed, (struct razer_rgb*)&buf[1]); break; @@ -2829,6 +2847,7 @@ static ssize_t razer_attr_write_logo_mode_breath(struct device *dev, struct devi case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: switch(count) { case 3: // Single colour mode report = razer_chroma_extended_matrix_effect_breathing_single(VARSTORE, LOGO_LED, (struct razer_rgb*)&buf[0]); @@ -2897,6 +2916,7 @@ static ssize_t razer_attr_write_logo_mode_static(struct device *dev, struct devi case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report = razer_chroma_extended_matrix_effect_static(VARSTORE, LOGO_LED, (struct razer_rgb*)&buf[0]); break; @@ -2955,6 +2975,7 @@ static ssize_t razer_attr_write_logo_mode_none(struct device *dev, struct device case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: report = razer_chroma_extended_matrix_effect_none(VARSTORE, LOGO_LED); break; @@ -3513,6 +3534,7 @@ static int razer_mouse_probe(struct hid_device *hdev, const struct hid_device_id case USB_DEVICE_ID_RAZER_DEATHADDER_V2: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED: case USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS: + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: expected_subclass = 0x01; break; } @@ -3607,6 +3629,20 @@ static int razer_mouse_probe(struct hid_device *hdev, const struct hid_device_id CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_matrix_custom_frame); break; + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_poll_rate); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_dpi); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_dpi_stages); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_logo_led_brightness); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_logo_matrix_effect_spectrum); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_logo_matrix_effect_reactive); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_logo_matrix_effect_breath); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_logo_matrix_effect_static); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_logo_matrix_effect_none); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_matrix_effect_custom); + CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_matrix_custom_frame); + break; + case USB_DEVICE_ID_RAZER_NAGA_HEX_V2: case USB_DEVICE_ID_RAZER_NAGA_CHROMA: CREATE_DEVICE_FILE(&hdev->dev, &dev_attr_poll_rate); @@ -4076,6 +4112,20 @@ static void razer_mouse_disconnect(struct hid_device *hdev) device_remove_file(&hdev->dev, &dev_attr_matrix_custom_frame); break; + case USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI: + device_remove_file(&hdev->dev, &dev_attr_poll_rate); + device_remove_file(&hdev->dev, &dev_attr_dpi); + device_remove_file(&hdev->dev, &dev_attr_dpi_stages); + device_remove_file(&hdev->dev, &dev_attr_logo_led_brightness); + device_remove_file(&hdev->dev, &dev_attr_logo_matrix_effect_spectrum); + device_remove_file(&hdev->dev, &dev_attr_logo_matrix_effect_reactive); + device_remove_file(&hdev->dev, &dev_attr_logo_matrix_effect_breath); + device_remove_file(&hdev->dev, &dev_attr_logo_matrix_effect_static); + device_remove_file(&hdev->dev, &dev_attr_logo_matrix_effect_none); + device_remove_file(&hdev->dev, &dev_attr_matrix_effect_custom); + device_remove_file(&hdev->dev, &dev_attr_matrix_custom_frame); + break; + case USB_DEVICE_ID_RAZER_NAGA_HEX_V2: case USB_DEVICE_ID_RAZER_NAGA_CHROMA: device_remove_file(&hdev->dev, &dev_attr_poll_rate); @@ -4457,6 +4507,7 @@ static const struct hid_device_id razer_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_DEATHADDER_V2) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRED) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_DEATHADDER_V2_PRO_WIRELESS) }, + { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_DEATHADDER_2000) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_ATHERIS_RECEIVER) }, { HID_USB_DEVICE(USB_VENDOR_ID_RAZER,USB_DEVICE_ID_RAZER_BASILISK_X_HYPERSPEED) }, diff --git a/driver/razermouse_driver.h b/driver/razermouse_driver.h index 640039c457df5459951c365ba3e23f8d34aa2ecb..9208dfdf4f1a15dc2d6a10d6ccde012f6e3cb604 100644 --- a/driver/razermouse_driver.h +++ b/driver/razermouse_driver.h @@ -64,6 +64,7 @@ #define USB_DEVICE_ID_RAZER_BASILISK_X_HYPERSPEED 0x0083 #define USB_DEVICE_ID_RAZER_DEATHADDER_V2 0x0084 #define USB_DEVICE_ID_RAZER_VIPER_MINI 0x008A +#define USB_DEVICE_ID_RAZER_DEATHADDER_V2_MINI 0x008C /* Each keyboard report has 90 bytes*/ #define RAZER_REPORT_LEN 0x5A diff --git a/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml b/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml index 871d52b6d9655ce061c364b29334d8fe3855ffa7..f45940b83dc7474cfb7e85c6b79bc1c3df9a38d9 100644 --- a/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml +++ b/install_files/appstream/io.github.openrazer.openrazer.metainfo.xml @@ -68,6 +68,7 @@ <modalias>usb:v1532p0083d*</modalias> <modalias>usb:v1532p0084d*</modalias> <modalias>usb:v1532p008Ad*</modalias> + <modalias>usb:v1532p008Cd*</modalias> <modalias>usb:v1532p010Dd*</modalias> <modalias>usb:v1532p010Ed*</modalias> <modalias>usb:v1532p010Fd*</modalias> diff --git a/install_files/udev/99-razer.rules b/install_files/udev/99-razer.rules index d5b36bd34fc96fdcc25ca6c2595fd102a56e5614..d26b716660adb37997f0b439131c77e8d7dd4693 100644 --- a/install_files/udev/99-razer.rules +++ b/install_files/udev/99-razer.rules @@ -5,7 +5,7 @@ GOTO="razer_end" LABEL="razer_vendor" # Mice -ATTRS{idProduct}=="0013|0016|0020|0024|0025|002e|002f|0032|0034|0036|0037|0038|0039|0040|0041|0042|0043|0044|0045|0046|0048|004c|004f|0050|0053|0054|0059|005a|005b|005c|005e|0060|0062|0064|0067|006a|006b|006c|006e|006f|0070|0071|0072|0073|0078|007a|007b|007c|007d|0083|0084|008a", \ +ATTRS{idProduct}=="0013|0016|0020|0024|0025|002e|002f|0032|0034|0036|0037|0038|0039|0040|0041|0042|0043|0044|0045|0046|0048|004c|004f|0050|0053|0054|0059|005a|005b|005c|005e|0060|0062|0064|0067|006a|006b|006c|006e|006f|0070|0071|0072|0073|0078|007a|007b|007c|007d|0083|0084|008a|008c", \ ATTRS{idVendor}=="1532", \ ENV{ID_RAZER_CHROMA}="1", ENV{RAZER_DRIVER}="razermouse" diff --git a/pylib/openrazer/_fake_driver/razerdeathadderv2mini.cfg b/pylib/openrazer/_fake_driver/razerdeathadderv2mini.cfg new file mode 100644 index 0000000000000000000000000000000000000000..f957bfa9d8aee3e6841acf835d82465d5b869e72 --- /dev/null +++ b/pylib/openrazer/_fake_driver/razerdeathadderv2mini.cfg @@ -0,0 +1,18 @@ +[device] +dir_name = 0003:1532:008C.0001 +name = Razer DeathAdder V2 Mini +files = r,device_serial,XX000000008C + r,device_type,%(name)s + rw,dpi,800:800 + rw,dpi_stages,0x010320032005dc05dc + r,firmware_version,v1.0 + rw,logo_led_brightness,0 + w,logo_matrix_effect_breath + w,logo_matrix_effect_none + w,logo_matrix_effect_reactive + w,logo_matrix_effect_spectrum + w,logo_matrix_effect_static + w,matrix_custom_frame + w,matrix_effect_custom + rw,poll_rate,500 + r,version,1.0.0