米尔电子
直播中

jf_39110170

1年用户 343经验值
擅长:可编程逻辑 嵌入式技术 EDA/IC设计
私信 关注
[技术]

【米尔-TIAM62开发板-接替335x-试用评测】+(三)手把手创建Uboot设备树与内核设备树实战

接上两篇:

【米尔-TIAM62开发板-接替335x-试用评测】+(一)手把手配置Yocto - 米尔电子

【米尔-TIAM62开发板-接替335x-试用评测】+(二)配置U-Boot步骤实战

感谢电子发烧友william hill官网 提供的试用平台,感谢深圳市米尔科技有限公司提供的试用机会,感谢深圳市米尔科技有限公司茜茜的周日及时回复和帮助!感谢深圳市米尔科技有限公司提供的技术支持与帮助!

谢谢!
wKgaomVRomaAMUzUAAoQXxA23Cc184.png

本周,我对设备树这一数据结构进行了深入的研究和学习。设备树是一种特殊的语法格式,用于描述嵌入式系统中的硬件信息。这种数据结构允许我们在不直接访问硬件的情况下,通过软件来识别和控制硬件设备。

首先,我了解到设备树是通过在U-Boot和Linux内核中使用的。U-Boot是一种引导加载程序,它在系统启动时使用设备树来识别和控制硬件设备。而Linux内核则使用设备树来获取硬件设备的配置信息,以便加载适当的驱动程序。

然后,我研究了设备树的层级结构。在U-Boot中,设备树文件通常包括一个主设备树文件和其他一些子设备树文件。这些文件描述了各种硬件设备的配置信息,例如CPU、内存、存储设备等。在Linux内核中,设备树层级结构更为复杂,它包括一个主设备树文件和其他一些子设备树文件。这些文件描述了各种硬件设备的配置信息和连接关系。

接下来,我学习了如何添加设备树。在U-Boot中,我们可以复制现有的设备树文件,然后修改它以满足我们的需求。我们还可以修改Makefile文件来编译我们的设备树文件。在Linux内核中,我们可以复制现有的设备树文件,然后修改它以满足我们的需求。我们还可以修改配置文件来指定我们的设备树文件。

最后,我研究了如何使用设备树。在U-Boot中,我们可以使用命令行工具来加载和运行我们的设备树文件。在Linux内核中,我们可以使用设备驱动程序来访问和控制硬件设备。这些驱动程序是根据设备树文件中的配置信息生成的。

通过本周的学习,我对设备树有了更深入的理解。我了解到它是一种强大的工具,可以让我们更好地管理和控制嵌入式系统中的硬件设备。我也学会了如何添加和使用设备树文件。我相信这些知识将对我的嵌入式系统开发之旅产生积极的影响。
以下是我的一些体会,希望对您能有所帮助!
(一)研究方法:
经过对米尔-TIAM62开发板-接替335x-试用评测实战,对于设备树(Device
Tree)创建和使用的心得,我建议按照以下步骤进行。

  1. 理解设备树的概念和用途:首先,你需要理解设备树是一种数据结构,用于描述硬件设备的信息。它常常被用在嵌入式系统中,特别是在描述系统的硬件配置方面。
  2. 学习设备树的语法和结构:你需要了解并理解设备树特有的语法格式和结构。设备树文件通常是以.dts.dtsi为后缀的文件,它们描述了设备的层级关系和属性等信息。
  3. 研究示例设备树文件:查看示例的设备树文件,如上面代码中列出的myb-am62x-dev.dtsmyb-am62x-dev-u-boot.dtsi等,可以帮助你理解设备树的具体内容和结构。
  4. 制作自己的设备树文件:尝试复制并修改一个示例设备树文件,以创建你自己的设备树。这可能包括选择类似的设备树文件,修改设备树Makefile以包含你的新设备树文件,以及修改配置文件以使用你的新设备树。
  5. 编译和使用设备树文件:学习如何编译设备树文件,例如使用dtc工具将.dts文件编译为.dtb文件,然后将.dtb文件用于系统启动过程中的设备信息获取。
  6. 深入学习特定硬件平台的设备树:针对你正在使用的硬件平台,深入研究其特定的设备树层级关系和配置。这将帮助你更好地理解如何配置和使用设备树来描述你的硬件环境。
  7. 实践操作:通过实际操作和实践,不断加深对设备树的理解和使用。尝试解决可能出现的问题,并查阅相关文档以获取更多信息。
  8. 参加社区或william hill官网 :加入相关的社区或william hill官网 ,如电子发烧友开发者william hill官网 ,与其他开发者交流和学习。
  9. 持续学习和更新知识:嵌入式系统和设备树是一个不断发展的领域,所以保持学习的热情和更新的意愿是非常重要的。关注新的发展趋势和技术变化,以便随时调整你的知识和技能。
    学习创建和使用设备树需要学习和实践。重要的是保持耐心,不断学习和探索。
    wKgaomVRo4qAY1ONAAMN8J-DimY018.png

