6

我们有一个由 FTDI 的 D2XX 驱动程序控制的 USB 设备。它目前通过 Python 接口从 Windows 机器控制,作为一个有趣的项目,我尝试将控制转移到 Raspberry Pi(大约是 PC 成本的 1/10,不包括操作系统成本)。

有许多障碍需要清除,但几周后,我终于找到了所有答案并让它发挥作用。答案分布在多个论坛上,因此感谢 Stack Overflow 社区,我想我会在这里整合它们。

一、项目要求:

我下载了 Wheezy 发行版并使用 Win32DiskImager 写入 4 GB SD 卡。Raspberry Pi 启动没有问题。然后我解压 D2XX 库 (libftd2xx.so) 并将其安装到/usr/local/lib.

PyUSB (1.6) 目前仅针对 Windows 进行测试,但它们提供了源代码。为 Raspberry Pi 编译一个副本非常简单。基本上,修改 setup.py 以链接到 libftd2xx.so 库(无需复制它)。还要编辑 d2xx/_d2xx.c 以注释掉没有 Linux 实现的例程(当前为 ftobj_Rescan、ftobj_Reload ftobj_GetComPortNumber)。将 FTDI D2XX 驱动程序下载(在发行版中)目录中的 WinTypes.h 和 ftd2xx.h 复制到 ftdi-win32 并运行python setup.py install,它将编译和安装 Python 模块。

完成所有这些后,我编写了一个简单的 Python 脚本来与 FTDI 芯片对话。请注意,您需要通过 sudo 运行。

import d2xx
jd = d2xx.open(0)
pd = jd.eeRead()
print pd

d2xx 模块似乎找不到 libftd2xx.so 文件。因此,我调整了 setup.py 脚本以链接到库的静态副本 libftd2xx.a。瞧,我得到了问题的第一个线索:D2XX 库是使用软浮点构建的,而我的 Wheezy 发行版被配置为使用浮点寄存器。也就是说,我系统上的 gcc 生成的代码与 D2XX 库二进制不兼容,并且不允许链接到它们。

为了解决这个问题,我下载了soft-float debian "wheezy" 发行版(2012-08-08) 并写入了 4 GB SD 卡。这次映像无法启动。环顾四周后,我发现了这个有用的答案. 简而言之,软浮点的启动映像存在问题,因此对于某些 Raspberry Pi 板,它不会启动。解决方案是将软浮点发行版中的 start.elf 文件替换为可以正常工作的文件,例如硬浮点 Raspbian 映像的副本。幸运的是,SD 卡有两个分区:一个 FAT 分区和一个 ext3(?) 分区。启动映像位于 FAT 分区上,因此将硬浮动 SD 卡弹出到 Windows 框中,复制 start.elf 文件,弹出软浮动 SD 卡并使用硬浮动更新其 start.elf 是微不足道的-浮动一个。之后,Raspberry Pi 启动没有问题。

在安装 FTDI 的 D2XX 驱动程序并从 PyUSB 构建 d2xx Python 模块后,我再次尝试了测试脚本。又失败了。d2xx 模块可以毫无问题地读取 libftd2xx.so 库,但由于某种原因无法与设备通信。

4

2 回答 2

4

我不确定问题出在哪里:是 PyUSB、FTDI 的 libftd2xx.so 的问题还是 Debian 发行版的问题?

使用 FTDI 包有一个测试,在release/examples/EEPROM/read. 您必须构建它,但这只是键入 make 的问题。运行它(通过 sudo),它无法打开 USB 设备,很明显它不是 PyUSB。在四处寻找之后,我发现了一个对驱动程序 ftdi_sio 的引用,它可能与其他 D2XX 驱动程序发生冲突。所以,使用lsmod,我看到 ftdi_sio 已经默认安装,所以我运行rmmod ftdi_sio. 之后,一切正常。读取命令应显示如下内容:

Library version = 0x10112
Opening port 0
FT_Open succeeded.  Handle is 0xf7d240
FT_GetDeviceInfo succeeded.  Device is type 4.
FT_EE_Read succeeded.
Signature1 = 0
Signature2 = -1
Version = 1
VendorId = 0x0407
ProductId = 0x6009
Manufacturer = MagicIncorporated
ManufacturerId = wo
Description = MyCompany Test Board
SerialNumber = testit_028
MaxPower = 44
PnP = 1
SelfPowered = 0
RemoteWakeup = 1
2232RC:
-------
    Rev5 = 0x1
    IsoInA = 0x0
    IsoInB = 0x0
    IsoOutA = 0x0
    IsoOutB = 0x0
    PullDownEnable5 = 0x0
    SerNumEnable5 = 0x0
    USBVersionEnable5 = 0x0
    USBVersion5 = 0x110
    AIsHighCurrent = 0x0
    BIsHighCurrent = 0x0
    IFAIsFifo = 0x0
    IFAIsFifoTar = 0x0
    IFAIsFastSer = 0x0
    AIsVCP = 0x0
    IFBIsFifo = 0x0
    IFBIsFifoTar = 0x0
    IFBIsFastSer = 0x0
    BIsVCP = 0x0
Returning 0

我也从 PyUSB 切换到ftd2xx,因为它是纯 python,但不是绝对必要的。

于 2013-01-30T22:56:17.097 回答
1

有一个特殊版本的 libftd2xx 1.1.12 修复了 Raspberry pi 上的问题。那可能会解决你的问题。

我忘记了在哪里找到它,但我在我网站的下载页面Lightput 下载页面上有一份副本。

于 2013-01-31T19:50:45.043 回答