ZYNQ SRIO枚举ID功能设计
Posted HeroKern
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZYNQ SRIO枚举ID功能设计相关的知识,希望对你有一定的参考价值。
常见的SRIO枚举分配ID操作在Powerc平台比较常见,本文使用zynq7045实现SRIO枚举功能,PL端有SRIO IP,只需要将AXI维护端口挂到AXI-GP接口上,PS软件就可以通过AXI总线访问SRIO IP实现枚举自动分配ID功能。本次测试硬件拓扑图如下图所示。
srio交换芯片采用的时1848交换芯片,SRIO1和SRIO2本次实验室环回到ZYNQ的SRIOIP上,也可以直接将端口引到外部让用户使用,本次方便实验分析和抓信号,SRIO三个x4的IP都是用同一个ZYNQ出的。PL端例化SRIO IP时按照正常配置SRIO就行,需要勾选上支持维护包,同时在用于枚举的SRIO,需要将维护接口连接到AXI-GP接口上,方便软件去访问相关寄存器,到此硬件和FPGA工作就准备完成,下面开始分析软件。
编写srio驱动之前需要对srio ip手册多研究,软件需要实现两组访问接口,第一访问host的寄存器列表(下图中左边标签部分),第二个是发维护包访问远端的寄存器列表。这两个是最重要的基础技术点,在zynq平台需要自定义自己实现,本文不贴具体代码,有需要的有偿提供技术支持。下图列举了获取ID 锁寄存器,访问某个SRIO设备之前,需要获得该设备的锁,看是否能够获取成功,不能获取成功,说明该设备被某个host已经枚举过了,如何获取锁可以看下图右边讲解。
获取锁,并且写ID代码实现如下所示。
通过维护包枚举远端设备,发现是switch设备,访问switch支持的端口数量,以及主端口是哪一个,同时增加路由表,方便遍历交换机的每一个端口,寄存器描述如下所示。
遍历每个端口代码如下所示。
代码中会判断,如果遍历到用来枚举的主端口,只需要使能该端口的收发就退出,然后继续遍历下一个端口,软件在访问到switch已经更新了路由表,让维护包可以访问到switch的所有端口,软件判断每个端口的link状态,如果端口link了,继续更新路由表,让维护包跳转到该端口,从该端口出去继续枚举,这就是SRIO的枚举过程了
路由表在1848中由0x70和0x74两个寄存器控制,寄存器具体细节如下所示。
通过不断枚举就可以访问到SRIO链上的所有设备,然后软件通过递归给每个设备分配ID,同时保存每个设备ID信息,方便软件发起NREAD和NWRITE发起访问,同样道理,软件也可以实现NREAD和NWRITE数据交互,通过走AXI-HP接口,本文不讲解该技术点。
下面是测试实验的数据,很多打印信息是为了方便SRIO交互细节,交互信息很多,这里只展现了部分实验数据。
下图是xilinx_srio驱动的入口代码。
驱动代码结构如下所示,该驱动代码支持动态编译,动态加载等功能。
这边文章讲解了srio如何枚举的工作原理,有感兴趣的小伙伴可以交流,下面文章讲解PCIE枚举和地址映射功能。
以上是关于ZYNQ SRIO枚举ID功能设计的主要内容,如果未能解决你的问题,请参考以下文章