ZYNQ设备树问题记录

一.问题描述

        在调试基于zynq7020的系统时出现问题,使用了petalinux创建根据导出的.xsa文件构建整个镜像系统,但在新系统启动加载内核之前,即启动成功完成FSBL,u-boot加载,PL端FPGA信号是正常输出的,但一旦加载系统内核和设备树之后,PL端的信号立刻全没有,导致后面系统无法正常工作。

    这里记录下解决问题的思路,以供后面复习参考。

二.解决思路

        路径: 学习设备树相关知识语法, 用途 ——> 查询设备树zynq中的的来源,应用方法——> 在xilinx-wiki中查看设备树生成帮助——>下载分析工具 ——> DTG直接生成dts文件——> dtc编译成dtb ——> 使用DTB comparison 比较旧的dtb文件与新生成的dtb的不同。

1.设备树基本知识

          旧版Linux内核中, ARM架构的板级硬件信息硬编码在内核文件中 → 导致大量的描述文件. c和.h存在,对各种芯片。板子采取硬编码, 致使内核虚胖,特定开发有很多不用的垃圾代码。
        引入设备树DTS文件描述硬件的数据结构,实现驱动代码与设备信息相分离(硬编码设备方式一旦外围设备发生变化, 驱动代码就要重写了)。
        引入DTS, 驱动代码只负责处理驱动的逻辑, 设备的具体信息存放在设备树文件中。只是接口信息变化, 驱动逻辑不变化,只需要修改设备树文件。设备树将信息传递给Linux系统。具体描述方法遵循设备树的语法,需要具体学习如何写设备树。

        在Petalinux中,在进行build之后,根据.xsa文件会自动生成dts文件,system-top.dts,其中会引用 (用#include方式)pl.dtsipcw. dtsi, zynq-7000.dtsi。另外有system-conf. dtsi, system-user.dtsi

zynq-7000.dtsi:描述zynq-7000 系列处理器相同的硬件外设配置信息(PS端)。
pl.dtsi: 描述在vivado当中添加PC端外, 配置信息。
pcw.dtsi: 描述在vivado中已经使能的PS外设。

system-user.dtsi:用户自定义的硬件描述信息,使用设备树语法添加。

2.设备树搭建分析

        在xilinx-wiki中学习设备树搭建流程和设备树分析工具下载使用:

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842279/Build+Device+Tree+Blob

        使用具体的工具:

dtc:用来直接编译dtbb文件以及反编译dtb文件到dts文件。


 

DTG: 设备树生成工具,用来直接从. xsa硬件文件中生成设备树文件,下载指导链接:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/341082130/Quick+guide+to+Debugging+Device+Tree+Generator+Issues


 

DTB Compansns: 在Linux源码内核中自带的, 比较2个dtb文件不同之处的脚本。     

3.问题发现

        具备了一定的设备树和设备树构建知识,根据实际的情况可以摸排出问题,直接使用DTG不通过petalinux生成dts文件,再由 dtc编译成dtb ,接着 使用DTB comparison 比较旧的dtb文件与新生成的dtb的不同。

        这里是因为之前有成功的内核镜像文件image.ub作为参考,根据博客如何直接修改image.ub的方法,将运行正常的image.ub分解出设备树文件system.dtb文件,来于新构建的dtb文件对比。发现是对于clkc的属性值fclk_enable不同。同理,反编译petalinux编译的dtb文件,也发现fclk_enable的值为<0x00>,意味着关闭了fclk时钟。

        flck时钟为什么又会影响PL的信号呢?回到vivado工程,查看时钟的引用,发现在zynq IP中打开了PS端输出给PL的时钟FCLK的0和1。

        查看几个自动生成的设备树文件dtsi中,zynq-7000.dtsi正确描述了fclk_enable属性开启,但是pcw.dtsi却引用了clkc,将这个属性改成了<0x00>导致最终编译出的dtb默认关闭了FCLK。所以加载内核和设备树文件后,PL无法得到PS端给的时钟而无法正常工作。问题查明。

三.解决方法

       查找问题蜿蜒曲折,小问题查了好几天,说明对整体构建和PL,PS关联的不熟练。实际只用做设备树的修改,就可以正常运行。用到petalinux设备树构建知识和设备树语法

 Petalinux下的设备树修改:
 (直接用Petalinux生成)

经过工程配置

petalinux-config
petalinux-config -c  kernel
petalinux-config  -c  rootfs

在编译工程之前, 用system-user. dtsi文件设置属性覆盖 pcw. dtsi 的配置。

 cd <工程目录>/project-spec/meta-user/recipes-bps/device-tree/files/

引用clkc并配置属性、保存。
文件内容如下:

/include/ "system-conf.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/media/xilinx-vip.h>
#include <dt-bindings/phy/phy.h>

/ {
 
};

&clkc {
    fclk-enable = <0xf>;
    ps-clk-frequency = <33333333>;
};


再用Petainux_ build编译工程即可正确生成system.dtb文件。

再打包命令→ 得到正常image.ub文件。

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值