玩zynq板子的,是不是受够了platform usb cable 那乌龟一样的下载速度了?现在好了,使用手上的廉价jlink就可以调试zynq 芯片,速度还飞快。
最近搞zynq开发,实在是无法忍受platform usb cable那个下载调试速度,所以一直在找有没有更好的调试方法,结果发现xilinx官方提供了个XVC虚拟调试电缆这个东西。然后花了点时间研究了一下,发现实现起来还挺简单,所以打算自己搞一个试试,然后突发奇想,能不能省事点,直接用jlink来干这事?灵光一闪,想到了jlink其实有SDK的,可以通过程序自己控制jlink读写芯片,所以觉得这个想法应该是可行的,然后随便bing搜了下,好像没看到有先例,所以这个螃蟹只能我自己先尝尝了。。。
废话就不多说了,直接说关键点就好,感兴趣的可以自己深入研究。首先xilinx提供了xvc的详细文档xapp-1251,里面有xvc的协议说明,还提供了GitHub地址,里面有xvc server的实现代码,由于我使用的是window环境,因此我把xvc server代码下载下来,然后简单修改移植到了window,然后把里面的axi to jtag的操作代码替换为jlink sdk的jtag读写操作函数上,简单搞搞。不到半天就搞定了,
xvc server内主要修改了int handle_data这个函数
int handle_data(int fd)
{
do
{
memset(cmd, 0, 32);
if (sread(fd, cmd, 2) != 1)
return 1;
if (memcmp(cmd, "ge", 2) == 0)
{
if (sread(fd, cmd, 6) != 1)
return 1;
memcpy(TDO, xvcInfo, strlen(xvcInfo));
if (send(fd, (const char*)TDO, strlen(xvcInfo),0) != strlen(xvcInfo))
{
perror("write");
return 1;
}
if (verbose)
{
printf("%u : Received command: 'getinfo'\n", (int)time(NULL));
printf("\t Replied with %s\n", xvcInfo);
}
break;
}
else if (memcmp(cmd, "se", 2) == 0)
{
if (sread(fd, cmd, 9) != 1)
return 1;
memcpy(TDO, cmd + 5, 4);
if (send(fd, (const char*)TDO, 4,0) != 4)
{
perror("write");
return 1;
}
if (verbose)
{
printf("%u : Received command: 'settck'\n", (int)time(NULL));
printf("\t Replied with '%.*s'\n\n", 4, cmd + 5);
}
break;
}
else if (memcmp(cmd, "sh", 2) == 0)
{
if (sread(fd, cmd, 4) != 1)
return 1;
if (verbose)
{
printf("%u : Received command: 'shift'\n", (int)time(NULL));
}
}
else
{
fprintf(stderr, "invalid cmd '%s'\n", cmd);
return 1;
}
int len; //<num bits>
if (sread(fd, &len, 4) != 1)
{
fprintf(stderr, "reading length failed\n");
return 1;
}
int nr_bytes = (len + 7) / 8; //向上取整数字节
if (nr_bytes > sizeof(TDI))
{
fprintf(stderr, "buffer size exceeded\n");
return 1;
}
if (verbose)
{
printf("\tNumber of Bits : %d\n", len);
printf("\tNumber of Bytes : %d \n", nr_bytes);
printf("\n");
}
memset(&TDO, 0, nr_bytes);
if (sread(fd, TMS, nr_bytes ) != 1) //读取tms
{
fprintf(stderr, "reading tms data failed\n");
return 1;
}
if (sread(fd, TDI, nr_bytes) != 1) //读取tdi
{
fprintf(stderr, "reading tdi data failed\n");
return 1;
}
JLINKARM_JTAG_StoreGetRaw((const U8*)&TDI, (U8*)&TDO, (const U8*)&TMS, len);
if (send(fd, (const char*)TDO, nr_bytes,0) != nr_bytes)
{
perror("write");
return 1;
}
break;
} while (1);
return 0;
}
编译好的exe文件,感兴趣的可以试试
https://whycan.com/files/members/7197/XVC.rar
目前有点问题没解决,就是可以下载bit文件但是无法烧写外部flash,目前还搞不清楚原因。
如果需要在vitis内使用xvc,目前我摸索出的方法是在vivado内设置xvc并连接到芯片,然后切换到vitis就可以在debug内找到xvc了,测试vitis内点击debug可以正常下载调试,其他功能未详细测试,目前xvc server速度我设置为30M,对比Platform usb cable真是速度提升明显,吃灰的矿渣zynq板又可以拉出来溜溜了!
由于jlink sdk有版权问题,为避免麻烦,sdk和源码就不上传这里了,sdk在GitHub就可以下载到,自己找找就好
离线
这个就NB大了,省了买XILINX下载线了
离线
更新一下,下载外部flash是ok的,需要把启动模式设置为JTAG模式即可下载到外部flash
原本使用xilinx usb下载线烧写32M外部flash需要将近15分钟,现在直不到5分钟就搞定了
最近编辑记录 jiaowoxiaolu (2022-04-06 14:15:53)
离线
速度提升不少啊
离线
XilinxVirtualCable能做这么高了? 我之前看别人用ESP或者各种派做的速度都特别低 除了能无线调试 没太大用途
离线
哇塞,我要好好试试了,太棒了楼主厉害。
离线
XilinxVirtualCable能做这么高了? 我之前看别人用ESP或者各种派做的速度都特别低 除了能无线调试 没太大用途
速度瓶颈不在xvc协议,是在具体实现jtag移位出去的硬件上,esp做得大概只实现了功能,没往优化速度上下功夫,我用jlink来实现jtag比特流的输出,一是jlink烂大街,方便获得,0动手成本,2是jlink本身的jtag速度还是挺快的,v8老古董版本的jtag就比官方DLC cable下载器快不少了,土豪用jlink pro或者更高版本的话轻松快到超过zynq jtag最高速度
离线
这个好,同理 高速DAP 也是可以的了
离线
这个好,同理 高速DAP 也是可以的了
可以的,顺着Xilinx / XilinxVirtualCable的代码思路,用Python写了个XVC server to CMSIS-DAP,可以正常工作,不过目前性能有些感人,还需要再优化下才能见人。
离线
ESP-XVCD那个优化到后面发现整个传输的大部分过程已经是在等wifi协议栈吐数了,IO部分原设计的8266一下凑不出能做并串的外设,只靠bitbang的速度在扣掉库函数之后也比较难想到再做提升的方法。速度方面理论上现在最容易买到的山寨jtag-hs2(FT232H/FT2232H)应该是可以跑满标称30M的MPSSE速度的,也许可以看一下是不是有黑心厂家换了个FT2232D进去,那个功能和VID/UID可以和2232H一样,但是速度掉了一大截-w-、
离线
周末又尝试优化了一波速度,在MCU-LINK搭配CMSIS-DAP V2,时钟频率为14MHz的时候,跑出了还不错的结果:
不过在尝试继续提高频率时无法识别到FPGA了,现在还不清楚是否和固件有关系。
离线
@metro
估计是硬件的信号完整性出现问题了,可以考虑缩短JTAG线路试试
离线
不知道高云有么有类似XVC的接口
离线
@metro
估计是硬件的信号完整性出现问题了,可以考虑缩短JTAG线路试试
最近可以试试CH32V305那个开源的调试器固件,看看有没有问题
离线
怎么将固件烧写到eeprom里面?
离线
这个服务端代码,我看都是markfile,在vs2022怎么创建C的工程,我试了提示太多错误,想加点新的功能。
离线
DIGILENT的下载器速率可以设置到30MHz,楼主试过没?
离线
楼主这个速度,比XILINX那个SMARTLYNQ下载线速度快嘛? 我以前用淘宝上买的,后来搞了条SMARTLYNQ,发现速度提高几倍。
如果XVC快很多,那意义很大。
离线
山寨的jlink能不能用?
离线
楼主这个速度,比XILINX那个SMARTLYNQ下载线速度快嘛? 我以前用淘宝上买的,后来搞了条SMARTLYNQ,发现速度提高几倍。
如果XVC快很多,那意义很大。
SmartLynq好像里面是块zynq跑得服务器, 至今没有山寨版本. 大概是成本太高.划不来
离线
jlinkv9可以吗?
离线
不用安装整个开发环境,只是需要下载编译好的文件,
用什么软件? 指点一下,谢谢!
离线
@metro
那个cmsislink的xvc server能不能分享一下,另大佬怎么用python直接驱动cmsislink的引脚的,pyocd我没翻到这个功能欸
离线
@metro
那个cmsislink的xvc server能不能分享一下,另大佬怎么用python直接驱动cmsislink的引脚的,pyocd我没翻到这个功能欸
之前用CMSIS-DAP测试过,速度感觉不太理想,目前在尝试其它方案,等搞定了应该会开源的。晒下目前的硬件设计,软件部分还没开始适配:
至于驱动CMSIS-DAP,俺是直接用pyUSB发送和接收数据的,用的是CMSIS-DAP的DAP_JTAG_Sequence命令,用法还是比较简单的,可以参考官方文档:CMSIS-DAP: DAP_JTAG_Sequence
离线
https://wiki.segger.com/J-Link_XVCD_Server
最新的Jlink已经原生支持XVC了,山寨V9可用
最近编辑记录 conandllu (2023-10-26 15:52:33)
离线
有速度更快的小白盒,100多块钱
离线
@metro
CH32V305,这不就是国产替换FTDI的方案嘛,淘宝上买的JTAG-HS2要么是FTDI,要么就是这个主控。
离线
xilinx 载器速率+vivado设置到30MHz,速率会这么慢吗。。。这个xvc方案可以研究一下,最近有需求
离线
@metro
现在适配完软件部分了吗
离线
CH32V305少有的低价USB HS
离线
楼主这个速度,比XILINX那个SMARTLYNQ下载线速度快嘛? 我以前用淘宝上买的,后来搞了条SMARTLYNQ,发现速度提高几倍。
如果XVC快很多,那意义很大。
ultra或者pro应该可以和smart比一比,都是zynq方案
离线
直接再window跑exe嘛
离线
@metro
正点原子的ZYNQ下载器ATK-PLATFORM也是用CH32V305模拟FT232H的。
离线