系列文章目录
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)
文章目录
- 系列文章目录
- BUG
- 扩展阅读
- 前言
- 一、clock时钟框架称为common clock framework
- 二、CLOCK API
- 2.1 clock 获取有关的API:
- 2.2 clock控制有关的API:
- 参考
前言
一、clock时钟框架称为common clock framework
从图中我们可以看出时钟提供者(clock provider
)和时钟使用者(clock consumer
)是通过common clock framework
来通信的,而通信的基础都是设备树
-
provider
侧:
解析设备树的的#clock-cells
(必须有,若属性值为0,表示provider
就提供一个clock output
输出,若属性值为1,表示provider
就提供多个clock output
输出)和#clock-output-names
(非必须有)属性,通过clk_register
等一系列注册函数把硬件时钟树注册,然后调用of_clk_add_provider
接口(这是provider
和consumer
连接的桥梁)组成时钟链表供时钟使用者查询使用 -
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指针,获取的接口如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/*从一个时钟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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23int 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)
参考
- 对clock时钟框架见解
最后
以上就是外向小蝴蝶最近收集整理的关于Linux clock子系统【1】- 对clock时钟框架见解系列文章目录BUG扩展阅读前言一、clock时钟框架称为common clock framework二、CLOCK API参考的全部内容,更多相关Linux内容请搜索靠谱客的其他文章。
发表评论 取消回复