2012-10-08 14 views
9

Sto lavorando su un programma di installazione in OS X che installa un driver IOKit per un dispositivo USB e sto cercando di farlo non richiedere un riavvio alla fine. Il programma di installazione installa correttamente il driver e ricostruisce la cache di kext e, una volta eseguito, se scollego e ricollego il dispositivo USB, carica correttamente il nuovo driver e tutto funziona correttamente.Programmare "scollegare e ricollegare" un dispositivo USB per caricare il nuovo driver in OS X?

Tuttavia, non desidero richiedere all'utente di scollegare fisicamente il dispositivo per consentire il caricamento del nuovo driver. Ci deve essere un modo per ottenere OS X per caricare il nuovo driver a livello di codice - in effetti simulare il dispositivo che viene scollegato e ricollegato di nuovo, o qualcosa di simile. Come potrei fare questo? Finora, le ore di Google non hanno trovato nulla, quindi qualsiasi aiuto sarà molto apprezzato!

+0

mi piacerebbe provare a guardare il codice che viene eseguito quando si espelle un dispositivo di archiviazione di massa USB - non sono sicuro se c'è traffico corrispondente USB o se dice semplicemente al sottosistema USB di ignorare la porta fino a quando un fisico non si disconnette. Nel primo caso (un messaggio "espulsione USB"), potrebbe non esserci un modo semplice per "estrarre" a parte il ciclo di alimentazione o un reset USB, entrambi potrebbero essere problematici per altri dispositivi USB. Ma spero che da qualche parte inizi a guardare. –

+0

Ho letto qualcosa chiamato pmount che può smontare altri dispositivi USB arbitrari, ma non so se questo include il tuo dispositivo. L'unico grande svantaggio è che non viene fornito con OS X per impostazione predefinita. – rien333

+0

Sono abbastanza sicuro che non puoi farlo direttamente dallo spazio utente. Tuttavia, nel kernel, è possibile provare a chiamare terminate() sul client esistente che esegue il hogging del dispositivo. – pmdj

risposta

2

IOUSBDeviceInterface187 :: USBDeviceReEnumerate() farà ciò che desideri. L'unico problema è quello di trovare tutti i dispositivi di interesse e chiamarli manualmente su 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); 

Cerca in IOKit/usb/IOUSBLib.h

1

Dai uno sguardo allo diskutil e in particolare le opzioni mount e unmount. Quelli software espelleranno e monteranno automaticamente i dispositivi. È possibile utilizzare diskutil list per ottenere un elenco di tutti i dispositivi attualmente montati. Se hai bisogno di maggiori informazioni su diskutil, guarda la pagina man.

+0

Purtroppo questo dispositivo non è un disco, è un dispositivo di interfaccia umano, quindi per quanto ne so diskutil non sarà di aiuto. – GuyGizmo

+0

Ah, capisco. Colpa mia. – rien333

Problemi correlati