OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 269|回复: 2

[XILINX] 【求助】领航者ZYNQ-7020 + PetaLinux 2020.2:CAN 设备树正常,但内核驱动不加载 (Driver Not Probing)

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2025-8-22
在线时间
0 小时
发表于 2025-11-2 15:28:41 | 显示全部楼层 |阅读模式
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` 的问题,并且有解决方案?




回复

使用道具 举报

1

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
452
金钱
452
注册时间
2024-3-19
在线时间
305 小时
发表于 2025-11-3 10:47:54 | 显示全部楼层
重点应该排查输入命令后产生的报错是什么意思,看上去是命令输的有问题,试试ip link add can0 type can bitrate 25000
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-5-26
在线时间
3 小时
发表于 2025-11-9 12:54:51 | 显示全部楼层
错误原因分析
语法错误:ip link set命令的参数顺序不正确

重复参数:系统认为 dev或 type参数重复了

命令格式错误

正确的命令格式
bash
复制
# 标准格式
ip link set dev can0 type can bitrate 250000

# 或者简化格式
ip link set can0 type can bitrate 250000
常见解决方案
1. 检查 CAN 设备是否存在
ip link show | grep can
2. 完整的 CAN 接口设置流程
# 先关闭接口
sudo ip link set can0 down

# 设置参数
sudo ip link set dev can0 type can bitrate 250000

# 启用接口
sudo ip link set can0 up
3. 使用正确的语法变体
# 方法1:明确指定设备
sudo ip link set dev can0 type can bitrate 250000

# 方法2:使用等号格式
sudo ip link set can0 type can bitrate 250000
4. 检查系统支持
# 检查 CAN 支持
lsmod | grep can

# 检查可用的 CAN 参数
ip link help
如果问题持续存在
检查权限:确保使用 sudo执行命令

检查 CAN 驱动:确认 CAN 模块已加载

检查拼写错误:确认接口名和参数拼写正确

请尝试上述解决方案,如果还有问题,请提供更详细的错误信息。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-11-22 11:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表