linux3.5 usb 设备树,嵌入式 PowerPC Linux 平台扁平设备树FDT解析

] [-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,内核及设备驱动可以查找到相应的设备节点,读取其属性值,利用这些信息正确地初始化和驱动硬件。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值