我正在尝试使用FTDI-based USB设备,并得到一个-32 (EPIPE)错误:
08-06 16:32:16.328: WARN/System.err(15547): ftdi_usb_open_dev()
08-06 16:32:16.328: WARN/System.err(15547): usb_detach_kernel_driver_np()libusb: 0.029116 debug [libusb_detach_kernel_driver] interface 0
08-06 16:32:16.328: WARN/System.err(15547): ftdi claim interface ...
08-06 16:32:16.328: WARN/System.err(15547): libusb-compat debug: usb_claim_interface: interface 0
08-06 16:32:16.328: WARN/System.err(15547): libusb: 0.030246 debug [libusb_claim_interface] interface 0
08-06 16:32:16.328: WARN/System.err(15547): claiming interface using fd = 4
08-06 16:32:16.328: WARN/System.err(15547): ftdi_usb_reset ...
08-06 16:32:16.328: WARN/System.err(15547): libusb-compat debug: usb_control_msg: RQT=40 RQ=0 V=0 I=0 len=0 timeout=300
08-06 16:32:16.328: WARN/System.err(15547): libusb: 0.031222 debug [libusb_get_next_timeout] next timeout in 0.300000s
08-06 16:32:16.328: WARN/System.err(15547): libusb: 0.031527 debug [libusb_handle_events_timeout_completed] doing our own event handling
08-06 16:32:16.328: WARN/System.err(15547): libusb: 0.032046 debug [handle_events] poll() 2 fds with timeout in 300ms
08-06 16:32:16.328: WARN/System.err(15547): libusb: 0.033023 debug [handle_events] poll() returned 1
08-06 16:32:16.338: WARN/System.err(15547): libusb: 0.033389 debug [reap_for_handle] urb type=2 status=-32 transferred=0
08-06 16:32:16.338: WARN/System.err(15547): libusb: 0.033755 debug [handle_control_completion] handling completion status -32
08-06 16:32:16.338: WARN/System.err(15547): libusb: 0.034091 debug [handle_control_completion] unsupported control request
08-06 16:32:16.338: WARN/System.err(15547): libusb: 0.034366 debug [usbi_handle_transfer_completion] transfer 0x2915e0 has callback 0x5ccb4
08-06 16:32:16.338: WARN/System.err(15547): libusb: 0.034732 debug [ctrl_transfer_cb] actual_length=0根据http://yosemitefoothills.com/Electronics/FTDI_Chip_Commands.html的要求,USB请求似乎完全符合它的要求。
FTDI上下文是在没有错误的情况下初始化的,usb_dev不是null,而且似乎没有问题。电缆是可以的,因为我可以用它上传阿杜伊诺草图到杜米拉诺 (FTDI)板。
所以我完全被困住了。我该怎么办?
我的代码
struct ftdi_context *ftdi_ctx;
struct usb_device *dev;
usb_dev_handle *udev;
// ...
ftdi_ctx = ftdi_new();
if (ftdi_ctx == NULL) {
fprintf(stderr, "error init ftdi context\n");
return 1;
}
ftdi_ctx->usb_write_timeout = 0;
ftdi_ctx->usb_read_timeout = 0;
// ...
udev = usb_open(dev);
int ret = ftdi_usb_open_dev(ftdi_ctx, dev, udev);
if (ret < 0) {
fprintf(stderr, "error opening ftdi device\n");
return ret;
}对ftdi_usb_open_dev()做了一些修改,以使usb_device就绪,并且不要在内部执行usb_open:
libftdi-0.1代码(ftdi.c):
int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev, struct usb_dev_handle *usb_dev)
{
int detach_errno = 0;
int config_val = 1;
fprintf(stderr, "ftdi_usb_open_dev()\n");
if (ftdi == NULL) {
fprintf(stderr, "ftdi context invalid\n");
ftdi_error_return(-8, "ftdi context invalid");
}
// 4ntoine (no need to open device if usb_dev is already passed)
if (usb_dev == NULL) {
if (!(ftdi->usb_dev = usb_open(dev)))
ftdi_error_return(-4, "usb_open() failed");
} else {
ftdi->usb_dev = usb_dev;
}
#ifdef LIBUSB_HAS_GET_DRIVER_NP
// Try to detach ftdi_sio kernel module.
// Returns ENODATA if driver is not loaded.
//
// The return code is kept in a separate variable and only parsed
// if usb_set_configuration() or usb_claim_interface() fails as the
// detach operation might be denied and everything still works fine.
// Likely scenario is a static ftdi_sio kernel module.
fprintf(stderr, "detaching kernel driver... \n");
if (ftdi->module_detach_mode == AUTO_DETACH_SIO_MODULE)
{
fprintf(stderr, "usb_detach_kernel_driver_np() ...\n");
if (usb_detach_kernel_driver_np(ftdi->usb_dev, ftdi->interface) != 0 && errno != ENODATA) {
fprintf(stderr, "failed to detach\n");
detach_errno = errno;
}
}
#endif
fprintf(stderr, "ftdi claim interface ...\n");
if (usb_claim_interface(ftdi->usb_dev, ftdi->interface) != 0)
{
fprintf(stderr, "failed to claim interface\n");
ftdi_usb_close_internal (ftdi);
if (detach_errno == EPERM)
{
ftdi_error_return(-8, "inappropriate permissions on device!");
}
else
{
ftdi_error_return(-5, "unable to claim usb device. Make sure the default FTDI driver is not in use");
}
}
fprintf(stderr, "ftdi claimed interface\n");
fprintf(stderr, "ftdi_usb_reset ...\n");
if (ftdi_usb_reset (ftdi) != 0)
{
ftdi_usb_close_internal (ftdi);
ftdi_error_return(-6, "ftdi_usb_reset failed");
}我已经用另一个FTDI板(Arduino Nano v3)测试了它,但是仍然有相同的错误,所以这个问题并不是最有可能的.
我也在另一个支持USB主机的Android设备和另一个Android操作系统版本(4.0.x)上测试过它,但是仍然有相同的错误.
发布于 2013-08-07 08:50:33
您的主机系统是Windows还是Linux?
设备似乎未能响应ftdi_usb_reset()发出的控制消息。ftdi_usb_reset()实际上是由ftdi_usb_open_dev()调用的。
如果检查libftdi源代码:source.html#l00522
我们发现,如果ftdi_usb_reset()失败,它将返回-6。整个错误日志没有在这里发布,所以我想知道这是否是最终真正发生的事情。也许有更多有趣的东西可以去那里看。
也许在这里展示您的代码可以帮助您更好地理解。:)
如果可能的话,在尝试使用D2XX提供的ftdichip.com驱动程序做同样的事情时,结果会是一样的吗?
发布于 2013-08-08 03:44:40
如果我的理解是错误的,请纠正我:您正在开发在Android (底层Linux系统)上工作的本地代码,该代码调用libftdi和libusb,对吗?我认为其目的是通过libusb使用Android设备,而不需要根呢?
Google上的一个小搜索告诉我,libusb没有官方的Android端口。有些平台可以使用libusb,而有些则不能。人们有不同的反馈。
因此,如果回到基础,例如,只使用libusb中的函数,而不使用您修改的libftdi代码,您可以通过基本的libusb函数执行设备打开、关闭和向FTDI设备发送控制消息吗?
或者,如果可能的话,尝试使用未经修改的libftdi。这与它应该做的工作有关吗?
顺便问一下,为什么是libftdi0.1?我知道现在应该是1.0版了。旧版本可能会有问题..。
我只是想提供一些值得一试的东西。这可能是libusb问题,libftdi问题,或者简单地说是你如何操作设备的顺序问题。所以如果不知道哪里出了问题,那就把它们分解成碎片,找出什么是正确的,这就是我要尝试的。
https://stackoverflow.com/questions/18086673
复制相似问题