瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】824412014(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(第七期_设备树_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
第58章 实例分析:时钟
时钟(Clock)用于描述硬件设备和系统中的时钟源以及时钟相关的配置和连接关系。时钟在计算机系统中起着至关重要的作用,用于同步和定时各种硬件设备的操作。时钟可以分为两个主要角色:时钟生产者(clock provider)和时钟消费者(clock consumer)。
时钟生产者(Clock Provider):
定义:时钟生产者是负责生成和提供时钟信号的硬件或软件模块。它可以是时钟控制器、PLL、时钟发生器等。
设备树节点:时钟生产者在设备树中以时钟节点的形式表示。
时钟节点属性:
(1)clock-cells:该属性用于指定时钟编号的位数。它是一个整数值,表示时钟编号的位数。通常情况下,当 clock-cells 为 0 时表示一个时钟,为 1 表示多个时钟。具体示例如下所示:
示例1:单个时钟
osc24m: osc24m {
compatible = "clock";
clock-frequency = <24000000>;
clock-output-names = "osc24m";
#clock-cells = <O>;
};
示例2:多个时钟
clock: clock {
#clock-cells = <1>;
clock-output-names = "clock1", "clock2";
};
(2)clock-frequency 属性是设备树中用于指定时钟频率的属性。它用于描述时钟节点所提供的时钟信号的频率,使用 Hertz (Hz) 作为单位。对于时钟生产者节点,clock-frequency 属性表示该节点生成的时钟信号的频率。它用于描述时钟控制器、晶振、PLL 等产生时钟信号的硬件或软件模块的输出频率,例如指定时钟频率为24000000的具体示例如下所示:
(3)assigned-clocks 和 assigned-clock-rates 是设备树中用于描述多路时钟的属性,通常一起使用。
assigned-clocks 属性用于标识时钟消费者节点所使用的时钟源。它是一个整数数组,每个元素对应一个时钟编号。时钟编号是指时钟生产者节点(如时钟控制器)所提供的时钟源的编号。通过在时钟消费者节点中使用 assigned-clocks 属性,可以指定该节点所需的时钟源。
assigned-clock-rates 属性用于指定每个时钟源的时钟频率。它是一个整数数组,每个元素对应一个时钟源的频率。时钟频率以 Hz (赫兹) 为单位表示。assigned-clock-rates 属性的元素数量和顺序应与 assigned-clocks 属性中的时钟编号相对应。
关于assigned-clocks 和 assigned-clock-rates 属性的一个具体示例如下所示:
cru: clock-controller@fdd20000 {
#clock-cells = <1>;
assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru ACLK_RKVDEC_PRE>;
assigned-clock-rates = <32768>, <300000000>;
};
(4)clock-indices:clock-indices 属性用于指定时钟消费者节点所使用的时钟源的索引值。它是一个整数数组,每个元素对应一个时钟源的索引。
时钟索引是指时钟生产者节点(如时钟控制器)所提供的时钟源的编号。通过在时钟消费者节点中使用 clock-indices 属性,可以明确指定该节点所需的时钟源,并按照特定的顺序进行匹配。一个clock-indices示例如下所示:
scpi_dvfs: clocks-0 {
#clock-cells = <1>;
clock-indices = <0>, <1>, <2>;
clock-output-names = "atlclk", "aplclk", "gpuclk";
};
scpi_clk: clocks-1 {
#clock-cells = <1>;
clock-indices = <3>;
clock-output-names = "pxlclk";
};
在第一个节点中"atlclk", "aplclk", "gpuclk"三个时钟源的索引就分别被设置为了0、1、2,在第二个节点中"pxlclk"时钟源的索引值被设置为了3.
(5)assigned-clock-parents 属性用于指定时钟消费者节点所使用的时钟源的父时钟源。它是一个时钟源引用的数组,每个元素对应一个父时钟源的引用。在时钟的层次结构中,某些时钟源可能是其他时钟源的父时钟源,即它们提供时钟信号给其他时钟源作为输入。通过在时钟消费者节点中使用 assigned-clock-parents 属性,可以明确指定该节点所需的父时钟源,并按照特定的顺序进行匹配。一个实际的 assigned-clock-parents 属性例子如下所示:
clock: clock {
assigned-clocks = <&clkcon 0>, <&pll 2>;
assigned-clock-parents = <&pll 2>;
assigned-clock-rates = <115200>, <9600>;
};
上述设备树表示了一个名为 clock 的时钟消费者节点,具有以下属性:
assigned-clocks 属性指定了该节点使用的时钟源,引用了两个时钟源节点:clkcon 0 和 pll 2。
assigned-clock-parents 属性指定了这些时钟源的父时钟源,引用了 pll 2 时钟源节点。
assigned-clock-rates 属性指定了每个时钟源的时钟频率,分别是 115200 和 9600。
时钟消费者(Clock Consumer):
定义:时钟消费者是依赖时钟信号的硬件设备或模块。它们通过引用时钟生产者节点提供的时钟源来获取时钟信号。
设备树节点:时钟消费者在设备树中的节点中使用属性来引用时钟生产者的时钟源。
时钟消费者属性:
(1)clocks:该属性用于指定时钟消费者节点所需的时钟源。它是一个整数数组,每个元素是一个时钟编号,表示时钟消费者需要的一个时钟源。
(2)clock-names:可选属性,用于指定时钟消费者节点所需时钟源的名称。它是一个字符串数组,与 clocks 数组一一对应,用于提供时钟源的描述性名称。
一个时钟消费者示例如下所示:
clock: clock {
clocks = <&cru CLK_VOP>;
clock-names = "clk_vop";
};
clocks 属性指定了该节点使用的时钟源,引用了 cru 节点中的 CLK_VOP 时钟源。
clock-names 属性指定了时钟源的名称,这里是 "clk_vop"。