我在版本0.8.7中使用xboxdrv,在raspberrypi 3上使用XBox 360无线控制器(4.9.13-v7 +)。
它有时会工作一天,有时几分钟。但我总是得到:
[ERROR] USBController :: on_read_data():USB读取失败:32: LIBUSB_TRANSFER_ERROR
论坛中的共同建议对我没有帮助,我认为仍有一些人在努力解决这个问题。
我试图联系作者但到目前为止没有得到答案。 该软件在GPL-3.0下运行,因此我查看了源代码。
GitHub上的项目: https://github.com/xboxdrv/xboxdrv
我确定了崩溃的位置(src / usb_controller.cpp,第277行及以下)。这是下面代码中的最后一个else部分。从 log_error开始(“USB读取失败:
” void
USBController::on_read_data(libusb_transfer* transfer)
{
assert(transfer);
if (transfer->status == LIBUSB_TRANSFER_COMPLETED)
{
// process data
XboxGenericMsg msg;
if (parse(transfer->buffer, transfer->actual_length, &msg))
{
submit_msg(msg);
}
int ret;
ret = libusb_submit_transfer(transfer);
if (ret != LIBUSB_SUCCESS) // could also check for LIBUSB_ERROR_NO_DEVICE
{
log_error("failed to resubmit USB transfer: " << usb_strerror(ret));
m_transfers.erase(transfer);
libusb_free_transfer(transfer);
send_disconnect();
}
}
else if (transfer->status == LIBUSB_TRANSFER_CANCELLED)
{
m_transfers.erase(transfer);
libusb_free_transfer(transfer);
}
else if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE)
{
m_transfers.erase(transfer);
libusb_free_transfer(transfer);
send_disconnect();
}
else
{
log_error("USB read failure: " << transfer->length << ": " << usb_transfer_strerror(transfer->status));
m_transfers.erase(transfer);
libusb_free_transfer(transfer);
}
}
我的C ++知识很糟糕,我还没有使用过libusb。你能否提出一个建议,我可以为我解决这个问题。
问题是,一旦出现上述错误,xboxdrv就会停止,它将不再处理来自XBOX 360无线控制器的输入。
它应该只是忽略那个错误的包并等待一个新包。但只是不要停止工作。
谢谢