所以我一直在玩PS2游戏的控制器,Buzz。我已成功使用libusb来轮询和阅读按钮,而且一切都很快乐。
麻烦的是,我喜欢使用内置灯来指示正在使用它们的人(特别是向他们展示谁先嗡嗡作响)。我知道有灯,我知道PS2可以随意打开和关闭它,我知道someone has managed it with python。所以我开始在Ruby中用libusb实现他们的代码。
我已经复制了他们正在制作的SET_CONFIGURATION电话,但我一直收到此错误:
/home/ajfaraday/.rvm/gems/ruby-2.2.1/gems/libusb-0.5.0/lib/libusb/dev_handle.rb:539:in `submit_transfer':
error TRANSFER_STALL (LIBUSB::ERROR_PIPE)
我在网上找不到任何关于这个错误的内容,除了它是一个USB管道错误,由libusb转换为TRANSFER_STALL。
我也在python中写了这篇文章,上面的论坛中有特定的行,我得到的内容看起来像是同样的错误:
usb.core.USBError: [Errno 32] Pipe error
所以我不知道自己做错了什么。我已成功进行相反的调用(GET_CONFIGURATION)以成功响应(\x00
)。
这是我的复制脚本(取决于libusb gem):
require 'libusb'
usb_context = LIBUSB::Context.new
device = usb_context.devices(
idVendor: 0x054c, idProduct: 0x0002
).first
handle = device.open
puts 'get configuration:'
x = handle.control_transfer(
:bmRequestType => "10000000".to_i(2),
:bRequest => 8,
:wValue => 0,
:wIndex => 0,
:dataIn => 1
)
puts x.inspect
puts 'set configuration:'
x = handle.control_transfer(
:bmRequestType => "00000000".to_i(2),
:bRequest => 9,
:wValue => 0,
:wIndex => 0,
:dataOut => "\x00\xFF\xFF\xFF\xFF"
)
puts x.inspect
这是它的输出:
get configuration:
"\x00"
set configuration:
/home/ajfaraday/.rvm/gems/ruby-2.2.1/gems/libusb-0.5.0/lib/libusb/dev_handle.rb:539:in `submit_transfer': error TRANSFER_STALL (LIBUSB::ERROR_PIPE)
from /home/ajfaraday/.rvm/gems/ruby-2.2.1/gems/libusb-0.5.0/lib/libusb/dev_handle.rb:515:in `control_transfer'
from sketches/raw_script.rb:22:in `<main>'
看起来管道错误意味着我发送的设置或数据有问题,但我无法找到它的位置。
我试过了:
我非常感谢任何帮助。这真的应该是可能的,我知道它已经完成了。
答案 0 :(得分:0)
Libusb提供了两个名为caloriesLabel
和libusb_set_configuration
的函数。您应该尝试使用这些而不是滚动您自己的控制转移来做同样的事情。它们记录在这里:
http://libusb.sourceforge.net/api-1.0/group__dev.html
您可以查看您正在使用的Ruby libusb绑定的源代码或文档,以了解如何从Ruby调用它们。
此外,设置配置对于USB设备来说是不寻常的事情。您应确保操作系统上的驱动程序尚未将设备置于正确的配置中。也许您不需要设置配置。
此外,如果此控制器是HID,hidapi库可能比libusb更合适。