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文章
1994浏览量
88728 -
Linux
+关注
关注
88文章
11821浏览量
219600 -
Clocks
+关注
关注
0文章
5浏览量
9910 -
系统
+关注
关注
1文章
1047浏览量
22407
发布评论请先 登录
相关推荐
热点推荐
Linux clock子系统及驱动实例
在Linux驱动中,操作时钟只需要简单调用内核提供的通用接口即可,clock驱动通常是由芯片厂商开发的,在Linux启动时
发表于 05-31 16:10
•1596次阅读
SYSBIOS6中驱动clock的timer配置问题如何解决
现在使用C6748开发,需要使用sy***ios6。在SYSBIOS6中需要使用某一个timer来驱动系统时钟,在sy***ios的cfg文件中
发表于 05-19 11:15
电子系统设计实例
电子系统设计实例将精选一些历届电子竞赛的赛题,通过对它们的具体分析和设计、实施,将理论与实践紧密的结合起来,通过具体的设计训练提高实际能力。
简易数字频
发表于 07-28 18:24
•69次下载
三个命令生成的报告中均可显示Clock Skew的具体数值
如果时钟同时驱动I/O和Slice中的逻辑资源,且负载小于2000时,可通过CLOCK_LOW_FANOUT属性对相应的时钟net进行设置,
Linux时间子系统之一:clock source(时钟源)
clock source用于为linux内核提供一个时间基线,如果你用linux的date命令获取当前时间,内核会读取当前的clock source,转换并返回合适的时间单位给用户空间。
发表于 05-10 14:36
•2510次阅读
SOC设计中Clock Gating的基本原理与应用讲解
SOC(System on Chip,片上系统)设计中,时钟信号的控制对于整个系统的性能和功耗至关重要。本文将带您了解SOC设计中的一种
时钟子系统中clock驱动实例
评论