手写板/鼠标笔在 Ubuntu 中不起作用

手写板/鼠标笔在 Ubuntu 中不起作用

我的问题几乎与这里&错误 1391260

Genius MousePen i608X 在 Ubuntu 中无法使用

我的操作系统是 Ubuntu 14.10。指针移动,但没有按钮感应。

它似乎与该供应商的其他平板电脑共享相同的魔法 HID

我可以得到下载和安装补丁文件的逐步过程吗?

编辑:在我将 Linux 内核版本升级到 3.18.3-031803-generic 之后,Genius MousePen i608X 运行良好。

答案1

这可能不是正确的程序,但我设法让它工作了。我会发布它,如果你有冒险精神,你也可以这样做。

我采用了两种方法,但我不能保证它们对你有用,因为我仍然认为自己是新手,而且我是按照其他人的指南来做的。

警告:这包括编译自定义内核。确保至少安装一个或多个旧内核,以防出现问题!


第一种(简单)方法:

  1. 从以下网址下载内核源代码Linux 内核档案。只需单击“最新稳定内核”按钮即可。
  2. 提取档案:打开终端并导航到下载内核的位置并运行此命令:(tar -xvJf linux-"KernelVersion".tar.xz替换"KernelVersion"为下载内核的版本号)。
  3. 这将创建一个新文件夹,通常名为 linux-“KernelVersion”(再次强调,这是下载的内核的版本号)。进入该文件夹,然后导航至 drivers > hid。您现在应该位于/path/to/download/linux-"KernelVersion"/drivers/hid
  4. hid-ids.h使用您喜欢的文本编辑器编辑文件:gedit hid-ids.hnano hid-ids.hkate hid-ids.h
  5. 在文本编辑器中,导航到以下行(应该在第 520-530 行左右):

    #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011

  6. 编辑该行,使其看起来像这样:

    #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x501a

  7. 保存并退出。现在是时候编译内核了。

你可以在网上找到很多关于编译内核的指南,所以我认为最好是给你参考一下,而不是自己写指南。我找到了这个文章非常有帮助。请仔细阅读文章并小心配置。

修复之后,一切都完美了,唯一让我烦恼的是xinput现在列出了几个 Genius MousePen i608X 设备。


第二种(困难)方法:

这种方式比较困难,因为你必须编辑更多文件。这就是你提到的补丁中描述的方式。

  1. 按照第一种方法中的步骤 1 - 3 进行操作。
  2. hid-core.c像这样编辑文件:

导航到如下代码块: { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_MANTICORE) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },

并将其改为: { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_MANTICORE) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2) }, //add this { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },

  1. 按照与第一种方法类似的方式进行编辑hid-ids.h,但不要编辑那一行,而是在其后添加以下行:

#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2 0x501A

  1. hid-kye.c像这样编辑文件:

找到这一段代码:

/*
 * See EasyPen M610X description, device and HID report descriptors at
 * http://sf.net/apps/mediawiki/digimend/?title=KYE_EasyPen_M610X
 */

在它之前添加以下内容:

/* Original MousePen i608X report descriptor size */
#define MOUSEPEN_I608X_2_RDESC_ORIG_SIZE  482

