我们设计的系统是6678和Altera的FPGA利用SRIO进行通讯,FPGA利用SRIO 1X接口,对6678进行SRIO BOOT和DOORBELL通讯。
现在遇到的问题是,代码用仿真器运行时DOORBELL通讯没问题,利用SRIO boot以后doorbell通讯就失败,SRIO端口的寄存器(0x0290b158)显示端口状态出了问题。起初怀疑SRIO boot没有成功,但是boot完成了,增加了写特定地址数据,闪灯等验证手段,发现boot也没有问题。为了取消多核的影响,我们把代码改到单核上来实现。
我是利用论坛上的6678的csl例程进行的SRIO初始化。代码里头会对SRIO端口进行重新的初始化。由于我们的系统是SRIO boot。我想请问,如果软件不重新初始化SRIO端口,只是收发doorbell,最小代码应该是什么?我尝试只配置LSU等相关寄存器,或者利用例程中给的keystone_SRIO_doorbell函数,doorbell都发不出去。请指点一下,非常感谢
Xin Li:
我看6678的SRIO boot默认设定是message 模式,和原来6474的PIO模式不太一致,有何具体区别?我可以将SRIO的BOOT模式默认设定为PIO模式吗?
Zhan Xiang:
1.把你们SRIO boot起来的代码做成死循环,不跑任何程序,把SRIO的端口状态寄存器读出来。看看SRIO是在boot起来就出现问题,还是跑了代码才出现问题。
2. 因为SRIO 初始化时需要DSP和FPGA两边一起初始化,你可以通过DSP发送reset命令,让FPGA重新发起SRIO初始化。
Xin Li:
回复 Zhan Xiang:
非常感谢答复!
1. 第一步我做过,我在代码中保存了不同时期SRIO的端口状态寄存器的值,在刚BOOT以后,SRIO初始化以后端口状态寄存器都显示正常,寄存器0x0290b158的数值为0x2。 但是发送完doorbell以后,即执行完keystone_SRIO_doorbell函数后,寄存器0x0290b158的数值变为0x01030306,显示端口状态错误。此时,只有复位DSP才能恢复正常。 如果不用BOOT,直接上电后用仿真器load,状态都是正常的。
从这个现象看,BOOT是OK的,是跑了代码才出现问题,可是又没法解释我上电后直接用仿真器load工作正常的现象。
2. 代码中SRIO初始化是DSP自己执行的,不需要FPGA控制,如何让FPGA发起?reset命令如何通知FPGA?
Xin Li:
回复 Xin Li:
6678的datasheet中第29页最后有这样一段话。
In SRIO boot mode, the message mode will be enabled by default. If use of the memory reserved for received
messages is required and reception of messages cannot be prevented, the master can disable the message mode by
writing to the boot table and generating a boot restart.
想请问一下,什么是boot table?如果message mode不能用,如何改成其它模式?比如Direct IO模式。
Andy Yin1:
回复 Xin Li:
您好,
C6678默认使用SRIO message方式进行boot,如果需要修改boot mode可以通过I2C secondary boot的方式修改SRIO boot parameter table。对于message mode及DIO mode时相应boot的差异请查看keystone boot user guide及C6678 ROM source code。
建议可以在应用程序中上电后对SRIO RESET,避免由于RBL在使用完SRIO后某些寄存器的不确定性,以及应用程序初始化的不健全,导致出现问题。
Xin Li:
回复 Andy Yin1:
多谢答复!
1. 我看了667x的bootloader的文档,似乎6678 message和DIO MODE的BOOT都支持,从我们实际调试的情况看,由于逻辑端用的是DIO模式,我们发送完代码后,向magic word中写入代码首地址,就可以正常boot代码,应该6678也可以支持DIO boot模式。可是看了上面的datasheet,又不是很清楚是 default只支持message模式吗?
2. 如果想把6678默认只支持message模式,想改成DIO模式似乎要用I2C master模式boot后再修改特定寄存器,我们的系统没有设计I2C EEPROM,似乎没有办法修改。
3. 应用程序中我们参考了TI 的例程,其中SRIO_INIT函数中有keystone_SRIO_soft_reset函数,我理解其中已经对SRIO进行了很详细的RESET,如果我们的代码可以利用DIO模式正常配置,通过soft_reset,还是不能让SRIO端口正常初始化吗? 现在如果端口出了问题,作为slave端的DSP只有硬件RESET,才能将SRIO端口恢复正常,只靠SOFT_RESET模式是不行的。
Andy Yin1:
回复 Xin Li:
您好,
1. 你们发送的代码是什么格式?
从你们的测试情况来看默认是DIO mode,确实与文档描述不符。我正在确认默认支持的boot mode然后反馈给你。
2. 你们使用仿真器加载时,板子的boot mode调成什么?如果是SRIO boot,上电后RBL会对SRIO做初始化,在boot完成后,会对PktDMA相关进行reset,但是PktDMA对doorbell并没有影响。
所以建议在连仿真器时也调成相同的SRIO boot试试看,如果此时没有问题说明应该是RBL中加载完程序后的尾处理代码影响;如果存在同样的问题,则说明是RBL 中SRIO的初始化影响。
建议抓取两种测试模式下的寄存器比较一下。
1) 在使用仿真器进行调试时,在load完程序后,将SRIO寄存器dump出来;在配置完SRIO后再次dump;
2) 在boot模式下,在加载完到SRIO初始化之前,dump出内存;在完成SRIO后再dump。
Xin Li:
回复 Andy Yin1:
1.FPGA端发送的代码是DSP编译生成的BIN文件,应该不区分message模式或者DIO模式吧。 默认boot mode请确认后给个消息。
2. 默认boot是SRIO boot, 我们修改成NO BOOT也尝试过,仿真器加载运行也是正确的,说明SRIO初始化代码应该可以进行doorbell通信。 但是SRIO boot后 通信就失败了。
寄存器我抓出来比较了一下,想了解ACK_ID的作用,例程中Host端DSP会做一个ACK_ID的match, 我们系统中, DSP是host端,不做这个有何区别吗?