使用IOKit获取USB设备的BSD名称以写入设备?

问题描述:

我想在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的设备。

这是我使用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
希望它可以帮助别人。

也许事情已经改变了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" 

你怎么会获得挂载点串?