在OS X中,如何通过编程方式“拔出并重新插入”USB设备以加载新驱动程序?

10
我正在开发一个OS X的安装程序,用于安装一个USB设备的IOKit驱动程序,并且我想让它在安装完成后不需要重新启动。安装程序能够正确地安装驱动程序并重建内核扩展缓存,在运行之后,如果我拔掉并重新插入USB设备,则它可以正确加载新的驱动程序,一切都很正常。
然而,我不想要求用户为了加载新驱动程序而物理上拔下设备。必须有一种方法通过编程方式加载新驱动程序,模拟设备被拔出和重新插入,或者类似的操作。我该如何做到这一点?到目前为止,搜寻了几个小时的谷歌,什么都没有找到,因此任何帮助将不胜感激!

我会尝试查看在弹出USB大容量存储设备时运行的代码——我不确定是否存在相应的USB流量,或者它只是告诉USB子系统忽略该端口,直到物理拔出。如果是前一种情况(“USB弹出”消息),除了电源循环或USB重置(这两种方法都可能对其他USB设备有问题)之外,可能没有简单的方法来“取消弹出”。但希望这是开始寻找的地方。 - tc.
我了解到一种叫做 pmount 的东西,它可以卸载更多任意的 USB 设备,但我不知道是否包括你的设备。唯一的缺点是它不会默认安装在 OS X 上。 - rien333
我相当确定你不能直接从用户空间这样做。然而,在内核中,你可以尝试调用terminate()函数来终止正在占用设备的现有客户端。 - pmdj
2个回答

3

IOUSBDeviceInterface187::USBDeviceReEnumerate()可以实现您想要的功能。唯一的问题是需要使用IOServiceGetMatchingServices()手动查找所有感兴趣的设备并调用此函数。

/*!
@function USBDeviceReEnumerate
@abstract   Tells the IOUSBFamily to reenumerate the device.
@discussion This function will send a terminate message to all clients of the IOUSBDevice (such as 
            IOUSBInterfaces and their drivers, as well as the current User Client), emulating an unplug 
            of the device. The IOUSBFamily will then enumerate the device as if it had just 
            been plugged in. This call should be used by clients wishing to take advantage 
            of the Device Firmware Update Class specification.  The device must be open to use this function. 
@availability This function is only available with IOUSBDeviceInterface187 and above.
@param      self Pointer to the IOUSBDeviceInterface.
@param      options A UInt32 reserved for future use. Ignored in current implementation. Set to zero.
@result     Returns kIOReturnSuccess if successful, kIOReturnNoDevice if there is no connection to an IOService,
            or kIOReturnNotOpen if the device is not open for exclusive access.
*/

IOReturn (*USBDeviceReEnumerate)(void *self, UInt32 options);

请查看IOKit/usb/IOUSBLib.h文件


-1

看一下 diskutil,特别是 mountunmount 选项。这些选项可以软件自动弹出和挂载设备。您可以使用 diskutil list 获取当前所有已挂载设备的列表。如果您需要更多关于 diskutil 的信息,请查看手册页。


很不幸,该设备不是磁盘,而是一个人机接口设备,因此据我所知,diskutil 无法帮助。 - Bri Bri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接