] [-O ] [-o output_filename] [-V output_version] input_filename
input_format可以使用以下三个参数:
dtb: 表示输入文件为dtb文件;
dts: 表示输入文件为dts文件;
fs: 表示输入文件为与/proc/device-tree文件的格式相同。
output_format可以使用以下三个参数:
dtb: 表示输出文件为dtb文件;
dts: 表示输出文件为dts文件;
asm: 表示输出文件为汇编语言文件;
如果output_format为“dtb”是,ouput_version用来规定生成的dtb文件的版本号,目前dtb文件可用的版本号为
1,2,3,16或17,output_format的缺省值为17。-S指定的是生成的dtb文件的大小,需要适当地扩大以供u-boot
创建/chose节点时使用。input_filename和output_filename分别为输入和输出文件名。从dtc编译器的使用方法中发
现,dtc编译器不仅可以实现dts文件到dtb文件的转换,也可以实现dtb文件到dts文件的转换。
Linux源码的arch/powerpc/boot/dts/目录下存放了很多dts文件,可以作为参考文件。另外dtc编译器在内核源码2.6.25版本之后已经被包含进去。在2.6.26版本之后,生成blob的简单规则已经加入makefile,如下命令:
$ make ARCH=powerpc canyonlands.dtb
也可以根据自己的硬件修改好dts文件后,用下面类似命令生成dtb文件。
$ dtc -f -I dts -O dtb -R 8 -S 0x3000 test.dts > mpc836x_mds.dtb
$ mkimage -A ppc -O Linux -T flat_dt -C none -a 0x300000 -e 0 -d mpc836x_mds.dtb mpc836x_mds.dtu
注:最新的U-Boot使用dtb镜像文件。而freescale的U-Boot需要如上使用mkimage为dtb添加镜像信息。
5 U-Boot相关设置
为使U-Boot支持设备树,需要在板子配置头文件中设置一系列宏变量。如本文在MPC8349E处理器目标板中移植的U-Boot配置如下:
/* pass open firmware flat tree */
#define CONFIG_OF_LIBFDT 1
#undef CONFIG_OF_FLAT_TREE
#define CONFIG_OF_BOARD_SETUP 1
#define CONFIG_OF_HAS_BD_T 1
#define CONFIG_OF_HAS_UBOOT_ENV 1
启动引导代码U-Boot在完成自己的工作之后,会加载Linux内核,并将扁平设备树的地址传递给内核,其代码形式如下:
#if defined(CONFIG_OF_FLAT_TREE) || defined(CONFIG_OF_LIBFDT)
if (of_flat_tree) { /* device tree; boot new style */
/*
* Linux Kernel Parameters (passing device tree):
* r3: pointer to the fdt, followed by the board info data
* r4: physical pointer to the kernel itself
* r5: NULL
* r6: NULL
* r7: NULL
*/
(*kernel) ((bd_t *)of_flat_tree, (ulong)kernel, 0, 0, 0);
/* does not return */
}
#endif
arch/powerpc内核的入口有且只有一个,入口点为内核镜像的起始。此入口支持两种调用方式,一种是支持Open
Firmware启动,另一种对于没有OF的引导代码,需要使用扁平设备树块,如上示例代码。寄存器r3保存指向设备树的物理地址指针,寄存器r4保存为
内核在物理内存中的地址,r5为NULL。其中的隐含意思为:假设开启了mmu,那么这个mmu的映射关系是1:1的映射,即虚拟地址和物理地址是相同
的。
6 Linux内核对设备的解析。
扁平设备树描述了目标板平台中的设备树信息。每个设备都有一个节点来描述其信息,每个节点又可以有子节点及其相应的属性。内核源码中
include/linux/of.h及drivers/of/base.c等文件中提供了一些Open Firmware
API,通过这些API,内核及设备驱动可以查找到相应的设备节点,读取其属性值,利用这些信息正确地初始化和驱动硬件。