A Tutorial on the Device Tree (Zynq) -- Part I

此教程的目的

本教程是针对Xilinx' Zynq-7000 EPP设备(一个集成了FPGA的ARM Cotex-A9)写的,但其中的概念适用于所有使用了设备树的Linux内核。本文使用Xillinux发行版为例,该发行版运行于Zedboard硬件上。

设备树有什么好处

设想一下:bootloader刚刚将Linux内核复制到内存中,然后跳到内核的入口点,,[1],,。此时内核就像运行在处理器上的一个裸机程序。需要配置处理器,设置虚拟内存,向控制台打印一些信息。但是这些事情如何完成?所有的这些操作都要通过写寄存器来实现,但Linux内核如何知道这些寄存器的地址?如何知道当前有多少个CPU核可以使用?有多少内存可以访问?

最直接的办法就是在内核代码里为指定平台写好这些代码,由内核配置参数决定哪些平台代码将被启用。当一切都固定不变时这种方法还不错,比如在x86处理器上内部的寄存器,或是BIOS的访问。但对于变化量来说, 比如PCI/PCIe外设,就需要内核明确了解这些变化的细节。

ARM架构已经变成了Linux社区的一个在麻烦:即使处理器使用相同的编译器和函数,但具体到某一种芯片,它就有自己的寄存器地址和不同的配置方式。不仅如此,每种板子都有自己的外设。结果造成内核中有大量的头文件、补丁和特殊的配置参数,它们的一种组合就对应于一款芯片的一种特殊板型。总之,这造成了大量丑陋和不可维护的代码。

另外,每个编译出来的内核bin文件都是为某一款芯片的某一种板子,有点像为市场上某一款PC主板编译内核。所以很希望为所有ARM处理器编译内核时,让内核能以某种方式识别硬件,然后使用正确的驱动,就像一台PC一样。

怎么实现呢?在PC上,寄存器初始化是硬编码的,其他的信息由BIOS提供。所以当有另一块软件提供这些信息时,硬件自动检测也很容易。ARM处理器没有BIOS,Linux内核只能靠自己了。

解决方案是设备树device tree, 也称作Open Firmware(OF)或Flattened Device Tree(FDT)。本质上是一个字节码格式的数据结构,其中包含信息在内核启动时非常有用。bootloader在跳到内核入口点之前将这一块数据复制到RAM中的已知地址。

设备树的严格的规范,却没有规定哪些内容可以放置其中以及放置的位置。内核可以搜索设备树中的任意路径和参数。程序员来决定哪些配置作为参数放进设备树里,以及放置在什么地方。

采取标准的树结构,则可用一套方便的API来操作。例如,约定好如何定义总线上的外设,那么API可以获取到驱动所需的基本信息:地址、中断和自定义变量。后面会介绍更多。

对于我们大多数人来说,我们用设备树来向内核描述对硬件的添加或删除操作,作为响应,内核就可以加载或卸载相应的驱动。硬件的特殊信息也可以通过设备树来向内核传达。

编译设备树

设备树有三种形式:

* 文本文件 (.dts) - 源

* 二进制对象 (
.dtb) - 目标码

* Linux系统中/proc/device-tree目录 - 调试和逆向信息

启用/proc/device-tree目录需要打开配置CONFIG_PROC_DEVICETREE:

Device Drivers --->

Device Tree and Open Firmware support --->

[*] Support for device tree in /proc

对于设备树,我们一般的使用流程是:编辑DTS文件,然后用一个工具将其编译成DTB文件,这个工具就在Linux内核源码scripts/dtc/目录下。

设备树编译器也可以单独下载并编译:

$ git clone git://www.jdl.com/software/dtc.git dtc
$ cd dtc
$ make

但是下文的描述都使用内核原码中的dtc工具。

设备树的语法在这里描述。注意这种语言并不作任何执行操作,不像XML,这只是一种组织数据的语法。一些架构有自动产生设备树的工具,来自于XPS项目。但目前对于Zynq EPP平台还没有此工具。

DTS编译为DTB:

$ scripts/dtc/dtc -I dts -O dtb -o /path/to/my-tree.dtb /path/to/my-tree.dts

这样就创建了my-tree.dtb二进制文件。dtc是主机上的一个程序。如果内核没有编译过,则先需要编译好DTS编译器:配置内核,也可以复制一份已有的配置文件到内核根目录下的.config。如下:

$ make ARCH=arm digilent_zed_defconfig

生成DTS编译器:

$ make ARCH=arm scripts

dtc也可以从一个DTB文件或/proc/device-tree文件系统反编译。例如从DTB反编译:

