내가 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 :
그래서, 내 질문은 내가 첫 번째 코드 블록와 함께 사용하기위한 장치를 정지 해제하는 방법을 입니까?
감사합니다.
해답을 가져 주셔서 감사합니다. 예, 이미 두 번째 코드를 사용하고 있지만 첫 번째 코드를 사용하여 장치를 일시 중단 해제하려면 어떻게해야합니까? 그것은'USBDeviceSuspend (x, ** false **)'로 가능해야하지만 실제로 작동하지 않습니다. –
'USBDeviceSuspend' 호출이 리턴하는 것은 무엇입니까? 또한, 완전히 제쳐두고, EHCI/OCHI/UHCI 등의 자식보다는 IOUSBDevice를 반복 할 수 있습니다. – Hasturkun
'USBDeviceSuspend'는'kIOReturnNotOpen'을 반환하고'USBDeviceOpen'는'kIOReturnExclusiveAccess'를 반환합니다 (이것은 장치가 이미 열려 있니?). 나는 IOKit에서 완전히 새내기 일 뿐이므로 IOUSBDevice와 AppleUSBEHCI를 통한 검색 (usb 장치의 계층 구조 만들기)의 차이점을 말할 수 있습니까? –