问题描述
我想使用 libusb 断开 USB 设备?我可以断开笔式驱动器,但对于 MTP 和 PTP 设备,该解决方案不起作用。
libusb_kernel_driver_active() 函数对于 MTP 和 PTP 设备总是返回 0。对于其他 USB 设备,我获得了一个活动的内核驱动程序。
printf_devices 是用于迭代和打印设备信息的函数。
void printf_devices(libusb_device *dev) //function for printing device info
{
// libusb structs declarations
struct libusb_device_descriptor desc;
struct libusb_config_descriptor *config;
const struct libusb_interface *inter;
const struct libusb_interface_descriptor *interdesc;
const struct libusb_endpoint_descriptor *endpointdesc;
struct libusb_device_handle *pDeviceHandle;
int ret;
ret = libusb_get_device_descriptor(dev,&desc);
if(ret < 0)
{
fprintf(stderr,"Error in libusb_get_device_descriptor()");
return;
}
ret = libusb_get_config_descriptor(dev,&config);
if(ret < 0)
{
fprintf(stderr,"Error in libusb_get_config_descriptor()\n");
return;
}
for(int i = 0; i < config->bNumInterfaces; i++)
{
inter = &config->interface[i];
for(int j = 0; j < inter->num_altsetting; j++)
{
interdesc = &inter->altsetting[j];
if(LIBUSB_CLASS_vendOR_SPEC == interdesc->bInterfaceClass || LIBUSB_CLASS_PTP == interdesc->bInterfaceClass)
{
printf("Interface number: %d,",interdesc->bInterfaceNumber);
printf("No of Endpoints: %d\n",interdesc->bNumEndpoints);
printf("Interface Class: %d\n",interdesc->bInterfaceClass);
ret = libusb_open(dev,&pDeviceHandle);
if(ret < 0)
{
fprintf(stderr,"Error in libusb_open(): %s\n",strerror(errno));
return;
}
ret = libusb_kernel_driver_active(pDeviceHandle,interdesc->bInterfaceNumber);
printf("Active kernel Driver: %d\n",ret);
if(ret != 0)
{
printf("Detaching\n");
ret = libusb_detach_kernel_driver(pDeviceHandle,interdesc->bInterfaceNumber);
if(ret != 0)
{
fprintf(stderr,"Error in libusb_detach_kernel_driver(): %d\n",ret);
return;
}
}
else{
ret = libusb_claim_interface(pDeviceHandle,1);
if(ret != 0)
{
fprintf(stderr,ret);
return;
}
else
{
printf("Interface claimed successfully.!!!!!!!\n");
}
}
for(int k = 0; k < interdesc->bNumEndpoints; k++)
{
endpointdesc = &interdesc->endpoint[k];
printf(" Desc type: %d,endpointdesc->bDescriptorType);
printf(" Endpoint Addr: %d\n",endpointdesc->bEndpointAddress);
}
libusb_close(pDeviceHandle);
}
}
}
libusb_free_config_descriptor(config);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)