2010-11-24 1 views
2

J'essaie d'extraire une liste de tous les périphériques IOClass AppleUSBCDCACMData dans mon mac en utilisant l'extrait de code suivant (juste quelques petites modifications dans le code d'exemple Apple). Le périphérique est un modem USB qui crée des nœuds périphériques 7 /dev/cu.usbmodemx.IOServiceMatching sur AppleUSBCDCACMData IOClass: Anomalie?

error = IOMasterPort(MACH_PORT_NULL, &masterPort); 

if(error){ 
    return ; 
} 
else{ 
    matchingDict = IOServiceMatching("AppleUSBCDCACMData"); 
    IOServiceGetMatchingServices(masterPort,matchingDict,&modem_iterator); 
    while(usbDevice = IOIteratorNext(modem_iterator)) 
    { 

      } 

Mon observation est l'itérateur retourné par IOServiceGetMatchingServices est vide (ie rien à itérer sur). Mais si je passe "AppleUSBCDCACMControl" comme paramètre à IOServiceMatching, j'obtiens un itérateur d'une liste de 7 éléments - ce qui est en conformité avec la vue IORegistryExplorer. Voir une capture d'écran de IORegistryExplorer ici, http://tumblr.deepak.dk/post/1666218968/ioregistryexplorer Il semble qu'il ne soit pas possible d'interroger IORegistry avec des chaînes de noms IOClass arbitraires? Depuis que j'ai fait face aux mêmes problèmes avec certains IOClasses propriétaires non standard. Ceci peut être reproduit en utilisant n'importe quel modem USB (3g/HSDPA) qui charge le pilote AppleUSBCDC.

Qu'est-ce que je fais de mal?

Répondre

2

IOService Les objets ne peuvent être appariés qu'une fois que registerService() leur a été appelée. AppleUSBCDCACMControl fait cela, mais pas AppleUSBCDCACMData.

+0

Merci pour la réponse. Y a-t-il une raison spécifique pour que registerService() soit omis dans le pilote AppleUSBCDCACMData? Ce que j'essayais de faire, c'est d'obtenir le chemin/dev de tous les périphériques associés à un modem via IOKit lib. Cette information n'est pas là dans les entrées AppleUSBCDCACMControl de l'IORegistry. Quoi qu'il en soit, il existe plusieurs façons d'obtenir ces données. Je pourrais résoudre ceci en faisant correspondre pour IOSerialBSDClient et filtrant dehors les entrées appropriées. –

+1

@Deepak: Si vous cherchez des modems, vous feriez probablement mieux de faire correspondre 'IOSerialStreamSync' et/ou ses sous-classes (' IORS232SerialStreamSync' et 'IOModemSerialStreamSync') – Hasturkun

+0

btw, IOSerialStreamSync est quasiment garanti pour être matchable, sinon IOSerialBSDClient ne travaille jamais – Hasturkun

Questions connexes