【发布时间】:2015-09-14 20:52:50
【问题描述】:
所以我一直在玩 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
所以我不知道自己做错了什么。我已经成功地对成功响应 (\x00) 进行了相反的调用 (GET_CONFIGURATION)。
这是我的复制脚本(取决于 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>'
看起来管道错误意味着我发送的设置或数据有问题,但我无法在任何地方找到它。
我试过了:
- 也将不同数量的数据放入 dataOut 属性中。
- 先分离内核驱动,同时重新打开句柄
- 将 dataOut 属性表示为数组
- 在另一台 (linux) 机器上运行它
- 检查 libusb 源代码(它正在转换 USB 消息,仅此而已)
- 使用http://www.usbmadesimple.co.uk/ums_4.htm 中定义的不同类型的消息
我将非常感谢任何帮助。这真的应该是可能的,我知道它已经完成了。
【问题讨论】:
-
我现在没有时间去调试这个,但你的错误似乎来自这里:github.com/larskanis/libusb/blob/master/lib/libusb/…
-
我已将其追溯到图书馆。不幸的是,它实际上只是告诉我它正在翻译 USB 错误。我可能会更新问题以反映这一点。
-
我很好奇发送字符串而不是原始字节是否会造成麻烦。如果 dataOut 发送原始字节会发生什么:
:dataOut => [0x00, 0xFF, 0xFF, 0xFF, 0xFF] -
API 调用 :dataOut: rubydoc.info/gems/libusb/LIBUSB%2FDevHandle%3Acontrol_transfer 中的字符串,它不能很好地处理数组...
'control_transfer': undefined method 'bytesize' for [0, 255, 255, 255, 255]:Array (NoMethodError) -
这种东西非常依赖于你使用的操作系统,你忽略了。