作者在 6 月修复了几个廉价的 Altera USB Blaster 克隆版,将改进的开源固件移植到之前无用的基于 CH552G 的克隆版,并在 Linux 中使其可靠工作。之后又买了更多 AliExpress 上的便宜克隆版,包括基于 CH552G 和 FTDI + CPLD 设计的,都存在 Windows 下工作正常但 Linux 下随机失败的问题,如 Waveshare 模型和 KRZV 模型。作者尝试在 KRZV 模型中焊接 12 MHz 振荡器但未成功,还购买了二手的 Terasic USB Blaster 作为参考,其设计与其他 FT245 + CPLD 相似。
作者深入研究随机失败原因,从 JTAG 链调试器的 IDCODE 迭代测试入手,捕获 USB 流量发现 Windows 和 Linux 下通信方式不同,Linux 中似乎每次发送都要求响应。作者读取了 Waveshare 和 KRZV 克隆版的 CPLD 比特流,但未得到有效帮助。后来发现 usb_jtag 项目提供了一些 Altera Blaster 克隆版实现,包括 FT245 + CPLD Blaster 的设计,作者根据其设计构建比特流并写入 CPLD,但效果不佳,问题依旧。
作者对比了开源 CPLD 设计和已知工作的 CH552G USB Blaster 固件,发现它们算法基本相同但实现细节有差异,如 CH552G 会等待 TDO 状态稳定,而开源 CPLD 设计未等待。作者添加延迟后,通用 KRZV FT245 + CPLD 克隆版在 Linux 和 Windows 下都能正常工作,Terasic 程序员的回读也有所不同但都能正常工作。
作者仍不确定此修复为何能消除最初的 0x81 问题,且最初对 Waveshare 克隆版时钟减速的修复为何有效,猜测原 Waveshare CPLD 设计的实际问题与开源设计不同。作者将修复后的 usb_jtag 设计上传到 GitHub,并分享了调试过程中的一些注意事项,如 USB 电缆问题、Quartus Programmer 18.1 的奇怪问题、手动运行 jtagd 的有用选项、Linux 中首次 JTAG 操作的延迟问题、Windows 和 Linux JTAG 服务器的差异等。最后作者强调基于 CH552G 的程序员在安装工作固件后较为可靠,且希望 Waveshare 和 AliExpress 卖家能修复其 CPLD 设计。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。