我正在使用带有FTDI芯片(FT4232)的定制电路板在Linux系统上通过USB进行四次串行通信(Fedora 24)。插板时,它工作正常,通信端口出现,我能够进行通信。
但是,我还需要在EEPROM中读取一些数据,并且只要我使用libftdi1进行通信或任何事情,我连接的通信端口就会消失。这是lsusb -t
:
|__ Port 2: Dev 46, If 2, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
|__ Port 2: Dev 46, If 0, Class=Vendor Specific Class, Driver=, 480M
|__ Port 2: Dev 46, If 3, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
|__ Port 2: Dev 46, If 1, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
所以我们看到驱动程序已被分离。我尝试按this question中的建议重新附加内核驱动程序,但没有任何成功。以下是执行以重现行为的代码的最小示例:
#include <stdio.h>
#include <libftdi1/ftdi.h>
#include <libusb-1.0/libusb.h>
int main(int argc, char * argv[])
{
struct ftdi_context ftdic;
libusb_device_handle * dev;
ftdi_init(&ftdic);
ftdi_usb_open(&ftdic, 0x0403, 0x6011);
dev = ftdic.usb_dev;
// Return error -6: LIBUSB_ERROR_BUSY
printf("%d\n", libusb_attach_kernel_driver(dev, 0));
ftdi_usb_close(&ftdic);
// Return error -99: LIBUSB_ERROR_OTHER
printf("%d\n", libusb_attach_kernel_driver(dev, 0));
return 0;
}
简而言之:在使用libftdi1之后,如何重新附加内核驱动程序?我更喜欢c
解决方案,但是bash也不错。
答案 0 :(得分:0)
使用 libftdi 后,可以使用 libusb 和 libusb_attach_kernel_driver 函数重新连接原始驱动程序。
#define DEVICE_VID 0x0403
#define DEVICE_PID 0x6015
int libftdireset() {
libusb_context * context = NULL;
libusb_device_handle * dev_handle = NULL;
int rc = 0;
rc = libusb_init( &context);
dev_handle = libusb_open_device_with_vid_pid(context, DEVICE_VID, DEVICE_PID);
/*Check if kenel driver attached*/
if (libusb_kernel_driver_active(dev_handle, 0)) {
rc = libusb_detach_kernel_driver(dev_handle, 0); // detach driver
}
libusb_reset_device(dev_handle);
libusb_attach_kernel_driver(dev_handle, 0);
libusb_close(dev_handle);
libusb_exit(context);
return 0;
}