Linux USB HID设备仅报告第一个事件

Linux USB HID设备仅报告第一个事件,linux,usb,hid,Linux,Usb,Hid,我有一个eDIO USB多遥控器(红外接收器),它与华硕PSR 2000网络冲浪遥控器一起提供 我正在尝试将遥控器连接到我的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

我有一个eDIO USB多遥控器(红外接收器),它与华硕PSR 2000网络冲浪遥控器一起提供

我正在尝试将遥控器连接到我的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..........
请告诉我如何才能使设备正常工作。在第一次击键后按任何键都不会返回任何内容,除非设备被重新插入


请建议需要采取哪些措施来解决此问题。

根据您最终想要采取的措施,将HID遥控器的按钮映射到击键可能就足够了,并且可以通过以下工具轻松实现:


看起来,你可能想试试,这在repos中可以找到:
sudo apt get install joy2key

最后,我有时间使用PyUSB库编写自己的实现,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