Linux 内核设备树时钟绑定
这种绑定依然处于开发中,并且基于 benh[1] 的一些实验性工作。
时钟信号源可以由设备树中的任何节点表示。这些节点被指定为时钟提供者。时钟消费者节点使用 phandle 和时钟指示符对将时钟提供者输出连接到时钟输入。与 gpio 指示符类似,时钟指示符是 0 个、1 个或多个标识设备上的时钟输出的元素的数组。时钟指示符的长度由时钟提供者节点中的 #clock-cells 属性值定义。
[1] https://patchwork.ozlabs.org/patch/31551/
时钟提供者
必需的属性:
#clock-cells:时钟指示符中的元素个数;通常,具有单个时钟输出的节点为 0,具有多个时钟输出的节点为 1。
可选的属性:
clock-output-names:建议为,由时钟指示符中的首个元素索引的时钟输出信号名称的字符串的列表。然而,clock-output-names 的含义特定于时钟提供者的域,并且只是为了鼓励对大多数时钟提供者使用相同的含义。这种格式可能不适用于使用复杂时钟指示符格式的时钟提供者。在这些情况下,建议省略此属性,并创建特定于绑定的名称属性。
时钟消费者节点不得直接引用提供者的 clock-output-names 属性。
例如:
oscillator {
#clock-cells = <1>;
clock-output-names = "ckil", "ckih";
};
- 这个节点定义了一个具有两个时钟输出的设备,第一个的名称为 "ckil",第二个的名称为 "ckih"。消费者节点总是通过索引引用时钟。名称应该反映设备的时钟输出信号名称。
clock-indices:如果节点中时钟的标识号不是从 0 开始线性增长的,这个属性可以将标识符映射到 clock-output-names 数组。
例如,如果我们有 <&oscillator 1> 和 <&oscillator 3> 两个时钟:
oscillator {
compatible = "myclocktype";
#clock-cells = <1>;
clock-indices = <1>, <3>;
clock-output-names = "clka", "clkb";
}
这确保我们在 clock-output-names 中没有任何空字符串。
时钟消费者
必需的属性:
clocks:phandle 和时钟指示符对的列表,设备的每个时钟输入一对。注意:如果时钟提供者指定其 #clock-cells 为 0,则只需要对的 phandle 部分。
可选的属性:
clock-names:时钟输入名称字符串的列表,按与时钟属性相同的顺序排序。消费者驱动程序将使用 clock-names 来匹配时钟输入名称和时钟指示符。
clock-ranges:空属性表示子节点可以从该节点继承命名时钟。用于总线节点向其子节点提供时钟。
例如:
device {
clocks = <&osc 1>, <&ref 0>;
clock-names = "baud", "register";
};
这表示具有两个时钟输入的设备,两个时钟输入名称为 "baud" 和 "register"。"baud" 时钟连接到 &osc 设备的输出 1,"register" 时钟连接到 &ref 设备的输出 0。
示例
/* external oscillator */
osc: oscillator {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <32678>;
clock-output-names = "osc";
};
/* phase-locked-loop device, generates a higher frequency clock
* from the external oscillator reference */
pll: pll@4c000 {
compatible = "vendor,some-pll-interface"
#clock-cells = <1>;
clocks = <&osc 0>;
clock-names = "ref";
reg = <0x4c000 0x1000>;
clock-output-names = "pll", "pll-switched";
};
/* UART, using the low frequency oscillator for the baud clock,
* and the high frequency switched PLL output for register
* clocking */
uart@a000 {
compatible = "fsl,imx-uart";
reg = <0xa000 0x1000>;
interrupts = <33>;
clocks = <&osc 0>, <&pll 1>;
clock-names = "baud", "register";
};
这个 DT 片段定义了三个设备:一个提供低频参考时钟的外部振荡器,一个生成更高频率时钟信号的 PLL 设备,和一个 UART。
- 振荡器是固定频率的,它提供了一个时钟输出,名为 "osc"。
- PLL 同时是时钟提供者和时钟消费者。它使用外部振荡器生成的时钟信号,并提供两个输出信号 ("pll" 和 "pll-switched")。
- UART 把它的 "baud" 时钟连接到外部振荡器,把它的 "register" 时钟连接到 PLL 时钟 ("pll-switched" 信号)。
分配时钟父节点和速率
某些平台可能需要初始配置默认父时钟和时钟频率。这样的配置可以在设备树节点中,通过 assigned-clocks,assigned-clock-parents 和 assigned-clock-rates 属性指定。assigned-clock-parents 属性应该以 phandle 和时钟指示符对的形式包含父时钟的列表,assigned-clock-rates 属性应该包含一个以 Hz 为单位的频率的列表。这两个属性应该对应于 assigned-clocks 属性中列出的时钟。
若要跳过设置时钟的父时钟或频率,则应将其对应的项设置为 0,如果其后没有任何非零项,则可以省略该项。
uart@a000 {
compatible = "fsl,imx-uart";
reg = <0xa000 0x1000>;
...
clocks = <&osc 0>, <&pll 1>;
clock-names = "baud", "register";
assigned-clocks = <&clkcon 0>, <&pll 2>;
assigned-clock-parents = <&pll 2>;
assigned-clock-rates = <0>, <460800>;
};
在这个例子中,<&pll 2> 时钟被设置为时钟 <&clkcon 0> 的父时钟,且给 <&pll 2> 时钟分配了频率值 460800 Hz。
通过消费时钟的设备节点配置时钟的父时钟和频率,只能用于具有单个用户的时钟。禁止在多个消费者节点中为共享的时钟指定冲突的父时钟或频率配置。
公共时钟的配置,将会影响多个消费者设备,可以类似地在时钟提供者节点中指定。
受保护的时钟
某些平台或固件可能不会将所有时钟完全暴露给 OS ,例如在这些时钟由运行在 ARM 安全执行级别的驱动程序所使用的情况下。在设备树中,这种配置可以通过 protected-clocks 属性以时钟指示符列表的形式来指定。这种属性只应该在提供受保护时钟的节点中指定。
clock-controller@a000f000 {
compatible = "vendor,clk95;
reg = <0xa000f000 0x1000>
#clocks-cells = <1>;
...
protected-clocks = <UART3_CLK>, <SPI5_CLK>;
};
Linux 内核设备树时钟绑定的更多相关文章
- Linux内核 设备树操作常用API【转】
转自:https://www.linuxidc.com/Linux/2017-02/140818.htm 一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在&qu ...
- Linux内核 设备树操作常用API
Linux设备树语法详解一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在"include/of.h"中声明. device_node 内核中 ...
- Linux dts 设备树详解(二) 动手编写设备树dts
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...
- Linux dts 设备树详解(一) 基础知识
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 1 前言 2 概念 2.1 什么是设备树 dts(device tree)? 2. ...
- Linux 获取设备树源文件(DTS)里描述的资源
Linux 获取设备树源文件(DTS)里的资源 韩大卫@吉林师范大学 在linux使用platform_driver_register() 注册 platform_driver 时, 需要在 plat ...
- (转)Linux内核基数树应用分析
Linux内核基数树应用分析 ——lvyilong316 基数树(Radix tree)可看做是以二进制位串为关键字的trie树,是一种多叉树结构,同时又类似多层索引表,每个中间节点包含指向多个节点的 ...
- Linux 获取设备树源文件(DTS)里的资源【转】
本文转载自:http://blog.csdn.net/keleming1/article/details/51036000 http://www.cnblogs.com/dyllove98/archi ...
- Linux 获取设备树源文件(DTS)里描述的资源【转】
转自:http://www.linuxidc.com/Linux/2013-07/86839.htm 转自:http://blog.sina.com.cn/s/blog_636a55070101mce ...
- 芯灵思Sinlinx A64 linux 通过设备树写LED驱动(附参考代码,未测试)
开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 全志A64设备树结构体 #inc ...
- Linux 内核设备驱动
设备模型跟踪所有对系统已知的驱动. 这个跟踪的主要原因是使驱动核心能匹配驱动和新 设备. 一旦驱动在系统中是已知的对象, 但是, 许多其他的事情变得有可能. 设备驱动可 输出和任何特定设备无关的信息和 ...
随机推荐
- AccessToken、for_user、get_token
在Django REST framework的SimpleJWT库中,AccessToken是一个类,用于表示一个JSON Web Token (JWT)中的访问令牌部分.访问令牌是一种常见的身份验证 ...
- ET介绍—— 一切皆实体的设计
一切皆实体 目前十分流行ECS设计,主要是守望先锋的成功,引爆了这种技术.守望先锋采用了状态帧这种网络技术,客户端会进行预测,预测不准需要进行回滚,由于组件式的设计,回滚可以只回滚某些组件即可.ECS ...
- C语言访问数据对象在内存中真实位模式的一个方法
在判定机器采用大端还是小端存储时,可以按字节输出某数据对象的机器表示的位模式.机器表示的位模式即某数据对象在内存中的二进制串.下面是一个访问数据对象位模式的方法: //传入一个数据对象,从低地址到高地 ...
- Python基础 - 注释
单行注释 Python中使用#表示单行注释.一般在#后面添加一个空格,再添加注释内容 1 # 这是单行注释 多行注释 Python中使用三个单引号或三个双引号表示多行注释. 1 ''' 2 这是使 ...
- Java方法的概念以及方法的四种语法
一.方法 方法的概念 将一个功能抽取出来,放在类中的大括号中,形成一个独立的功能,当需要使用该功能时,则调用它,这样可以增强代码的复用性(重复利用),并解决代码的冗余现象. 方法的语法: [访 ...
- shader编程经典:分形--科赫曲线
序言 科赫(雪花)曲线是一个经典分形图案,来一起领略下分形之美.本篇内容用到一些基础的内容,例如UV的理解和画线技巧,有需要的话可以参考合集的画圆和画线两篇文章. 示例 shadertoy 代码: # ...
- Python生成器深度解析:构建强大的数据处理管道
前言 生成器是Python的一种核心特性,允许我们在请求新元素时再生成这些元素,而不是在开始时就生成所有元素.它在处理大规模数据集.实现节省内存的算法和构建复杂的迭代器模式等多种情况下都有着广泛的应用 ...
- Docker 中的 .NET 异常了怎么抓 Dump
一:背景 1. 讲故事 有很多朋友跟我说,在 Windows 上看过你文章知道了怎么抓 Crash, CPU爆高,内存暴涨 等各种Dump,为什么你没有写在 Docker 中如何抓的相关文章呢?瞧不上 ...
- Prompt Playground: 一个简易的提示词调试工具
Prompt Playground: 一个简易的提示词调试工具 将LLM引入到日常的开发工作中后,会面临大量的提示词调试的工作,由于LLM不确定性,这个工作会变得非常的繁琐,需要不断的调整,甚至需要大 ...
- 论文日记四:Transformer(论文解读+NLP、CV项目实战)
导读 重磅模型transformer,在2017年发布,但就今天来说产生的影响在各个领域包括NLP.CV这些都是巨大的! Paper<Attention Is All You Need>, ...