目录
1.2.2 定义分配 struct clk_onecell_data 结构体,初始化相关数据
1.2.3 定义分配 struct clk_init_data 结构体,初始化相关数据
1.2.4 调用 clk_register 将时钟注册进框架
1.2.5 调用 clk_register_clkdev 注册时钟设备
1.2.6 调用 of_clk_add_provider,将 clk provider 存放到 of_clk_provider 链表中管理
1. clock provider dts配置
在设备数中,需要首先定义clock provider的特性节点,以 rk3399 为例,下面的 cru(clock reset unit) 的配置如下:
cru: clock-controller@ff760000 {
compatible = "rockchip,rk3399-cru";
reg = <0x0 0xff760000 0x0 0x1000>;
rockchip,grf = <&grf>;
#clock-cells = <1>;
#reset-cells = <1>;
assigned-clocks =
<&cru PLL_GPLL>, <&cru PLL_CPLL>,
<&cru PLL_NPLL>,
<&cru ACLK_PERIHP>, <&cru HCLK_PERIHP>,
<&cru PCLK_PERIHP>,
<&cru ACLK_PERILP0>, <&cru HCLK_PERILP0>,
<&cru PCLK_PERILP0>, <&cru ACLK_CCI>,
<&cru HCLK_PERILP1>, <&cru PCLK_PERILP1>;
assigned-clock-rates =
<594000000>, <800000000>,
<1000000000>,
<150000000>, <75000000>,
<37500000>,
<100000000>, <100000000>,
<50000000>, <600000000>,
<100000000>, <50000000>;
};
不同属性的的含义如下:
| 属性 | 含义 |
| compatible | 驱动的匹配名称,内核通过字段匹配到不同的初始化函数 |
| clock-output-names | 输出时钟的名字,当consumer 使用此时钟时,使用该属性的值 |
| clock-frequency | 输出时钟的频率 |
| clock-cells | 输出的时钟的路数,当#clock-cells为0时,代表仅输出1路时钟,若大于等于1,则代表输出多路时钟,Clock consumers通过编号索引使用。 |
| assigned-clocks | 表示该设备需要使用时钟信号,这个属性的值是一个整数数组,每一个元素对应一个时钟信号 |
| assigned-clock-rates | 和 assigned-clocks 成对使用,表述输入时钟的频率 |
在 Linux 内核代码中,还需要声明相匹配的时钟驱动,这样在初始化阶段,内核就可以自动匹配 dts 中的 compatible 字段,向系统注册时钟设备。
CLK_OF_DECLARE 宏用于声明与设备树(DeviceTree)绑定的时钟控制器驱动
1.1 CLK_OF_DECLARE
CLK_OF_DECLARE 宏的定义如下:
#define CLK_OF_DECLARE(name, compat, fn) \
OF_DECLARE_1(clk_of_match, name, compat, fn)
//name:时钟提供者的名称,通常是一个结构体的实例。
//c

最低0.47元/天 解锁文章
1385

被折叠的 条评论
为什么被折叠?



