首页 理论教育揭秘TI芯片Clock管理实现

揭秘TI芯片Clock管理实现

【摘要】:TI芯片时钟管理框架的实现也是分层次的。3不同时钟类型的具体实现由之前的代码和struct clk中可见,操作接口有两种,一种是在struct clkops中表示的,另外一种是直接在struct clk中的,如set_rate等。仔细看struct clkops中的操作接口是和时钟enable和disable相关的,而struct clk中的操作接口是和频率设定相关的。操作接口分析如下:4时钟管理初始化实际的芯片中所有时钟的信息都在clockxxxx_data.c内,DM3730的时钟信息是在clock3xxx_data.c内,其中不仅包含了详细的时钟信息,还包含芯片相关的时钟管理初始化操作。

TI芯片(包括DM 3730和DM 816X)时钟管理框架的实现也是分层次的。在上层实现了Linux内核提供的接口函数作为抽象层,供其他模块使用;底层则是和芯片相关的具体接口实现。无论哪一层,相应的核心结构都是struct clk,该结构在arch/arm/plat-omap/in-clude/plat/clock.h中定义,具体内容如下:

978-7-111-49426-3-Chapter04-235.jpg

978-7-111-49426-3-Chapter04-236.jpg

其中包括了和树状管理相关的属性parent、children和sibling;使用计数的属性usec-ount;操作接口;以及特定时钟类型相关的属性,如clksel、dpll_data等。这里包含了完整的信息。时钟管理的具体实现就是围绕着该数据结构展开的。

下面按照层次来介绍时钟管理。

1ᤫ抽象层实现

相应的抽象实现是在linux/arch/arm/plat-omap/clock.c文件中,具体实现了Linux内核中规定的一些接口,代码分析如下:

978-7-111-49426-3-Chapter04-237.jpg

978-7-111-49426-3-Chapter04-238.jpg

978-7-111-49426-3-Chapter04-239.jpg

978-7-111-49426-3-Chapter04-240.jpg

978-7-111-49426-3-Chapter04-241.jpg

2ᤫ芯片时钟接口具体实现

在抽象层看到很多接口都是调用芯片的具体实现来执行的,DM 3730和DM 816X相关的具体实现是在mach-omap2/clock.c中,操作接口综合成clk_functions。

978-7-111-49426-3-Chapter04-242.jpg

相应的接口实现详细分析如下:

978-7-111-49426-3-Chapter04-243.jpg

978-7-111-49426-3-Chapter04-244.jpg

978-7-111-49426-3-Chapter04-245.jpg

978-7-111-49426-3-Chapter04-246.jpg

978-7-111-49426-3-Chapter04-247.jpg

从代码中可见,对clock的操作中还要设置上层的clock domain,这符合芯片的电源管理设计框架。

3ᤫ不同时钟类型的具体实现

由之前的代码和struct clk中可见,操作接口有两种,一种是在struct clkops中表示的,另外一种是直接在struct clk中的,如set_rate等。这是为什么呢?仔细看struct clkops中的操作接口是和时钟enable和disable相关的,而struct clk中的操作接口是和频率设定相关的。把它们分开是因为这是两种完全不同的操作类型。对enable和disable相关的操作单独管理是由于很多模块会有不止一种时钟,通常会有接口时钟和功能时钟,而设备要能使用,需要在enable某种时钟时伴随着enable相应的伙伴时钟;或者某些时钟是由模块对外产生的,在enable时需要等待相应的模块到某种状态时才是真正的enable,只有等待到相应的状态时相关的操作才完整。而对时钟频率的操作则相对直接,只要根据不同的时钟类型进行正确的操作即可。

DM 3730提供了几类enable和disable的操作接口,具体如下:

978-7-111-49426-3-Chapter04-248.jpg

978-7-111-49426-3-Chapter04-249.jpg(www.chuimin.cn)

可见主要的接口是enable和disable。下面来进行详细分析,在分析之前先进行说明,相应的接口主要操作的寄存器是功能时钟使能FCLKEN、接口时钟使能ICLKEN和状态检查IDLEST等寄存器。

978-7-111-49426-3-Chapter04-250.jpg

978-7-111-49426-3-Chapter04-251.jpg

978-7-111-49426-3-Chapter04-252.jpg

针对时钟频率的操作,则要考虑两种类型的时钟,分别是通过寄存器选择的clock和dpll clock,这两种类型的时钟对应频率的操作是完全不同的。

先看看通过寄存器选择的时钟相关的操作接口实现:

978-7-111-49426-3-Chapter04-253.jpg

978-7-111-49426-3-Chapter04-254.jpg

978-7-111-49426-3-Chapter04-255.jpg

978-7-111-49426-3-Chapter04-256.jpg

DPLL锁相环时钟会和芯片中究竟采用怎样的锁相环技术相关。DM 3730中使用的DPLL结构如图4-47所示。图4-47引自《DM 3730芯片手册》中第299页框图。

978-7-111-49426-3-Chapter04-257.jpg

图4-47 DM 3730DPLL结构图

由图4-47可见,DM3730的DPLL主要是设置乘数和除数(M和N),另外DPLL有bypass模式。操作接口分析如下:

978-7-111-49426-3-Chapter04-258.jpg

978-7-111-49426-3-Chapter04-259.jpg

978-7-111-49426-3-Chapter04-260.jpg

978-7-111-49426-3-Chapter04-261.jpg

978-7-111-49426-3-Chapter04-262.jpg

4ᤫ时钟管理初始化

实际的芯片中所有时钟的信息都在clockxxxx_data.c内,DM3730的时钟信息是在clock3xxx_data.c内,其中不仅包含了详细的时钟信息,还包含芯片相关的时钟管理初始化操作。详细分析如下:

978-7-111-49426-3-Chapter04-263.jpg

978-7-111-49426-3-Chapter04-264.jpg

978-7-111-49426-3-Chapter04-265.jpg

注意,该操作是对整个系统的时钟的初始化函数,所以需要在系统初始化比较早的时候进行,对于DM 3730是在板级的中断初始化接口中调用。

至此,关于时钟管理的框架和主要接口分析完毕。