一:主要关键字定义说明
<1>. DT :Device Tree
<2>. FDT : Flattened Device Tree
<3>. OF :Open Firmware
<4>. DTS :device tree source
<5>. DTSI:device tree source include
<6>. DTB :device tree blob
<7>. DTC :device tree compiler
二:制作镜像:
FIT镜像制作示例,FIT是内核、设备树、文件系统合并成一个文件的一种镜像,并且一个FIT镜像里边可能包含了很多个内核、设备树、文件系统等;
<1>准备文件:
a.可执行程序:mkimage;
该文件在U-Boot编译完成后,源码目录下/tools/有编译好的二进制程序;
b.分开的镜像文件:zImage、rootfs.gz、dev-tree.dtb;
zImage由内核源码编译后在arch/arm/boot/zImage目录下;
rootfs.gz由busybox编译后,添加相关文件、目录后制作而成,参见 “busybox根文件系统制作”;
dev-tree.dtb是设备树编译好后的二进制文件,在linux源码目录执行make dtbs可生成,也可用linux源码目录的/scripts/dtc/dtc工具编译;
c.描述合并后镜像信息的文件:image_info.its;
*.its文件需要用户自己编写,编写时可以参考U-Boot源码目录下的./doc/uImage.FIT/kernel.its文件编写;
<2> 生成FIT镜像
命令:./mkimage -f image_info.its fit.img
其中:-f 表明要依据its文件内描述的文件制作FIT镜像;image_info.its文件是针对当前单板构建的镜像信息描述文件;fit.img是最后生成的FIT镜像文件名,文件名和拓展名自定义(file命令可以看到不管文件拓展名是啥,文件本质是:data)
注:执行该条命令时,需要把its文件内描述的镜像文件放在指定的路径下,mkimage工具会依据its文件内描述自动加载文件,生成的fit.img文件也可以依据需求指定文件的路径,最好是绝对路径。
FIT镜像制作示例,FIT是内核、设备树、文件系统合并成一个文件的一种镜像,并且一个FIT镜像里边可能包含了很多个内核、设备树、文件系统等;
mkimage -f /fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/fit-qcom-ipq4019-ap.dk07.1-c1.its fit-qcom-ipq4019-ap.dk07.1-c1.itb 来完成。
其中
fit-qcom-ipq4019-ap.dk07.1-c1.itb 为最终生成的文件
fit-qcom-ipq4019-ap.dk07.1-c1.its 用来说明itd文件如何生成。
制作FIT(Flattened device tree)镜像
./tools/mkimage -f image_info.its fit.img
<3> xxx.its的文件内容
root@suiyuan626-vm:~# cat /fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/fit-qcom-ipq4019-ap.dk07.1-c1.its
/dts-v1/;
/ {
description = "ARM OpenWrt FIT (Flattened Image Tree)";
#address-cells = <1>;
images {
kernel@1 {
description = "ARM OpenWrt Linux-4.4.60";
data = /incbin/("/fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/Image-initramfs");
type = "kernel";
arch = "arm";
os = "linux";
compression = "none";
load = <0x80208000>;
entry = <0x80208000>;
hash@1 {
algo = "crc32";
};
hash@2 {
algo = "sha1";
};
};
fdt@1 {
description = "ARM OpenWrt qcom-ipq4019-ap.dk07.1-c1 device tree blob";
data = /incbin/("/fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/linux-4.4.60/arch/arm/boot/dts//qcom-ipq4019-ap.dk07.1-c1.dtb");
type = "flat_dt";
arch = "arm";
compression = "none";
hash@1 {
algo = "crc32";
};
hash@2 {
algo = "sha1";
};
};
};
configurations {
default = "config@1";
config@1 {
description = "OpenWrt";
kernel = "kernel@1";
fdt = "fdt@1";
};
};
};
cp -fpR /fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/fit-qcom-ipq4019-ap.dk07.1-c1.itb /fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/bin/ipq806x/openwrt-ipq806x-qcom-ipq4019-ap.dk07.1-c1-fit-uImage.itb
同理通过mkimage 制作FTD文件
mkimage -f /fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/fit-qcom-ipq40xx-ap.dkxx.its /fae/qsdk/arm/spf6.1.1.new/qca-networking-2018-spf-6-1-0_qca_oem.git/qsdk/build_dir/target-arm_cortex-a7_uClibc-1.0.14_eabi/linux-ipq806x/fit-qcom-ipq40xx-ap.dkxx.itb
fit-qcom-ipq40xx-ap.dkxx.itb 用来打包固件
其中
三:DTS说明
那么可以把不变的东西和变化的东西分开来做。不变的逻辑,以少量精确的代码搞定;变化的资源,可以形成一个资源配置文件。基于这种思想,Linux device tree(DTS)便应运而生。所谓DTS,它是一个以 ".dts"结尾的文件,该文件会被编译成dtb文件,uboot会把该文件放置到某特定的内存区域,并把相关参数传给kernel;kernel起来之初,便会去解析该文件,以便拿到板载资源配置。DTS文件中内容框架是一棵树的结构,其由一系列的结点(node)和属性(property)键值对组成,此处不进行具体分析。DTS文件一般放在 "kernel/arch/arm/boot/dts/ " 目录下。
Device tree结构约定
Device tree 常用节点类型
所有device tree节点必须有1个根节点/, 还必须在根节点下有如下2个节点:
1、Cpu节点
2、memory节点 ---ePAPR规范指定了memory是必须的节点,名称也必须是memory。内存节点描述了系统物理内存的信息,如果系统中有多个内存范围,device tree中可能会创建多个内存节点,或者在一个单独的内存节点中通过reg属性指定内存的范围、
3、Chosen节点不代表一个真正的节点,只是传到参数的作用,chosen里的数据也不代表硬件。
4、Cpus节点
必须的节点,不代表真实设备,存放cpu节点的一个容器
5、cpu节点描述具体的硬件执行单元
6、soc节点表示一个系统级的芯片
文档 documentation/devicetree/bindings
四:DTS文件路径位置
Z:\fae\qsdk\arm\spf6.1.1.new\qca-networking-2018-spf-6-1-0_qca_oem.git\qsdk\qca\src\linux-4.4\arch\arm\boot\dts
描述文件存放路径: kernel/arch/arm/boot/dts
3个dts文件组成:
qcom-ipq4019.dtsi
qcom-ipq4019-ap.dk07.1.dtsi
qcom-ipq4019-ap.dk07.1-c1.dts
qcom-ipq4019-ap.dk07.1-c1.dtb
五:编译使能DTS
Z:\fae\qsdk\arm\spf6.1.1.new\qca-networking-2018-spf-6-1-0_qca_oem.git\qsdk\qca\src\linux-4.4\arch\arm\boot\dts 的makefile 中
六:配置文件
Z:\fae\qsdk\arm\spf6.1.1.new\qca-networking-2018-spf-6-1-0_qca_oem.git\qsdk\qca\src\linux-4.4\arch\arm\configs
qcom_defconfig
七:加载执行过程分析
https://www.cnblogs.com/chineseboy/p/5235608.html
八:系统内核映射
/sys/firmware/devicetree