Rockchip android 系统平台使用 parameter 文件来配置一些系统参数,比如定义串口号,固件版本,nand flash 分区信息等等。Parameter 的参数是由 BootLoader 解析的。另外,Parameter 文件也是 upgrade_tool (rockchip 烧录工具) 烧录系统的依据,这点很重要,由此可知为何 BootLoader 通过解析 Parameter 文件即可获取到系统的烧录信息与相关参数。
DTB文件可以存放于 android 标准格式的 boot/recovery 分区中,也可以存放于 resource 分区。U-boot 假定 kernel 启动必须加载 dtb 文件,dtb 由 Uboot 传递给 kernel。
解析代码位于:u-boot/board/rockchip/common/rkloader/parameter.c
调用过程如下:
load_disk_partitions(void)
GetParam(0, param) -------- 从 0 地址中获取 param,也从侧面反应 upgrade_tool 将 parameter.txt 烧写到 0 地址中
StorageReadLba(param_addr+i*PARAMETER_OFFSET, buf, read_sec) -------- 读取 param
ParsePara(&gBootInfo, param->parameter, param->length) -------- 若 GetParam成功,就解析 param
ParseLine(info, line) -------- 按行解析 parameter 文件
经过以上的解析之后,Uboot 就获取到了 parameter.txt 文件中的系统信息。
由其中可知: upgrade_tool 会将 parameter.txt 烧写到 0x00000000 的地址中。
设备树是一种描述硬件支援的数据结构,它通过 BootLoader 将硬件资源传给内核,使得内核和硬件资源描述相对独立。
Device Tree 可以描述的信息包括 CPU 的数量和类型,内存基地址和大小,总线和桥,外设链接,中断控制器和中断使用情况,GPIO 控制器和 GPIO 使用情况,Clock 控制器和 Clock 使用情况。
另外,设备树对于可热插拔的设备不进行具体描述,它只描述用于控制该热插拔设备的控制器。
设备树的主要优势:对于同一个 SOC 的不同主板,只需要更换设备树文件 .dtb 即可实现不同主板的无差异支持,而无需更换内核文件。
注:要使得内核支持使用设备树,除了内核编译时需要打开相对应的选项外,BootLoader 也需要支持将设备树的数据结构传给内核。
DTC 编译 .dts 生成二级制文件 .dtb,BootLoader 在引导内核的时,会预先读取 .dtb 到内存,进而由内核解析。
BootLoader 需要将设备树在内存中的地址传给内核,在 ARM 中通过 bootm 或 bootz 命令来进行传递。
bootm [kernel_addr] [initrd_address] [dtb_address],其中kernel_addr为内核镜像的地址,initrd为initrd的地址,dtb_address为dtb所在的地址。若initrd_address为空,则用“-”来代替。
在以前的版本中:
现今的内核版本使用了 Device Tree:
DTS chosen 节点位于根节点下,该节点用来给内核传递参数,对于 Linux 内核,该节点下最有用的属性是 bootargs,该属性的类型是字符串,用来向 Linux 内核传递 cmd_line。
/{
chosen {
bootargs = "earlycon=uart8250,mmio32,0xff1a0000 swiotlb=1 coherent_pool=1m";
};
};
DTS ----> DTB --(传给内核)--> 内核解析DTB ----> device_node ----> platform_device
系统应该会根据 Device Tree 来动态的增加系统中的 platform_device。当然,这个过程并非只发生在 platform_bus 上,例如 AMBA 总线,PCI 总线。一言以蔽之,如果要并入 Linux kernel 的设备驱动模型,那么就需要根据 device_node 的树状结构(root 是 of_allnodes)将一个个的 device node 挂入到相应的总线 device 链表中。只要做到这一点,总线机制就会安排 device 和 driver 的约会。当然,也不是所有的 device node 都会挂入 bus 上的设备链表,比如 cpus node,memory node,chosen node 等。
解析加载过程总结为:
本文参考文章:https://blog.csdn.net/u014650722/article/details/79076352
在此特别感谢!!!