$ scripts/dtc/dtc -I dtb -O dts -o /path/to/fromdtb.dts /path/to/booted_with_this.dtb

生成的dts文件仍然可以被用来生成dtb。但最好还是使用最初的DTS文件,因为一些参考标签在反编译的DTS文件中显示为数字。

从运行中的内核生成DTS文件:

# scripts/dtc/dtc -I fs -O dts -o ~/effective.dts /proc/device-tree/

注释

[1] 切入点,entry point

翻译:A Tutorial on the Device Tree (Zynq) -- Part I的更多相关文章

  1. 翻译:A Tutorial on the Device Tree (Zynq) -- Part V

    A Tutorial on the Device Tree (Zynq) -- Part V Application-specific data 之前提过,设备树中是一些特殊信息,这样一个驱动可以管理 ...

  2. 翻译:A Tutorial on the Device Tree (Zynq) -- Part III

    A Tutorial on the Device Tree (Zynq) -- Part III 定义外设 可能你读本文是为了给你的设备写一个Linux驱动,在这方面要推荐著名的<Linux D ...

  3. 翻译:A Tutorial on the Device Tree (Zynq) -- Part II

    A Tutorial on the Device Tree (Zynq) -- Part II 设备树结构 Zynq的设备树如下: /dts-v1/; / { #address-cells = < ...

  4. 翻译:A Tutorial on the Device Tree (Zynq) -- Part IV

    获取资源信息 内核模块驱动加载之后,就开始把硬件资源管理起来,如读写寄存器.接收中断. 来看看设备树里的一条: xillybus_0: xillybus@50000000 { compatible = ...

  5. Device Tree Usage 【转】

    转自:http://blog.chinaunix.net/uid-20522771-id-3457184.html 原文链接:http://devicetree.org/Device_Tree_Usa ...

  6. Device Tree(二):基本概念

    转自:http://www.wowotech.net/linux_kenrel/dt_basic_concept.html 一.前言 一些背景知识(例如:为何要引入Device Tree,这个机制是用 ...

  7. Device Tree Usage( DTS文件语法)

    http://elinux.org/Device_Tree_Usage Device Tree Usage     Top Device Tree page This page walks throu ...

  8. 【转】Device Tree(二):基本概念

    原文网址:http://www.wowotech.net/linux_kenrel/dt_basic_concept.html 一.前言 一些背景知识(例如:为何要引入Device Tree,这个机制 ...

  9. Device Tree Usage(理解DTS文件语法)

    Basic Data Format The device tree is a simple tree structure of nodes and properties. Properties are ...

随机推荐

  1. POJ-2078 Matrix,暴力枚举!

                                                                 Matrix 题意:一个n*n的数字矩阵,每次操作可以对任意一行或者一列进行循 ...

  2. The BLOB and TEXT Types

    官网参考:https://dev.mysql.com/doc/refman/5.7/en/blob.html 字符串类型对应的存储需求 Data Type Storage Required CHAR( ...

  3. 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)

    题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...

  4. apache kafka参考

    apache kafka参考 消息队列分类:  点对点: 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息.这里要注意: 消息被消费以后,queue中不再有存储,所以 ...

  5. BZOJ 1443 [JSOI2009]游戏Game ——博弈论

    好题. 首先看到棋盘,先黑白染色. 然后就是二分图的经典模型. 考虑最特殊的情况,完美匹配,那么先手必胜, 因为无论如何,先手走匹配边,后手无论走哪条边,总有对应的匹配边. 如果在不在最大匹配中出发, ...

  6. [luoguP2053] [SCOI2007]修车(最小费用最大流)

    传送门 网络流的建图真的好难! 将一个点拆分成多个点的思想还需要加强. 题解 代码和题解中的图略不一样. #include <queue> #include <cstdio> ...

  7. mysql查询死锁,执行语句,服务器状态等语句集合

    [转]http://blog.csdn.net/enweitech/article/details/52447006

  8. Codeforces983E. NN country

    新鲜出炉! $n \leq 200000$的树,给$m \leq 200000$条链,$q \leq 200000$个询问,每次问一条询问链最少用m条中的几条给定链覆盖其所有边,可能无解. 首先确定一 ...

  9. 从dataset表中获取某一列的所有值方法

    原文发布时间为:2008-07-31 -- 来源于本人的百度文章 [由搬家工具导入] 可以datarow遍历所有行即可,如下:pubauthor这个表中的au_lname的所有值加到listbox上面 ...

  10. Windows下拷贝Linux的文件到本地(Putty)

    去官网下载的Putty中包含了如下文件: 其中pscp.exe是一个远程复制文件的工具. 官网:https://www.chiark.greenend.org.uk/~sgtatham/putty/l ...