免责声明:
下文中的所有内容仅供学习和研究之用,对由此造成的损坏、保修等问题概不负责,如有侵权请删除本帖,谢谢。
DSLogic是一个便携式的逻辑分析仪,功能够用,价格还算便宜。DSLogic分为Basic和Plus两个版本(现在似乎有新版了),两者在硬件上仅有SDRAM缓冲和屏蔽线的区别。通过一些硬件上的改造,可以将Basic升级为Plus。
注:下文内容在我的Basic上验证成功,对于新版U2 Basic是否修改硬件并不清楚,如有成功经验欢迎分享。
首先,还是要将SDRAM焊到板子上。官方用的SDRAM似乎有多个版本(例如Alliance AS4C16M16SA-7TCN,见DreamSourceLab DSLogic Plus),我自己用的是H57V2562GTR-75C,已经正常使用一年半了,应该133 MHz及以上频率、16-bit的SDRAM都可以用。
这里我们需要Plus对应的固件,好在DSView是开源软件,我们可以在GitHub上找到历史版本:DSLogicPlus.fw,下载下来备用。
接下来就该烧写固件了。我把相关操作都写好代码放到GitHub上了,地址在metro94/fx2_tools。需要安装Python 3.x及PyUSB。
现在,可以根据需要选择以下操作:
临时修改固件:
只需使用firmware_run.py即可,执行命令python firmware_run.py DSLogicPlus.fw,等待写入完成即可。之后,硬件应该自动重新枚举,可以在DSView中看到设备名称已经变为DSLogic Plus。由于固件存储在RAM上,重启后会丢失。
永久修改固件:
这一操作需要将固件烧录到EEPROM上。首先,由于EEPROM的固件存储格式是封装过的(FX2的特性),因此需要将DSLogicPlus.fw文件封装为iic格式(C2 format),firmware_mkimage.py可以用来做这个事情。命令如下:python firmware_mkimage.py DSLogicPlus.fw DSLogicPlus.iic
由于EEPROM的WC引脚默认接高电平,此时忽略写入,因此需要临时将WC引脚接地,如下图所示。
(小提示:可以直接用信号线中的黑色线(地线),接到引脚后另一头通过测试夹短接采样端口。)
之后,运行命令python firmware_download.py DSLogicPlus.iic。由于EEPROM的写入较慢,需要多等待一段时间,直到执行完成,之后根据提示重新插拔即可。
经过上述步骤,应该就可以搞定升级过程了。后面会解释这样做的原理。
最近编辑记录 metro (2020-02-28 17:24:11)
离线
下面解释一下为什么上述操作可以修改固件。其实这是因为Cypress FX2系列USB单片机内置了Firmware Load请求。该命令属于Vendor Request,并且是在硬件层面就实现的功能,因此就算固件没有进行相关编码也可以用。(所以某种程度上来说FX2没办法加密固件,毕竟可以绕过固件直接读写RAM的内容。)
可以看到,FX2支持Firmware Download(从PC到FX2)和Firmware Upload(从FX2到PC)。特别地,Firmware Download的过程需要在Reset状态下完成(毕竟固件都要被覆盖了)。所以下载固件时的正确操作如下:
使用Firmware Download往CPUCS中的8051RES位写1,以复位FX2的CPU(USB部分不受影响)。这等价于往0xE600寄存器里写1。
使用Firmware Download往RAM区域(0x0-0x4000)写代码。由于FX2的代码和数据共用一条总线,因此向RAM写入的数据可被执行。另外,写入的时候似乎有大小限制,每次最多可以写0x1000字节。
使用Firmware Download往CPUCS中的8051RES位写0,以取消对FX2 CPU的复位。这等价于往0xE600寄存器里写0。
当然,上面说的是下载固件到RAM,要下载到EEPROM就会麻烦些。由于Firmware Load不能直接操作EEPROM,因此需要借助下载的固件来实现这个功能(类似于bootloader)。另外,EEPROM的固件并不是源程序,而是经过了打包,这在参考手册中被称作是C2 Format,打包后的文件后缀是.iic格式。C2 Format的结构如下图所示。
言归正传,这个bootloader要怎么做呢?在FX2的官方例程中,我发现了一个名为Vend_Ax的程序,该程序就能完美实现我需要的功能。具体代码见这里:Vend_ax.zip。
因此,下载到EEPROM的过程如下:
使用上述步骤上传编译好的Vend_Ax.bin文件。注意这里不该使用.iic文件,因为Vend_Ax是直接上传到RAM中执行的。
在上传固件并取消复位后,在不进行USB重新枚举的情况下,我们按照Vend_Ax记录的文件内容进行操作,做法是使用对应的Vendor Request发起Control Transfer
在成功上传固件后,重新插拔设备,此时将使用新固件启动。
上面就是烧写固件所需的全部操作。由于DSLogic使用了WinUSB,因此上述过程可以直接用libusb或是基于此的PyUSB完成。
最近编辑记录 metro (2020-02-28 17:21:53)
离线
这个方法好!我原先以为这个EEPROM是FPGA的配置,一时没想到是FX2的。
LA4016我看了,原模原样抄的DSLogic Plus,外面套了一个公模的金属壳,声称【不仅与上位机软件DSView永久同步,LA4016比DSlogic具备更高性能价格比】,太low了。
应该是FX2通过并行接口对FPGA编程,在编程结束后直接就切换成与FPGA逻辑的通信接口了。确实比较节省硬件资源,而且也方便对FPGA进行固件升级。
离线
记得楼主还是学生?玩得好高级
毕业了就没得玩了,趁现在多玩一点
离线
老版的Basic直接拆掉IIC改一个字节的USB PID就可以变成plus,U2 Basic这种办法已经失效了。
对,我对比过固件,其实需要改的就是PID从0x0021改成0x0020,整个固件就只有C2 Header和USB描述符的区别而已,其它都是一模一样。
本来发这个帖子也不是为了破解(这也是我一直都没有发出来的原因),只是分享一下方法而已,不过用FX2作为逻辑分析仪USB方案的产品还是很多的。
离线
我想问一下 新版本的还可以破解码?
不知道,我手头没有新版,而且暂时找不到新版的PCB,不知道内部有没有修改。
离线
更新:找到了U2 Basic的升级方法,不过手头没有硬件,需要大家自行验证。
地址:Превращаем DSLogic U2Basic в DSLogic Plus,理论上可以套用我的方法不使用编程器。
离线