基于Zynq平台的设备树指南 --第二部分

来源:互联网 发布:java设置编码格式 编辑:程序博客网 时间:2024/05/23 13:04

 设备树的结构

一个在Zynq上运行Linux的设备树典型格式如下:

 

/dts-v1/;
/ {
  #address-cells = <1>;
  #size-cells = <1>;
  compatible = "xlnx,zynq-zed";
  interrupt-parent = <&gic>;
  model = "Xillinux for Zedboard";
 aliases {
    serial0 = &ps7_uart_1;
  } ;
  chosen {
    bootargs = "consoleblank=0 root=/dev/mmcblk0p2 rw rootwait earlyprintk";
    linux,stdout-path = "/axi@0/uart@E0001000";
  };
 
  cpus {
 
      [ ... CPU definitions ... ]
 
   } ;
  ps7_ddr_0: memory@0 {
    device_type = "memory";
    reg = < 0x0 0x20000000 >;
  } ;
  ps7_axi_interconnect_0: axi@0 {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "xlnx,ps7-axi-interconnect-1.00.a", "simple-bus";
    ranges ;
 
      [ ... Peripheral definitions ... ]
 
  } ;
} ;

这个设备树是用于Xillinux的, 上面显示了其中两个部分:一个描述CPUs(因为它没什么意思),另一个定义了外围设备(因为它内容太多,我们稍后描述它的细节内容)。

默认使用的设备树源码在Xillinux文件系统的这个目录下:/boot/devicetree-3.3.0-xillinux-1.0.dts

在版本声明的后面,设备树以一个斜线/ 作为开始, 就像说“这里是树根”。后面就是{ }中间包含的具体内容了。从DTS编译器的角度看,每一队的{}包含了这个树中更深一层的结构(就像文件系统中的目录层级)。消化这个树的内容,从特定的路径下获取期望的信息(就像到达文件系统中的目标路径后读取一个文件),这些都是内核的工作。

非常重要的一点是:设备树的结构必须是按照内核希望得到的形式构建的,{}中的赋值语句对编译器来说没有任何意义,实际中,许多赋值语句都是被内核忽略的,就像文件系统中没有程序需要打开的文件,都被忽略了。

从用户空间访问数据

设备树和文件系统对比不仅自然,而且它在内核的 /proc/device-tree下就是文件系统:每一个{}都是是一个目录,目录的名字就是花括号前面的字符串。

     这一节,我们的系统中使用上面列出的设备树。

# hexdump -C'/proc/device-tree/#size-cells'

00000000  00 00 00 01                                       |....|

00000004

# hexdump -C'/proc/device-tree/axi@0/compatible'

00000000  78 6c 6e 78 2c 70 73 37  2d 61 78 69 2d 69 6e 74  |xlnx,ps7-axi-int|

00000010  65 72 63 6f 6e 6e 65 63  74 2d 31 2e 30 30 2e 61  |erconnect-1.00.a|

00000020  00 73 69 6d 70 6c 65 2d  62 75 73 00              |.simple-bus.|

0000002c

或者类似

# cat'/proc/device-tree/axi@0/compatible'

xlnx,ps7-axi-interconnect-1.00.asimple-bus

 

上面列出的设备树中定义了 axi@0这个元素,定义为: “ps7_axi_interconnect_0: axi@0″, 在冒号前面的字符串是一个标签(别名),这个字符串可能会在DTS文件中被引用到,但是绝对不会出现DTB文件中。正如前面说的,紧邻花括号前面的字符串定义了结构的名称(当然也是目录)。

     正如这个例子所展示的,那些条目在/proc文件系统中转换成了普通的文件。如果该条目没有赋值语句(就像“axi@0″下面的ranges),就创建一个空文件。

     上面的例子显示,因为/proc/device-tree 这个伪文件系统使设备树信息能够访问,设备树能够很方便地传递信息给用户空间程序,就像给内核空间的代码传递信息一样。需要说明下,在内核中,有专用的API用来访问设备树的结构和数据。

     你可能已经发现了,赋值语句中的整型是大端方式存储的。需要记住一点,Zynq处理器是以小端方式运行的。

     设备树中的启动参数

     通常,有三种源码用来给内核启动命令行:

        在内核配置文件中,通过CONFIG_CMDLINE给出。

        通过bootloader(通常在ARM处理器上是U-boot,x86处理器上是LILO或GRUB)传递.

        通过设备树中的chosen/bootargs(参考上面的例子)给出

     使用哪一种启动参数依赖于内核配置参数。在Xillinux上,使用的是设备树的chosen/bootargs。

     打印内核启动信息的UART是硬编码在初始化程序中的。事实上,即使设备树上的节点 ps7_uart_1: serial@e0001000被删除(但是UART在文件系统中不会出现/dev/ttyPS0),启动信息仍然会输出到UART端口。

         一些类似 "aliases"and "linux,stdout-path" 的赋值语句是其他架构的遗留下来的。在这里没有什么意义。

0 0
原创粉丝点击