我似乎在USB堆栈上的不同抽象之间纠结了..针对USB设备触发的IOCTL_USB_RESETUSBDEVFS_RESET之间有什么区别?这两个调用最终会在接口(interface)上触发相同的低级操作,还是有所不同?

我注意到USBDEVFS_RESET有时被描述为“等效于重新插入并重新枚举设备”,而我自己发现触发IOCTL_USB_RESET(由libusb的usb_reset()调用完成)确实触发了dmesg中的重置消息,但没有新的“枚举”,这会导致通常的多行USB检测和识别消息。

由于IOCTL_USB_RESET无法解决我的问题(卡住USB设备),甚至无法触发重新枚举,因此USBDEVFS_RESET是否有可能会做得更好?

最佳答案

我认为您是在谈论IOCTL_USBFS_RESET而不是IOCTL_USB_RESET吗?
IOCTL_USBFS_RESET特定于libusb。实际上,libusb不使用usbdevice_fs.h中定义的结构或ioctl。相反,它重新定义了os/linux_usbfs.h中的所有内容(我认为是出于历史原因)。这两个 header 是二进制兼容的,但是libusb的结构和ioctl名称不相同。对于结构,将前缀usbdevfs_替换为usbfs_(usbfs_ctrltransferusbfs_bulktransfer,...)。对于ioctls,前缀USBDEVFS_替换为IOCTL_USBFS_

因此,确实,IOCTL_USBFS_RESETUSBDEVFS_RESET(= _IO('U', 20))相同。

关于linux - USBDEVFS_RESET和IOCTL_USB_RESET,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30437015/

10-11 23:19