运行自定义 AM5728板、ARM 运行 Linux、DSP 运行 Sys/BIOS。
DSP 是一个与 FPGA EP 第2代单通道通信的 PCIe RC。 DSP 内核1通过 PCIESS2连接。
DSP 的驱动程序代码大量偏离处理器 SDK 的 PCIe 示例。
整个过程的工作方式如下:
ARM 为 Linux 提供支持
ARM 加载 DSP 应用
ARM 将 FPGA 图像放入共享存储器
ARM 通知 DSP (通过 MessageQ)通过 GPMC 接口加载 FPGA。
加载 FPGA 并准备就绪后、DSP 将启动 PCIe 初始化。
PCIe 初始化如下所示:
1) 1) 通过 GPIO 对 FPGA PCIe 子系统进行硬件复位
2)调用 PCIe_init()
3)调用 pcieSerdesCfg -> PlatformPCIESS2ClockEnable()、PlatformPCIESS2PllConfig()、PlatformPCIESS2CtrlConfig()、PlatformPCIESS2Reset()、PlatformPCIESS2PhyConfig()
4)调用 PCIe_open ()
5)调用 pcieCfgRC()
6)调用 PCIe_cfgBar()
7)调用 pcieIbTransCfg()
8)调用 pcieObTransCfg()
9)调用 PCIe_getMemSpaceRange()
10)调用 pcieLtssmCtrl()<-启用链接训练
11)调用 waitLinkup()<-在链接启动时返回
我们的 ARM 应用每分钟多次重新加载 DSP 和 FPGA、并显示不同的图像。 经过一段随机的时间后、DSP 将不会响应。 当我们尝试连接 JTAG 调试器时、会出现"Device core is hung (设备内核挂起)"错误。
为了帮助隔离该问题、在 DSP 中、我循环执行上述 PCIe 初始化步骤、并在结束时反复关闭。 在 DSP 内核挂起之前、我可以进行50到1000次迭代。
在通过 printf 日志进行大量调试后,我发现它始终挂起在 pcieCfgRC()函数中。 在更多 printf 调试后、它始终挂起在代码中:
MEM_SET (&getRegs、0、sizeof (getRegs)); getRegs.statusCmd =&statusCmd;
跟踪(DspTrace::error_log、"pcieCfgRC 启用存储器读取"); 新生儿睡眠(10);
if ((RetVal = PCIe_readRegs (handle、PCIe_location_local、&getRegs))!= PCIe_RET_OK) { 跟踪(DspTrace::error_log、"读取状态 Comand 寄存器失败!"); }
跟踪是我提供的一个记录函数、用于将字符串写入循环缓冲区。 SLEEP 命令允许我们运行低级任务、该任务会将刚刚写入 ARM 的字符串发送到控制台上以供显示。
我还可以从 ARM 访问该缓冲存储器。 在每个故障情况下、最后记录的是"pcieCfgRC 使能存储器读取"。
我深入研究了 PCIe V1源代码、发现上面的代码正在读取地址0x51800004处的状态/命令寄存器。 因此、我用以下代码替换了对 PCIe_readRegs 的调用:
uint32 statusCmdVal =*(volatile uint32_t *)((uint32_t *) 0x51800004);
它仍然完全停留在该位置。
因此、经过数百次迭代、反复运行相同的代码后、内核将突然在读取0x51800004时挂起。
然后,有人建议从 ARM 读取同一地址。 我使用命令 omapconf 读取0x51800004、然后 Linux 挂起。 我必须按下电路板上的 POR 才能重新启动。
引导 Linux 时、但在加载 DSP 或配置 PCIe 之前、omapconf 读取0x51800004将返回以下结果:
bash-4.3# omapconf 读取0x51800004
!!! OUPS。。。 内存错误@ 0x00000000!!!
您确定:
存储器地址有效?
目标模块计时?
我想这是意料之中的、因为 PCIe 尚未启动并运行。 (BTW、所有对 PCIe 的引用均已从 Linux 器件树中删除。)
加载 DSP/FPGA 并循环后、读取正常工作:
bash-4.3# omapconf 读取0x51800004
00100146
当 DSP 最终挂起时、我尝试使用相同的命令、并且 Linux 提示符永远不会返回、Ctrl-C 不起作用、我无法将 SSH 连接到主板、我必须按下重置按钮。
不确定下一步要去哪里。 很明显、PCIe 子系统中的某个组件锁定、导致对其进行存储器访问挂起存储器总线。 只是不确定如何证明或修复它。