( 二)设备树原理:
接下来我通过基本原理和米尔-TIAM62开发板设备树(Device
Tree)实例 详细介绍我的技术经验。
在板载设备树中,如何通过修改设备树层级来增加新的设备树节点?

原理:在设备树中,可以通过添加新的设备树节点来扩展设备树。这些新的节点可以添加到现有的子树中,也可以创建新的子树。在添加新节点时,需要遵循设备树的语法规则,包括节点的名称、属性和连接关系等。

设备树层级通常包括以下几个部分:

根节点(Root Node):设备树的根节点代表整个系统,它包含了所有其他的节点。

处理器节点(Processor Node):处理器节点代表了系统中的处理器,它包含了处理器的配置信息,如型号、频率等。

内存节点(Memory Node):内存节点代表了系统中的内存,它包含了内存的配置信息,如大小、地址等。

I/O 节点(I/O Node):I/O 节点代表了系统中的输入输出设备,如串口、USB 接口等。

桥接节点(Bridge Node):桥接节点用于将不同的设备节点连接起来,形成系统拓扑结构。

设备驱动节点(Device Driver Node):设备驱动节点包含了设备的驱动程序信息,如驱动程序的名称、版本等。

这些节点按照层级关系组织在一起,形成一个树状结构。在设备树中,每个节点都有一个唯一的名称(或编号),并且可以包含多个子节点。通过设备树,系统启动时可以按照层级关系逐级加载驱动程序,并初始化硬件设备。
wKgaomVRpbqAWE4GAAQZ7OFLs7Y850.png

例子:假设我们要在MYD-YM62X的设备树中添加一个新的节点,可以按照以下步骤进行:

  1. 复制现有的设备树文件,例如myb-am62x-dev.dts,并将其重命名为myb-am62x-newdev.dts。
  2. 在myb-am62x-newdev.dts中添加新的设备树节点。例如,我们可以添加一个名为"new_device"的节点,该节点包含一个名为"reg"的属性,表示该设备的寄存器地址。
/dts-v1/;
/include/ "myb-am62x-common.dtsi"

/ {
    model = "MYD-YM62X";
    ...
    new_device: new_device@0 {
        compatible = "myd,new_device";
        reg = <0x0000>;  // 设备的寄存器地址
        ...
    };
    ...
};
  1. 修改设备树的Makefile文件,将新的设备树文件添加到编译列表中。例如,在Makefile中添加以下内容:
dtb-$(CONFIG_SOC_K3_AM625) +=myb-am62x-dev.dtb \                            
myb-am62x-r5-dev.dtb \
myb-am62x-newdev.dtb \
                             ...
  1. 修改板子的配置文件,将默认的设备树改为新的设备树。例如,在配置文件中添加以下内容:
CONFIG_DEFAULT_DEVICE_TREE="myb-am62x-newdev"

以上步骤完成后,新的设备树节点就可以成功地添加到板载设备树中了。

image.png

考虑一个嵌入式系统,它包含一个处理器、一块内存、一个网络接口和一个USB接口。设备树可以描述这个系统的层级关系如下:

处理器信息(包含在/dts/model/cpus节点中)

内存信息(包含在/dts/model/memory节点中)

网络接口信息(包含在/dts/model/network节点中)

USB接口信息(包含在/dts/model/usb节点中)

