文档章节

device tree source(dts)

季风_落地窗
 季风_落地窗
发布于 2015/05/19 11:15
字数 1008
阅读 81
收藏 0

Device Tree Source 语法:

.dts 也可以像c语言一样包含 .dtsi 文件, 这个 .dtsi文件就像是 .h文件一样. 几乎所有的arm芯片都包含了skeleton.dtsi  

root节点 "/",   子节点 "cpu" 和 "external-bus" 

[label:] node-name[@unit-address] { 
   [properties definitions] 
   [child nodes] 
}

label: 在dts中要引用某个节点要写出全路径



每个节点都有属性, 属性的表示方式: 

(1) text string 或者text list 属性表示方法: device_type = "memory"

(2) u32的属性表示方法:     #size-cells = <1>

(3) binary-data 属性表示方法: binary-property = [0x10 0x20 0x30 0x40]

说明: # 表示数字的意思

Basic Data Format

为了说明dts是如何使用的, 我们使用样机来一步一步编写出一个dst

1个双核ARM Cortex-A9 32位处理器;生产商:"Acme"  名称:"Coyote's Revenge":
local bus
    串口x2        (位于0x101F1000 和 0x101F2000)
    GPIO控制器    (位于0x101F3000)
    SPI控制器     (位于0x10170000)
    中断控制器     (位于0x10140000)
external bus桥;
    SMC SMC91111 Ethernet    (位于0x10100000)
    I2C控制器                (位于0x10160000)
        Maxim DS1338实时钟   (I2C地址为0x58)
    64MB NOR Flash           (位于0x30000000)

1 Initial structure

/ {
    compatible = "acme,coyotes-revenge";
};

"compatible" 是系统的名称, 格式 "厂商, 型号" , OS只根据compatible来识别machine, 所以必须保证准确性. 

2 CPUs

/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };
};

在根节点下再增加一个 cpus 子节点,  cpu子节点的compatible为string, 格式为 "厂商, 型号" . 和根节点的compatible一样.

3 Node Names

节点的命名规范: <名字>[@<部件地址>]    其中名字是小于31个字符的ascii字符串(<>为必选项 []为非必选项). 名字主要用来描述设备类型, 如    3com Ethernet适配器对应的结点名字宜为ethernet,而不是3com

一般来说 部件地址 是用来描述设备的主地址. 如果一个结点描述的设备有地址,则应该给出@unit-address。多个相同类型设备结点的name可以一样,只要部件地址不同即可,如本例中含有cpu@0、cpu@1. 

设备的 部件地址 也经常在结点的reg属性中给出

4 Devices

每个设备在dts中对应一个节点, 下边我们就来为每个设备填充树中的节点

/ {
    compatible = "acme,coyotes-revenge";

    cpus {
        cpu@0 {
            compatible = "arm,cortex-a9";
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
        };
    };

    serial@101F0000 {
        compatible = "arm,pl011";
    };

    serial@101F2000 {
        compatible = "arm,pl011";
    };

    gpio@101F3000 {
        compatible = "arm,pl061";
    };

    interrupt-controller@10140000 {
        compatible = "arm,pl190";
    };

    spi@10115000 {
        compatible = "arm,pl022";
    };

    external-bus {
        ethernet@0,0 {
            compatible = "smc,smc91c111";
        };

        i2c@1,0 {
            compatible = "acme,a1234-i2c-bus";
            rtc@58 {
                compatible = "maxim,ds1338";
            };
        };

        flash@2,0 {
            compatible = "samsung,k8f1315ebm", "cfi-flash";
        };
    };
};

在dts中层次结构反应了硬件的从属关系, 现在这个dts中还没有设备之间连接的信息, 之后会加入, 在本dts中要注意的:

            (1)每个设备节点都有一个compatible  (2)flash使用两个字符串, 下一节 (3)名字就是设备类型而不是特定的编号

5 Understanding the compatible Property

compatible 是OS绑定硬件和驱动的关键, flash中第一个string 是表示支持的准确的设备, 第二个字符串表示兼容的设备. 

How Addressing Works

可寻址的设备使用如下信息来在Device Tree中编码地址信息:

reg
#address-cells
#size-cells

reg的组织形式为reg = <address1 length1 [address2 length2] [address3 length3] ... >, 其中的每一组address length表明了设备使用的一个地址范围.  

address为1个或多个cell(即32位的整型),而length则为0或多个cell(若#size-cells = 0)。address 和 length 字段是可变长的,父结点的#address-cells和#size-cells分别决定了子结点的reg属性的address和length字段的长度。

下边我们从cpu开始添加reg属性

CPU addressing

 cpus {
        #address-cells = <1>;
        #size-cells = <0>;
        cpu@0 {
            compatible = "arm,cortex-a9";
            reg = <0>;
        };
        cpu@1 {
            compatible = "arm,cortex-a9";
            reg = <1>;
        };
    };

address用1个cell表示  length用0 个cell表示, 所以reg就是<x> , 另外注意如果节点有reg属性那么他就必须指明部件地址  name[@unit-addr] 

Memory Mapped Devices

/ {
    #address-cells = <1>;
    #size-cells = <1>;

    ...

    serial@101f0000 {
        compatible = "arm,pl011";
        reg = <0x101f0000 0x1000 >;
    };

    serial@101f2000 {
        compatible = "arm,pl011";
        reg = <0x101f2000 0x1000 >;
    };

    gpio@101f3000 {
        compatible = "arm,pl061";
        reg = <0x101f3000 0x1000
               0x101f4000 0x0010>;
    };

    interrupt-controller@10140000 {
        compatible = "arm,pl190";
        reg = <0x10140000 0x1000 >;
    };

    spi@10115000 {
        compatible = "arm,pl022";
        reg = <0x10115000 0x1000 >;
    };

    ...

};



















































































































































© 著作权归作者所有

季风_落地窗
粉丝 4
博文 16
码字总数 16829
作品 0
杨浦
程序员
私信 提问
Device Tree(二):基本概念

一、前言 一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念。 简单的说,如果要使用Device ...

黑客画家
2018/11/05
57
0
ARM Linux 3.x的设备树(Device Tree)

宋宝华 Barry Song <21cnbao@gmail.com> 1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM L......

21cnbao
2013/01/01
0
0
基于树莓派3B+,一个可以遥控的小车(一)

一、树莓派端口驱动 用树莓派的8个端口驱动小车的四个电机(一个电机两根线),首先修改DTS(Device Tree Source)文件(bcm2708_common.dtsi,bcm2710-rpi-3-b.dts),在对应的DTS文件中加入...

Mybigkid
2017/03/22
0
0
Device Tree(四):文件结构解析

前言 通过linuxer发表的三篇设备树的文章,我想你应该对设备已经有一个非常充分的认识了。本篇文章即作为一篇Device Tree的总结性文章,同时也作为linuxer文章的补充。 1. Device Tree简介 ...

黑客画家
2018/11/05
58
0
根据设备树文件初始化linux驱动

一、前提 新版基于ARM的Linux都会基于Device Tree去代替之前的device驱动。更加多的了解Device Tree可以访问宝哥的Bolg:ARM Linux 3.x的设备树(Device Tree) 这里只是举例在arch/arm/boot...

宁宁爸
2016/02/15
344
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部