为什么 Linux 在尝试访问连接到轻量级 hps-to-fpga 桥(或任何桥)的外设时会冻结?

为什么 Linux 在尝试访问连接到轻量级 hps-to-fpga 桥(或任何桥)的外设时会冻结?

我在 Altera DE1-SoC 开发板上工作了 8 个月。我正在开发的系统包括 Cyclone V FPGA 芯片,特别是 5CSEMA5F31C6N。它在芯片上运行嵌入式 Linux 操作系统。

一切都很好,开发正在进行中。两周前,公司的硬件工程师组装了一块新的定制板。设计和组件与开发板基本相似。所有与 HPS 相关的引脚都以相同的方式接线,主要区别在于默认控制台端口是 UART1。该问题现已解决,我现在可以通过 UART1 接收 U-boot 和内核消息。

但系统并没有完全启动。我已经指出了这一点有多种原因。首先,我有一个 init.d 脚本,用于导出 GPIO LED 并创建一个 sysfs 文件。导出 GPIO 引脚可以工作,但是,更改方向、更改值或从中读取数据会导致系统冻结。我在 init.d 脚本中禁用了该功能并重新启动了设备。这次在另一个 init.d 脚本行上启动失败。该行将更改轻量级桥中寄存器的值。命令为devmem 0xFF200XXX 32 1,XXX 为具体寄存器。

我尝试在所有网桥上使用 devmem,但所有尝试都会冻结 Linux。我尝试在HPS的UART寄存器、HPS的SDCard寄存器上使用devmem(参考这里),并且它不会冻结。

我可以通过读取每个桥的状态 sysfs 文件来验证桥是否已启用: fpga_bridge状态返回启用

我还可以通过此 dmesg 输出验证桥是否已链接到驱动程序: dmesg 输出

我已使用 Quartus Platform Designer 启用了 hps 配置中的所有三个桥。我的 u-boot.scr 中还有以下几行:

fatload mmc 0:1 $fpgadata soc_system.rbf;
fpga load 0 $fpgadata $filesize;
setenv fdtimage soc_system.dtb;
run bridge_enable_handoff;
run mmcload;
run mmcboot;

我还尝试通过以下 U-boot 命令行启用桥接这些说明

但是,我无法向 $l3regs 写入任何内容: 写入l3regs

我正在使用 Buildroot 2016.05 和 4.4 Linux 内核构建操作系统。为了创建 .rbf、.dts、.dtb、preloader-mkpimage.bin 和 u-boot 文件,我使用 SoC EDS 18.1 [Build 625]。

我已经没有什么可以尝试的了。

如果我能够使用 sysfs 文件从 Linux 操作系统打开和关闭 LED,我认为问题已经解决。

假设硬件是正确的,还有什么可能的原因以及如何修复它?

答案1

谢谢回复。此问题已得到解决。

在开发板上,我们使用 50Mhz 振荡器为 HPS 外设提供时钟,同时从同一 50Mhz 时钟生成 25MHz 信号,然后将其连接到结构上的 HPS 时钟引脚。

在新板上,我们没有使用 50Mhz 振荡器,而是选择了 25Mhz 振荡器。这次,单个轨道直接从振荡器连接到结构上的 HPS 时钟引脚。

我们没有任何其他时钟可以为 HPS 外设提供。

因此,我们将专用 HPS 时钟在内部路由到 HPS 外设上的输入引脚。这是一个错误,因为这无法在 Cyclone V 的顶层架构上完成,因为专用 HPS 时钟引脚不是 GPIO。

相关内容