2012-10-08 16 views
9

Bir USB aygıtı için bir IOKit sürücüsü yükleyen OS X'deki bir yükleyici üzerinde çalışıyorum ve sonunda yeniden başlatma gerektirmemesi için çalışıyorum. Yükleyici sürücüyü doğru şekilde yükler ve kext önbelleğini yeniden oluşturur ve sonra da USB aygıtını çıkarır ve yeniden bağlarsam, yeni sürücüyü doğru şekilde yükler ve her şey yolunda çalışır. Ancak, yeni sürücünün yüklenmesi için kullanıcının fiziksel olarak fişini çekmesini istemiyorum. OS X'in yeni sürücüyü programsal olarak yüklemesi için bir yol olmalı - aslında cihazın takılı ve tekrar takılı olduğunu veya benzer bir şeyi taklit etmesini sağlayın. Bunu yapmak için nasıl giderim? Şimdiye kadar, Googling saatlerinin hiçbiri bir şey olmadı, bu yüzden herhangi bir yardım büyük takdir görecek!OS X'de yeni sürücüyü yüklemek için bir USB aygıtı program aracılığıyla "çıkarın ve yeniden takın" mi?

+0

Ben istiyorum koþulur kodu incelemeden bir USB yığın depolama aygıtı çıkarmak zaman denemek - İlgili varsa emin değilim USB trafik veya eğer USB altsistemine sadece fiziksel bir fiş çıkarılıncaya kadar portu yok saymasını söylerse. Eski durumda (bir "USB çıkartma" mesajı), her ikisi de diğer USB cihazları için sorun yaratabilecek güç çevirme veya USB sıfırlama dışında "çıkarma" için kolay bir yol olmayabilir. Ama umarım bu aramaya başlamak için bir yer. –

+0

Daha rasgele USB aygıtlarını ayırabilen "pmount" adlı bir şeyi okudum, ancak aygıtınızı içerip içermediğini bilmiyorum. Tek büyük dezavantajı, varsayılan olarak OS X ile gelmemesidir. – rien333

+0

Ben kesinlikle bu kullanıcı alanı üzerinden yapamazsınız eminim. Ancak, çekirdekte, aygıtı işleyen mevcut istemcideki terminate() yöntemini çağırabilirsiniz. – pmdj

cevap

2

IOUSBDeviceInterface187 :: USBDeviceReEnumerate() istediğiniz şeyi yapacak. Tek aksaklık, ilgili tüm cihazları bulmak ve bunları IOServiceGetMatchingServices() ile manuel olarak çağırmaktır. IOKit/usb içinde

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

Bak/IOUSBLib.h

1

diskutil'a ve özellikle mount ve unmount seçeneklerine göz atın. Bunlar yazılımları yumuşak bir şekilde çıkaracak ve cihazlara bağlanacaktır. Halihazırda monte edilmiş tüm cihazların bir listesini almak için diskutil list'u kullanabilirsiniz. Diskutil hakkında daha fazla bilgiye ihtiyacınız varsa, sadece man sayfasına bakın.

+0

Ne yazık ki bu aygıt disk değil, diskutil'in bilmediği kadarıyla bir insan arabirim aygıtı. – GuyGizmo

+0

Ah, anlıyorum. Benim hatam. – rien333

İlgili konular