2013-02-12 2 views
7

MacOS에서 IOKit을 사용하여 가상 직렬 포트의 BSD 이름을 확인하려고합니다.IOKit을 사용하여 USB 장치의 BSD 이름을 가져와 장치에 쓸 수 있습니까?

필자는 가상 직렬 포트처럼 보이는 USB CDC 장치를 가지고 있으며 fopen ("/ dev/tty.usbmodem123")을 수행 할 수 있도록 BSD 장치 경로를 얻고 싶습니다. 나는 VID와 PID를 취하고 장치가 플러그 인될 때까지 기다린 다음 BSD 이름을 장치에 쓰고 싶습니다. 장치는 모든 시스템에 다르게 탑재되며 이것을 교육용 도구로 사용하려고하므로 장치를 장착 한 위치에 대한 /dev/tty.*를 수동으로 검사하지 않고 장치를 검색해야합니다.

나는 3 개의 질문이 있습니다.

첫째, CFSTR(kIOBSDNameKey)을 사용하여 가상 직렬 포트의 BSD 이름을 얻을 수 있습니까? IORegistryEntrySearchCFProperty()FindProp()은 항상 "null"을 반환합니다. 누구든지 BSD 이름이 비 블록 장치에 의해 반환 될 수 있는지 알고 있습니까? 나는 현재이 일을하고있다 : IOService :

bsdName = IORegistryEntrySearchCFProperty(p_usb_ref, kIOServicePlane, CFSTR(kIOBSDNameKey), kCFAllocatorDefault, kIORegistryIterateRecursively);

이 두 번째로, 내가 서비스면 이름을 얻을 수 있었다/AppleACPIPlatformExpert/pci0으로 @ 0/AppleACPIPCI/OHC1 4/AppleUSBOHCI/소개 @ 전자에를 @ 4100000 이 마운트 지점에 해당합니다 : /dev/tty.usbmodem411 누군가가 dev에 트리 이름으로 서비스 비행기 이름을 번역하는 방법을 알고 있습니까?

셋째, 이것을 너무 복잡하게 만드나요? 디바이스 io 핸들을 이미 알고 있습니다. 디바이스에 데이터를 쓰는 방법이 있습니까? 난 그냥 몇 가지 LED를 플래시 몇 ASCII 바이트를 보내야합니다.

모든 조언을 주시면 감사하겠습니다.

EDIT:

이보고 좀 더 많은 시간을 보내고 난 후에, 나는 나의 문제는 CDC 드라이버가로드되기 전에 나는 BSD 이름에 대한 쿼리 것을 것을 발견했다. 현재 BSD 이름을 얻고 있는데 VID와 PID를 정렬합니다.

위의 내 문제를 해결 코드 :

matchingDictionary = IOServiceMatching(kIOSerialBSDServiceValue); 
CFDictionarySetValue(matchingDictionary, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDModemType)); 
kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &iter); 

그리고 올바른 ID와 장치를 찾을 iter 반복.

답변

1

이것은 USB 직렬 장치를 추가 할 때 IONotification에서 사용하는 것입니다. 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가 누군가를 도움이되기를 바랍니다 많은 것들을 시도 후이 내 솔루션이었다.

0

아마도 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" 

?

관련 문제