目前大多数体系结构如ARM、PowerPC以及MIPS相继加入使用设备树来描述SOC芯片的各种资源,并遵循Open Firmware中Device Tree Mode描述规则,如开源项目libfdt提供一套完整解析接口。“Device Tree”提供了Bootloader与Kernel交互的界面,并尽力屏蔽SOC芯片因为外设扩展带来的内核设备驱动的改动。Linux Kernel有较详细的记录文档《booting-without-of.txt》(Documentation目录下),本文简要罗列了基于PowerPC设备树的描述,重点是PCI这块,仅供参考。- /* IPIC* interrupts cell = <intr #, sense>* sense values match linux IORESOURCE_IRQ_* defines:* sense == 8: Level, low assertion* sense == 2: Edge, high-to-low change*/pic@700 { linux,phandle = <700>; --->节点标记号 interrupt-controller; --->表明为中断控制器 #address-cells = <0>; #interrupt-cells = <2>; --->表示响应边缘触发的中断(由高电平到低电平) reg = <700 100>; --->中断控制器IMMR的偏移量以及大小 built-in; device_type = "ipic"; --->设备类型:Integrated Programmable Interrupt Controller};pci@8500 { interrupt-map-mask = <f800 0 0 7>;---> interrupt-map-mask由unit address mask以及 interrupt specifier mask两部分组成,每部分 占cells的个数分别由#address-cells与#interrupt-cells 决定。 interrupt-map = < /* IDSEL 0x0E -mini PCI */ 7000 0 0 1 700 12 8 7000 0 0 2 700 12 8 7000 0 0 3 700 12 8 7000 0 0 4 700 12 8 /* IDSEL 0x0F - PCI slot */ 7800 0 0 1 700 11 8 7800 0 0 2 700 12 8 7800 0 0 3 700 11 8 7800 0 0 4 700 12 8>;---> interrupt-map 表示每个PCI设备中断与IPIC之间的对应关系如下: 7000 0 0 表示unit address, 由#address-cells决定其大小,其值 为<7000 0 0> & <f800 0 0>(位与)取高5位得到0x0e,对应该PCI 设备的IDSEL AD值; 1 表示该PCI设备的INTA跨接PCI 中断控制器的INTX。每个 PCI设备有INTA、INTB、INTC以及INTD四个硬件中断( 对应数值为1、2、3以及4),该值表示该PCI设备与PCI Controller相连的硬件中断引脚。 700 表示所应该连接的中断控制器的标记号 11 8 表示占用中断控制器(如IPIC Controller)向量值,即为 interrupt specifier值,8表示电平触发; interrupt-parent = <700>; interrupts = <42 8>; ---> interrupts由两部分组成interrupt specifier值(66), 以及interrupt type/sense(8, 表示电平触发)。 bus-range = <0 0>; ranges = <02000000 0 90000000 90000000 0 10000000 42000000 0 80000000 80000000 0 10000000 01000000 0 00000000 e2000000 0 00100000>;---> ranges由bus address, parent bus address, size三部分组成; 其每一部分占#size-cells个cells。bus address, 表示占用总线 的地址范围,如PCI Bridge设备,它就表示一个PCI地址。 (bus address, size)定义了PCI Bridge下游PCI子设备所占用的 PCI地址范围;parent bus address, 表示该总线在父总线上的 地址,如PCI控制器, 它则表示CPU BUS的地址;它定义了父总 线上MAP该设备的起始地址。 clock-frequency = <3f940aa>; #interrupt-cells = <1>; ---> 表示interrupt specifier占一个cell #size-cells = <2>; ---> 表示rangs每一个值占两个cells #address-cells = <3>; ---> 表示unit address 占三个cells reg = <8500 100>; compatible = "83xx"; device_type = "pci"; sleep = <b00 1 8 00010000 0>;};usb@23000 { device_type = "usb"; compatible = "fsl-usb2-dr"; --->dr dual-role,可以充当两个角色:设备和主控制器 reg = <23000 1000>; #address-cells = <1>; #size-cells = <0>; interrupt-parent = <700>; interrupts = <26 2>; phy_type = "utmi_wide"; control_init = <00000280>; // UTMI ext 48 MHz clk sleep = <b00 1 8 00300000 0>;};/* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */---> USB PHY四种类型: ULPI为外置PHY接口,可用于OTG模式 UTMI为内置8位数据宽度的PHY接口 UTMI_WIDE为内置16位数据宽度的PHY接口 SERIAL为串行接口一般来说, 每个cell占用32位:#address-cells = <1>; 1表示地址32位,2表示地址64位#size-cells = <1>; 1表示rangs的每部分占一个cell,依此类推#interrupt-cells = <2>; 2表示interrupts用两个cell表示中断<interrupt number, interrupt type>
复制代码 更多内容请参考《Using the device tree to describe embedded hardware》,该文详细的说明Device Tree的构造过程。 原创作品,欢迎转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。|8[/ypan] |
|