2012-10-08 72 views
9

我正在使用OS X中的安裝程序,該安裝程序爲USB設備安裝IOKit驅動程序,並且試圖在最終不需要重新啓動它。安裝程序正確安裝驅動程序並重建Kext緩存,運行後,如果我拔下並重新插入USB設備,它會正確加載新驅動程序,並且一切正常。以編程方式「拔下並重新插入」USB設備以在OS X中加載新驅動程序?

但是,我不想要求用戶物理拔掉設備以便加載新驅動程序。必須有一種方法讓OS X以編程方式加載新驅動程序 - 實際上模擬將設備拔出並重新插入,或者類似的東西。我會如何去做這件事?到目前爲止,谷歌搜索幾個小時沒有出現,所以任何幫助將不勝感激!

+0

我想嘗試看着那被運行代碼時,你彈出USB大容量存儲設備 - 我不知道是否有相應的USB通信或如果它只是告訴USB子系統忽略端口,直到物理拔掉。在前一種情況下(「USB彈出」消息),除了斷電或USB重置之外,可能沒有簡單的方法來「解除彈出」,這兩種方式都可能對其他USB設備有問題。但希望這是一個開始尋找的地方。 –

+0

我讀了一些名爲'pmount'的東西,它可以卸載更多的任意USB設備,但我不知道它是否包含您的設備。唯一的缺點是它默認沒有OS X。 – rien333

+0

我相當肯定你不能直接從用戶空間做到這一點。但是,在內核中,您可以嘗試在佔用設備的現有客戶端上調用terminate()。 – pmdj

回答

2

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的更多信息,請查看手冊頁。

+0

不幸的是,這個設備不是一個磁盤,它是一個人機界面設備,所以據我所知diskutil不會幫助。 – GuyGizmo

+0

啊,我明白了。我的錯。 – rien333

相關問題