4

情况是这样的:我有一个带有两个端点的 USB 设备(我正在尝试与之通信的自定义设备),一个写入设备,一个从设备读取。两者都是批量转移。每个通信事务都采用以下形式:(1)向设备写入命令(2)读取响应。我正在使用 libusb(版本 0.1 而不是 1.0 beta)来实际执行通信。

在 Windows 上,一切都很好。我可以连接设备,声明接口并愉快地通信。但是,在 Ubuntu(标准 Hardy 桌面安装)中,虽然我可以连接到设备并对其进行写入,但所有读取操作都会失败,并从 libusb 报告错误“提交 URB:无效参数”(错误代码 -22)。

如果我检查 /var/log/messages 我看到在尝试读取的同时记录了一条警告消息:“sysfs: duplicate filename 'usbdev4.3_ep81' can not be created” - 这与设备相符(确实是在那辆公共汽车上,它是我试图读取的端点 81)。

所以...有人在使用 libusb 时看到过类似的问题,或者知道如何解决它?

4

4 回答 4

2

原来这是设备本身描述符中的错误配置。lsusb -v 显示了一个从未使用过的额外接口,它有一个同步端点 0x81。由于这从未使用过(据我所知,从未经过测试,因此很可能甚至没有正确定义)我将它从设备描述符中完全删除(在固件中)。

现在我有了一个可以正常工作的设备。为什么 linux 拒绝从设备读取但 Windows 运行良好我不知道,但它肯定让我大吃一惊。

于 2008-10-13T17:42:47.307 回答
1

我不得不对 udev 规则进行一些修改,以使创建的设备具有正确的权限,以便 libusb 工作。像这样:

SUBSYSTEM=="usb" ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", \
                MODE="0666" SYMLINK+="missile_launcher"

(这是我正在为其编写驱动程序的 USB 导弹发射器。

此外,此代码段还需要不与内核冲突。

if(LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP)
{
    // Detach kernel driver (usbhid) from device interface. (Linux hack)
    usb_detach_kernel_driver_np(launcher, 0);
    usb_detach_kernel_driver_np(launcher, 1);
}

我不确定这与您的问题有何关系,但至少可能涉及两个可能的故障点。

于 2008-10-09T16:47:41.160 回答
1

我已经有一段时间没有使用 libusb 了——但是 sysfs 错误表明这很可能是内核问题,而不是 libusb 问题,所以我会首先尝试追踪该问题。(在您确定内核与设备正确通信之前,尝试使用 libusb 并没有多大意义)。

补丁是否在http://kerneltrap.org/mailarchive/linux-usb-devel/2007/10/17/345922适用于您的内核?(如果是这样,它可以解决问题吗?)

于 2008-10-09T00:57:37.460 回答
0

你可以试试WinDriver,它是一个商业工具,但有免费的全功能评估(不知何故有时间限制)。您可以使用 WinDriver 检查,如果问题可重现,则可能是设备或您的协议故障。您没有提供足够的信息来确定或分析。

于 2008-10-09T16:29:14.053 回答