DTS结构及其编译方法

上传人:简****9 文档编号:111788779 上传时间:2019-11-03 格式:PDF 页数:22 大小:310.34KB
返回 下载 相关 举报
DTS结构及其编译方法_第1页
第1页 / 共22页
DTS结构及其编译方法_第2页
第2页 / 共22页
DTS结构及其编译方法_第3页
第3页 / 共22页
DTS结构及其编译方法_第4页
第4页 / 共22页
DTS结构及其编译方法_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《DTS结构及其编译方法》由会员分享,可在线阅读,更多相关《DTS结构及其编译方法(22页珍藏版)》请在金锄头文库上搜索。

1、(DT系列一)DTS结构及其编译方法 (DT系列一)DTS结构及其编译方法 2014-08-30 09:43 13345人阅读 评论(0) 收藏 举报 分类: Linux(17) 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)+ DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 3,dts是如何被编译的,以及编译后会生成一个什么文件. 二:参考文字 1,DTS(device tree source) .dts文件是一种ASCII文本格式的DeviceTree描述。基本上,在ARMLinux内,一个.dts文件对应一个ARM的mac

2、hine,一般放置在内核 的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同 的部分。Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应 的.dts就include这个.dtsi。 2,dts的结构模型 为了了解DeviceTree的结构,我们首先给出一个DeviceTree的示例: /o device-tree |- name =“device-tree“ |- model =“MyBoardN

3、ame“ |-compatible = “MyBoardFamilyName“ |- #address-cells = |-#size-cells = |-linux,phandle = | o cpus | | - name = “cpus“ | | - linux,phandle = | |- #address-cells = | | -#size-cells = | | | o PowerPC,9700 | |- name =“PowerPC,970“ | |-device_type = “cpu“ | |-reg = | |-clock-frequency = | |- 64-bit

4、| |- linux,phandle = | o memory0 | |- name =“memory“ | |- device_type= “memory“ | |- reg = | |- linux,phandle = | o chosen |- name = “chosen“ |- bootargs = “root=/dev/sda2“ |- linux,phandle = 从上图中可以看出,devicetree的基本单元是node。这些node被组织成树状结构,除了rootnode,每个node都只有一个parent。一个devicetree文件中 只能有一个rootnode。每个no

5、de中包含了若干的property/value来描述该node的一些特性。每个node用节点名字(nodename)标识,节点名字的格 式是node-nameunit-address。如果该node没有reg属性(后面会描述这个property),那么该节点名字中必须不能包括和unit-address。unit- address的具体格式是和设备挂在那个bus上相关。例如对于cpu,其unit-address就是从0开始编址,以此加一。而具体的设备,例如以太网控制器, 其unit-address就是寄存器地址。rootnode的nodename是确定的,必须是“/”。 3,dts是如何被编译的

6、,以及编译后会生成一个什么文件。 1. DTC(device tree compiler) dtc是将.dts编译为.dtb的工具。DTC的源代码位于内核的scripts/dtc目录,在Linux内核使能了DeviceTree的情况下,编译内核时,主机工 具dtc会被编译出来,对应scripts/dtc/Makefile中的“hostprogs-y:= dtc”这一hostprogs编译target。 在Linux内核的arch/arm/boot/dts/Makefile中,描述了当某种SoC被选中后,哪些.dtb文件会被编译出来。举例如下: 如与VEXPRESS对应的.dtb包括: dtb-

7、$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb vexpress-v2p-ca9.dtb vexpress-v2p-ca15-tc1.dtb vexpress-v2p-ca15_a7.dtb xenvm-4.2.dtb 在Linux下,我们可以单独编译DeviceTree文件。当我们在Linux内核下运行makedtbs时,若我们之前选择了ARCH_VEXPRESS,上述.dtb都 会由对应的.dts编译出来。因为arch/arm/Makefile中含有一个dtbs编译target项目。 2. DeviceTree Blob (.dtb) .d

