根据总线位置ID打开FTDI设备

时间:2013-01-22 22:27:08

标签: macos ftdi

我有一些连接到Mac的FTDI设备。它们都具有相同的描述,PID和VID。我希望能够指定FT_OpenEx()我要打开哪一个。

我可以使用IO Kit API获取我感兴趣的设备的总线位置ID。 FT_OpenEX()API允许我传入位置而不是描述或序列号。

但是,返回位置ID的FT API会返回与总线位置ID不同的值。我连接的其中一个设备的总线位置ID为0x1a127000,总线当我使用FT API获取所有设备的位置时,它会显示0x1a051和0x1a052之类的内容。

有没有办法从IO Kit总线位置ID和FT位置转换,或者指定使用哪个设备?

2 个答案:

答案 0 :(得分:2)

我最近遇到了类似的问题:在某些地点和设备上,我将0作为位置ID。我写了一份FTDI援助请求,这就是我得到的:

  

我们测试了USB 3.0主机PCI卡,发现它与我们不兼容   司机出于以下原因。

     

Windows计算机上的现有主机端口在其中具有名称   格式:\ device \ usbfdo-#其中#是一个数字。

     

USB 3.0卡被称为\ device \ device#,其中#是一个数字。

     

USB 3.0主机端口不符合标准命名约定   在Windows机器上我们不会尝试打开此端口发送   枚举和尝试加载驱动程序时的设备ID。

     

正如我们希望微软在添加支持时遵循惯例   3.0,我们希望问题远离我们的观点。因此我们仍然认为问题在于3.0主机而不是   我们的司机。

     

即使可以进行更改以支持此主机   控制器很有可能你尝试下一个主机设备   (不同的制造商)将有另一个变体需要a   不同的修改。这不是一个可持续的模式   反对USB的PnP精神。

     

我们认为此问题已在Windows 8中得到解决。我们目前正在使用   我期望着从事新Windows 8驱动程序的认证工作   这将于2月底上市。

这不是很令人满意,但至少它描述了它无法正常工作的原因。当我有时间时,我将尝试使用libusbX获取位置ID,然后使用FTDI API例程打开它。 不知道什么时候会这样,但是......

维特

答案 1 :(得分:0)

由于我已经为linux做了一次并且有一个可行的解决方案,我想我也试图为mac解决这个问题。 我不确定我是否正确地做到了这一点,但这是我想出的:

基本上,你把MacOSX位置ID右移16位,二进制和&使用0xff00并添加设备地址。 这应该等于你从ftdi驱动程序获得的位置ID。

示例:
在"系统信息"程序我可以找到我的USB设备,看到这样的事情:

Location ID:    0x14100000 / 21

这似乎是"位置ID /设备号"。 现在将其插入该公式:

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

因此,在十进制表示法中,位置ID为:5141,它匹配FTDI返回的内容。注意,上面使用的21是十六进制的0x15。

我刚刚在30分钟前发现了这一点,所以如果这个实现有问题请告诉我。我需要这个也能可靠地工作。我尝试在mac和设备之间放置一个集线器,公式仍然适用。

IOKit调用是:

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

apple developer reference网站上进行了描述。

修改 由于您的FTDI位置ID有5位数,我会对您的设备设备编号感兴趣。也许我的方法在你的情况下并不适用?