LINUX CommonClock Framework子系统分析之一 系统概述

本专栏主要介绍linux的ccf子系统 , 主要用于系统clock的管理等操作 。 本专栏我们大概分为如下几章进行学习:
一、CCF子系统概述
二、CCF子系统数据结构分析及关联说明
三、CCF子系统的clk注册与注销接口实现分析
四、虚拟的clk设备驱动实现
本章我们主要进行CCF子系统的概述 。 大致说明下CCF的框架 。 以便我们后续深入的分析下CCF的实现机制 。
clk的种类说明
LINUX CommonClock Framework子系统分析之一 系统概述文章插图
如上图所示 , 时钟源大概可分为如下几种:

  1. 提供基础时钟源的晶振(可分为有源晶振、无源晶振两种);
  2. 用于倍频的锁相环;
  3. 用于分频的divider;
  4. 用于多路时钟源选择的mux;
  5. 用于时钟使能的与门电路等 。
而在CCF子系统的抽象中 , 这五种均抽象为clk , 但是针对这5种类型的时钟也提供了单独的时钟注册函数(也就是对clk_register函数的封装 , 并针对不同的时钟类型定义了不同的结构体)
在CCF子系统中 , 针对硬件时钟的操作接口 , 也抽象了对应的结构体struct clk_ops , 包含时钟的使能接口、时钟频率的修改接口等等 。 而针对上述所说的不同种类的时钟源 , 其并不需要实现所有struct clk_ops中定义的接口 。 如下图所示 , 针对“时钟使能的与门电路”而言 , 仅需要实现enabel、disable、is_enable接口即可;针对多路时钟源选择的mux而言 , 则需要实现父时钟源的设置及获取的接口set_parent、get_parent等;对于倍频、分频而言 , 则需要实现时钟频率相关的接口set_rate、recalc_rate等 。
LINUX CommonClock Framework子系统分析之一 系统概述文章插图
CCF子系统的框架说明 如下图所示 , 是CCF子系统的软件框架 , 其对各设备驱动子系统提供统一时钟源操作的接口 , 实现为具体的硬件设备获取其对应的输入时钟源 , 并可通过统一的接口实现对时钟源的配置(如时钟的使能、时钟频率的配置等等);在CCF内部 , 针对每一个时钟源 , 抽象结构体struct clk_hw , 该结构体中包含每一个硬件时钟源的操作接口(struct clk_ops) , 当时钟源驱动程序完成时钟操作接口的定义 , 并调用clk_register完成注册后 , 则CCF即可借助clk_hw的clk_ops完成对时钟源的参数配置等操作 。
LINUX CommonClock Framework子系统分析之一 系统概述文章插图
clk子系统抽象了数据结构struct clk、struct clk_hw、struct clk_ops , 其中clk_hw是对一个时钟源的抽象 , 而clk_ops是时钟源的操作接口的抽象 , 而struct clk可以理解为访问clk_hw的实例) 。
【LINUX CommonClock Framework子系统分析之一 系统概述】 本章主要是简要说明一下时钟源的概念以及CCF子系统的框架 , 下一篇我们重点分析CCF子系统内部的实现 , 此专栏分析的目的主要是了解CCF子系统内部的实现流程以及CCF子系统的设计 , 因此重点会分析CCF子系统内部数据结构的划分、内部接口的实现及调用逻辑等内容 , 而不仅仅是说明CCF子系统下的时钟源驱动的注册以及时钟控制等 , 因为CCF子系统内部设计上做了很好的设计与抽象 , 因此时钟源设备驱动的开发以及时钟的使用等接口就相对来说简单了许多 , 在本专栏的最后一章我们将实现一个虚拟时钟源的驱动程序 , 从而说明时钟源驱动的开发流程(像这些设备驱动子系统而言 , 使用它们提供的接口实现驱动的注册一般都是比较简单的 , 因此我们最好能理解其子系统内部的设计逻辑 , 可能我们以后实现驱动或者应用程序开发时 , 也可以借鉴这种设计思路) 。