使用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"
你怎么会获得挂载点串?