/* Fixed MousePen i608X report descriptor */
static __u8 mousepen_i608x_2_rdesc_fixed[] = {
  0x06, 0x00, 0xFF, /*  Usage Page (FF00h),             */
  0x09, 0x01,       /*  Usage (01h),                    */
  0xA1, 0x01,       /*  Collection (Application),       */
  0x85, 0x05,       /*    Report ID (5),                */
  0x09, 0x01,       /*    Usage (01h),                  */
  0x15, 0x80,       /*    Logical Minimum (-128),       */
  0x25, 0x7F,       /*    Logical Maximum (127),        */
  0x75, 0x08,       /*    Report Size (8),              */
  0x95, 0x07,       /*    Report Count (7),             */
  0xB1, 0x02,       /*    Feature (Variable),           */
  0xC0,             /*  End Collection,                 */
  0x05, 0x0D,       /*  Usage Page (Digitizer),         */
  0x09, 0x02,       /*  Usage (Pen),                    */
  0xA1, 0x01,       /*  Collection (Application),       */
  0x85, 0x10,       /*    Report ID (16),               */
  0x09, 0x20,       /*    Usage (Stylus),               */
  0xA0,             /*    Collection (Physical),        */
  0x14,             /*      Logical Minimum (0),        */
  0x25, 0x01,       /*      Logical Maximum (1),        */
  0x75, 0x01,       /*      Report Size (1),            */
  0x09, 0x42,       /*      Usage (Tip Switch),         */
  0x09, 0x44,       /*      Usage (Barrel Switch),      */
  0x09, 0x46,       /*      Usage (Tablet Pick),        */
  0x95, 0x03,       /*      Report Count (3),           */
  0x81, 0x02,       /*      Input (Variable),           */
  0x95, 0x04,       /*      Report Count (4),           */
  0x81, 0x03,       /*      Input (Constant, Variable), */
  0x09, 0x32,       /*      Usage (In Range),           */
  0x95, 0x01,       /*      Report Count (1),           */
  0x81, 0x02,       /*      Input (Variable),           */
  0x75, 0x10,       /*      Report Size (16),           */
  0x95, 0x01,       /*      Report Count (1),           */
  0xA4,             /*      Push,                       */
  0x05, 0x01,       /*      Usage Page (Desktop),       */
  0x55, 0xFD,       /*      Unit Exponent (-3),         */
  0x65, 0x13,       /*      Unit (Inch),                */
  0x34,             /*      Physical Minimum (0),       */
  0x09, 0x30,       /*      Usage (X),                  */
  0x46, 0x40, 0x1F, /*      Physical Maximum (8000),    */
  0x26, 0x00, 0xA0, /*      Logical Maximum (40960),    */
  0x81, 0x02,       /*      Input (Variable),           */
  0x09, 0x31,       /*      Usage (Y),                  */
  0x46, 0x70, 0x17, /*      Physical Maximum (6000),    */
  0x26, 0x00, 0x78, /*      Logical Maximum (30720),    */
  0x81, 0x02,       /*      Input (Variable),           */
  0xB4,             /*      Pop,                        */
  0x09, 0x30,       /*      Usage (Tip Pressure),       */
  0x26, 0xFF, 0x07, /*      Logical Maximum (2047),     */
  0x81, 0x02,       /*      Input (Variable),           */
  0xC0,             /*    End Collection,               */
  0xC0,             /*  End Collection,                 */
  0x05, 0x01,       /*  Usage Page (Desktop),           */
  0x09, 0x02,       /*  Usage (Mouse),                  */
  0xA1, 0x01,       /*  Collection (Application),       */
  0x85, 0x11,       /*    Report ID (17),               */
  0x09, 0x01,       /*    Usage (Pointer),              */
  0xA0,             /*    Collection (Physical),        */
  0x14,             /*      Logical Minimum (0),        */
  0xA4,             /*      Push,                       */
  0x05, 0x09,       /*      Usage Page (Button),        */
  0x75, 0x01,       /*      Report Size (1),            */
  0x19, 0x01,       /*      Usage Minimum (01h),        */
  0x29, 0x03,       /*      Usage Maximum (03h),        */
  0x25, 0x01,       /*      Logical Maximum (1),        */
  0x95, 0x03,       /*      Report Count (3),           */
  0x81, 0x02,       /*      Input (Variable),           */
  0x95, 0x05,       /*      Report Count (5),           */
  0x81, 0x01,       /*      Input (Constant),           */
  0xB4,             /*      Pop,                        */
  0x95, 0x01,       /*      Report Count (1),           */
  0xA4,             /*      Push,                       */
  0x55, 0xFD,       /*      Unit Exponent (-3),         */
  0x65, 0x13,       /*      Unit (Inch),                */
  0x34,             /*      Physical Minimum (0),       */
  0x75, 0x10,       /*      Report Size (16),           */
  0x09, 0x30,       /*      Usage (X),                  */
  0x46, 0x40, 0x1F, /*      Physical Maximum (8000),    */
  0x26, 0x00, 0x50, /*      Logical Maximum (20480),    */
  0x81, 0x02,       /*      Input (Variable),           */
  0x09, 0x31,       /*      Usage (Y),                  */
  0x46, 0x70, 0x17, /*      Physical Maximum (6000),    */
  0x26, 0x00, 0x3C, /*      Logical Maximum (15360),    */
  0x81, 0x02,       /*      Input (Variable),           */
  0xB4,             /*      Pop,                        */
  0x75, 0x08,       /*      Report Size (8),            */
  0x09, 0x38,       /*      Usage (Wheel),              */
  0x15, 0xFF,       /*      Logical Minimum (-1),       */
  0x25, 0x01,       /*      Logical Maximum (1),        */
  0x81, 0x06,       /*      Input (Variable, Relative), */
  0x81, 0x01,       /*      Input (Constant),           */
  0xC0,             /*    End Collection,               */
  0xC0              /*  End Collection                  */
};
  1. 在同一个文件中找到这块代码:
