2013-01-22 6 views
2

내 Mac에 몇 대의 FTDI 장치가 연결되어 있습니다. 그들은 모두 동일한 설명, PID 및 VID를가집니다. 내가 원하는 FT_OpenEx()를 지정할 수 있어야합니다.버스 위치 ID를 기반으로 FTDI 장치 열기

내가 관심있는 장치의 버스 위치 ID를 얻기 위해 IO Kit API를 사용할 수 있습니다. FT_OpenEX() API를 사용하면 설명이나 일련 번호 대신 위치를 전달할 수 있습니다.

그러나 위치 ID를 반환하는 FT API는 버스 위치 ID와 비슷한 것으로 보이는 값을 반환합니다. 내가 연결 한 장치 중 하나는 0x1a127000이라는 버스 위치 ID를 가지고 있습니다. 버스에서 FT API를 사용하여 모든 장치의 위치를 ​​얻으면 0x1a051 및 0x1a052와 같은 것을 말합니다.

IO Kit 버스 위치 ID 및 FT 위치에서 변환하거나 사용할 장치를 지정하는 방법이 있습니까?

답변

2

최근에 비슷한 문제가 발생했습니다. 위치 및 기기에 따라 위치 ID가 0 인 곳이 있습니다. 내가 FTDI에 지원 요청을 쓴이 내가 가진 것입니다 :

우리는 USB 3.0 호스트 PCI 카드는 다음과 같은 이유로 우리 드라이버와 호환되지 발견 테스트.

Windows 시스템의 기존 호스트 포트는 형식의 이름을 갖습니다. \ device \ usbfdo- # 여기서 #은 숫자입니다.

USB 3.0 카드는 \ device \ device #로 알려져 있습니다. 여기서 #은 숫자입니다.

의 USB 3.0 호스트 포트

우리가 열거 및 드라이버를로드 할 때 장치 ID를 보내이 포트를 열려고하지 않는 윈도우 머신에 표준 명명 규칙 을 따르지 않습니다.

Microsoft는 3.0에 대한 지원을 추가 할 때 규정을 준수 할 것으로 예상하므로 문제가 Google의 관점에서 사라질 것으로 예상됩니다. 따라서 우리는 문제가 3.0 호스트가 아닌 드라이버에 있다고 생각합니다. 이 변화는 다음 호스트 장치는 (다른 제조업체)를 시도 할 가능성이 매우 가능성이 호스트 컨트롤러를 지원하기 위해 만들 수 있었다하더라도

는 다른 수정을 필요로하는 다른 변형이있을 것이다. 이것은 지속 가능한 모델이 아니며 을 USB의 PnP 방식과 비교합니다.

우리는이 문제가 Windows 8에서 해결 된 것으로 믿습니다. 우리는 현재 새 Windows 8 드라이버의 인증 작업을하고 있으며, 은 2 월 말에 사용 가능할 것으로 예상합니다.

매우 만족 스럽지는 않지만 적어도 작동하지 않는 이유를 설명합니다. 시간이있을 때 libusbX를 사용하여 위치 ID를 얻은 다음 FTDI API 루틴을 사용하여 위치 ID를 열려고합니다. 확실하지 그게 될 때,하지만 ...

베이트

+0

유용한 답변이지만 질문에 * 전혀 대답하지 않습니다 :( –

0

이미 한 번 리눅스에 대한 이런 짓을하고 작업 솔루션을 가지고 있기 때문에, 나는 나뿐만 아니라 맥을 위해 그것을 알아 내려고 시도라고 생각 . 정확히했는지 잘 모르겠지만 여기에 나와있는 것이 있습니다.

기본적으로 MacOSX 위치 ID를 오른쪽으로 16 비트 이동하고 0x32로 이진 &을 입력하고 장치 주소를 추가합니다. ftdi 드라이버에서 가져온 위치 ID와 같아야합니다.

예 : "시스템 정보"프로그램에서
내가 내 USB 장치를 찾아이 같은 것을 볼 수 있습니다

Location ID: 0x14100000/21 

은 "위치 ID/장치 번호"가 될 것으로 보인다. 은 이제 공식에 연결 :

0x141000000>>16 = 0x1410 
0x1410&0xff00 = 0x1400 
0x1400|21  = 0x1415 

그래서 10 진법으로 위치 ID는 다음과 같습니다 FTDI 반환 된 것과 일치 5141. 위에 사용 된 21은 16 진수의 0x15입니다.

나는이 구현에 문제가 있다면 알려 주시기 바랍니다. 나는 이것을 신뢰할 수있게 작동시킬 필요가있다. 나는 맥과 장치 사이에 허브를 넣으려고했는데 공식이 여전히 적용된다.

IOKit 호출은 다음과 같습니다

kr = (*dev)->GetLocationID(dev, &locationid); 
kr = (*dev)->GetDeviceAddress(dev, &address); 

apple developer reference 웹 사이트에서 설명했다.

EDIT 귀하의 FTDI 위치 ID에 5 자리 숫자가 있기 때문에, 귀하의 장치 번호가 무엇인지 알고 싶습니다. 어쩌면 내 방식이 너의 상황에서 유지되지 않을까?