The*_*uke 6 python usb raspberry-pi ftdi raspbian
我们有一个由FTDI的D2XX驱动程序控制的USB设备.它目前通过Python界面从Windows机器控制,作为一个有趣的项目,我尝试将控件移动到Raspberry Pi(大约是PC成本的十分之一,不包括操作系统成本).
有许多障碍需要澄清,但几周之后我终于找到了所有的答案,并让它发挥作用.答案分布在几个论坛上,感谢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).将WinTypes.h和ftd2xx.h从FTDI D2XX驱动程序下载(在发行版中)目录复制到ftdi-win32并运行python setup.py install,它将编译并安装Python模块.
完成所有操作后,我编写了一个简单的Python脚本来与FTDI芯片进行通信.注意你需要通过sudo运行.
import d2xx
jd = d2xx.open(0)
pd = jd.eeRead()
print pd
Run Code Online (Sandbox Code Playgroud)
d2xx模块似乎无法找到libftd2xx.so文件.因此,我调整了setup.py脚本以链接到库的静态副本libftd2xx.a.我有第一个问题的线索:D2XX库是使用soft-float构建的,我的Wheezy发行版配置为使用浮点寄存器.也就是说,我系统上的gcc生成的代码与D2XX库不兼容,并且不允许它们链接到.
为了解决这个问题,我下载了soft-float debian"wheezy"发行版(2012-08-08)并写入4 GB SD卡.这次图像无法启动.环顾四周后,我找到了这个有用的答案.简而言之,软浮动的启动映像存在问题,因此对于某些Raspberry Pi板,它将无法启动.解决方案是将软浮动分布上的start.elf文件替换为可以工作的文件,例如来自硬浮动Raspbian图像的副本.幸运的是,SD卡有两个分区:FAT 1和ext3(?).启动映像在FAT分区上,因此将硬浮SD卡弹出到Windows框中,复制start.elf文件,弹出软浮SD卡并用硬盘更新它的start.elf是微不足道的. - 浮动一个.之后,Raspberry Pi启动没问题.
安装FTDI的D2XX驱动程序并从PyUSB构建d2xx Python模块后,我再次尝试了测试脚本.再次失败了.d2xx模块可以读取libftd2xx.so库没问题,但由于某种原因可能无法与设备通信.
我不确定问题出在哪里:是 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
Run Code Online (Sandbox Code Playgroud)
我还从 PyUSB 切换到ftd2xx,因为它是纯 python,但这并不是绝对必要的。