Linux USB HID设备仅报告第一个事件
我有一个eDIO USB多遥控器(红外接收器),它与华硕PSR 2000网络冲浪遥控器一起提供 我正在尝试将遥控器连接到我的pi,以便它接收遥控器发送的按键 控制器被检测为HID设备。下面是lsusb-v命令的详细信息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
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