2

我有几个 FTDI 设备连接到我的 Mac。它们都具有相同的描述、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 位置进行转换,或者以其他方式指定要使用的设备?

4

2 回答 2

2

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

我们测试了 USB 3.0 主机 PCI 卡,发现它与我们的驱动程序不兼容,原因如下。

Windows 机器上的现有主机端口按以下格式命名:\device\usbfdo-# 其中# 是一个数字。

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

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

由于我们希望 Microsoft 在添加对 3.0 的支持时遵循惯例,因此我们希望问题会远离我们的观点。因此,我们仍然认为问题在于 3.0 主机而不是我们的驱动程序。

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

我们相信这个问题已经在 Windows 8 中得到解决。我们目前正在努力对我们的新 Windows 8 驱动程序进行认证,我预计这将在 2 月底推出。

这不是很令人满意,但至少它描述了它为什么不起作用。当我有时间时,我会尝试使用 libusbX 获取位置 ID,然后使用 FTDI API 例程打开它。不知道那会是什么时候,虽然......

维特

于 2013-02-07T07:38:37.383 回答
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);

苹果开发者参考网站上描述。

编辑 ,因为您的 FTDI 位置 ID 中有 5 位数字,所以我会对您的设备设备号感兴趣。也许我的方法在你的情况下不成立?

于 2014-06-22T13:31:41.957 回答