"); //-->
……是的,你没有看错,我们将讨论如何使用jlink仿真器来控制FPGA——主要是读取或写入其引脚状态。本文主要针对A家的FPGA,但理论上也可用于X家的FPGA,以及其他支持JTAG的器件。
研究这个的原因是我的一块板子上的FPGA接了一片QSPI的Flash,我想有一种方便的方法对其进行编程。可惜Altera没有开放他的USB Blaster的编程接口,所以我选择了开放编程接口(虽然只是有限度的开放)的segger的jlink。其实我们完全可以自己做一个用于jtag控制的小板子,不过既然有现成的jlink可以用,就不去找那个麻烦了。
我假定您熟悉usb和基本的jtag概念,熟悉计算机上的简单软件开发,熟悉FPGA。本文将侧重于jtag的运作,对开发过程中的其他细节问题将不作详细介绍。这不是一篇Step by step的文章。
需要准备的文档及软件:
- libusb
这个是一个开源的跨平台通用usb驱动,可以在sourceforge.net下载它的源代码和二进制文件。稳定性和性能都相当好。我们将使用这个驱动来操作jlink,而不用segger的原厂驱动,因为segger貌似没有提供原厂驱动的接口文档。
- jlink编程接口文档
http://www.segger.com/admin/uploads/productDocs/RM08001_JLinkUSBProtocol.pdf
- IEEE1149.1
这个是必须的。
- TopProbe
这个是一个通用的JTAG接口控制软件,可以通过它对芯片引脚进行简单的读写操作。支持很多JTAG调试器,当然也包括USB Blaster和Jlink。
- BusHound
这个是USB监控软件,可以用来监控USB总线上的数据流,相当于一个软件级别的协议分析仪。
- VC6.0 or VS2008 or CodeBlocks or 其他
只要能用来编写计算机软件就可以。推荐CodeBlocks,这个是跨平台的开发工具,在windows上写好后几乎不用太多工作就可以在linux下控制你的jlink。
以上软件中TopProbe和BusHound不是必须的,不过在我们自己的调试软件出现问题的时候可以用这两个软件配合起来抓下USB总线数据,方便和我们自己的软件进行对比。
这里注意下,arm和altera所使用的jtag口的引脚顺序是不一样的,所以我们需要一根自己改造过的10PIN调试线。
今天我们先看下如何获取jlink的版本,验证与jlink通讯正常,接下来的几篇将讲述如何控制jtag port。
1. 首先我们用libusb生成一个可用于jlink的驱动,并用它替换segger原厂的驱动。我手里的jlink的VID和PID分别是0x1366和0x0101。
2. 根据libusb的文档和example,我们在自己的程序中打开jlink,然后向其发送获取版本信息的命令:
jlink_out_buf[0] = EMU_CMD_VERSION;
usb_bulk_write(dev, EP_OUT, jlink_out_buf, 1, 5000);
然后读取jlink返回的版本信息,共需读两次。第一次读回来的是版本字符串的长度,第二次读回来的才是版本字符串:
usb_bulk_read(dev, EP_IN, jlink_in_buf, BUFFER_SIZE, 5000);
int ver_len = jlink_in_buf[0] | (jlink_in_buf[1] << 8); // 字符串长度数据占2个字节,Little Endian
usb_bulk_read(dev, EP_IN, jlink_in_buf, BUFFER_SIZE, 5000); // 这次取回来的是版本信息字符串
printf("%s", jlink_in_buf);
如果打印出来的字符串没什么问题,那么表明我们已经可以与jlink通讯了!打印出来的字符串大概是这个样子:
J-link compiled Dec 03 2007 7:15:31 ARM Rev.5
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。