2012-10-08 26 views
9

Pracuję nad instalatorem w systemie OS X, który instaluje sterownik IOKit dla urządzenia USB i staram się go nie wymagać ponownego uruchomienia na końcu. Instalator prawidłowo instaluje sterownik i odbudowuje pamięć podręczną kext, a po jej uruchomieniu, po odłączeniu i ponownym podłączeniu urządzenia USB, poprawnie ładuje nowy sterownik i wszystko działa poprawnie.Programowo "odłączyć i ponownie podłączyć" urządzenie USB, aby załadować nowy sterownik w systemie OS X?

Nie chcę jednak, aby użytkownik zmuszony był do fizycznego odłączenia urządzenia w celu załadowania nowego sterownika. Musi być sposób, aby system OS X załadował nowy sterownik programowo - w efekcie symulując odłączenie urządzenia i ponowne podłączenie go lub coś podobnego. Jak miałbym to zrobić? Do tej pory godziny Googlinga nie dały żadnych rezultatów, więc wszelka pomoc zostanie doceniona!

+0

Chciałbym spróbować patrząc na kod, który pobiera uruchamiane podczas wysuwania urządzenia pamięci masowej USB - Nie jestem pewien, czy istnieje odpowiadający ruch USB lub jeśli po prostu mówi podsystemowi USB, aby ignorował port do fizycznego odłączenia. W pierwszym przypadku (komunikat "USB eject") może nie być łatwego sposobu na "un-eject" z wyjątkiem power-cycling lub USB reset, które mogą być problematyczne dla innych urządzeń USB. Ale mam nadzieję, że to gdzieś zacząć szukać. –

+0

Przeczytałem o czymś o nazwie 'pmount', które może odmontować więcej dowolnych urządzeń USB, ale nie wiem, czy to obejmuje twoje urządzenie. Jedynym poważnym minusem jest to, że domyślnie nie pochodzi z OS X. – rien333

+0

Jestem prawie pewien, że nie można tego zrobić bezpośrednio z przestrzeni użytkownika. Jednak w jądrze można spróbować wywołać metodę terminate() na istniejącym kliencie, który przerywa działanie urządzenia. – pmdj

Odpowiedz

2

IOUSBDeviceInterface187 :: USBDeviceReEnumerate() zrobi, co chcesz. Jedynym problemem jest znalezienie wszystkich interesujących urządzeń i wywołanie ich ręcznie za pomocą 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); 

Look w IOKit/USB/IOUSBLib.h

1

Spójrz na diskutil, a zwłaszcza opcje mount i unmount. Będą one programowo wysuwać i montować urządzenia. Możesz użyć diskutil list, aby uzyskać listę wszystkich aktualnie podłączonych urządzeń. Jeśli potrzebujesz więcej informacji na temat diskutil, po prostu spójrz na stronę man.

+0

Niestety, to urządzenie nie jest dyskiem, to ludzkie urządzenie interfejsu, więc o ile wiem, diskutil nie pomoże. – GuyGizmo

+0

Ach, rozumiem. Mój błąd. – rien333