8、tb是.dts被DTC编译后的二进制格式的DeviceTree描述,可由Linux内核解析。通常在我们为电路板制作NAND、SD启动image时, 会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导kernel的过程中,会先读取该.dtb到内存。 3. 源代码体现 有两种方式使用DT。第一种可包含多个dtb,编入dt.img,放入boot.img。第二种只包含一个dtb,直接追加到kernelimage后面,放入boot.img。 dtc编译在kernel/AndroidKernel.mk中定义。先用定义“DTS_NAMES“变量,它的每个entry(记为“DTS_

9、NAME“变量,下面的$arch)中可能 有arch和rev两部分,和.config中相关配置有关,用下面方法找出。 while () $a = $1 if /CONFIG_ARCH_(?:MSM|QSD|MPQ)a-zA-Z0-9+)=y/; $r = $1 if /CONFIG_MSM_SOC_REV_(?!NONE)(w+)=y/; $arch = $arch.lc(“$a$r “) if /CONFIG_ARCH_(?:MSM|QSD|MPQ)a-zA-Z0-9+)=y/ print $arch; 得到上述“DTS_NAMES“变量,用“$(DTS_NAME)*.dts“方式去“ker

10、nel/arch/arm/boot/dts/“下匹配。见下面的定义,其中“cat“命令就是生成 带DT的kernelimage。 define append-dtb mkdir -p $(KERNEL_OUT)/arch/arm/boot; $(foreach DTS_NAME, $(DTS_NAMES), $(foreach d, $(DTS_FILES), $(DTC) -p 1024 -O dtb -o $(call DTB_FILE,$(d) $(d); cat $(KERNEL_ZIMG) $(call DTB_FILE,$(d) $(call ZIMG_FILE,$(d);) en

11、def 第二种方式没看到后续如何放入boot.img。对于第一种方式,会用“device/qcom/common/generate_extra_images.mk“中定义的下面规则编 出“dt.img“, $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET) $(build-dtimage-target) 在“build/core/Makefile“中用下面语句使它被编入boot.img。 ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT),true) INTERNAL_BOOTI

12、MAGE_ARGS += -dt $(INSTALLED_DTIMAGE_TARGET) BOOTIMAGE_EXTRA_DEPS s:= $(INSTALLED_DTIMAGE_TARGET) endif (DT系列二)device tree的书写规范 2014-08-30 09:53 3185人阅读 评论(0) 收藏 举报 分类: Linux(17) 版权声明:本文为博主原创文章,未经博主允许不得转载。 devicetree的书写规范 下面从节点,属性,reg,ranges,中断控制器等几个方面叙述devicetree的书写规范。 1,dts的基本元素:节点 .dts(或者其include

13、的.dtsi)基本元素为结点和属性。举例说明节点的概念: / node1 a-string-property = “A string“; a-string-list-property = “first string“, “second string“; a-byte-data-property = 0x01 0x23 0x34 0x56; child-node1 first-child-property; second-child-property = ; a-string-property = “Hello, world“; ; child-node2 ; ; node2 an-empty-

14、property; a-cell-property = ; /* each number (cell) is a uint32 */ child-node1 ; ; ; 1个root结点“/“;root结点下面含一系列子结点,本例中为“node1“和 “node2“; 结点“node1“下又含有一系列子结点,本例中为“child-node1“和 “child-node2“; 各结点都有一系列属性。这些属性可能为空,如“an-empty-property“;可能为字符串,如“a-string-property“;可能为字符串数组,如“a-string -list-property“;可能为Cel

15、ls(由u32整数组成),如“second-child-property“,可能为二进制数,如“a-byte-data-property“。 子结点的命名遵循的组织形式为:,中的内容是必选项,中的则为可选项。name是一个ASCII字符串,用于 描述结点对应的设备类型,如3comEthernet适配器对应的结点name宜为ethernet,而不是3com509。如果一个结点描述的设备有地址,则应 该给出unit-address。多个相同类型设备结点的name可以一样,只要unit-address不同即可。设备的unit-address地址也经常在其对应结点的r eg属性中给出。 2,dts的基

16、本元素:compatible属性 在.dts文件的每个设备,都有一个compatible属性,compatible属性用户驱动和设备的绑定。compatible属性是一个字符串的列表,列表中的 第一个字符串表征了结点代表的确切设备,形式为“,“,其后的字符串表征可兼容的其他设备。可以说前面的是特指 ,后面的则涵盖更广的范围。 举例说明:FreescaleMPC8349 SoC含一个串口设备,它实现了国家半导体(NationalSemiconductor)的ns16550寄存器接口。则MPC8349串 口设备的compatible属性为compatible= “fsl,mpc8349-uart“,“ns16550“。其中,fsl,mpc8349-uart指代了确切的设备,ns16550代表该设备与Natio nalSemiconductor 的16550UART保持了寄存器兼容。 3,dts的其它部分:reg 可寻址的设备使用如下信息来在D

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号