2013-02-12 139 views
7

我想在MacOS下使用IOKit來確定虛擬串行端口的BSD名稱。使用IOKit獲取USB設備的BSD名稱以寫入設備?

我有一個USB CDC設備,看起來像一個虛擬串行端口,我想獲得BSD設備路徑,以便我可以做一個fopen(「/ dev/tty.usbmodem123」)。我有一個程序需要VID和PID,並等待設備插入,然後我想使用BSD名稱寫入設備。該設備在每個系統上的安裝方式不同,我試圖將其用作教學工具,因此,在寫入設備之前,無需手動檢查/dev/tty.*以查找設備安裝位置,然後搜索設備。

我有3個問題。

首先,可以使用CFSTR(kIOBSDNameKey)獲得虛擬串口的BSD名稱嗎? IORegistryEntrySearchCFProperty()FindProp()總是返回「null」。有誰知道BSD名稱是否可以由非阻塞設備返回? 我目前這樣做:

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

其次,我已經能夠得到服務平面名稱: 的IOService:/ AppleACPIPlatformExpert/PCI0 @ 0/AppleACPIPCI/OHC1 @ 4/AppleUSBOHCI /簡介電子@ 4100000 ,這對應於一個掛載點:/dev/tty.usbmodem411 有誰知道如何將服務平面名稱轉換爲開發樹名稱?

第三,我是否讓這個過於複雜?我已經知道該設備處理,有沒有辦法使用它來寫入數據到設備?我只需要發送幾個ASCII字節來閃爍一些LED。

任何意見將不勝感激。

EDIT:

花費更多的時間在看這之後,我發現我的問題是,我查詢了BSD的名字被載入了CDC驅動程序之前。我目前正在獲取BSD名稱,然後對VID和PID進行分類。

上解決了我的問題上面的代碼是:

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

然後你通過iter迭代,以找到正確的ID的設備。

回答

1

這是我使用IONotification時添加一個USB串行設備: 在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

也許事情已經改變了OS X 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" 

你怎麼會獲得掛載點串?