• 设备树快速入门【转】


    转自:http://www.pianshen.com/article/274236825/;jsessionid=D90FC6B215155680E0B89A6D060892D4

    A devicetree is a data structure for describing hardware.

    一个用于描述硬件的数据结构。

    https://www.devicetree.org/

    基本概念

    Dtsi——类似于c语言的头文件

    Dts——类似于c语言的源文件

    Dtb——类似于c语言的编译产物、二进制文件

    使用device tree,用户需要了解自己的硬件配置和系统运行参数,并把这些信息组织成device tree source file。DT是描述系统中的硬件信息,那些可以被动态探测到的硬件设备不需要描述。通过dtc(device tree compiler),可以将dts变成适合机器处理的dtb(device tree blob)。

    Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。

    设备树主要有三个作用:

    1、识别平台单板 2、运行参数配置 3、设备构建

    语法

    1、设备树语法格式

    DT的基本单元是node(节点),这些node被组织成树状结构。每个node包含了若干个property/value,描述node的一些特性。一个设备树只能有一个root node(根节点),其名字必须是‘/’。引用设备树某个节点,可以使用全路径,也可以使用句柄等方式。

    一个Node被定义为如下形式:

    [label:] node-name[@unit-address] { 

    [properties [= value] ] 

    [child nodes] 

    }

    A.[]——表示可选项

    B.label:——标签,方便dts文件的引用,通过符号‘&’进行引用

    C.node-name——节点名字

    D.@unit-addresss——如果node没有reg属性,不需要该选项;如果有就必须和reg第 一个地址相等(The unit-address must match the first address specified in the

    reg property of the node——摘自Devicetree Specification Release v0.2,章节2.2.1 Node Names)。Unit-address具体格式和设备挂在哪个bus上相关。比如:对于cpu, 其unit-address就是从0开始编址;如果是串口控制器,其就是寄存器地址。

    E.property——设备属性

    非标准的属性名字应该以该公司或者组织名称开头,比如:fsl,channel-fifo-len=<?>; zrevmm,vdev = "proxy";

    也定义了一些标准的属性:“compatible”,“model”,"device_type"都是用来表示 节点基本信息的,compatible = "virtio,mmio";

    F.= value——属性的定义是多种多样的,可以是空值、整型或者字符串。

    G.child nodes——和Node格式一样

    2、常见属性实例

    “compatible”属性是用来匹配驱动的,他的类型是字符串数组,每个字符串表示一种设备的类型,从具体到一般。举个例子就比较清楚了,比如某个串口控制器节点的属性”compatible = “fsl,mpc8641-uart”, “ns16550"“。第一个字符串“fsl,mpc8641-uart”前边部分是厂商(推测是frescale),后边部分是控制器具体型号,这个形式也是规范建议的标准写法。第二个字符串ns16550表示一类符合同一标准的串口控制器,比第一个字符串表示的范围更大。内核匹配驱动时首先看是否有匹配第一个字符串的驱动,如果没有的话再匹配第二个(如果有更多的,依次类推,所以优先匹配前边的)。

    "model"属性用来表示设备的型号,用字符串表示,不像"compatible"用多个字符串,只需一个就够了。

    "device_type"属性用来表示设备类型,用字符串表示。

    @后地址和reg后第一个地址关系说明。它两数值必须得一致。

    下面举一个实例节点分析:

    对应的dts源码

    /{

      cpus{

        cpu@0{

        };

        cpu@1{

        };

      };

      memory@0{

      };

      uart@fe001000{

      };

      ethernet@fe002000{

      };

      ethernet@fe003000{

      };

    };

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/jqh_111/article/details/83212323
  • 相关阅读:
    一起谈.NET技术,验证.NET强命称的思路和实例 狼人:
    一起谈.NET技术,基于SQL Server 2008 Service Broker构建企业级消息系统 狼人:
    一起谈.NET技术,一句代码实现批量数据绑定[下篇] 狼人:
    一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo 狼人:
    一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(六)流光追影 狼人:
    一起谈.NET技术,ASP.NET下用URLRewriter重写二级域名 狼人:
    这样覆写Object类的toString方法对吗
    【Cocos2DX 】初窥门径(7)无限地图滚动
    poj2975——Caesar密码
    [置顶] poi最简单易学解析xls代码
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/11755716.html
Copyright © 2020-2023  润新知