libusb:对于 MTP 和 PTP 设备,libusb_kernel_driver_active() 函数总是返回 0?

问题描述

我想使用 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 (将#修改为@)