1 设备树入口文件
设备树目录dts下可能有多个dts文件,编译完成后也可能会生成多个dtb文件,那么如何确定哪个是入口文件呢? dtb编译Makefile
./arch/arm64/boot/dts/Makefile:1:dtb-$(CONFIG_ARCH_VEXPRESS) += rtsm_ve-aemv8a.dtb foundation-v8.dtb \
./arch/arm64/boot/dts/Makefile:3:dtb-$(CONFIG_ARCH_VEXPRESS) += juno.dtb
./arch/arm64/boot/dts/Makefile:4:dtb-$(CONFIG_ARCH_XGENE) += apm-mustang.dtb
./arch/arm64/boot/dts/Makefile:5:dtb-$(CONFIG_ARCH_SUN50IW1P1) += sun50iw1p1-fpga.dtb sun50iw1p1-perf1_v1_0.dtb \
./arch/arm64/boot/dts/Makefile:8:dtb-$(CONFIG_ARCH_SUN50IW2P1) += sun50iw2p1-fpga.dtb sun50iw2p1-perf1_v1_0.dtb \
./arch/arm64/boot/dts/Makefile:11:dtb-$(CONFIG_ARCH_SUN50IW3P1) += sun50iw3p1-fpga.dtb sun50iw3p1-soc.dtb \
./arch/arm64/boot/dts/Makefile:14:dtb-$(CONFIG_ARCH_SUN50IW6P1) += sun50iw6p1-fpga.dtb sun50iw6p1-soc.dtb \
./arch/arm64/boot/dts/Makefile:24:DTB_LIST := $(dtb-y)
从上面可以看出编译哪些dts文件是由宏来控制的,kernel定义了CONFIG_ARCH_SUN50IW3P1
grep "CONFIG_ARCH_SUN50IW3P1" ./.config -rns
257:CONFIG_ARCH_SUN50IW3P1=y
dtb-$(CONFIG_ARCH_SUN50IW3P1) += sun50iw3p1-fpga.dtb sun50iw3p1-soc.dtb \
sun50iw3p1-perf1_v1_0.dtb sun50iw3p1-perf2_v1_0.dtb \
sun50iw3p1-y1.dtb sun50iw3p1-y2.dtb sun50iw3p1-t1.dtb
上面的几个dts被编译到,实际使用哪个或者哪几个由其他条件决定。当前编译的是board = t1的代码,应当是用sun50iw3p1-t1.dtb。
更为准确的方法是找到编译、拷贝的脚本,脚本会将使用的dtb文件拷贝到指定位置,或者找到当前正在使用的dtb,也dts目录下生成的dtb对比。内容一致的就是要使用的,也可以根据大小判断。对应的dts文件就是要用的dts。
2 设备树中的/dts-v1/;
在设备树文件中前面位置都可以看到有下面一行内容,这个在dts的版本号,v1表示第一个版本,后面可能会有新的版本出现。
/dts-v1/;
在kernel源码目录下执行grep "dts-v1" ./ -rns
,可以找到dts-v1使用的位置。dts-v1要被kernel/scripts/dtc/目录下关于dts解析的文件使用,具体dts-v1作用,参考相关源码。