英文:
When should we use device tree overlay over multiple device tree blob?
问题
你是否应该创建多个dtsi文件以适应每种配置,然后编译多个dtb文件并将其安装在/boot/中,还是应该使用设备树叠加?
-
如果你想继续使用现有的方法,为每种硬件配置创建多个独立的dts文件,然后编译并安装对应的dtb文件,这是一种有效的方式。这样,每种配置都有一个单独的dtb文件,可以在启动时选择正确的dtb。
-
另一方面,使用设备树叠加也是一种可行的方法。你可以保持一个基本的dts文件,然后为每种配置创建叠加(overlay)文件,每个叠加文件仅包含与特定配置相关的更改。在运行时,可以加载适当的叠加文件以覆盖基本的设备树信息,从而适应不同的硬件配置。
选择哪种方法取决于你的需求和偏好。使用叠加文件可以使设备树更加模块化,但也需要在运行时加载叠加,而不是在编译时生成不同的dtb文件。根据你的具体情况和偏好,选择合适的方法。
英文:
I have a custom board based on iMX8MP processors. This board can have 3 different hardware configuration. Basically the number of adc
and shift registers
are different between them. I want to be able to select correct dtb
at boot time based on a truth table. I have done a u-boot
script to select correct dtb
which should be located in /boot/.
For a time being, I have generated all dtbs
with dtc
command. Then I generated dts
again from those dtbs
to get rid of all dtsi
and to have one compact dts
file for each hardware configuration.
My yocto recipe look like this:
SUMMARY = "U-boot script: auto select dtb for devboard"
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""
COMPATIBLE_MACHINE = "devboard"
DEPENDS = "u-boot-mkimage-native dtc-native"
SRC_URI = "file://autoselect-dtb.txt \
file://devboard-cirrus8.dts \
file://devboard-cirrus16.dts \
file://devboard-cirrus32.dts"
do_compile() {
mkimage -A arm64 -O linux -T script -C none -d "${WORKDIR}/autoselect-dtb.txt" boot.scr
dtc -I dts -O dtb -o devboard-cirrus8.dtb ${WORKDIR}/devboard-cirrus8.dts
dtc -I dts -O dtb -o devboard-cirrus16.dtb ${WORKDIR}/devboard-cirrus16.dts
dtc -I dts -O dtb -o devboard-cirrus32.dtb ${WORKDIR}/devboard-cirrus32.dts
}
do_install() {
install -d ${D}/boot/
install -m 0644 boot.scr ${D}/boot/
install -m 0644 devboard-cirrus8.dtb ${D}/boot/
install -m 0644 devboard-cirrus16.dtb ${D}/boot/
install -m 0644 devboard-cirrus32.dtb ${D}/boot/
}
FILES:${PN} = "/boot/*"
I am aware that this is not good practice. Now I am confused, should I create multiple dtsi to suit each configuration then compile multiple dtb then install it in /boot/ or should I use device tree overlay ?
答案1
得分: 3
这取决于使用情况。DTSI用于开发人员,而DTO用于最终用户。
因此,如果您正在为某些客户开发一个“平台”,比如树莓派(RPi),或者在某些情况下,某人需要非常频繁地更改功能(集成商、服务人员),您应该优先选择DTO,让最终用户决定他们需要哪些节点。
对于您作为开发者,或者在您的DTB已经是最终版本的情况下(例如,一些设备已经从工厂发布,不再打算重新配置),我建议使用DTSI,带有定义。
如果您想在启动时选择要加载的DTB,我认为这完全取决于您 - 是使用基本DTB的DTO,还是不使用DTO的不同DTB。
注意:
为了避免编译和反编译循环,您可以使用cpp(C预处理器)来摆脱所有类似于DTSI的内容:
CPP_FLAGS := -nostdinc -I $(INCLUDE) -undef -x assembler-with-cpp
$(TARGET_PP): $(TARGET_DTS)
cpp $(CPP_FLAGS) $(TARGET_DTS) $(TARGET_PP)
然后,您将获得$(TARGET_PP)文件,其中包含您的整个DTS及所有包含的内容(但仍然不包括未分组的节点)。
英文:
It depends on use case. DTSI's are for developers while DTO's are for end-users.
So if you are working on a "platform" for some customers, like RPi or cases when someone needs to change functionality (integrators, service staff) very frequently - you should prefer DTO's to let end-users decide what nodes they need.
For you as for developer, or in case your DTB is final (for example - some device which is released form factory and not intended to be reconfigured anymore) I would suggest use DTSI's, with defines.
If you want to select DTB to load at boot time, I think it's all up to you - to use DTO's with base DTB or to use different DTB's w/o DTO's.
NB
To omit compiling-decompiling cycle you can use cpp (C Preprocessor) to get rid of all DTSI's like that:
CPP_FLAGS := -nostdinc -I $(INCLUDE) -undef -x assembler-with-cpp
$(TARGET_PP): $(TARGET_DTS)
cpp $(CPP_FLAGS) $(TARGET_DTS) $(TARGET_PP)
and you'll get $(TARGET_PP) file which will contain your whole DTS with all includes (but still with not grouped nodes).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论