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
声明驱动
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
驱动
+关注
关注
11文章
1718浏览量
84353 -
Linux
+关注
关注
87文章
10992浏览量
206744 -
Clocks
+关注
关注
0文章
6浏览量
9581 -
系统
+关注
关注
1文章
981浏览量
21037
发布评论请先 登录
相关推荐
Linux clock子系统及驱动实例
在Linux驱动中,操作时钟只需要简单调用内核提供的通用接口即可,clock驱动通常是由芯片厂商开发的,在Linux启动时clock
发表于 05-31 16:10
•464次阅读
SYSBIOS6中驱动clock的timer配置问题如何解决
现在使用C6748开发,需要使用sy***ios6。在SYSBIOS6中需要使用某一个timer来驱动系统时钟,在sy***ios的cfg文件中
发表于 05-19 11:15
如何使用Linux内核中的input子系统
输入设备总类繁杂,包括按键,键盘,触摸屏,鼠标,摇杆等等,它们本身都是字符设备,不过内核为了能将这些设备的共性抽象出来,简化驱动的开发,建立了一个 Input 子系统。用户只需要根据内核提供
发表于 12-29 07:20
评论