我似乎在USB堆栈上的不同抽象之间纠结了..针对USB设备触发的IOCTL_USB_RESET
和USBDEVFS_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_ctrltransfer
,usbfs_bulktransfer
,...)。对于ioctls,前缀USBDEVFS_
替换为IOCTL_USBFS_
。
因此,确实,IOCTL_USBFS_RESET
与USBDEVFS_RESET
(= _IO('U', 20)
)相同。
关于linux - USBDEVFS_RESET和IOCTL_USB_RESET,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30437015/