Linux clock子系统【1】- 对clock时钟框架见解

系列文章目录

Linux clock子系统【1】- 对clock时钟框架见解
Linux clock子系统【2】- 一文搞懂 | Linux 时钟子系统
Linux clock子系统【3】-i2c控制器获取时钟的流程分析
Linux clock子系统【4】-从CLK_OF_DECLARE 解析时钟驱动
Linux clock子系统【5】-从imx_clk_mux解析多路复用时钟时钟驱动(provider侧)
Linux clock子系统【6】-从imx_clk_gate2解析多路复用时钟时钟驱动(provider侧)

BUG

CLOCK【1】-单片机使用内部时钟,串口受热输出错误数据

扩展阅读

SOC时钟——一文看懂所有锁相环PLL的对比(模拟PLL、全数字PLL、模拟DLL、数字DLL)



前言


一、clock时钟框架称为common clock framework

在这里插入图片描述
从图中我们可以看出时钟提供者(clock provider)和时钟使用者(clock consumer)是通过common clock framework来通信的,而通信的基础都是设备树

  1. provider侧:
    解析设备树的的#clock-cells(必须有,若属性值为0,表示provider就提供一个clock output输出,若属性值为1,表示provider就提供多个clock output输出)和#clock-output-names(非必须有)属性,通过clk_register等一系列注册函数把硬件时钟树注册,然后调用of_clk_add_provider接口(这是providerconsumer连接的桥梁)组成时钟链表供时钟使用者查询使用

  2. consumer侧:
    解析设备树#clocks ,#clock-names 等属性,调用clk_get,devm_clk_get,clk_enable,clk_set_rate等一系列接口函数从provider侧组织好的时钟链表中获取匹配的时钟句柄(struct clk类型)

对我们使用者(device driver)来说,struct clk只是访问clock的一个句柄,不用关心它内部的具体形态。所以只需知道以下常用接口就可以:

二、CLOCK API

2.1 clock 获取有关的API:

device driver在操作设备的clock之前,需要先获取和该clock关联的struct clk指针,获取的接口如下:

/*从一个时钟list链表中以dev或者字符id名称查找一个时钟clk结构体*/
struct clk *clk_get(struct device *dev, const char *id);

struct clk *devm_clk_get(struct device *dev, const char *id);

/*该函数与clk_get函数对应,释放对应时钟结构体,即对结构体的引用计数减1*/
void clk_put(struct clk *clk);

void devm_clk_put(struct device *dev, struct clk *clk);

struct clk *clk_get_sys(const char *dev_id, const char *con_id);

struct clk *of_clk_get(struct device_node *np, int index);

struct clk *of_clk_get_by_name(struct device_node *np, const char *name);

struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec);

2.2 clock控制有关的API:

int clk_prepare(struct clk *clk)

void clk_unprepare(struct clk *clk)

/*使能对应的时钟*/
static inline int clk_enable(struct clk *clk)

/*关闭对应时钟*/
static inline void clk_disable(struct clk *clk)

/*获取对应时钟模块的频率*/
static inline unsigned long clk_get_rate(struct clk *clk)

/*设置时钟模块的频率*/
static inline int clk_set_rate(struct clk *clk, unsigned long rate)

/*调整频率rate为对应时钟可以提供的正确频率*/
static inline long clk_round_rate(struct clk *clk, unsigned long rate)

static inline int clk_set_parent(struct clk *clk, struct clk *parent)

static inline struct clk *clk_get_parent(struct clk *clk)

参考

  1. 对clock时钟框架见解
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值