2013-02-12 4 views
7

Ich versuche den BSD-Namen der virtuellen seriellen Schnittstelle mit IOKit unter MacOS zu bestimmen.Ermitteln des BSD-Namens eines USB-Geräts mit IOKit zum Schreiben auf das Gerät?

Ich habe ein USB CDC-Gerät, das wie eine virtuelle serielle Schnittstelle aussieht, und ich mag den BSD-Gerätepfad bekommen, so dass ich nur ein fopen tun kann („/ dev/tty.usbmodem123“). Ich habe ein Programm, das die VID und PID nimmt und darauf wartet, dass das Gerät eingesteckt wird, und dann möchte ich den BSD-Namen verwenden, der auf das Gerät geschrieben wird. Das Gerät wird auf jedem System anders installiert, und ich versuche es als Lehrprogramm zu verwenden. Daher muss ich nach dem Gerät suchen, bevor ich es schreibe, ohne manuell /dev/tty.* nach der Position des Geräts zu suchen.

Ich habe 3 Fragen.

Erstens kann man den BSD-Namen einer virtuellen seriellen Schnittstelle unter Verwendung CFSTR(kIOBSDNameKey) erhalten? IORegistryEntrySearchCFProperty() und FindProp() geben immer "null" zurück. Weiß jemand, ob der BSD-Name von einem Nicht-Block-Gerät zurückgegeben werden kann? ich derzeit tue dies:

bsdName = IORegistryEntrySearchCFProperty(p_usb_ref, kIOServicePlane, CFSTR(kIOBSDNameKey), kCFAllocatorDefault, kIORegistryIterateRecursively);

Zweitens bin ich in der Lage gewesen Service Flugzeug-Namen zu erhalten: IOService:/AppleACPIPlatformExpert/PCI0 @ 0/AppleACPIPCI/OHC1 @ 4/AppleUSBOHCI/Intro zu Elektronik @ 4100000 und dies entspricht einem Einhängepunkt von: /dev/tty.usbmodem411 Kann jemand den Service-Ebene-Namen in den Namen des Dev-Baums übersetzen?

Drittens mache ich das zu kompliziert? Ich kenne das Gerät bereits, kann man das verwenden, um Daten auf das Gerät zu schreiben? Ich muss nur ein paar ASCII-Bytes senden, um einige LEDs zu blinken.

Jeder Rat würde sehr geschätzt werden.

EDIT:

Nach etwas mehr Zeit bei dieser Suche zu verbringen, fand ich, dass mein Problem war, dass ich für den BSD Namen wurde abfragt, bevor der CDC-Treiber geladen wurde. Ich erhalte derzeit den BSD-Namen und sortiere dann für die VID und PID aus.

Der Code, der meine Frage oben gelöst ist:

matchingDictionary = IOServiceMatching(kIOSerialBSDServiceValue); 
CFDictionarySetValue(matchingDictionary, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDModemType)); 
kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &iter); 

Und dann iterieren Sie iter durch das Gerät mit der korrekten ID zu finden.

Antwort

1

Dies ist, was ich mit einer IONotification beim Hinzufügen eines seriellen USB-Gerät verwenden: Unter 10.11 kam es leer. Nachdem eine Menge Dinge zu versuchen, war meine Lösung:

while ((usbDevice = IOIteratorNext(iterator))) 
{ 
    //when hotplugging under OSX 10.11: 
    sleep(1);//otherwise the property will be empty. 

    CFStringRef deviceBSDName_cf = (CFStringRef) IORegistryEntrySearchCFProperty (usbDevice, 
    kIOServicePlane, 
    CFSTR (kIOCalloutDeviceKey), 
    kCFAllocatorDefault, 
    kIORegistryIterateRecursively); 

    NSLog(@"device path: %@", deviceBSDName_cf); 

} 

Es ist etwas finden sollte wie: /dev/cu.xxxxx
Hoffe, dass es jemand hilft.

0

Vielleicht haben sich die Dinge in OS X 10.10 geändert? Ihr letzter Code-Schnipsel scheint nicht das /dev/tty.usbmodem00054741 Gerät auf meinem System zu finden:

io_iterator_t devlisthndl = 0; 
CFMutableDictionaryRef matchingDictionary = IOServiceMatching(kIOSerialBSDServiceValue); 
CFIndex dict_count = CFDictionaryGetCount(matchingDictionary); 
CFDictionarySetValue(matchingDictionary, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDModemType)); 
kern_return_t kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &devlisthndl); 

(lldb) p matchingDictionary 
(CFMutableDictionaryRef) $3 = 0x0000610000267780 @"0 entries" 

Wie haben Sie das Mount-Punkt-String zu erhalten am Ende?

Verwandte Themen