2013-02-12 12 views
7

Sto provando a determinare il nome BSD della porta seriale virtuale usando IOKit sotto MacOS.Ottenere il nome BSD di un dispositivo USB utilizzando IOKit per scrivere sul dispositivo?

Ho un dispositivo USB CDC che sembra una porta seriale virtuale e voglio ottenere il percorso del dispositivo BSD in modo che possa semplicemente eseguire un fopen ("/ dev/tty.usbmodem123"). Ho un programma che prende il VID e il PID e aspetta che il dispositivo sia collegato, e poi voglio usare il nome BSD per scrivere sul dispositivo. Il dispositivo si monta in modo diverso su ogni sistema e sto cercando di usarlo come strumento didattico, quindi ho bisogno di cercare il dispositivo prima di scrivere su di esso senza ispezionare manualmente /dev/tty.* per dove è stato montato il dispositivo.

Ho 3 domande.

In primo luogo, è possibile ottenere il nome BSD di una porta seriale virtuale utilizzando CFSTR(kIOBSDNameKey)? IORegistryEntrySearchCFProperty() e FindProp() restituiscono sempre "null". Qualcuno sa se il nome BSD può essere restituito da un dispositivo non-block? Attualmente sto facendo questo:

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

In secondo luogo, sono stato in grado di ottenere il nome piano di servizio: IOService:/AppleACPIPlatformExpert/pci0 @ 0/AppleACPIPCI/OHC1 @ 4/AppleUSBOHCI/Introduzione a Elettronica @ 4100000 e questo corrisponde a un punto di montaggio di: /dev/tty.usbmodem411 Qualcuno sa come tradurre il nome del piano di servizio nel nome dell'albero di sviluppo?

In terzo luogo, lo sto rendendo troppo complicato? Conosco già l'handle del dispositivo, c'è un modo per usarlo per scrivere dati sul dispositivo? Ho solo bisogno di inviare alcuni byte ASCII per far lampeggiare alcuni LED.

Qualsiasi consiglio sarebbe molto apprezzato.

EDIT:

Dopo aver trascorso qualche più tempo a guardare questo, ho scoperto che il mio problema era che stavo query per il nome BSD prima che il conducente CDC è stata caricata. Attualmente sto ricevendo il nome BSD e quindi l'ordinamento per VID e PID.

Il codice che ha risolto il mio problema di cui sopra è:

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

E poi si itera attraverso iter per trovare il dispositivo con l'ID corretto.

risposta

1

Questo è quello che uso con una IONotification quando si aggiunge un dispositivo seriale USB: Sotto 10.11 risulta vuoto. Dopo aver provato un sacco di cose, questa è stata la mia soluzione:

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); 

} 

Dovrebbe trovare qualcosa di simile: /dev/cu.xxxxx
Speranza che aiuta qualcuno.

0

Forse le cose sono cambiate in OS X 10.10? Il tuo ultimo codice frammento non sembra trovare il dispositivo /dev/tty.usbmodem00054741 sul mio sistema:

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" 

Come hai fatto a finire ottenere la stringa di punto di montaggio?

Problemi correlati