在嵌入式编程中,使用 uboot 时应该修改哪些 dts 文件?
Posted
技术标签:
【中文标题】在嵌入式编程中,使用 uboot 时应该修改哪些 dts 文件?【英文标题】:In embedded programming, when using uboot which dts files should i modify? 【发布时间】:2022-01-06 17:25:35 【问题描述】:除了 uboot 文档之外,我还需要更多参考资料。有什么我可以阅读以加深理解的吗?
在使用 uboot 时,我对我的构建使用的 dts
文件感到困惑。我是否修改了所有相关的dts
文件,包括kernel/
和uboot/
目录。
或者我是否将其设置在特定文件中?我可以告诉我启动到 linux 后使用的是哪个 dts
吗?
比如我用的是imx8mq-evk板,但是有很多dts文件可供选择。
【问题讨论】:
【参考方案1】:嗯,你的问题有很多部分。让我们从查看 U-Boot 中的 configs/imx8mq_evk_defconfig 开始,我们可以在其中看到:
CONFIG_DEFAULT_DEVICE_TREE="imx8mq-evk"
所以在这种情况下,arch/arm/dts/imx8mq-evk.dts 是主要的 dts,并将 #include 所有它需要的 dtsi 文件。除了一个例外。 arch/arm/dts/imx8mq-evk-u-boot.dtsi 文件也将自动包含在内。
您应该为 U-Boot 修改哪些文件? 仅 arch/arm/dts/imx8mq-evk-u-boot.dtsi 将被直接修改,所有其他文件都是从 Linux 内核源直接复制的。顺便说一句,是的,有反例,但它们没有遵循最佳实践。
什么设备树将被传递给内核?嗯,这有点取决于你。假设您正在使用bootefi
(以及额外的加载程序,例如 GRUB 或 systemd-boot,或者直接从内核构建中引导 Image 文件),如果您不传入设备树内存中的地址,将传递正在使用的 U-Boot。否则,您将 load
来自其他来源的 dtb 文件,通常指向 $fdt_addr_r
指向的内存地址,然后将其作为第二个参数传递给 bootefi
。如果您使用 booti
引导,则您在内存中加载的设备树是传递的第三个参数,通常也是 $fdt_addr_r
。
现在,您注意到有许多 dtb 文件,这是真的,但该平台没有自动逻辑来确定要使用哪些外围设备,这是所有其他变体的来源,您配置的额外 IO在 EVK 上满足您的特定需求。
【讨论】:
哇,谢谢,这很有意义,如果我继续遇到问题(加载程序),我知道现在该研究什么。现在,如果我可以要求跟进,唯一包含的dtsi
文件是在 dts
文件开头明确声明为 included
的文件,对吗?如果dtsi
还包含更多内容,那么这些内容也是如此。我只是不知道我查看的文件是否正确。
正确,dts文件是通过C预处理器传递的,所以#includes后面跟着#includes和#defines工作等等。以上是关于在嵌入式编程中,使用 uboot 时应该修改哪些 dts 文件?的主要内容,如果未能解决你的问题,请参考以下文章
uboot研读笔记 | 03 - 初步移植uboot 2012.04到JZ2440(修改时钟,配置串口)