linux clk驱动框架

转载 2017年11月14日 23:12:56

clk common framework(ccf)子系统,用来完成对clock的统一管理.
如今,可运行Linux的主流处理器平台,都有非常复杂的clock tree,我们随便拿一个处理器的spec,查看clock相关的章节,一定会有一个非常庞大和复杂的树状图,这个图由clock相关的器件,以及这些器件输出的clock组成。下图是一个示例:
这里写图片描述
clock相关的器件包括:用于产生clock的Oscillator(有源振荡器,也称作谐振荡器)或者Crystal(无源振荡器,也称晶振);用于倍频的PLL(锁相环,Phase Locked Loop);用于分频的divider;用于多路选择的Mux;用于clock enable控制的与门;使用clock的硬件模块(可称作consumer);等等.common clock framework的管理对象,就是上图蓝色字体描述的clock(在软件中用struct clk抽象,以后就简称clk),主要内容包括(不需要所有clk都支持):
1)enable/disable clk。
2)设置clk的频率。
3)选择clk的parent,例如hw3_clk可以选择osc_clk、pll2_clk或者pll3_clk作为输入源.

clk framework是内核中用来统一管理clock的子系统。代码存在于kernel/driver/clk目录中。 要使用clkframework来实现厂商自己平台上的clock驱动,首先需要在defconfig中使能如下的几个CONFIG来配置内核。
CONFIG_CLKDEV_LOOKUP=y
CONFIG_HAVE_CLK_PREPARE=y
CONFIG_COMMON_CLK=y
CONFIG_COMMON_CLK_DEBUG=y
如果配置了debug ,内核将生成相应的debugfs,在启动后将会挂载于/sys/kernel/debug目录下。
内核中clk framework 主要提供的功能有:

1. 向上提供给其他driver调用的接口API
2.  向下提供给clock driver注册的接口API
3.  debugfs创建
4.  若干个基于dts配置的通用clock模型(通过调用注册接口API)

这里写图片描述
上图中的黄色区域都是clk core所实现的功能,灰色区域是clock驱动开发需要做的事情,而绿色区域是其他device driver需要使用clock时要调用到的clk功能。

为其他设备驱动提供的接口(API)
struct clk *clk_get(struct device *dev, const char *id);
struct clk *devm_clk_get(struct device *dev, const char *id);
int clk_enable(struct clk *clk);
void clk_disable(struct clk *clk);
unsigned long clk_get_rate(struct clk *clk);
void clk_put(struct clk *clk);
long clk_round_rate(struct clk *clk, unsigned long rate);
int clk_set_rate(struct clk *clk, unsigned long rate);
int clk_set_parent(struct clk *clk, struct clk *parent);
struct clk *clk_get_parent(struct clk *clk);
int clk_prepare(struct clk *clk);
void clk_unprepare(struct clk *clk);
这些都是比较重要的api接口,主要是在device driver中调用来设置device的clk的。这部分的实现最终会调用到clk_ops中的回调函数来设置硬件并且会更新core中的clk链表.作为一个clk设备,它有可能会改变rate,那么作为device driver的一方需要获取到这个改变,并作出相应的响应,那么就可以通过通知功能的接口来实现,我们可以在感兴趣的clk上注册notifier_block,然后当该clk的rate发生了改变的时候会通过__clk_notify,通知到相应的回调函数,来做相应的处理。
int clk_notifier_register(struct clk *clk, struct notifier_block *nb);
int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb);

clk 设备驱动
1.几个重要的结构体,具体的结构可以参看内核源码。
clk_hw,clk_init_data ,clk_ops
clk
clk_hw结构体可以看到其中封装了一个clk_ops结构体,它是一个clk驱动需要实现的关键结构,厂商需要实现此结构体,并把它注册到clk framework。clk_hw是联系clk_ops和struct clk的纽带。它一般会被封装到一个厂商自己定义的更大的结构体中,主要是用来建立与struct clk的联系。
clk主要是用来抽象clk硬件的差异,并完成一些通用操作的封装。其中的hw成员变量是与之关联的clk_hw结构。

嵌入式Linux驱动笔记(十四)------详解clock时钟(CCF)框架及clk_get函数

你好!这里是风筝的博客,欢迎和我一起交流。我在找资料的时候,发现网上大部分文章都是说: 在s3c244x_init_clocks函数里:void __init s3c244x_init_clocks...
  • Guet_Kite
  • Guet_Kite
  • 2017年09月17日 19:40
  • 517

linux clk驱动框架

内核中提供了clk common framework子系统,用来完成对clock的统一管理。 我们将从如下几个方面来介绍clk子系统的内容:1. clk framework简介 2. clk f...
  • rikeyone
  • rikeyone
  • 2016年06月14日 16:25
  • 5229

mmc驱动框架分析1

mmc驱动框架分为core层,host层和card层。
  • xuao20060793
  • xuao20060793
  • 2015年06月17日 10:15
  • 462

linux CLK时钟驱动

前述:本篇linux时钟驱动以UART6串口为例。 一、时钟设备寄存器配置 1. UART6有两种时钟源选择APLL\UPLL(可通过技术手册查看),如图 clk[uart6_aplldiv...
  • chenliang0224
  • chenliang0224
  • 2017年04月30日 17:28
  • 480

Linux 内核clk 硬件相关层

在Linux内核的clk处理框架中,平台需要实现针对具体clk操作的函数句柄,并且这些 被封装到struct clk_hw对象中。之后通过函数clk_register()向clk框架层注册。 框架...
  • sunlei0625
  • sunlei0625
  • 2017年03月09日 11:29
  • 168

Linux common clock framework(1)_概述

Linux common clock framework(1)_概述 作者:蜗蜗 发布于:2014-10-20 23:06 分类:Linux内核分析 1. 前言 common clock f...
  • M_O_Bz
  • M_O_Bz
  • 2014年10月29日 03:23
  • 3287

1-Linux驱动基本框架结构

学习linux驱动编程,首先应该学习linux的驱动框架,而本次博文是最基本的驱动框架,对学习很实用!...
  • lihui598738423
  • lihui598738423
  • 2016年09月01日 18:54
  • 385

串口驱动及架构

原创kylin_zeng:http://blog.csdn.net/kylin_fire_zeng  本文参考国嵌视频教程,再此感谢国嵌教育。 一、重点概述: 在Linux中,TTY(终端)是一类字...
  • Diwat
  • Diwat
  • 2013年09月12日 23:18
  • 2678

【Linux开发】V4L2驱动框架分析学习

Author:CJOK Contact:cjok.liao#gmail.com SinaWeibo:@廖野cjok   1、概述 Video4Linux2是Linux内核...
  • LG1259156776
  • LG1259156776
  • 2016年08月28日 09:52
  • 2427

Linux ASoC音频驱动架构 及 Machine驱动代码分析

【软件框架】     在对要做的事情一无所知的时候,从全局看看系统的拓扑图对我们认识新事物有很大的帮助。Audio 部分的驱动程序框架如下图所示:     这幅图明显地分为 3 级。     上方蓝...
  • Qidi_Huang
  • Qidi_Huang
  • 2016年07月18日 00:33
  • 2076
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux clk驱动框架
举报原因:
原因补充:

(最多只允许输入30个字)