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. 【编程工具】如何用Sublime Text3建立本地服务器和站点

    不久前,我学习了使用DW(DreamWare CS6)这款软件来学习HTML和制作静态网页,但是总觉得这款图形化软件不太适合我这种喜欢写代码的码农,所以最终我使用的是Sublime Text3这款软件 ...

  2. NYIS OJ 42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  3. IIS中如何应用程序启用https协议

    首先已经安装完了SSL证书 1.找到需要添加的站点,右击 ---> 编辑绑定-->添加--->选择  ""https"-->选择"SSL ...

  4. sql语句中的join连接(左连接、右连接、全连接、内连接)

    内部连接(inner join): select * from d_user a inner join D_ORGANIZATION b on a.COMPANY_XID=b.ID  内部链接也是排他 ...

  5. POJ-2002 Squares,哈希模板+数学公式!

                                                           Squares 题意:二维坐标轴给出n个点求有多少个正方形. 要是平时做比赛的话毫无疑问会 ...

  6. [BZOJ1575] [Usaco2009 Jan]气象牛Baric(DP)

    传送门 DP f[i][j]表示前i个中选j个的最优解 预处理g[i][j]表示选i~j对答案的贡献 那么就可以n^3乱搞了! 注意边界 #include <cstdio> #includ ...

  7. P3147 [USACO16OPEN]262144 (贪心)

    题目描述 给定一个1*n的地图,在里面玩2048,每次可以合并相邻两个(数值范围1-262,144),问最大能合出多少.注意合并后的数值并非加倍而是+1,例如2与2合并后的数值为3. 这道题的思路: ...

  8. 【2018.10.2】Note of CXM

    1.有一张无向图,现在要给每个点染上黑色或白色,最后每个点的染色代价是它与离这个点最近的不同色节点的距离.求最小代价.所有边权$\geq 0$且互不相同. 分三种情况: 两点都染了色:两点都跟其它点算 ...

  9. SLF4J 简单日志门面 介绍和使用

    参考:http://singleant.iteye.com/blog/934593        http://liuzidong.iteye.com/blog/776072 介绍: 简单日记门面(s ...

  10. 还是Tomcat,关于类加载器的趣味实验

    一.前言 类加载器,其实是很复杂一个东西,想等到我完全什么都弄明白了再写出来,估计不太现实...现在只能是知道多少写多少吧. 首先,我提一个问题:在我们自己的servlet中(比如ssm中,contr ...