2012-10-08 9 views
9

मैं ओएस एक्स में एक इंस्टॉलर पर काम कर रहा हूं जो एक यूएसबी डिवाइस के लिए आईओकिट ड्राइवर स्थापित करता है, और मैं इसे अंत में पुनरारंभ करने की आवश्यकता नहीं होने की कोशिश कर रहा हूं। इंस्टॉलर ड्राइवर को सही तरीके से स्थापित करता है और केक्स्ट कैश का पुनर्निर्माण करता है, और उसके बाद चलता है, अगर मैं यूएसबी डिवाइस को अनप्लग और दोबारा जोड़ता हूं, तो यह सही ढंग से नया ड्राइवर लोड करता है और सब कुछ ठीक काम करता है।ओएस एक्स में नए ड्राइवर को लोड करने के लिए प्रोग्रामेटिक रूप से "यूएसबी डिवाइस को अनप्लग और दोबारा" करें?

हालांकि, मैं उपयोगकर्ता को नए ड्राइवर को लोड करने के लिए डिवाइस को भौतिक रूप से अनप्लग करने की आवश्यकता नहीं चाहता हूं। नए ड्राइवर को प्रोग्रामेटिक रूप से लोड करने के लिए ओएस एक्स प्राप्त करने का एक तरीका होना चाहिए - असल में डिवाइस को अनप्लग किया गया है और दोबारा प्लग किया गया है, या कुछ ऐसा ही है। मैं ऐसा कैसे कर पाऊंगा? अब तक, गुगलिंग के घंटों में कुछ भी नहीं आया है, इसलिए किसी भी मदद की सराहना की जाएगी!

+0

मैं था कोड है कि चलाने हो जाता है पर देख रहे हैं जब आप एक USB विपुल भंडारण उपकरण को निकाल लें कोशिश - हो, तो इसी मुझे यकीन है कि नहीं कर रहा हूँ यूएसबी यातायात या अगर यह यूएसबी उपप्रणाली को भौतिक अनप्लग तक बंदरगाह को अनदेखा करने के लिए कहता है। पूर्व मामले में (एक "यूएसबी निकास" संदेश), पावर-साइकलिंग या यूएसबी रीसेट के अलावा "अनजान" करने का एक आसान तरीका नहीं हो सकता है, जो दोनों अन्य यूएसबी उपकरणों के लिए समस्याग्रस्त हो सकते हैं। लेकिन उम्मीद है कि यह कहीं दिखने के लिए कहीं है। –

+0

मैंने 'pmount' नामक किसी चीज़ के बारे में पढ़ा है जो अधिक मनमानी यूएसबी डिवाइस को अनमाउंट कर सकता है, लेकिन मुझे नहीं पता कि इसमें आपका डिवाइस शामिल है या नहीं। एकमात्र बड़ा नकारात्मक यह है कि यह डिफ़ॉल्ट रूप से ओएस एक्स के साथ नहीं आता है। – rien333

+0

मुझे काफी यकीन है कि आप इसे सीधे उपयोगकर्ता स्थान से नहीं कर सकते हैं। हालांकि, कर्नेल में, आप मौजूदा क्लाइंट पर टर्मिनेट() को कॉल करने का प्रयास कर सकते हैं जो डिवाइस को हॉगिंग कर रहा है। – pmdj

उत्तर

2

IOUSBDeviceInterface187 :: USBDeviceReEnumerate() जो आप चाहते हैं वह करेगा। एकमात्र हिचकिचाहट यह है कि ब्याज के सभी उपकरणों को ढूंढने के लिए और इसे IOServiceGetMatchingServices() के साथ मैन्युअल रूप से कॉल करें। IOKit/usb में

/*! 
@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); 

देखो/IOUSBLib.h

1

diskutil पर विशेष रूप से mount और unmount विकल्प देखें। वे सॉफ़्टवेयरेटिक रूप से निकालेंगे और डिवाइस को माउंट करेंगे। वर्तमान में आरोहित उपकरणों की सूची प्राप्त करने के लिए आप diskutil list का उपयोग कर सकते हैं। अगर आपको डिस्कुटिल पर अधिक जानकारी चाहिए, तो बस मैन पेज देखें।

+0

दुर्भाग्यवश यह डिवाइस डिस्क नहीं है, यह एक मानव इंटरफ़ेस डिवाइस है, इसलिए जहां तक ​​मुझे पता है कि Diskutil मदद नहीं करेगा। – GuyGizmo

+0

आह, मैं देखता हूं। मेरी गलती। – rien333

संबंधित मुद्दे