Q考吧

[PowerPC] 解析PowerPC设备树Flattened Device Tree (FDT)

      目前大多数体系结构如ARM、PowerPC以及MIPS相继加入使用设备树来描述SOC芯片的各种资源,并遵循Open Firmware中Device Tree Mode描述规则,如开源项目libfdt提供一套完整解析接口。“Device Tree”提供了Bootloader与Kernel交互的界面,并尽力屏蔽SOC芯片因为外设扩展带来的内核设备驱动的改动。Linux Kernel有较详细的记录文档《booting-without-of.txt》(Documentation目录下),本文简要罗列了基于PowerPC设备树的描述,重点是PCI这块,仅供参考。
  1. /* 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]

booting-without-of.txt

59.5 KB, 下载次数: 1

glikely-Using the device tree to describe embedded hardware.pdf

83.1 KB, 下载次数: 1

资料评论(1 条)
小绵羊
小绵羊 2015-10-11 22:02:41
点点滴滴点点滴滴的的的

  • 授课专家

  • 授课机构

  • 聆听您的建议
欢迎您提出对网站宝贵的建议,我们竭诚为您服务。
请填写建议:
论坛注册名:
客服中心 升级VIP
快速回复 返回顶部 返回列表