设备树
在过去的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的源码,也可以选择apt-get下载dtc,其中也包括反编译工具fdtdumb。
基本语法框架简单概括一下有这几个部分;
根节点:
设备节点:nodex
节点名称:图中node;
节点地址:node@0就是节点的地址;
子节点:childnode
属性:属性名称(Property name)和属性值(Property value)
标签
CCF
在内核3.10之后正式开始使用CCF框架(Common Clock Framework)。在以前Clock部分,虽然也提供了相应的API根据名字去获取Clock,设置频率,获取父时钟,设置父时钟的函数,但是这些API都是由每个SoC单独实现,导致了代码的差异很大,于是就引入了一个新的通用的时钟框架来解决这个问题。
框架的两端一个是provider,一个是consumer。provider指的时钟模块。
时钟种类包括:
时钟振荡器 晶振用于倍频的锁相环PLL用于多路选择的选择器MUX用于分频的分频器DIV用于时钟使能的门电路GATE
这些时钟都可抽象为一种类型struct clk_hw,并且会被统一注册到,clk_register()将描述时钟的struct clk_hw注册,转化成strcut clk变量。
consumer指的是使用这些时钟的模块。