鼠标多媒体按钮不会在“/dev/input/eventX”中发出事件

鼠标多媒体按钮不会在“/dev/input/eventX”中发出事件

我有一只鼠标(Canyon CND-SGM14RGB),上面有多个可编程按钮,其中一半被设置为多媒体按钮。配置软件仅适用于 Windows,这些按钮在 Windows 中可以正常工作——即使没有特殊驱动程序。

然而,在 Linux 中,只有映射到标准鼠标操作的按钮才有效(lmb、rmb、中、前进/后退)。多媒体按钮不起作用。


我尝试过以下诊断步骤:

  1. 启动wevxevwayland 的替代方案)并按下所有按钮:

    常规按钮可以使用,但多媒体按钮不行。

  2. 执行cat /dev/input/eventX并寻找新数据:

    根据/proc/bus/input/devices与鼠标相关的两个文件,其中一个在进行常规鼠标活动时确实发出垃圾,而在按下多媒体按钮时两个文件都没有声音。

  3. 启动 Wireshark 并寻找鼠标数据包,我发现:

    • 握手 (???) 从设备 2.27.0(总线 2、设备 27、端点 0)发送
    • 常规鼠标事件(在 中发出的事件/dev/input/eventX)从设备 2.27.1 发送
    • 多媒体按钮按下从设备 2.27.2 发送。

我可以做些什么来让这些按钮正常工作吗?如果需要,我可以提供 Wireshark 转储文件。

编辑1:lsusb输出

Bus 002 Device 027: ID 258a:0027 SINOWEALTH Wired Gaming Mouse
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x258a 
  idProduct          0x0027 
  bcdDevice            1.02
  iManufacturer           1 SINOWEALTH
  iProduct                2 Wired Gaming Mouse
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x003b
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              480mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      2 Mouse
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      71
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     213
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               1
Device Status:     0x0000
  (Bus Powered)

编辑2:相关libinput list-devices输出

Device:           SINOWEALTH Wired Gaming Mouse
Kernel:           /dev/input/event9
Group:            9
Seat:             seat0, default
Capabilities:     pointer 
Tap-to-click:     n/a
Tap-and-drag:     n/a
Tap drag lock:    n/a
Left-handed:      disabled
Nat.scrolling:    disabled
Middle emulation: disabled
Calibration:      n/a
Scroll methods:   button
Click methods:    none
Disable-w-typing: n/a
Disable-w-trackpointing: n/a
Accel profiles:   flat *adaptive
Rotation:         n/a

Device:           SINOWEALTH Wired Gaming Mouse Keyboard
Kernel:           /dev/input/event10
Group:            9
Seat:             seat0, default
Capabilities:     keyboard 
Tap-to-click:     n/a
Tap-and-drag:     n/a
Tap drag lock:    n/a
Left-handed:      n/a
Nat.scrolling:    n/a
Middle emulation: n/a
Calibration:      n/a
Scroll methods:   none
Click methods:    none
Disable-w-typing: n/a
Disable-w-trackpointing: n/a
Accel profiles:   n/a
Rotation:         n/a

答案1

bInterfaceClass         3 Human Interface Device
bInterfaceSubClass      1 Boot Interface Subclass
bInterfaceProtocol      1 Keyboard

看起来鼠标并没有使用普通的USB HID协议,而是一个单独的USB HID 启动协议usbkbd,由单独的内核模块处理usbmouse。绝大多数 USB 鼠标hid更喜欢该协议,某些发行版甚至可能不会自动加载鼠标的启动协议驱动程序。

由于该usbhid模块通常声明所有识别为通用 USB 鼠标和键盘设备的设备,因此您可能必须明确确定该鼠标的启动协议驱动程序的优先级。

您可以通过创建包含/etc/modprobe.d/canyonmouse.conf以下内容的文件来完成此操作:

# Prioritize boot protocol for the multimedia keys of this mouse
install usbhid /sbin/modprobe usbkbd; /sbin/modprobe -i usbhid
alias usb:v258ap0027* usbkbd

创建此文件后,您应该更新 initrd/initramfs 文件。

这将强制键盘启动协议模块在模块之前首先加载,使其有机会在驱动程序接管usbhid之前控制鼠标(特别是其“键盘”接口) 。usbhid

我必须做同样的事情来使服务器具有基于 AST2400 的远程管理界面,以响应基于 Web 的远程管理连接上的击键:事实证明,远程管理连接为服务器提供了虚拟鼠标和键盘设备,两者都只支持启动协议。对于鼠标功能来说,这不是问题,但显然仅支持启动协议的键盘非常罕见,目前还没有对它们的自动支持。

由于使用 HID 启动协议的要求非常罕见,因此某些发行版(例如 Debian 11)已停止在其标准内核中提供启动协议驱动程序。因此,如果modprobe usbkbd作为 root 导致错误表明此类模块不可用,则您可能需要CONFIG_USB_KBD启用内核构建时配置选项的备用/自定义内核。

答案2

https://askubuntu.com/a/1460840/906557

我现在不知道为什么,但它正在工作:

使用这个特殊的鼠标(我相信还有许多其他鼠标),您可以使用 Windows 软件将附加按钮绑定到任何组合键,例如Ctrl+ Alt+ Arrow button,然后将它们用作 Ubuntu 中媒体的自定义快捷方式。

相关内容