ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:25.80KB ,
资源ID:12609593      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-12609593.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(dts入门.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

dts入门.docx

1、dts入门dts入门本文目标是了解dts基本语法,可以尝试去看内核dts中的文件,follow去配置。一、dts产生原因DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。它替代arch/arm/plat-xxx和arch/arm/mach-xxx中的板级spec代码,便于code管理。ARM平台的相关code相关规范调整:1、ARM的核心代码仍然保存在arch/arm目录下2、ARM SOC core architecture code保存在arch/arm目录下3、ARM SOC的周边外设

2、模块的驱动保存在drivers目录下4、ARM SOC的特定代码在arch/arm/mach-xxx目录下5、ARM SOC board specific的代码被移除,由Device Tree机制来负责传递硬件拓扑和硬件资源信息。本质上,Device Tree改变了原来用hardcode方式将HW配置信息嵌入到内核代码的方法,改用bootloader传递一些参数。如果我们认为kernel是一个black box,那么其输入参数应该包括:a.识别platform的信息 b. runtime的配置参数 c.设备的拓扑结构以及特性对于嵌入式系统,在系统启动阶段,bootloader会加载内核并将控制

3、权转交给内核,此外,还需要把上述的三个参数信息传递给kernel,以便kernel可以有较大的灵活性。在linux kernel中,Device Tree的设计目标就是如此。二、dts基本知识2.1 dts加载过程如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。通过DTC(Device Tree Compiler),可以将这些适合人类阅读的Device Tree source file变成适合机器处理的Device Tree binary file(有一个更好听的名字,DTB,device tree

4、 blob)。在系统启动的时候,boot program(例如:firmware、bootloader)可以将保存在flash中的DTB copy到内存(当然也可以通过其他方式,例如可以通过bootloader的交互式命令加载DTB,或者firmware可以探测到device的信息,组织成DTB保存在内存中),并把DTB的起始地址传递给client program(例如OS kernel,bootloader或者其他特殊功能的程序)。对于计算机系统(computer system),一般是firmware-bootloader-OS,对于嵌入式系统,一般是bootloader-OS。在高通ms

5、m8992平台:sbl将烧写在emmc中的cdt.bin进行读取和处理,获得nPlatform和nSubtype,如果没有CDT分区,那么就使用代码里配置的cdt,存入共享内存;lk将从共享内存中获得nPlatform和nSubtype进行相应处理,确定dtb entry,然后选择一个对应的dtb(所有dtb保存在boot.img中)从emmc中读进内存地址hdr-tags_addr,这个参数会传递给kernel;kernel通过传入的dtb地址进行设备的创建。2.2 dts描述信息Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所

6、谓属性,其实就是成对出现的name和value。在Device Tree中,可描述的信息包括(原先这些信息大多被hard code到kernel中):CPU的数量和类别内存基地址和大小总线和桥外设连接中断控制器和中断使用情况GPIO控制器和GPIO使用情况Clock控制器和Clock使用情况它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定

7、给展开的相应的设备。是否Device Tree要描述系统中的所有硬件信息?答案是否定的。基本上,那些可以动态探测到的设备是不需要描述的,例如USB device。不过对于SOC上的usb host controller,它是无法动态识别的,需要在device tree中描述。同样的道理,在computer system中,PCI device可以被动态探测到,不需要在device tree中描述,但是PCI bridge如果不能被探测,那么就需要描述之。.dts文件是一种ASCII 文本格式的Device Tree描述,此文本格式非常人性化,适合人类的阅读习惯。基本上,在ARM Linux在,

8、一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分,Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dts就include这个.dtsi。譬如在arch/arm/boot/dts/qcom/目录下,高通的很多.dtsi都include了skeleton.dtsi或者skeleton64.dtsi。正常情况下所有的dts文件以

9、及dtsi文件都含有一个根节点”/”,这样include之后就会造成有很多个“根节点”。 按理说 device tree既然是一个树,那么其只能有一个根节点,所有其他的节点都是派生于根节点的child node。其实Device Tree Compiler会对DTS的node进行合并,最终生成的DTB中只有一个root node. device tree的基本单元是node。这些node被组织成树状结构,除了root node,每个node都只有一个parent。一个device tree文件中只能有一个root node。每个node中包含了若干的property/value来描述该node

10、的一些特性。每个node用节点名字(node name)标识,节点名字的格式是node-nameunit-address。如果该node没有reg属性(后面会描述这个property),那么该节点名字中必须不能包括和unit-address。unit-address的具体格式是和设备挂在那个bus上相关。例如对于cpu,其unit-address就是从0开始编址,依次加一。而具体的设备,例如以太网控制器,其unit-address就是寄存器地址。root node的node name是确定的,必须是“/”。在一个树状结构的device tree中,如何引用一个node呢?要想唯一指定一个nod

11、e必须使用full path,例如/node-name-1/node-name-2/node-name-N2.3 dts组成结构示例/ / 表示root结点,该结点下有两个子结点node1和node2 node1 结点node1下又含有子结点,本例中为child-node1 和 child-node2,各结点都有一系列属性 a-string-property = A string;属性是字符串 a-string-list-property = first string, second string;字符串数组 a-byte-data-property = 0x01 0x23 0x34 0x56

12、;二进制数组 child-node1 first-child-property; second-child-property = ;Cells(由u32整数组成) a-string-property = Hello, world; ; child-node2 ; ; node2 an-empty-property;属性为空 a-cell-property = ; /* each number (cell) is a uint32 */ child-node1 ; ;上述.dts文件并没有什么真实的用途,但它基本表征了一个Device Tree源文件的结构。2.4 dts语法完整的Device

13、Tree可以将一个PCB摆在你眼前,下面我们一起来看一下:下面以一个最简单的machine为例来看如何写一个.dts文件。假设此machine的配置如下:1个双核ARM Cortex-A9 32位处理器; ARM的local bus上的内存映射区域分布了2个串口(分别位于0x101F1000 和 0x101F2000)、GPIO控制器(位于0x101F3000)、SPI控制器(位于0x10115000)、中断控制器(位于0x10140000)和一个external bus桥; External bus桥上又连接了SMC SMC91111 Ethernet(位于0x10100000)、I2C控制

14、器(位于0x10160000)、64MB NOR Flash(位于0x30000000); External bus桥上连接的I2C控制器所对应的I2C总线上又连接了Maxim DS1338实时钟(I2C地址为0x58)。其对应的.dts文件为:/compatible=acme,coyotes-revenge;#address-cells=;子结点需要一个cell描述地址#size-cells=;子结点需要一个cell描述长度interrupt-parent=;cpus#address-cells=;#size-cells=;cpu0compatible=arm,cortex-a9;reg=;

15、cpu1compatible=arm,cortex-a9;reg=;serial101f1000串口compatible=arm,pl011;reg=;interrupts=;serial101f2000串口compatible=arm,pl011;reg=;interrupts=; gpio101f3000GPIO控制器compatible=arm,pl061;reg=;interrupts=;intc:interrupt-controller10140000中断控制器compatible=arm,pl190;reg=;interrupt-controller;#interrupt-cell

16、s=;spi10115000spi控制器compatible=arm,pl022;reg=;起始地址为0x10115000,长度为0x1000interrupts=; external-busexternal bus桥#address-cells=子结点需要两个cell描述地址,片选#size-cells=;子结点需要一个cell描述长度ranges=;/Chipselect3,NORFlashethernet0,0compatible=smc,smc91c111;reg=;interrupts=;i2c1,0compatible=acme,a1234-i2c-bus;#address-cel

17、ls=;rtc需要一个cell描述地址#size-cells=;rtc不需要0描述长度reg=;rtc58compatible=maxim,ds1338;reg=;interrupts=;flash2,0compatible=samsung,k8f1315ebm,cfi-flash;reg=;注释不是太多,下面来详细分类解释:2.4.1 compatible上述.dts文件中,root结点/的compatible 属性compatible = acme,coyotes-revenge;定义了系统的名称,它的组织形式为:,。Linux内核透过root结点/的compatible 属性即可判断它启

18、动的是什么machine。 在.dts文件的每个设备,都有一个compatible属性,compatible属性用户驱动和设备的绑定。compatible属性是一个字符串的列表,列表中的第一个字符串表征了结点代表的确切设备,形式为,,其后的字符串表征可兼容的其他设备。可以说前面的是特指,后面的则涵盖更广的范围。如在arch/arm/boot/dts/vexpress-v2m.dtsi中的Flash结点:flash0,00000000compatible=arm,vexpress-flash,cfi-flash;reg=,;bank-width=;compatible属性的第2个字符串cfi-f

19、lash明显比第1个字符串arm,vexpress-flash涵盖的范围更广。2.4.2 nameunit-address接下来root结点/的cpus子结点下面又包含2个cpu子结点,描述了此machine上的2个CPU,并且二者的compatible 属性为arm,cortex-a9。 注意cpus和cpus的2个cpu子结点的命名,它们遵循的组织形式为:,中的内容是必选项,中的则为可选项。name是一个ASCII字符串,用于描述结点对应的设备类型,如网卡适配器对应的结点name宜为ethernet,表示这个是网卡。如果一个结点描述的设备有地址,则应该给出unit-address。多个相同

20、类型设备结点的name可以一样,只要unit-address不同即可,如本例中含有cpu0、cpu1以及serial101f0000与serial101f2000这样的同名结点。设备的unit-address地址也经常在其对应结点的reg属性中给出。2.4.3 reg address-cells size-cells设备的地址特性根据一下几个属性来控制: reg #address-cells #size-cellsreg意为region,区域。格式为:reg = ;父类的address-cells和size-cells决定了子类的相关属性要包含多少个cell,如果子节点有特殊需求的话,可以自己

21、再定义,这样就可以摆脱父节点的控制。address-cells决定了address1/2/3包含几个cell,size-cells决定了length1/2/3包含了几个cell,用上面的dts文件内容举例子说明:例子2.4.3.1root结点的#address-cells = ;和#size-cells = ;决定了serial、gpio、spi等结点的address和length字段的长度分别为1serial101f1000compatible=arm,pl011;reg=;地址0x101f1000,长度0x1000interrupts=;例子2.4.3.2i2c控制器模块下的rtc模块。因

22、为I2C设备只是被分配在一个地址上,不需要其他任何空间,所以只需要一个address的cell就可以描述完整,不需要size-cells/compatible=acme,coyotes-revenge;#address-cells=;子结点需要一个cell描述地址#size-cells=;子结点需要一个cell描述长度interrupt-parent=;. external-bus #address-cells = #size-cells = ;. i2c1,0 compatible = acme,a1234-i2c-bus; #address-cells = ;重新写address-cell

23、s #size-cells = ;重新写address-cells reg = ; rtc58 compatible = maxim,ds1338; reg = ;只需要一个address cell,不需要cell再描述长度 ; ;.;例子2.4.3.3当需要描述的设备不是本地设备时,就需要描述一个从设备地址空间到CPU地址空间的映射关系,这里就需要用到ranges属性。还是以上边的external-bus举例ranges属性为一个地址转换表。表中的每一行都包含了子地址、父地址、在自地址空间内的区域大小。他们的大小(包含的cell)分别由子节点的address-cells的值、父节点的addr

24、ess-cells的值和子节点的size-cells来决定。/compatible=acme,coyotes-revenge;#address-cells=;子结点 需要一个cell描述地址#size-cells=;子结点 需要一个cell描述长度interrupt-parent=;.0 0 两个cell,由子节点external-bus的address-cells=决定;0x10100000 一个cell,由父节点(/)的address-cells=决定;0x10000 一个cell,由子节点external-bus的size-cells=决定。最终第一行说明的意思就是:片选0,偏移0(选中了网卡),被映射到CPU地址空间的0x101000000x10110000中,地址长度为0x10000。external-bus #address-cells = #size-cells = ; ranges = ; / Chipselect 3, NOR Flash;进阶例子2.4.3.4pci0x10180000 compatible = arm,versatile-pci-hostbridge, pci; reg = ; interrupts = ; bus-ranges = ; #address-cells = #size-cells = ;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2