我有一台配备华硕PSR 2000网上冲浪遥控器的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..........
请建议我如何才能使设备正常工作。除非设备被重新插入,否则在第一次击键后按任意键不会返回任何键。
请建议您需要采取哪些措施来解决问题。
答案 0 :(得分:2)
根据您最终想要做的事情,将HID遥控器的按钮映射到击键可能就足够了,使用QJoyPad等工具可以轻松实现。
似乎是hard to build on a Raspberry Pi,因此您可能需要尝试使用joy2key,这可以在回购邮件中找到:sudo apt-get install joy2key
。
答案 1 :(得分:1)
最后,我有时间使用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