【问题标题】:USB HID Device only reporting first eventUSB HID 设备仅报告第一个事件
【发布时间】:2012-11-02 18:28:45
【问题描述】:

我有一个随 ASUS PSR 2000 Web Surfing Remote Control 一起提供的 eDIO USB 多功能遥控器(红外线接收器)。

我正在尝试将 Remote COntroller 连接到我的 pi,以便它接收遥控器发送的击键。

控制器被检测为 HID 设备。以下是 lsusb -v 命令的详细信息

Bus 001 Device 007: ID 147a:e001 Formosa Industrial Computing, Inc.
Couldn't open device, some information will be missing
Device Descriptor:
bLength                18
bDescriptorType         1
bcdUSB               1.10
bDeviceClass            0 (Defined at Interface level)
bDeviceSubClass         0
bDeviceProtocol         0
bMaxPacketSize0         8
idVendor           0x147a Formosa Industrial Computing, Inc.
idProduct          0xe001
bcdDevice            1.22
iManufacturer           1
iProduct                2
iSerial                 0
bNumConfigurations      1
Configuration Descriptor:
bLength                 9
bDescriptorType         2
wTotalLength           34
bNumInterfaces          1
bConfigurationValue     1
iConfiguration          4
bmAttributes         0xa0
(Bus Powered)
Remote Wakeup
MaxPower              300mA
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.10
bCountryCode            0 Not supported
bNumDescriptors         1
bDescriptorType        34 Report
wDescriptorLength      20
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     0x0004  1x 4 bytes
bInterval              10

我也可以在 dev 文件夹中的设备上创建一个事件

pi@raspberrypi /dev/input/by-id $ dir
usb-Cypress_Semiconductor_eDio_USB_Multi_Remote_Controlle-event-if00

与其关联的事件处理程序如下,从以下命令可见。

    pi@raspberrypi /proc/bus/input $ cat devices
    I: Bus=0003 Vendor=147a Product=e001 Version=0110
    N: Name="Cypress Semiconductor eDio USB Multi Remote Controlle"
    P: Phys=usb-bcm2708_usb-1.2/input0
    S: Sysfs=/devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input2
    U: Uniq=
    H: Handlers=event0
    B: PROP=0
    B: EV=1

问题是当我试图从为设备创建的事件处理程序中读取输出时。第一次击键已注册,但随后的击键未由 CAT 命令显示。

   pi@raspberrypi /dev/input $ cat event0 | xxd
   0000000: e007 9450 9476 0900 0000 0000 0000 0000  ...P.v..........

请建议我该怎么做才能使设备正常工作。在第一次击键后按下任何键都不会返回任何内容,除非重新插入设备。

请提出解决问题需要采取的措施。

【问题讨论】:

    标签: linux usb hid


    【解决方案1】:

    根据您最终想要做什么,将 HID 遥控器的按钮映射到击键可能就足够了,并且使用诸如 QJoyPad 之类的工具相当容易实现。

    这似乎是hard to build on a Raspberry Pi,所以你可能想尝试joy2key,它可以在repos 中找到:sudo apt-get install joy2key

    【讨论】:

      【解决方案2】:

      最后我有时间使用 PyUSB 库编写自己的实现,它是 Libusb 的包装器。

      我在这里发布代码。可能会对某人有所帮助。

      我有另一段代码创建了此处使用的配置文件。没有映射所有远程键,因为我不需要所有这些。

      import usb.core
      import usb.util
      import ConfigParser
      import shlex
      import subprocess
      import logging
      
      # find our device
      diction={
        6402315641282315:'1',
        6402415641282415:'2',
        6402515641282515:'3',
        6402615641282615:'4',
        6402715641282715:'5',
        6402815641282815:'6',
        6402915641282915:'7',
        6403015641283015:'8',
        6403115641283115:'9',
        }
      
      
      
      def load_config():
          dict={}
          config = ConfigParser.RawConfigParser()
          config.read('/codes/remote/remote.cfg')
      
          dict['vendor']=config.getint('Settings','idVendor')
      
          dict['product']=config.getint('Settings','idProduct')
      
          dict['interface']=config.getint('Settings', 'interface')
      
          r=config.options('Key Mappings')
      
          for item in r:
              if config.get('Key Mappings',item)!='': 
                  dict[item]=config.get('Key Mappings',item)
                  #print config.get('Key Mappings',item)
          return dict
      
      def pyus():
      
          try:
              load_log()
              dict=load_config()
              join_int = lambda nums: int(''.join(str(i) for i in nums))
              #print dict
      
              dev = usb.core.find(idVendor=dict['vendor'], idProduct=dict['product'])
              interface=dict['interface']
      
              if dev is None:
                  raise ValueError('Device not found')
      
              if dev.is_kernel_driver_active(interface) is True:
                      #print "but we need to detach kernel driver"
                      dev.detach_kernel_driver(interface)
              #dev.detatch_kernel_driver(interface) 
              # set the active configuration. With no arguments, the first
              # configuration will be the active one
              dev.set_configuration()
      
              # get an endpoint instance
              cfg = dev.get_active_configuration()
              interface_number = cfg[(0,0)].bInterfaceNumber
              alternate_setting = usb.control.get_interface(dev,interface_number)
              intf = usb.util.find_descriptor(
                  cfg, bInterfaceNumber = interface_number,
                  bAlternateSetting = alternate_setting
              )
      
              ep = usb.util.find_descriptor(
                  intf,
                  # match the first IN endpoint
                  custom_match = \
                  lambda e: \
                      usb.util.endpoint_direction(e.bEndpointAddress) == \
                      usb.util.ENDPOINT_IN
              )
      
              assert ep is not None
              #print 'packet details',ep.bEndpointAddress , ep.wMaxPacketSize
      
              while 1:
                  try:
                      data = dev.read(ep.bEndpointAddress, ep.wMaxPacketSize*2,interface,1000)
                      data=data.tolist()
                      key=join_int(data)
                      #print "Key is " , key
                      if  key in diction:
      
                          try:
                              args=shlex.split(dict[diction[key]])
                              #print args
                              p=subprocess.Popen(args, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
                              #print "Pressed key is ",diction[key]
                          except:
                              pass
      
      
                  except usb.core.USBError as e:
                      pass
          except:
              pass
      
      pyus()
      
      
      
      
      
      
      #____________________________REPORT DESCRIPTOR EXAMPLE___________________
      # Bus 001 Device 007: ID 147a:e001 Formosa Industrial Computing, Inc.
          # Couldn't open device, some information will be missing
          # Device Descriptor:
          # bLength                18
          # bDescriptorType         1
          # bcdUSB               1.10
          # bDeviceClass            0 (Defined at Interface level)
         # bDeviceSubClass         0
         # bDeviceProtocol         0
         # bMaxPacketSize0         8
         # idVendor           0x147a Formosa Industrial Computing, Inc.
         # idProduct          0xe001
         # bcdDevice            1.22
         # iManufacturer           1
         # iProduct                2
         # iSerial                 0
         # bNumConfigurations      1
        # Configuration Descriptor:
        # bLength                 9
        # bDescriptorType         2
      # wTotalLength           34
      # bNumInterfaces          1
      # bConfigurationValue     1
      # iConfiguration          4
      # bmAttributes         0xa0
        # (Bus Powered)
        # Remote Wakeup
      # MaxPower              300mA
      # 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.10
            # bCountryCode            0 Not supported
            # bNumDescriptors         1
            # bDescriptorType        34 Report
            # wDescriptorLength      20
           # 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     0x0004  1x 4 bytes
          # bInterval              10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多