基于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" 的赋值语句是其他架构的遗留下来的。在这里没有什么意义。
- 基于Zynq平台的设备树指南 --第二部分
- 基于Zynq平台的设备树指南 --第一部分
- 基于Zynq平台的设备树指南 --第三部分
- 基于Zynq平台的设备树指南 --第四部分
- 基于Zynq平台的设备树指南 --第五部分
- 译文:基于Zynq平台的设备树指南
- ZYNQ平台学习--(4)设备树生成
- 第二部分:创建SDK基于vs2005平台
- zynq设备树详解
- 一种新的基于Windows Mobile平台的移动开发N层架构(第二部分)
- 转载有关zynq的linux设备树相关知识
- Zynq的PL-PS中断在设备树中的描述
- ZYNQ的Linux开发--使用SDK生成设备树
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
- 微软应用程序架构设计指南2.0 第一部分 基本原则 第二章.NET平台纵览
- 如何编写更好的SQL查询:终极指南-第二部分
- 如何编写更好的SQL查询:终极指南-第二部分
- it's beautiful outside
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- cheap jerseys supply
- wholesale cheap sports jerseys online from china
- www.dansvillagebowl.com/client.html
- 基于Zynq平台的设备树指南 --第二部分
- 多个控制器内数据共享
- Convert Sorted List to Binary Search Tree
- 过滤器current number date
- cheap replica jerseys china
- cheap authentic jerseys from china free shipping
- "We just play that aggressive no matter who the opponent is
- a professor at DePaul talked on the host
- sports jerseys china