在 Linux 中,时钟架构是如何实现的。有一个文件include/linux/clkdev.h
struct clk_lookup {
struct list_head node;
const char *dev_id;
const char *con_id;
struct clk *clk;
};
有哪些不同的领域,它在时钟架构中被广泛使用arch/arm/Board***/...
?
在 Linux 中,时钟架构是如何实现的。有一个文件include/linux/clkdev.h
struct clk_lookup {
struct list_head node;
const char *dev_id;
const char *con_id;
struct clk *clk;
};
有哪些不同的领域,它在时钟架构中被广泛使用arch/arm/Board***/...
?
通用 Linux 时钟基础结构记录在clk.rst中。对于 ARM,Sasha Hauer最近(过去两年)创建了通用时钟框架。时钟以父/子关系构造。典型的 SOC(片上系统)具有由晶体创建的主时钟,这些时钟要么按比例缩小(使用计数器),要么使用 PLL 放大,可能两者兼而有之。它们的层次结构对于节能很重要。通常设备只使用树中最低/最年轻的时钟之一。当设备请求时钟时,基础结构确保所有父母都启动。
以前(旧版),时钟通过平台数据从机器文件(参考arch/arm/Board***/
)传递到驱动程序/设备;最终通过platform_device_register()
。有时,时钟是/源自设备名称。例如,fec驱动程序可能使用fec-clk。这对于多机配置效果不佳,因此引入了平台数据机制。甚至较新的机器也使用dt(或设备表)。这里没有机器文件,只有一个从引导加载程序传递到内核的设备表。在这种情况下,dt告诉驱动程序使用哪个时钟。
最初,dev_id
andcon_id
是关联设备的时钟和连接的时钟(父/子)。通常要么 要么dev_id
为con_id
NULL,因为只需要一个方面。我认为这种观点是有欠缺的;特别是对于启动整个时钟链。因此,根据 Linux 版本,答案会有所不同。即使在当前源代码中,某些平台(如orion
)仍然使用较旧的机制。我认为不orion
支持设备树。
具体答案取决于您的 Linux 版本和使用的机器(可能还有平台)。
参见:clkdev.c、clk.c
开源 - 有许多突变。他们都有不同的计划。BSG 重新成像
参考:Russell Kings 关于 ARM clkdev 的消息,原文并不暗示订购。