IOServiceGetMatchingServices在某些Mac上找不到某些设备

时间:2011-05-27 16:26:01

标签: macos io usb

我的应用程序存在问题,该应用程序监视USB总线的更改。具体来说,如果我想获得附加的USB服务列表,我使用下面的代码。奇怪的是,某些用户(并且通常不是我的机器)看不到一个或两个设备。 这些设备会出现在IORegistryExplorer中,并显示已注册。

不能正常运行的机器也运行10.6,也是MacBook Pro。

  

CFMutableDictionaryRef service_properties = CFDictionaryCreateMutable(NULL,0,NULL,NULL);       CFMutableDictionaryRef child_props = CFDictionaryCreateMutable(NULL,0,NULL,NULL);

kr = IOServiceGetMatchingServices(kIOMasterPortDefault,
                                  IOServiceNameMatching("AppleUSBEHCI"), &io_objects);

if(kr != KERN_SUCCESS)
    exit(1);

while((io_service= IOIteratorNext(io_objects)))
{

    kr = IORegistryEntryCreateCFProperties(io_service, &service_properties, kCFAllocatorDefault, kNilOptions);

    io_iterator_t   iter;
    kr = IORegistryEntryGetChildIterator(io_service, kIOServicePlane, &iter);
    io_registry_entry_t     child;
    while( (child = IOIteratorNext( iter )))
    {
        kr = IORegistryEntryCreateCFProperties(child, &child_props,  kCFAllocatorDefault, kNilOptions );
        NSLog(@"%@",child_props);
    }

    IOObjectRelease(io_service);
}

3 个答案:

答案 0 :(得分:2)

你完全匹配错误的东西。您正在匹配Mac中使用的物理控制器(EHCIUHCIOHCI)。每当他们发明新的控制器标准时都会失败,例如自2012年以来新Mac中的XHCI(兼容USB 3)。

您可能想要做的是匹配IOUSBDevice,即当我想匹配系统中的每个设备时我所做的事情。这也是它在Deva示例代码中的完成方式。

答案 1 :(得分:0)

事实证明,您需要轮询所有总线类型:

for(i=0;i<3;i++){

if(i==0)kr = IOServiceGetMatchingServices(myMasterPort,
                                      IOServiceNameMatching("AppleUSBEHCI"), &io_objects);
if(i==1)kr = IOServiceGetMatchingServices(myMasterPort,
                                      IOServiceNameMatching("AppleUSBOHCI"), &io_objects);
if(i==2)kr = IOServiceGetMatchingServices(myMasterPort,
                                      IOServiceNameMatching("AppleUSBUHCI"), &io_objects);

if(kr != KERN_SUCCESS)
    exit(1);

答案 2 :(得分:0)

我同意杰里米:还有其他可能性,而不是AppleUSBEHCI

也许你可能知道(以防万一):

ioreg -l | grep AppleUSB

应显示计算机上的活动USB状态