每个节点可以有子节点,以进一步描述硬件的详细信息。例如,网络接口节点可能包含一个子节点,描述MAC地址、IP地址等信息。

当U-Boot或Linux内核引导时,它们会读取和解析这个设备树文件,以了解系统硬件的配置,并据此进行正确的初始化操作。

这就是板载设备树层级的基本介绍。具体实现可能会因硬件和固件的不同而有所差异,但基本原理是相同的:设备树提供了一种标准化的方式来描述和初始化硬件设备。这种数据结构允许固件(例如U-Boot和Linux内核)在引导过程中获取和解析这些信息,以便正确地初始化和操作硬件。

(三)本人网名"还没吃饭"手把手设备树实战(以米尔-TIAM62开发板为例):

1.Uboot创建设备树。
选择类似的设备树文件:从源码根目录下进入arch/arm/dts目录,复制myb-am62x-dev.dts为myb-am62x-test.dts等。
修改设备树Makefile:接着修改目录下的设备树Makefile,增加内容如下:dtb-$(CONFIG_SOC_K3_AM625) += myb-am62x-dev.dtb等。
修改板子配置文件:如然后修改R5的配置文件test_am62x_r5_defconfig配置文件默认的设备树,如下:CONFIG_DM_GPIO=y等。

2.Kernel创建设备树。
MYIR系列设备树在arch/arm64/boot/dts/myir/目录。用户在该目录也可以通过复制MYIR的设备树重命名,方法过程如uboot类似。
在U-Boot中,设备树被用于描述板级设备的配置信息。U-Boot最终将设备树编译成dtb文件,使用过程中通过解析该dtb文件来获取板级设备信息。对于MYD-YM62X板,U-Boot源码中包含着多个设备树文件,如myb-am62x-dev.dts、myb-am62x-r5-dev.dts等。这些文件描述了不同设备的配置信息,如MYD-AM62X R5和A53的设备树。在编译MYD-YM62X板uboot源码时会合并相关的所有dts/dtsi文件,生成R5阶段的设备树myb-am62x-r5-dev.dtb和uboot阶段默认使用的myb-am62x-dev.dtb文件。

在Linux内核中,设备树也被用于描述硬件的配置信息。Linux内核中的设备树大概层级关系为:k3-am62-main.dtsi->k3-am62.dtsi->k3-am625.dtsi->myd-ym62x系列设备树。这些文件包含了myd-ym62x系列的所有资源配置,如针对不同myc-ym62x核心板的设备树配置,默认HDMI显示等。对于基本设备树的外设资源补充,可以动态加载。设备树是一种数据结构,它描述了一些设备的信息,就像一张设备的“清单”。这些设备信息可以是片上的设备,也可以是片外的设备。这些信息可以存放在一个文件中,例如在Linux系统中,这个文件通常叫做device tree source(DTS)。

在计算机启动时,像U-Boot或内核这样的程序需要知道这些设备的信息,以便正确地与它们交互。于是,设备树在这个过程中就发挥了作用。这些程序会“读取”设备树文件,就像我们打开一个文件查看里面的内容一样,从而获取板级设备的详细信息。

详细myir-ti-uboot 设备树介绍:
对于MYD-YM62X系列的设备树信息,我们有以下几款设备树:
myb-am62x-r5-dev.dts:这是MYD-AM62X R5的设备树。
myb-am62x-dev.dts:这是MYD-AM62X A53的设备树。
myb-am62x-dev-binman.dtsi:通过使用binman工具,可以配置和生成特定于AM62x平台的U-Boot二进制映像文件,这个文件包含了引导程序、设备树(Device Tree)、启动脚本等信息。
myb-am62x-dev-u-boot.dtsi:这是针对myb-am62x系列特定配置的设备树。
当编译MYD-YM62X板的U-Boot源码时,会合并相关的所有DTS/DTI文件,生成R5阶段的设备树myb-am62x-r5-dev.dtb和U-Boot阶段默认使用的myb-am62x-dev.dtb文件。
myir-ti-linux 设备树介绍:
myir-ti-linux的设备树大概的层级关系为:k3-am62-main.dtsi -> k3-am62.dtsi -> k3-am625.dtsi -> myd-ym62x系列设备树。
下面是我们MYD-YM62X系列的设备树的详细信息:

