2011-09-11 4 views
0

내가 IOUSBDeviceInterface245를 통해 몇 가지 정보 (예 : 제품 이름)을 얻으려고 통해 일시 중단 된 USB 장치에 대한 정보를 수집
코드 # 1(IOKit에서 맥 OS X에) IOUSBDeviceInterface245

io_iterator_t iterator; 
io_object_t usb_device 
SInt32 score = 0; 
kern_return_t kr = IOServiceGetMatchingServices(kIOMasterPortDefault,  
              IOServiceNameMatching("AppleUSBOHCI"),  
              &iterator); 
IOCFPlugInInterface  **plugin_interface = NULL; 
IOUSBDeviceInterface245 **usb_interface = NULL; 
// ... 
// enumerate devices (usb_device = IOIteratorNext(iterator)) 
// ... 
IOReturn return_code = IOCreatePlugInInterfaceForService(usb_device, 
                kIOUSBDeviceUserClientTypeID, 
                kIOCFPlugInInterfaceID, 
                &plugin_interface, 
                &score); 
HRESULT h_result = (*pluginInterface)->QueryInterface(pluginInterface, 
            CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID245), 
            (LPVOID)&usb_interface); 
IODestroyPlugInInterface(pluginInterface); 

UInt8 product_string_index; 
return_code = (*usb_interface)->USBGetProductStringIndex(usb_interface, 
                 &product_string_index); 
// Next, getting a product string by string's index. To do so, we need to send 
// IOUSBDevRequest (with type "kUSBRqGetDescriptor") to the current USB-device. 
// Code bellow - is a pseudocode: 
char *product_name = malloc(128); 
get_string_by_index(usb_interface, product_string_index, product_string, 128); 

이 코드는 모든 working-now 기기에서 잘 작동하지만 일시 중지 ('잠자기')에는 작동하지 않습니다.
기기 (product_name은 빈 문자열입니다.)

하지만,이 코드를 사용하는 경우 : 모든 모든 장치 (이유를 모르겠어요)을 위해 일하고
코드 # 2

CFMutableDictionaryRef child_properties = CFDictionaryCreateMutable(NULL, 0, 
                   NULL,NULL); 
kern_return_t kr; 
io_service_t io_service; 
// iterator = iterator for "AppleUSBOHCI" or "AppleUSBEHCI" services 
while((io_service = IOIteratorNext(iterator))) {  
    io_iterator_t children_iterator; 
    kernel_return = IORegistryEntryGetChildIterator(io_service, kIOServicePlane, 
                &children_iterator); 
    io_registry_entry_t child; 
    while((child = IOIteratorNext(children_iterator))) { 
     // Create a CFDictionary with usb-device's properties 
     IORegistryEntryCreateCFProperties(child, &child_properties, 
             kCFAllocatorDefault, 
             kNilOptions); 
     NSLog(@"%@",[(NSDictionary*)child_properties valueForKey:@"USB Product Name"]); 
    } 
    } 

합니다.

나는 (코드 1 번 사용)이 코드에 의해 일시 중단 된 장치를 웨이크 업을 시도 :

(*usb_interface)->USBDeviceSuspend(usb_interface, false); 

하지만 아무것도 변경되지입니다. 내가 눈치

한 가지 - 코드 # 1은 완전히 (이 문자열의 인덱스로 점점) 문자열 값을 제외한 모든 속성 수면 장치의 을 위해 노력하고 있습니다.

UPDATE :
그래서, 내 질문은 내가 첫 번째 코드 블록와 함께 사용하기위한 장치를 정지 해제하는 방법을 입니까?
감사합니다.

답변

1

정지 된 장치에서 문자열을 읽을 수 없습니다 (코드 # 1과 같이). 장치에서 직접 읽으므로 (일시 중단되었으므로 응답 할 수 없음). 이를 직접 읽으려면 먼저 장치를 일시 중단 해제해야합니다 (드라이버에 의해 일시 중지 된 경우 나쁜 아이디어 일 수도 있습니다).

표준 문자열을 읽으려면 다음을 사용하십시오. 두 번째 코드 블록 (장치에서 이미 가져온 속성을 읽음)

+0

해답을 가져 주셔서 감사합니다. 예, 이미 두 번째 코드를 사용하고 있지만 첫 번째 코드를 사용하여 장치를 일시 중단 해제하려면 어떻게해야합니까? 그것은'USBDeviceSuspend (x, ** false **)'로 가능해야하지만 실제로 작동하지 않습니다. –

+0

'USBDeviceSuspend' 호출이 리턴하는 것은 무엇입니까? 또한, 완전히 제쳐두고, EHCI/OCHI/UHCI 등의 자식보다는 IOUSBDevice를 반복 할 수 있습니다. – Hasturkun

+0

'USBDeviceSuspend'는'kIOReturnNotOpen'을 반환하고'USBDeviceOpen'는'kIOReturnExclusiveAccess'를 반환합니다 (이것은 장치가 이미 열려 있니?). 나는 IOKit에서 완전히 새내기 일 뿐이므로 IOUSBDevice와 AppleUSBEHCI를 통한 검색 (usb 장치의 계층 구조 만들기)의 차이점을 말할 수 있습니까? –

관련 문제