2011-05-27 340 views
1

我遇到了監視USB總線更改的應用程序的問題。具體而言,如果我想獲得連接的USB服務列表,我正在使用下面的代碼。奇怪的是,一些用戶(和nautally不是我的機器)沒有看到一個或兩個設備。 這些設備會顯示在IORegistryExplorer中,並顯示已註冊。IOServiceGetMatchingServices在某些Mac上找不到某些設備

這不工作的機器也運行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); 
} 

回答

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); 
0

我同意傑里米:還有其他的可能性比AppleUSBEHCI

也許你可能知道(以防萬一):

ioreg -l | grep AppleUSB 

應顯示機器上的活動USB狀態

2

您完全匹配錯誤的東西。您正在匹配Mac中使用的物理控制器(EHCIUHCIOHCI)。只要他們發明了新的控制器標準,例如2012年以來的新Mac電腦中的XHCI(對於USB3兼容性),這將會失敗。

你可能想要做的是匹配IOUSBDevice,這是我想要匹配系統中的每個設備時所做的。這也是如何在Deva示例代碼中完成的。

相關問題