驱动程序下载路径:
https://download.csdn.net/download/luky_zhou123/20087673
欢迎共同探讨SRIO相关问题
文件说明:
rio.c、rio-driver.c、rio-access.c、rio-sysfs.c:srio总线驱动代码文件
/devices/tsi721.c、/devices/tsi721_dma.c:PCIE转RAPIDIO控制器驱动代码文件
rio-scan.c:设备扫描驱动文件
/devices/rio_mport_cdev.c创建控制器设备文件驱动文件
rio_cm.c:创建测试应用层设备文件驱动文件
Tsi721 测试代码安装说明:
insmod rapidio.ko hdid=0,1(0和1 对应2个主端口ID)
insmod tsi721_mport.ko
sudo insmod rio_cm.ko
insmod rio_mport_cdev.ko
sleep 1(为确保扫描到设备此处延时1秒)
insmod rio-scan.ko scan=1
驱动安装完成后/sys/bus/rapidio/devices目录下应该有对应设备文件
Tsi721测试程序测试步骤:
1、安装驱动程序:
a、进入驱动程序所在目录,输入命令:
cd /home/kylin/kernel-rapidio-master-release/srio_driver
b、运行驱动安装脚本,输入命令:
./install_srio_drv.sh
2、rio_test_misc测试程序,通过./rio_test_misc –h可以查看帮助信息,主要测试功能如下:
查看Tsi721端口link状态:
./rio_test_misc -M 0 -q
参数说明:
-M: Tsi721端口号,如果只有一个Tsi21主端口号默认为0
-q:查询端口状态
端口必须link后才能进行后面测试
3、寄存器读写
a、读设备寄存器值
./rio_test_misc -M 0 -H hopcount -D destid -O offset
参数说明:
-M: Tsi721端口号,如果只有一个Tsi21主端口号默认为0
-H:设备跳数,如果读取Tsi721寄存器无需使用该参数
-D:待读取设备的id号,如果读取Tsi721寄存器无需使用该参数
-O:寄存器偏移地址
例如读取与Tsi721相连的switch设备id命令为:
./rio_test_misc -M 0 -H 0 -D 0xff -O 0
b、写设备寄存器值
./rio_test_misc -M 0 -H hopcount -D destid -O offset -V data -w
参数说明:
-M: Tsi721端口号,如果只有一个Tsi21主端口号默认为0
-H:设备跳数,如果写Tsi721寄存器无需使用该参数
-D:待写入设备id号,如果写Tsi721寄存器无需使用该参数
-O:寄存器偏移地址
例如向Tsi721寄存器0x60写入0x1a:
./rio_test_misc -M 0 -O 0x1a -V 0x1a -w
-V: 要写入的数据值
-w:表示写入数据
4、 门铃消息收发
rio_test_db测试程序功能:通过./rio_test_db –h可以查看帮助信息,通过改测试程序能够收发送门铃信息。
4.1 发送门铃消息
./rio_test_db -M 0 -D destid -I data
参数说明:
-M: Tsi721端口号,如果只有一个Tsi21主端口号默认为0
-D:待发送门铃信息的设备id
-I:(大写i)16位门铃数据
例如向设备id为0x1b的设备发送门铃消息0x5a5a命令如下:
./rio_test_db -M 0 -D 0x1b -I 0x01
4.2 接收门铃消息
./rio_test_db -M 0 -D destid -S start -E end -r
参数说明:
-M: Tsi721端口号,如果只有一个Tsi21主端口号默认为0
-D:待发送门铃信息的设备id
-S: 接收门铃消息的起始值
-E: 接收门铃消息的结束值
-r: 表示接收门铃消息
例如:读取设备id为0x1b发送的门铃消息为0x1a1a到0x5a5a的命令如下:
./rio_test_db -M 0 -D 0x1b -S 0x1a1a -E 0x5a5a -r
5、 dma数据收发
5.1 dma数据发送
./rio_test_dma -M 0 -D destid -A targetAdress -O offset -S size -d -v -k -T times
-M:Tsi721端口号,如果只有一个Tsi21主端口号默认为0
-D: 发送目的设备ID
-A: 发送数据目的设备地址
-S: 发送数据长度
-d: 打印调试信息,如果输入该参数将打印调试信息,默认不打印调试信息
-v: 不做数据校验,默认发送后将读取对端设备数据进行比较,输入该参数不做校验
-k: 使用内核模式,如果输入该参数将在内核空间申请缓存区发送数据,否则在用户空间申请缓存区发送数据,默认用户模式。
-T:发送次数,如果不输入该参数则默认发送1次
例如:通过dma方式向设备id为0x1b,目的基地址为 0xa0000000,偏移为0x0的位置发送长度为0x100的数据命令为:
./rio_test_dma -M 0 -D 0x1b -A 0xa0000000 -O 0 -S 0x100 -d -v
5.2 dma数据接收
./rio_test_dma -M 0 -D destid -I size -v -d -R riobase
-M:Tsi721端口号,如果只有一个Tsi21主端口号默认为0
-D:发送目的设备ID
-R:对端设备发送到接收设备的目的地址,即接收设备接收数据的目的地址,地址需要4K对齐。
-I:接收数据缓冲区长度,如果参数-i 默认接收数据长度为2*1024*1024(2M)
-d:打印调试信息,如果输入该参数将打印调试信息,默认不打印调试信息
-v:数据校验,默认发送后将读取对端设备数据进行比较,输入该参数不做校验
例如:接收目的ID为0x1b,地址为0x0,数据长度为0x200000的命令为:
./rio_test_dma -M 0 -D 0x1b -i -v -d -R 0x0,当对端设备数据发送完后按回车键可以查看对端发送的数据类容。
对于驱动接口测试一般需要使用应用层测试程序实现,本项目通过官网提供的测试程序对SRIO接口进行测试,测试数据收发功能前需要判断数据链路是否连接正常,判断方式如下:
运行rio_test_misc程序:
rio_test_misc –M 0 –D 1 –q
rio_test_misc –M 0 –D 1 –O 0x158
寄存器说明如下:
正确值为:0x02
注意:本次调试时由于对端设备是FPGA,查看0x158寄存器的值偶尔为0x03,此时可能链接状态不稳定,通过修改FPGA代码解决。
接口链接状态正常后可以通过发送维护包或门铃信息进行数据测试,否则需要先解决链接问题。
调试接口驱动时如果接口数据收发不通时需要先定位是本端接口问题还是外接设备问题,一般通过回环测试进行定位,Tsi721提供的回环测试方式很多。
1.Tsi721作为接收端,设备作为发送端回环测试如下:
该方式下FPGA发送PRBS误码测试数据,经Tsi721回环后设备再接收验证是否正确,采用该方式测试设备检测到误码,这个可能是由于Tsi721和FPGA误码率算法不同导致。
2.不经过设备端,Tsi自环测试, PMA自环测试方式是所有方式中测试接口链路最全的,该方式下回环数据经过了SRIO转换接口所有物理链路模块,测试框图如下:
如果用该方式回环测试不通,此时与外部设备无关,需要检查Tsi721设置是否正确。如果回环测试能通,连接设备不通,可以通过SRIO连接线将Tsi721 SRIO口短接回环测试数据收发和其他相关功能,如果数据能够收发,这种情况可以确定是对端设备问题,需要对端设备进行修改。本项目中通过修改FPGA的SRIOIP核配置最终解决设备不通的问题。
如果Tsi721作为从设备(不枚举设备及生成路由信息),需要将设备Tsi721设置成从模式:寄存器RapidIO Port General Control CSR,地址0x13c的第0位(HOST)设置成0;
如果host_deviceid 大于等于0,Tsi721驱动程序,默认设置HOST=1;
if (mport->host_deviceid >= 0)
iowrite32(RIO_PORT_GEN_HOST | RIO_PORT_GEN_MASTER |
RIO_PORT_GEN_DISCOVERED,
priv->regs + (0x100 + RIO_PORT_GEN_CTL_CSR));
else
iowrite32(0, priv->regs + (0x100 + RIO_PORT_GEN_CTL_CSR));