一般情况下,在可运行linux的处理器平台中,都存在非常复杂的时钟树(clock tree)关系,也一定会有一个非常庞大和复杂的树状图,用于描述与时钟相关的器件,以及这些器件输出的clock关系。查看手册都会存在类似下列的内容: 一款处理器中与时钟相关的器件主要包括有: 用于产生 CLOCK 的 Oscillator(有源振荡器,也称作谐振荡器...
一般情况下,在可运行linux的处理器平台中,都存在非常复杂的时钟树(clock tree)关系,也一定会有一个非常庞大和复杂的树状图,用于描述与时钟相关的器件,以及这些器件输出的clock关系。查看手册都会存在类似下列的内容: 一款处理器中与时钟相关的器件主要包括有: 用于产生 CLOCK 的 Oscillator(有源振荡器,也称作谐振荡器...
clock子系统数据结构 通过of_clk_add_provider根据device_node来添加节点到全局链表of_clk_providers中,方便of_get_clk获取clk结构。 通过clk_register将struct clk_hw结构注册到clock框架,其中clk_hw包含了对硬件的操作及相关的一些变量。 通过clk_core结构来维护一个clock tree,通过clk->core->ops来回调实际clock驱...
如今,可运行Linux的主流处理器平台,都有非常复杂的clock tree,我们随便拿一个处理器的spec,查看clock相关的章节,一定会有一个非常庞大和复杂的树状图,这个图由clock相关的器件,以及这些器件输出的clock组成。下图是一个示例: clock相关的器件包括:用于产生clock的Oscillator(有源振荡器,也称作谐振荡器)或者Crystal(无源...
clock相当于各种device(包括cpu)工作的脉搏,clock的设置是驱动开发中绕不过去的槛,而且容易出错,之前对kernel中的clk模块有敬畏心理,没有仔细研究,结果导致驱动调试中一涉及clk的东西我就有点晕,痛定思痛,终于下定决心啃掉这块硬骨头,下面介绍linux中clk tree的framework和基本用法。
管理clock的最终目的,是让device driver可以方便的使用,这些是通过include/linux/clk.h中的通用API实现的,如下: 1)struct clk结构 一个系统的clock tree是固定的,因此clock的数目和用途也是固定的。假设上面图片所描述的是一个系统,它的clock包括osc_clk、pll1_clk、pll2_clk、pll3_clk、hw1_clk、hw2_clk和hw...
在“Linux common clock framework(2)_clock provider”中已经讲过,clock provider需要将系统的clock以tree的形式组织起来,分门别类,并在系统初始化时,通过provider的初始化接口,或者clock framework core的DTS接口,将所有的clock注册到kernel。 clock的注册,统一由clk_regitser接口实现,但基于该接口,kernel也提供了其它...
...现在主流的 Linux 处理器平台都包含了非常复杂的 clock tree,对应很多clock相关的器件。而这个通用时钟框架管理的对象就是这些clock器件。...框架的主要功能包括: 使能(enable/disable)clk 设置clk频率 选择clk的parent 通用时钟框架的通用接口定义在 Linux 内核中(include/linux/clk.h[3]...每个时钟源对象使用...
Device Tree可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况等等 DeviceTree 是一种描述了电路板上CPU、总线、设备组成的树形数据结构,Bootloader会将这些信息传递给内核,然后内核可以识别这棵树,并根据它展开...
设备树(Device Tree)由一系列被命名的结点(node)和属性(property)组成,以lubancat2为例,不妨打开本章节的配套代码 linux_driver/device_tree/rk3568-lubancat2.dts或者内核源码/arch/arm64/boot/dts/rockchip/rk3568-lubancat2.dts先睹为快。 下面的内容将围绕着设备树源码,来讲解设备树框架和基本语法。 设备树 ...