2013-02-12 41 views
7

मै मैकोज़ के तहत IOKit का उपयोग कर वर्चुअल सीरियल पोर्ट के बीएसडी नाम को निर्धारित करने का प्रयास कर रहा हूं।डिवाइस पर लिखने के लिए IOKit का उपयोग कर किसी यूएसबी डिवाइस का बीएसडी नाम प्राप्त करना?

मेरे पास एक यूएसबी सीडीसी डिवाइस है जो वर्चुअल सीरियल पोर्ट की तरह दिखता है, और मैं बीएसडी डिवाइस पथ प्राप्त करना चाहता हूं ताकि मैं सिर्फ एक फॉपेन ("/ dev/tty.usbmodem123") कर सकूं। मेरे पास एक प्रोग्राम है जो वीआईडी ​​और पीआईडी ​​लेता है और डिवाइस को प्लग करने के लिए इंतजार कर रहा है, और फिर मैं डिवाइस पर बीएसडी नाम लिखना चाहता हूं। डिवाइस प्रत्येक सिस्टम पर अलग-अलग माउंट करता है और मैं इसे एक शिक्षण उपकरण के रूप में उपयोग करने की कोशिश कर रहा हूं, इसलिए डिवाइस को घुमाने के लिए /dev/tty.* मैन्युअल रूप से निरीक्षण किए बिना मुझे इसे लिखने से पहले डिवाइस को खोजने की आवश्यकता है।

मेरे पास 3 प्रश्न हैं।

सबसे पहले, क्या कोई CFSTR(kIOBSDNameKey) का उपयोग कर वर्चुअल सीरियल पोर्ट का बीएसडी नाम प्राप्त कर सकता है? IORegistryEntrySearchCFProperty() और FindProp() हमेशा "शून्य" वापस लौटें। क्या किसी को पता है कि बीएसडी नाम गैर-ब्लॉक डिवाइस द्वारा वापस किया जा सकता है? मैं वर्तमान में यह कर रहा हूं: IOService:

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

दूसरे, मैं सेवा विमान नाम पाने के लिए सक्षम किया गया है/AppleACPIPlatformExpert/PCI0 @ 0/AppleACPIPCI/OHC1 @ 4/AppleUSBOHCI/परिचय इलेक्ट्रॉनिक्स के लिए @ 4100000 और यह एक माउंट पॉइंट से मेल खाता है: /dev/tty.usbmodem411 क्या कोई जानता है कि सेवा विमान नाम को देव वृक्ष नाम में कैसे अनुवादित किया जाए?

तीसरा, क्या मैं इसे बहुत जटिल बना रहा हूं? मुझे पहले से ही डिवाइस आईओ हैंडल पता है, क्या डिवाइस पर डेटा लिखने के लिए इसका उपयोग करने का कोई तरीका है? मुझे कुछ एल ई डी फ्लैश करने के लिए बस कुछ एएससीआईआई बाइट्स भेजने की जरूरत है।

किसी भी सलाह की सराहना की जाएगी।

EDIT:

कुछ और समय के लिए इस पर देख खर्च करने के बाद, मैंने पाया कि मेरी समस्या यह है कि मैं बीएसडी नाम के लिए क्वेरी से पहले सीडीसी ड्राइवर लोड किया जा रहा था था। मुझे वर्तमान में बीएसडी नाम मिल रहा है, और फिर वीआईडी ​​और पीआईडी ​​के लिए छंटनी कर रही है।

कोड है कि ऊपर मेरी समस्या हल हो जाती है:

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

और फिर आप iter के माध्यम से पुनरावृति सही आईडी के साथ डिवाइस को खोजने के लिए।

उत्तर

1

यूएसबी सीरियल डिवाइस जोड़ने पर मैं आईओओटीफिकेशन के साथ उपयोग करता हूं: 10.11 के तहत यह खाली हो गया।

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

} 

यह कुछ खोजना चाहिए की तरह: /dev/cu.xxxxx
आशा है कि यह किसी को मदद करता है बहुत कुछ की कोशिश के बाद, यह मेरा समाधान था।

0

शायद ओएस एक्स 10.10 में चीजें बदल गई हैं? आपकी पिछली कोड स्निपेट अपने सिस्टम पर /dev/tty.usbmodem00054741 डिवाइस को खोजने के लिए प्रतीत नहीं होता:

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" 

कैसे आप माउंट बिंदु स्ट्रिंग प्राप्त करने के अंत में किया था?