clock驱动实例
clock驱动在时钟子系统中属于provider,provider是时钟的提供者,即具体的clock驱动。
clock驱动在Linux刚启动的时候就要完成,比initcall
都要早期,因此clock驱动是在内核中进行实现。 在内核的drivers/clk
目录下,可以看到各个芯片厂商对各自芯片clock驱动的实现:
下面以一个简单的时钟树,举例说明一个芯片的时钟驱动的大致实现过程:
1、时钟树
通常来说,一个芯片的时钟树是比较固定的,例如,以下时钟树:
时钟树的 根节点一般是晶振时钟 ,上图根节点为24M晶振时钟。根节点下面是PLL,PLL用于提升频率。PPL0下又分频给PERI、DSP和ISP。PLL1分频给DDR和ENC。
对于PLL来说,PLL的频率可以通过寄存器设置,但通常是固定的,所以PLL属于 固定时钟 。
对PERI、DSP等模块来说,它们的频率来自于PLL的分频,因此这些模块的时钟属于 分频时钟 。
2、设备树
设备树中表示一个时钟源,应有如下属性,例如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 | 输出时钟的频率 |
3、驱动实现
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
声明驱动
-
驱动
+关注
关注
12文章
1838浏览量
85261 -
Linux
+关注
关注
87文章
11292浏览量
209317 -
Clocks
+关注
关注
0文章
5浏览量
9613 -
系统
+关注
关注
1文章
1014浏览量
21332
发布评论请先 登录
相关推荐
评论