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:
위의 내 문제를 해결 코드 :
matchingDictionary = IOServiceMatching(kIOSerialBSDServiceValue);
CFDictionarySetValue(matchingDictionary, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDModemType));
kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDictionary, &iter);
그리고 올바른 ID와 장치를 찾을 iter
반복.