clock驱动在时钟子系统中属于provider,provider是时钟的提供者,即具体的clock驱动。
clock驱动在Linux刚启动的时候就要完成,比initcall
都要早期,因此clock驱动是在内核中进行实现。 在内核的drivers/clk
目录下,可以看到各个芯片厂商对各自芯片clock驱动的实现:
下面以一个简单的时钟树,举例说明一个芯片的时钟驱动的大致实现过程:
通常来说,一个芯片的时钟树是比较固定的,例如,以下时钟树:
时钟树的 根节点一般是晶振时钟 ,上图根节点为24M晶振时钟。根节点下面是PLL,PLL用于提升频率。PPL0下又分频给PERI、DSP和ISP。PLL1分频给DDR和ENC。
对于PLL来说,PLL的频率可以通过寄存器设置,但通常是固定的,所以PLL属于 固定时钟 。
对PERI、DSP等模块来说,它们的频率来自于PLL的分频,因此这些模块的时钟属于 分频时钟 。
设备树中表示一个时钟源,应有如下属性,例如24M晶振时钟:
clocks{
osc24M:osc24M{
compatible = "fixed-clock";
#clock-cells = < 0 >;
clock-output-name = "osc24M";
clock-frequency = < 24000000 >;
};
};
属性 | 说明 |
---|---|
compatible | 驱动匹配名字 |
#clock-cells | 提供输出时钟的路数。#clock-cells为0时,代表输出一路时钟#clock-cells为1时,代表输出2路时钟。 |
#clock-output-names | 输出时钟的名字 |
#clock-frequency | 输出时钟的频率 |
clock驱动编写的基本步骤:
struct clk_ops
相关成员函数struct clk_onecell_data
结构体,初始化相关数据struct clk_init_data
结构体,初始化相关数据clk_register
将时钟注册进框架clk_register_clkdev
注册时钟设备of_clk_add_provider
,将clk provider存放到of_clk_provider链表中管理CLK_OF_DECLARE
声明驱动全部0条评论
快来发表一下你的评论吧 !