我想在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的設備。