case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
      if (*rsize == MOUSEPEN_I608X_RDESC_ORIG_SIZE) {
          rdesc = mousepen_i608x_rdesc_fixed;
          *rsize = sizeof(mousepen_i608x_rdesc_fixed);
      }
      break;

并在其后添加:

case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2:
      if (*rsize == MOUSEPEN_I608X_2_RDESC_ORIG_SIZE) {
          rdesc = mousepen_i608x_2_rdesc_fixed;
          *rsize = sizeof(mousepen_i608x_2_rdesc_fixed);
      }
      break;
  1. 在同一个文件中找到这块代码:
case USB_DEVICE_ID_KYE_EASYPEN_I405X:
  case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
  case USB_DEVICE_ID_KYE_EASYPEN_M610X:

并将其更改为:

case USB_DEVICE_ID_KYE_EASYPEN_I405X:
  case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
  case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2: // add this line
  case USB_DEVICE_ID_KYE_EASYPEN_M610X:
  1. 在同一个文件中找到这块代码:
  { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
              USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
  { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
              USB_DEVICE_ID_KYE_EASYPEN_M610X) },
  { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
              USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },

并将其更改为:

  { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
              USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
  { HID_USB_DEVICE(USB_VENDOR_ID_KYE,                // add this line
              USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2) }, // and this one
  { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
              USB_DEVICE_ID_KYE_EASYPEN_M610X) },
  { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
              USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
  1. 要编辑的最后一个文件位于/path/to/download/linux-"KernelVersion"/drivers/hid/usbhid目录中。它被称为hid-quirks.c。在其中找到以下代码块:

      { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS, HID_QUIRK_MULTI_INPUT },
      { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS },
      { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT },
      { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT },
      { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS },
      { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS },
    

    并将其更改为:

  { USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS, HID_QUIRK_MULTI_INPUT },
  { USB_VENDOR_ID_SIGMA_MICRO, USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD, HID_QUIRK_NO_INIT_REPORTS },
  { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT },
  { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2, HID_QUIRK_MULTI_INPUT }, // add this line
  { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT },
  { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS },
  { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS },
  1. 编辑完后记得保存所有文件。现在你可以按照上面说的来编译内核了。

再次强调,这可能不是正确的方法,但由于我没有找到如何正确执行此操作的教程,因此我不得不手动执行。对我来说,这种方法有效,但同样,我不能保证这种方法对您也有效。希望这对您有所帮助。

答案2

在我将 Linux 内核版本升级到 3.18.3-031803-generic 后,Genius MousePen i608X 运行正常

相关内容