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.