新手入门
- 积分
- 5
- 金钱
- 5
- 注册时间
- 2025-8-22
- 在线时间
- 0 小时
|
2金钱
大家好,
我正在一个基于 ZYNQ-7020 的项目上尝试启用 can0接口,但遇到了一个非常棘手的问题,希望有经验的工程师能帮忙看一下。
1. 目标与环境
* 硬件平台: 正点原子领航者 ZYNQ 开发板 (芯片: Z-7020 CLG400-2)
* 软件工具: PetaLinux 2020.2 (运行在 Ubuntu 20.04 虚拟机上)
* 目标: 成功运行 `ip link set can0 type can bitrate 250000` 命令。
2. 核心问题
在开发板启动后,can0`接口似乎被内核创建了,但它不是一个真正的 CAN 设备。当我尝试配置它时,命令失败:
```bash
root@ZYNQ-7020:~# ip link set can0 type can bitrate 250000
ip: either "dev" is duplicate, or "type" is garbage
```
使用 ifconfig 查看,发现它的链路类型是 UNSPEC`(未指定),而不是 CAN:
```bash
root@ZYNQ-7020:~# ifconfig can0
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:21
```
3. 已做的验证和关键证据 (问题的诡异之处)
我已经确认了所有常规的配置都是正确的,但问题依然存在。以下是我收集到的关键证据,它们之间存在着明显的矛盾:
证据A:硬件设计 (`.xsa` 文件) 中明确包含了 CAN0。
我解压了 `project-spec/hw-description/system.xsa`,在 `system.hwh` 文件中可以清楚地看到 `can0_tx` 和 `can0_rx` 的外部端口定义,它们连接到了 `processing_system7_0`。
```xml
<PORT DIR="O" NAME="can0_tx" ...>
<CONNECTIONS>
<CONNECTION INSTANCE="processing_system7_0" PORT="CAN0_PHY_TX"/>
</CONNECTIONS>
</PORT>
<PORT DIR="I" NAME="can0_rx" ...>
<CONNECTIONS>
<CONNECTION INSTANCE="processing_system7_0" PORT="CAN0_PHY_RX"/>
</CONNECTIONS>
</PORT>
```
证据B:设备树中,`can0` 节点被成功启用。
我已经在 `system-user.dtsi` 中手动添加了补丁,并且在系统启动后,可以通过 `/proc/device-tree` 确认 `can0` 的状态是 `okay`。
手动添加的补丁 (`system-user.dtsi`):
```c
&can0 {
status = "okay";
};
```
系统启动后的验证:
```bash
# ls -l /proc/device-tree/amba/can@e0008000
# (此命令成功列出文件,证明节点存在)
# cat /proc/device-tree/amba/can@e0008000/status
okay
```
证据C:内核配置中,`xilinx_can` 驱动被编译进内核 (`*`)。
我已经反复确认过 `petalinux-config -c kernel` 的配置,`Xilinx CAN driver` 选项是 `[*]`,而不是 `<M>`。这意味着驱动是内核的一部分。
4. 最终的矛盾点
尽管设备树是正确的,并且驱动程序是内置的,但内核在启动时,完全没有加载 `xilinx_can` 硬件驱动。`dmesg` 日志中没有任何关于 `xilinx_can` 的硬件初始化信息。
```bash
root@ZYNQ-7020:~# dmesg | grep can
can: controller area network core (rev 20170425 abi 9)
can: raw protocol (rev 20170425)
can: broadcast manager protocol (rev 20170425 t)
can: netlink gateway (rev 20190810) max_hops=1
```
(日志中只显示了通用的 CAN 软件协议,没有任何硬件驱动(如 `xilinx_can`)的加载记录。)
我的问题:
在所有配置(硬件、设备树、内核)看起来都正确的情况下,为什么内置的 `xilinx_can` 驱动没有被“唤醒”并绑定到设备树中的 `can0` 节点上?
这是否可能是 PetaLinux 2020.2 针对 ZYNQ-7000 的一个已知的深层次 BUG?有没有人遇到过类似 `Link encap:UNSPEC` 的问题,并且有解决方案?
|
|