k3-am62-main.dtsi:这个文件包含了myd-ym62x系列的所有资源配置。
myd-ym62x-6231.dts、myd-ym62x-6252.dts 、myd-ym62x-6254.dts:这些是针对不同的myc-ym62x核心板的设备树配置,默认HDMI显示。
myd-ym62x-hdmi-audio.dtso、myd-ym62x-lvds-dual.dtso、myd-ym62x-lvds.dtso、myd-ym62x-lvds-j6.dtso:这些是针对基本设备树的外设资源补充,可以动态加载。

(四)这次实战心得体会的总结:
鱼骨图表示

├─ 设备树介绍
│ ├─ 定义
│ │ └─ 描述硬件配置信息
│ │ ├─ 处理器
│ │ ├─ 内存
│ │ ├─ 存储设备
│ │ ├─ 网络接口
│ │ └─ 其他设备
│ └─ 在嵌入式系统中的应用
│ ├─ U-Boot
│ │ ├─ 描述板级设备信息
│ │ ├─ 编译成dtb文件
│ │ ├─ 通过解析dtb获取板级设备信息
│ │ └─ MYD-YM62X板的设备树文件
│ │ ├─ myb-am62x-dev.dts
│ │ ├─ myb-am62x-r5-dev.dts
│ │ └─ myb-am62x-dev-u-boot.dtsi
│ └─ Linux内核
│ ├─ 描述硬件配置信息
│ ├─ 层级关系
│ │ ├─ k3-am62-main.dtsi
│ │ ├─ k3-am62.dtsi
│ │ ├─ k3-am625.dtsi
│ │ └─ myd-ym62x系列设备树
│ └─ 外设资源补充
│ └─ 可以动态加载
└─ 系统开发过程
├─ U-Boot创建设备树
│ ├─ 选择类似的设备树文件
│ │ └─ 复制myb-am62x-dev.dts为myb-am62x-test.dts等
│ ├─ 修改设备树Makefile
│ │ └─ 增加内容:dtb-$(CONFIG_SOC_K3_AM625) += myb-am62x-dev.dtb等
│ └─ 修改板子配置文件
│ └─ 修改R5的配置文件test_am62x_r5_defconfig,如下:CONFIG_DM_GPIO=y等
└─ Kernel创建设备树
└─ MYIR系列设备树目录在arch/arm64/boot/dts/myir/下

通过以上步骤,您将能够逐步掌握设备树的概念、创建、编译和使用过程,以及在U-Boot和Linux内核中加载和使用设备树的方法。通过实践创建设备树和学习特定硬件平台的设备树配置,您将能够更好地理解嵌入式系统开发中的设备树角色和用途。持续学习和深入发展将有助于你在嵌入式系统开发领域取得更大的进步。通过理解设备树的概念、语法和应用,学习特定硬件平台的设备树文件,实践创建设备树文件的练习,学习设备树的调试和问题解决,以及持续学习和更新知识,可以更好地理解和应用设备树,为嵌入式系统的开发和学习打下坚实的基础。
希望以上心得对您会有所帮助!
谢谢!
本人在本william hill官网 内的试读[经验] :

《电子工程师必备——九大系统威廉希尔官方网站 识图宝典》+附录2化整为零和集零为整威廉希尔官方网站 分析方法

《运算放大器参数解析与LTspice应用仿真》+学习心得4第三章专用放大器

《Android Runtime源码解析》+深入体会第六章ART的执行(4)

本人在本william hill官网 内的帖子:
6—手把手实战Linux控制小车 - RISC-V技术

【米尔-TIAM62开发板-接替335x-试用评测】+(一)手把手配置Yocto

【飞凌AM6254开发板试用】 4-机器视觉(原创) - 飞凌嵌入式

【飞凌AM6254开发板试用】+5内核编译串口芯片Linux驱动(原创)

【Milk-V Duo 开发板免费体验】4-Linux控制小车动作(原创)首发

【飞凌i.MX9352开发板试用】+机械臂游戏2游戏操纵杆控制四自由度机械臂(开源)原创首发

谢谢!

更多回帖

发帖
×
20
完善资料,
赚取积分