设备树
在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。 社区必须改变这种局面,于是PowerPC等其他体系架构下已经使用的Flattened Device Tree(FDT)进入ARM社区的视野。
Device Tree是一种描述硬件的数据结构,它起源于OpenFirmware(OF)。它的出现可以实现驱动代码与设备的硬件信息相互的隔离,减少了代码中的耦合性。在此之前,一些与硬件设备相关的具体信息都要写在驱动代码中,如果外设发生相应的变化,那么驱动代码就需要改动。但是在引入了设备树之后,这种尴尬的情况找到了解决的办法,通过设备树对硬件信息的抽象,驱动代码只要负责处理逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,开发者只需要修改设备树文件信息,不需要改写驱动代码。Device Tree 可描写的硬件数据有:
- CPU的数量和类别
- 内存基地址和大小
- 总线和桥
- 外设链接
- 中断控制器和中断使用情况
- GPIO控制器和GPIO使用情况
Device Tree文件的格式是dts,他是人能看懂的格式,但是uboot和kernel看不懂,他们会把dts问件编译成dtb文件,通过dtc编译工具,linux源码scripts/dtc下包含dtc的源码,也可以选