RK3399 Clock Guide Linux4.4
User Manual:
Open the PDF directly: View PDF
.
Page Count: 25
| Download | |
| Open PDF In Browser | View PDF |
Rockchip
时钟配置详细说明
发布版本:1.0
作者邮箱:zhangqing@rock-chips.com
日期:2018.6
文件密级:公开资料
前言
概述
产品版本
芯片名称
内核版本
RK3399
4.4
读者对象
本文档(本指南)主要适用于以下工程师:
技术支持工程师
软件开发工程师
修订记录
日期
版本
作者
修改说明
2018-06-08
V1.0
Elaine
第一次临时版本发布
时钟配置详细说明
1 时钟配置
Rockchip
1.1 CRU时钟配置
1.1.1 CRU时钟树
1.1.2 配置一些时钟常开
1.1.3 CLK ID获取
1.1.4 PLL时钟配置
1.1.5 CLK_TIMER时钟配置
1.1.6 总线时钟配置
1.1.7 FCLK_CM0S时钟配置
1.1.8 CLK_I2C时钟配置
1.1.9 CLK_SPI时钟配置
1.1.10 CLK_UART时钟配置
1.1.11 CLK_EMMC、CLK_SDIO、CLK_SDMMC时钟配置
1.1.12 显示相关VOP、HDCP、EDP跟ISP时钟配置
1.1.13 视频编解码VDU、RGA、CODEC、IEP相关时钟配置
1.1.14 USB相关时钟配置
1.1.15 CIF相关时钟配置
1.2 PMUCRU时钟配置
1.2.1 PMUCRU时钟树
1.2.2 配置一些时钟常开
1.2.3 PCLK_PMU总线时钟配置
1.2.4 PMU_M0时钟配置
1.2.5 PMU总线时钟配置
1.2.6 PMU_I2C时钟配置
1.2.7 PMU_SPI时钟配置
1.2.8 PMU_WIFI时钟配置
1.2.9 PMU_UART4时钟配置
2
时钟间依赖关系
2.1 普通的父子关系
2.2 不同模块间NOC复用
2.3 不同模块间GRF复用
3
时钟频率值
3.1 可设置的时钟频率
1
时钟配置
时钟配置
1.1 CRU
1.1.1 CRU
时钟树
时钟树太长,不做说明,详细cat /sys/kernel/debug/clk/clk_summary
1.1.2
配置一些时钟常开
对于调试过程中,想把某些时钟设置成常开的,可以修改rk3399_cru_critical_clocks这个结构体,按照现有增加时钟名
字即可:
1
drivers/clk/rockchip/clk-rk3399.c
2
3
static const char *const rk3399_cru_critical_clocks[] __initconst = {
4
5
"aclk_usb3_noc",
};
这个结构中的clk在系统开机,clk初始化的时候会默认调用clk_set_enable接口。
注意:如果时钟不是常开的,驱动设备也没有引用这个时钟并开启,在时钟初始化完成之后,会调用
clk_disable_unused_subtree(drivers/clk/clk.c)关闭没有用的时钟。如果没有用的时钟不想被关闭,可以在dts中
的增加属性clk_ignore_unused:
1
chosen {
2
bootargs = "earlyprintk=uart8250-32bit,0xff690000 clk_ignore_unused";
3
};
1.1.3 CLK ID
获取
4.4的内核dts引用时钟,是根据clk id,不像3.10通过clk name索引。 CLK ID获取,详细见文档《Rockchip Clock 开
发指南》中2.3.2章节。
1.1.4 PLL
时钟配置
PLL锁相环详细介绍见文档《Rockchip Clock 开发指南》中1.3和2.2.1章节中。一般PLL不需要修改,尤其是下面挂了
显示相关时钟的,PLL最好不要重现设置否则会有抖动问题。PLL的设置可以在UBOOT中,也可以直接在cru节点里
面设置。
1. dts中设置 但是只在节点初始化的时候调用一次。
1
cru: clock-controller@ff760000 {
2
assigned-clocks =
3
<&cru ARMCLKL>, <&cru ARMCLKB>,
4
<&cru PLL_NPLL>, <&cru PLL_CPLL>,
5
<&cru PLL_GPLL>;
6
assigned-clock-rates =
7
<816000000>,
8
<600000000>, <500000000>,
9
10
<816000000>,
<800000000>;
};
ARMB PLL
ARML PLL
DDR PLL
GPLL
CPLL
VPLL
NPLL
USBPHYPLL
PMUPLL
1200
900
900
600
800
1200
1000
480
700
2. PLL计算公式 RK平台目前有两种类型PLL,一种是NR\NF\NO(RK3066、RK3188、RK3288),一种
REF\POSTDIV1\POSTDIV2(RK3036、RK312X、RK322X、RK332X、RK336X、RK3399)
NO类型,只有整数分频
FOUTVCO / NO
FREF = FIN / NR
FOUTVCO = FREF * NF
FOUTPOSTDIV =
FREF范围: 269MHZ - 2200MHZ,VCO 范围: 440MHz – 2200MHz,输出频率范围:
27.5MHz – 2200MHz。
NF_MAX:4096,NR_MAX:64,NO_MAX:16(只能偶数)
2)REF\POSTDIV1\POSTDIV2类型,支持整数分频和小数分频
disabled, "integer mode")
POSTDIV1 / POSTDIV2
整数分频:
FOUTVCO = FREF / REFDIV * FBDIV
小数分频:
If DSMPD = 1 (DSM is
FOUTPOSTDIV = FOUTVCO /
If DSMPD = 0 (DSM is enabled, "fractional mode")
FOUTVCO = FREF / REFDIV * (FBDIV + FRAC / 2^24)
POSTDIV2
1)NR、NF、
FOUTPOSTDIV = FOUTVCO / POSTDIV1 /
VCO 范围: 440MHz – 3200MHz,输出频率范围:27.5MHz – 2200MHz。
REFDIV_MAX:63,FBDIV_MAX:4095,POSTDIV1_MAX:7,POSTDIV1_MAX:7。
备注: 一般PLL是不需要做修改的,默认配置就可以,但是显示的时钟会对Jitter有要求,所以一般就是显示dclk独占
的PLL有这种特殊的要求。可能会做一些微调。
PLL设置原则: PLL一般要求频率尽量在600-1200M,这样VCO比较合适(jitter会小)。目前的时钟频率基本都是支
持自动计算的,但是自动计算只能保证VCO在上述范围内,不能保证VCO是最好的。所以如果对VCO有严格要求可以
按照下面方式处理: PLL频率尽量设置大一些,然后通过后端分频。如:DCLK 50M,可以把CPLL设置成1000M,
然后20分频。(这样Jitter肯定比把CPLL设置成50M或者100M的时候要好) 这种修改方式可以放在cru节点或者设备
节点中使用assigned-clock-rates的方式(本章节(1)),或者在驱动中,先设置PLL然后再设置dclk的方式。 可以
在PLL频率表中增加所需要的频率,并且指定VCO。
以RK3399 4.4内核为例:
1
static struct rockchip_pll_rate_table rk3399_vpll_rates[] = {
2
/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
3
RK3036_PLL_RATE( 594000000, 1, 123, 5, 1, 0, 12582912),
/* vco = 2970000000
RK3036_PLL_RATE( 593406593, 1, 123, 5, 1, 0, 10508804),
/* vco = 2967032965
RK3036_PLL_RATE( 297000000, 1, 123, 5, 2, 0, 12582912),
/* vco = 2970000000
RK3036_PLL_RATE( 296703297, 1, 123, 5, 2, 0, 10508807),
/* vco = 2967032970
RK3036_PLL_RATE( 148500000, 1, 129, 7, 3, 0, 15728640),
/* vco = 3118500000
RK3036_PLL_RATE( 148351648, 1, 123, 5, 4, 0, 10508800),
/* vco = 2967032960
RK3036_PLL_RATE( 106500000, 1, 124, 7, 4, 0,
4194304),
/* vco = 2982000000
RK3036_PLL_RATE(
74250000, 1, 129, 7, 6, 0, 15728640),
/* vco = 3118500000
RK3036_PLL_RATE(
74175824, 1, 129, 7, 6, 0, 13550823),
/* vco = 3115384608
RK3036_PLL_RATE(
65000000, 1, 113, 7, 6, 0, 12582912),
/* vco = 2730000000
RK3036_PLL_RATE(
59340659, 1, 121, 7, 7, 0,
2581098),
/* vco = 2907692291
RK3036_PLL_RATE(
54000000, 1, 110, 7, 7, 0,
4194304),
/* vco = 2646000000
RK3036_PLL_RATE(
27000000, 1,
55, 7, 7, 0,
2097152),
/* vco = 1323000000
RK3036_PLL_RATE(
26973027, 1,
55, 7, 7, 0,
1173232),
/* vco = 1321678323
*/
4
*/
5
*/
6
*/
7
*/
8
*/
9
*/
10
*/
11
*/
12
*/
13
*/
14
*/
15
*/
16
*/
17
{ /* sentinel */ },
18
};
可以修改表中的频率对应的_refdiv, _fbdiv, _postdiv1, _postdiv2,以达到比较合适的VCO。 (对应3.10内核的处理
方式请参考文档Rockchip Clock 开发指南中3.1章节)
1.1.5 CLK_TIMER
时钟配置
Timer的时钟都是从24M直接经过gating bypass过来的。所以没有频率设置的概念,只有开关时钟的说法。如
果想把clk配置成常开,请参考本文1.1.2. 如果驱动自己控制可以如下操作:
1
struct clk *clk;
2
clk = clk_get(NULL, "clk_timer00");
3
clk_prepare_enable(clk);
1.1.6
总线时钟配置
总线时钟分为高速跟低速的, 高速时钟aclk_perihp、hclk_perihp、pclk_perihp,低速时钟是aclk_perilp0、
hclk_perilp0、pclk_perilp0和hclk_perilp1、pclk_perilp1是可以配置时钟频率的,但是时钟树上这些时钟其下面的
子时钟都是gating,只能开关,不能设置频率,如果希望修改频率,只能修改父时钟的频率。CCI做核间通信的总线
时钟ACLK_CCI。DDR总线ACLK_CENTER。
频率设置方法
dts中设置(但是只在节点初始化的时候调用一次)
1
cru: clock-controller@ff760000 {
2
assigned-clocks =
3
<&cru ACLK_PERIHP>, <&cru HCLK_PERIHP>,
4
<&cru PCLK_PERIHP>,
5
<&cru ACLK_PERILP0>, <&cru HCLK_PERILP0>,
6
<&cru PCLK_PERILP0>,
7
<&cru HCLK_PERILP1>, <&cru PCLK_PERILP1>,
8
<&cru ACLK_CCI>, <&cru ACLK_CENTER>;
9
assigned-clock-rates =
10
<150000000>,
11
<37500000>,
12
<100000000>,
13
<50000000>,
14
<100000000>,
15
<40000000>, <40000000>;
16
<75000000>,
<100000000>,
<50000000>,
};
总线没有单独的驱动,也没有单独的节点,所以频率设置都是在cru节点中通过assigned的方式处理。
时钟频率范围
总线中aclk一般是用于数据传输,hclk跟pclk用于寄存器读写等。设计的频率:
CLK
SIZEOFF
CLK
SIZEOFF
ACLK_PERIHP
300M
ACLK_PERILP0
300M
HCLK_PERIHP
150M
HCLK_PERILP0
150M
PCLK_PERIHP
150M
PCLK_PERILP0
150M
HCLK_PERILP1
150M
PCLK_PERILP1
150M
CCI
600M
ACLK_CENTER
300M
如果超频需要考虑加压(logic路加压)
1.1.7 FCLK_CM0S
时钟配置
fclk_cm0s是在cru而fclk_cm0s_src_pmu是在pmucru的,两个时钟设置是有差异的。Pmucru请看本章节中
1.2.4.fclk_cm0s是可以配置时钟的,其下面的时钟都是
gating(hclk_m0_perilp_noc\clk_m0_perilp_dec\dclk_m0_perilp\hclk_m0_perilp\sclk_m0_perilp),只能开关,不
能设置频率,如果希望修改频率,只能修改fclk_cm0s的频率。而且频率只能从GPLL或者CPLL分频下来。
频率设置方法
dts中设置,但是只在节点初始化的时候调用一次。
1
cru: clock-controller@ff760000 {
2
assigned-clocks = <&cru FCLK_CM0S>;
3
4
assigned-clock-rates = <100000000>;
};
可以放在cru节点,也可以放在设备的节点里面。 驱动中设置频率 总线一般没有单独的驱动,所以一般是在dts设
置,如果部分驱动内部想调整这个频率也是可以的。
1
struct clk *clk;
2
clk = clk_get(NULL, "fclk_cm0s");
3
clk_set_rate(clk, rate);/* rate单位hz */
时钟频率范围
M0设计的频率是100M,如果超频需要考虑加压(logic路加压)
1.1.8 CLK_I2C
时钟配置
需要注意I2c1、2、3、5、6、7在cru模块中(I2C0、4、8在pmucru设置频率参考本章节1.2.5),3399的芯
片i2c有两个时钟,一个控制时钟clk_i2c1一个配置时钟pclk_i2c1。控制时钟的频率只能从CPLL、GPLL分频,配置时
钟频率是从pclk_perilp1来,自身只是gating不能修改频率,如果修改频率就要修改pclk_perilp1(见1.1.5)。
频率设置方法(以i2c1为例)
1. dts中设置,但是只在节点初始化的时候调用一次。
1
i2c1: i2c@ff110000 {
2
clocks = <&cru SCLK_I2C1>, <&cru PCLK_I2C1>;
3
clock-names = "i2c", "pclk";
4
assigned-clocks = <&cru SCLK_I2C1>;
5
6
assigned-clock-rates = <50000000>;
};
可以放在cru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
1
I2C的驱动文件drivers/i2c/busses/i2c-rk3x.c中:
2
i2c->clk = devm_clk_get(&pdev->dev, "i2c");
3
i2c->pclk = devm_clk_get(&pdev->dev, "pclk");
4
clk_set_rate(i2c->clk, rate);/* rate单位hz */
时钟频率范围
一般使用控制时钟频率不超过100M,配置时钟不超过100M。如果超频需要考虑加压(logic路加压)
1.1.9 CLK_SPI
时钟配置
需要注意spi0、1、2、4、5在cru模块中(spi3在pmucru设置频率参考本章节1.2.6),3399的芯片spi有两个
时钟,一个控制时钟clk_spi0一个配置时钟pclk_spi0。控制时钟的频率只能从CPLL、GPLL分频,配置时钟频率是
spi0、1、2、4是从pclk_perilp1,spi5从hclk_perilp1,自身只是gating不能修改频率,如果修改频率就要修改
pclk_perilp1和hclk_perilp1(见1.1.5)。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
spi0: spi@ff1c0000 {
2
clocks = <&cru SCLK_SPI0>, <&cru PCLK_SPI0>;
3
clock-names = "spiclk", "apb_pclk";
4
assigned-clocks = <&cru SCLK_SPI0>;
5
assigned-clock-rates = <50000000>;
6
};
可以放在cru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
SPI的驱动文件drivers/spi/spi-rockchip.c中:
1
rs->apb_pclk = devm_clk_get(&pdev->dev, "apb_pclk");
2
rs->spiclk = devm_clk_get(&pdev->dev, "spiclk");
3
clk_set_rate(rs->spiclk, rate);/* rate单位hz */
时钟频率范围
一般使用控制时钟频率不超过50M,配置时钟不超过50M。如果超频需要考虑加压(logic路加压)
1.1.10 CLK_UART
时钟配置
需要注意uart0、1、2、3在cru模块中(uart4在pmucru设置频率参考本章节1.2.8),3399的芯片uart有两
个时钟,一个控制时钟clk_uart0一个配置时钟pclk_uart0。控制时钟支持小数分频和整数分频。clk_uart0_div由
CPLL、GPLL、USB480M整数分频得到,clk_uart0_frac是由clk_uart0_div做输入时钟然后使用小数分频器分频的
(小数分频需要注意输入时钟要是输出时钟的20倍以上,否则时钟Jitter很差)。具体使用时整数分频能满足走整数
分频,整数分频不能满足走小数分频。配置时钟频率是从pclk_perilp1来,自身只是gating不能修改频率,如果修改
频率就要修改pclk_perilp1(见1.1.5)。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
uart0: serial@ff180000 {
2
clocks = <&cru SCLK_UART0>, <&cru PCLK_UART0>;
3
clock-names = "baudclk", "apb_pclk";
4
assigned-clocks = <&cru SCLK_UART0>;
5
assigned-clock-rates = <24000000>;
6
};
可以放在cru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
UART的驱动文件drivers/tty/serial/8250/8250_dw.c
1
data->clk = devm_clk_get(&pdev->dev, "baudclk");
2
data->pclk = devm_clk_get(&pdev->dev, "apb_pclk");
3
clk_set_rate(data->clk, rate);/* rate单位hz */
时钟频率范围
这个主要看uart要求的波特率是多少,一般uart的频率是波特率 * 16(HZ),一般我们平台默认支持115200、
1500000两种,其他波特率要具体看PLL的频率是否可以分到。
、CLK_SDIO、CLK_SDMMC时钟配置
1.1.11 CLK_EMMC
这几个比较特殊,由于内部是双边沿采集数据,所以要求时钟的占空比是50%,也就要求必须是偶数分频。
Emmc有两个时钟,clk_emmc是控制器时钟,要求偶数分频的。Aclk_emmc是数据传输和配置时钟。SDIO有有两个
时钟,clk_sdio是控制器时钟,要求偶数分频的。hclk_sdio是配置时钟。SDMMC有有两个时钟,clk_sdmmc是控制
器时钟,要求偶数分频的。hclk_sdmmc是配置时钟。控制时钟都是可以配置频率的,aclk_emmc、hclk_sdmmc也
是可以单独配置频率,hclk_sdio是一个gating是从hclk_perilp1来,需要修改Hclk_sdio只能修改hclk_perilp1(见
1.1.5).
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
sdhci: sdhci@fe330000 {
2
assigned-clocks = <&cru SCLK_EMMC>;
3
assigned-clock-rates = <200000000>;
4
clocks = <&cru SCLK_EMMC>, <&cru ACLK_EMMC>;
5
clock-names = "clk_xin", "clk_ahb";
6
};
7
sdio0: dwmmc@fe310000 {
8
assigned-clocks = <&cru SCLK_SDIO>;
9
assigned-clock-rates = <100000000>;
10
clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>,
11
<&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
12
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
13
};
14
sdmmc: dwmmc@fe320000 {
15
assigned-clocks = <&cru SCLK_SDMMC>;
16
assigned-clock-rates = <100000000>;
17
clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
18
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
19
20
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
};
可以放在cru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
EMMC的驱动文件drivers/mmc/host/Sdhci-of-arasan.c
1
sdhci_arasan->clk_ahb = devm_clk_get(&pdev->dev, "clk_ahb");
2
clk_xin = devm_clk_get(&pdev->dev, "clk_xin");
3
clk_set_rate(clk_xin, rate);/* rate单位hz */
时钟频率范围
时钟的频率范围如下,这个是输入频率,模块内部还有二分频,所以模块输出的实际频率是时钟树上看到频率的2分
频。
名称
频率
CLK
sizeoff
EMMC
200M
ACLK_EMMC
100M(300M/b 64Bit)
SDMMC/SDIO
300/240M(<=300M)
注意
对于频率设置需要说明,EMMC、SDIO、SDMMC的控制时钟的parent一般有CPLL、GPLL、NPLL、
PPLL、UPLL。一般这些PLL中,CPLL被显示独占,如果EMMC需要200M频率,那么要求PLL频率是
400M\800M\1200M,所以控制时钟能分到的频率要看PLL的频率是多少?一定是偶数分频得到的频率才可以(如果
PLL只有600M和800M, 那么只能分出150\200\300\400M,实际在控制器输出频率只能那个有75、100、150、
200M)。
1.1.12
显示相关VOP、HDCP、EDP跟ISP时钟配置
显示相关的时钟需求比较多,dclk一般要求任意频率,因为显示的分辨率不同dclk频率不同。而aclk跟Hclk做
为数据传输和寄存器配置时钟一般是固定在一个值上,不会变化,一旦显示情况下修改aclk很hclk可能会造成显示抖
动等。
DCLK
如果要支持任意分辨率也就是要求DCLK可以出任意频率,一般这种情况DCLK要独占一个PLL,如果是
双显也就是要两个PLL独立给DCLK使用(是否支持一般在芯片设计的时候就已经确定了,或者说支持双显后可以不需
要支持其他特殊的功能)。RK3399的平台如果打开宏RK3399_TWO_PLL_FOR_VOP是支持双显任意频率,
dclk_vop0独占CPLL,dclk_vop1独占VPLL。并且dclk_vop0和dclk_vop1都CLK_SET_RATE_PARENT的属性,dclk需
要多少就会将对于的parent的Pll设置成多少。如果没有开启宏。只有dclk_vop0独占CPLL可以支持任意频率,
dclk_vop1就是在当前parent可以就近分频。
1
2
#ifdef RK3399_TWO_PLL_FOR_VOP
COMPOSITE(DCLK_VOP0_DIV, "dclk_vop0_div", mux_pll_src_vpll_cpll_gpll_p,
3
CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
4
RK3399_CLKSEL_CON(49), 8, 2, MFLAGS, 0, 8, DFLAGS,
5
6
7
RK3399_CLKGATE_CON(10), 12, GFLAGS),
#else
COMPOSITE(DCLK_VOP0_DIV, "dclk_vop0_div", mux_pll_src_vpll_cpll_gpll_p,
8
CLK_SET_RATE_PARENT,
9
RK3399_CLKSEL_CON(49), 8, 2, MFLAGS, 0, 8, DFLAGS,
10
11
RK3399_CLKGATE_CON(10), 12, GFLAGS),
#endif
12
13
14
15
#ifdef RK3399_TWO_PLL_FOR_VOP
COMPOSITE(DCLK_VOP1_DIV, "dclk_vop1_div", mux_pll_src_vpll_cpll_gpll_p,
CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT,
16
RK3399_CLKSEL_CON(50), 8, 2, MFLAGS, 0, 8, DFLAGS,
17
RK3399_CLKGATE_CON(10), 13, GFLAGS),
18
#else
19
COMPOSITE(DCLK_VOP1_DIV, "dclk_vop1_div", mux_pll_src_dmyvpll_cpll_gpll_p, 0,
20
RK3399_CLKSEL_CON(50), 8, 2, MFLAGS, 0, 8, DFLAGS,
21
RK3399_CLKGATE_CON(10), 13, GFLAGS),
22
ACLK
#endif
、HCLK
支持频率设置,但是如果有Uboot显示的时候,要求Uboot到kernel,频率不能发生变化,否则
会闪屏。也就是要求uboot跟kernel的aclk hclk频率一致,其parent一致,parent频率一致。
频率设置方法
1. dts中设置
指定vop dclk的parent,因为rk3399硬件设计原因,要求给hdmi使用的那个vop一定要在vpll上(跟hdmi是同源
的),另一个vop的parent是cpll。在各自的dts中,显示的节点中增加。
1
&vopb_rk_fb {
2
assigned-clocks = <&cru DCLK_VOP0_DIV>;
3
assigned-clock-parents = <&cru PLL_VPLL>;
4
};
5
&vopl_rk_fb {
6
assigned-clocks = <&cru DCLK_VOP1_DIV>;
7
8
assigned-clock-parents = <&cru PLL_CPLL>;
};
而ACLK跟HCLK只需要初始化一次:
1
&vopb {
2
clocks = <&cru ACLK_VOP0>, <&cru DCLK_VOP0>, <&cru HCLK_VOP0>, <&cru
3
DCLK_VOP0_DIV>;
4
clock-names = "aclk_vop", "dclk_vop", "hclk_vop", "dclk_source";
5
assigned-clocks = <&cru ACLK_VOP0>, <&cru HCLK_VOP0>;
6
7
assigned-clock-rates = <400000000>, <100000000>;
};
可以放在cru节点,也可以放在设备的节点里面。HDCP、EDP跟ISP设置类似处理。
HDCP
ACLK_HDCP 可以从CPLL、GPLL、PPLL分频得到、HCLK_HDCP和PCLK_HDCP是从ACLK_HDCP分频
得到。都有独立的gating。
EDP
ISP
只有PCLK_EDP,可以从CPLL、GPLL分频得到。其他的EDP时钟都是挂在这个下面的独立gating。
ACLK_ISP0、ACLK_ISP1用于总线数据传输的可以从CPLL、GPLL、PPLL分频得到、HCLK_ISP0、
HCLK_ISP1是寄存器配置时钟直接从ACLK分频、SCLK_ISP0、SCLK_ISP1是控制器时钟可以从CPLL、GPLL、NPLL分
频得到。引用时钟的时候ACLK引用ACLK_ISP0_WRAPPER,HCLK引用HCLK_ISP0_WRAPPER,会自动打开上级的
parent时钟保证ACLK跟HCLK时钟通路开启。
2. 驱动中设置频率
vop的驱动文件drivers/gpu/drm/rockchip/rockchip_drm_vop.c
1
vop->hclk = devm_clk_get(vop->dev, "hclk_vop");
2
if (IS_ERR(vop->hclk)) {
3
dev_err(vop->dev, "failed to get hclk source\n");
4
return PTR_ERR(vop->hclk);
5
}
6
vop->aclk = devm_clk_get(vop->dev, "aclk_vop");
7
if (IS_ERR(vop->aclk)) {
8
dev_err(vop->dev, "failed to get aclk source\n");
9
return PTR_ERR(vop->aclk);
10
}
11
vop->dclk = devm_clk_get(vop->dev, "dclk_vop");
12
if (IS_ERR(vop->dclk)) {
13
dev_err(vop->dev, "failed to get dclk source\n");
14
return PTR_ERR(vop->dclk);
15
}
时钟频率范围
Dclk主要是看屏的分辨率是多少。因为PLL使用自动计算的,jitter不是最优,如果需要调整,可以在PLL表格中自己
计算合适的VCO填进去(VCO的计算方式详细见RK3399 datasheet的2.6.2)。
1
2
Drivers/clk/rockchip/clk-rk3399.c
3
4
static struct rockchip_pll_rate_table rk3399_vpll_rates[] = {
5
/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, _frac */
6
RK3036_PLL_RATE( 594000000, 1, 123, 5, 1, 0, 12582912),
/* vco = 2970000000
RK3036_PLL_RATE( 593406593, 1, 123, 5, 1, 0, 10508804),
/* vco = 2967032965
RK3036_PLL_RATE( 297000000, 1, 123, 5, 2, 0, 12582912),
/* vco = 2970000000
RK3036_PLL_RATE( 296703297, 1, 123, 5, 2, 0, 10508807),
/* vco = 2967032970
RK3036_PLL_RATE( 148500000, 1, 129, 7, 3, 0, 15728640),
/* vco = 3118500000
RK3036_PLL_RATE( 148351648, 1, 123, 5, 4, 0, 10508800),
/* vco = 2967032960
RK3036_PLL_RATE( 106500000, 1, 124, 7, 4, 0,
4194304),
/* vco = 2982000000
RK3036_PLL_RATE(
74250000, 1, 129, 7, 6, 0, 15728640),
/* vco = 3118500000
RK3036_PLL_RATE(
74175824, 1, 129, 7, 6, 0, 13550823),
/* vco = 3115384608
RK3036_PLL_RATE(
65000000, 1, 113, 7, 6, 0, 12582912),
/* vco = 2730000000
RK3036_PLL_RATE(
59340659, 1, 121, 7, 7, 0,
2581098),
/* vco = 2907692291
RK3036_PLL_RATE(
54000000, 1, 110, 7, 7, 0,
4194304),
/* vco = 2646000000
RK3036_PLL_RATE(
27000000, 1,
2097152),
/* vco = 1323000000
*/
7
*/
8
*/
9
*/
10
*/
11
*/
12
*/
13
*/
14
*/
15
*/
16
*/
17
*/
18
*/
55, 7, 7, 0,
19
RK3036_PLL_RATE(
26973027, 1,
55, 7, 7, 0,
1173232),
/* vco = 1321678323
*/
20
{ /* sentinel */ },
21
};
而对于对应的频率范围(如果做4K显示带宽不够可以相应提高ACLK的频率,但是要注意电压是不是够是否需要提
压):
CLK
SIZEOFF
CLK
SIZEOFF
ACLK_VOP0/1
400M
ACLK_VIO
400M
DCLK_VOP0
600M
ACLK_ISP0/1
400M
DCLK_VOP1
300M
CLK_ISP0/1
500M
CLK_VOP0/1_PWM
200M
CLK_EDP
200M
ACLK_HDCP
400M
1.1.13
视频编解码VDU、RGA、CODEC、IEP相关时钟配置
主要是VDU、RGA、CODEC、IEP相关的时钟配置。
VDU
ACLK_VDU可以从CPLL、GPLL、NPLL、PPLL分频得到,HCLK_VDU从ACLK分频得到。控制器时钟
SCLK_VDU_CORE和SCLK_VDU_CA从CPLL、GPLL、NPLL分频得到。
RGA
ACLK_RGA可以从CPLL、GPLL、NPLL、PPLL分频得到,HCLK_RGA从ACLK分频得到。
CODEC
ACLK_VCODEC可以从CPLL、GPLL、NPLL、PPLL分频得到,HCLK_VCODEC从ACLK分频得到。控制
器时钟SCLK_RGA_CORE从CPLL、GPLL、NPLL、PPLL分频得到。
IEP
ACLK_IEP可以从CPLL、GPLL、NPLL、PPLL分频得到,HCLK_IEP从ACLK分频得到。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
rkvdec: rkvdec@ff660000 {
2
clocks = <&cru ACLK_VDU>, <&cru HCLK_VDU>,
3
<&cru SCLK_VDU_CA>, <&cru SCLK_VDU_CORE>;
4
clock-names = "aclk_vcodec", "hclk_vcodec",
5
"clk_cabac", "clk_core";
6
assigned-clocks = <&cru ACLK_VDU>, <&cru HCLK_VDU>,
7
<&cru SCLK_VDU_CA>, <&cru SCLK_VDU_CORE>;
8
assigned-clock-rates = <400000000>, <400000000>,
9
10
<300000000>, <300000000>;
};
可以放在cru节点,也可以放在设备的节点里面(其他模块类似处理)。
2. 驱动中设置频率
VCODEC的驱动文件drivers/video/rockchip/vcodec/vcodec_service.c
1
pservice->aclk_vcodec = devm_clk_get(dev, "aclk_vcodec");
2
pservice->hclk_vcodec = devm_clk_get(dev, "hclk_vcodec");
3
pservice->clk_cabac = devm_clk_get(dev, "clk_cabac");
4
pservice->clk_core = devm_clk_get(dev, "clk_core");
时钟频率范围
而对于对应的频率范围(如果做4K视频编解码带宽不够可以相应提高ACLK的频率,但是要注意电压是不是够是否需
要提压):
CLK
SIZEOFF
CLK
SIZEOFF
ACLK_VCODEC
400M
ACLK_IEP
400M
ACLK_VDU
400M
ACLK_RGA
400M
CLK_VDU_CORE
300M
CLK_RGA_CORE
400M
CLK_VDU_CA
300M
1.1.14 USB
相关时钟配置
USB主要包括aclk、Host、otg还有就是usb内部phy。
USB3
ACLK_USB3可以从CPLL、GPLL、NPLL分频得到。
HOST
HCLK_HOST0跟HCLK_HOST1都是挂在HCLK_PERI下面,只有GATING属性,如果要修改频率只能修改
HCLK_PERI(详细见本文1.1.5)。
OTG
ACLK_USB3OTG0、ACLK_USB3OTG1是挂在从ACLK_USB3下面,只有GATING属性,如果要修改频率只
能修改ACLK_USB3。SCLK_USB3OTG0_REF直接从24M来的,只有GATING属性,SCLK_USB3OTG0_SUSPEND可以
从24M或者32K上获取可以设置频率。
PHY
SCLK_USBPHY1_480M是USB PHY内部PLL锁相环出的,一般是固定频率480M,可以选择内部锁相环输
出可以直接选择24M输出。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
usb_host0_ohci: usb@fe3a0000 {
2
clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST0_ARB>,
3
<&cru SCLK_USBPHY0_480M_SRC>;
4
5
clock-names = "hclk_host0", "hclk_host0_arb", "usbphy0_480m";
};
6
7
usb_host1_ehci: usb@fe3c0000 {
8
clocks = <&cru HCLK_HOST1>, <&cru HCLK_HOST1_ARB>,
9
<&cru SCLK_USBPHY1_480M_SRC>;
10
clock-names = "hclk_host1", "hclk_host1_arb", "usbphy1_480m";
11
};
12
usbdrd3_0: usb@fe800000 {
13
14
clocks = <&cru SCLK_USB3OTG0_REF>, <&cru SCLK_USB3OTG0_SUSPEND>,
<&cru ACLK_USB3OTG0>, <&cru ACLK_USB3_GRF>;
15
clock-names = "ref_clk", "suspend_clk",
16
17
"bus_clk", "grf_clk";
};
可以放在cru节点,也可以放在设备的节点里面(其他模块类似处理)。
2. 驱动中设置频率
VCODEC的驱动文件drivers/usb/dwc3/dwc3-rockchip.c
1
clk = of_clk_get(np, i);
2
if (IS_ERR(clk)) {
3
ret = PTR_ERR(clk);
4
goto err0;
5
}
6
ret = clk_prepare_enable(clk);
7
if (ret < 0) {
8
clk_put(clk);
9
10
goto err0;
}
时钟频率范围
而对于对应的频率范围(如果USB有大数据拷贝等可以相应提高ACLK的频率,但是要注意电压是不是够是否需要提
压),ACLK_USB的SIZEOFF频率400M。
相关时钟配置
1.1.15 CIF
Cif主要是SCLK_CIF_OUT,可能有24M或者27M这样的时钟要求。这个时钟源可以直接选择24M进行分频也可
以选择CPLL、GPLL、NPLL然后再分频。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
cru: clock-controller@ff760000 {
2
assigned-clocks = <&cru SCLK_CIF_OUT_SRC>, <&cru SCLK_CIF_OUT>;
3
4
assigned-clock-rates = <800000000>, <27000000>;
};
可以放在cru节点,也可以放在设备的节点里面(其他模块类似处理)。
时钟配置
1.2 PMUCRU
1.2.1 PMUCRU
时钟树
注意
上述时钟控制都是在pmucru寄存器。
1.2.2
配置一些时钟常开
对于调试过程中,想把某些时钟设置成常开的,
可以修改rk3399_pmucru_critical_clocks这个结构体中,按照现有增加时钟名字即可。
1
Drivers/clk/rockchip/clk-rk3399.c
2
3
static const char *const rk3399_pmucru_critical_clocks[] __initconst = {
4
5
"pclk_noc_pmu",
};
这个结构中的clk在系统开机,clk初始化的时候会默认调用clk_set_enable接口。
总线时钟配置
1.2.3 PCLK_PMU
总线时钟只有pclk_pmu_src是可以配置时钟的,其下面的时钟都是
gating(pclk_wdt_m0_pmu\pclk_uart4_pmu\pclk_mailbox_pmu\pclk_timer_pmu\pclk_spi3_pmu\pclk_rkpwm_p
mu\pclk_i2c8_pmu\pclk_i2c4_pmu\pclk_i2c0_pmu\pclk_noc_pmu\pclk_sgrf_pmu\pclk_gpio1_pmu\pclk_gpio0_
pmu\pclk_intmem1_pmu\pclk_pmugrf_pmu\pclk_pmu),只能开关,不能设置频率,如果希望修改频率,只能修
改pclk_pmu_src的频率。而且频率只能从PPLL分频下来(676M整除出来的频率)。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
pmucru: pmu-clock-controller@ff750000 {
2
assigned-clocks = <&pmucru PCLK_SRC_PMU>;
3
assigned-clock-rates = <100000000>;
4
};
可以放在pmucru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
总线一般没有单独的驱动,所以一般是在dts设置,如果部分驱动内部想调整这个频率也是可以的。
1
struct clk *clk;
2
clk = clk_get(NULL, "pclk_pmu_src");
3
clk_set_rate(clk, rate);/* rate单位hz */
时钟频率范围
IC设计的频率是50M,如果超频需要考虑加压(logic路加压)
时钟配置
1.2.4 PMU_M0
总线时钟只有PCLK_SRC_PMUfclk_cm0s_src_pmu是可以配置时钟的,其下面的时钟都是
gating(hclk_noc_pmu\dclk_cm0s_pmu\hclk_cm0s_pmu\sclk_cm0s_pmu\fclk_cm0s_pmu),只能开关,不能设置
频率,如果希望修改频率,只能修改fclk_cm0s_src_pmu的频率。而且频率只能从PPLL或者24M分频下来。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
pmucru: pmu-clock-controller@ff750000 {
2
assigned-clocks = <&pmucru FCLK_CM0S_SRC_PMU>;
3
assigned-clock-rates = <100000000>;
4
};
可以放在pmucru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
总线一般没有单独的驱动,所以一般是在dts设置,如果部分驱动内部想调整这个频率也是可以的。
1
struct clk *clk;
2
clk = clk_get(NULL, "fclk_cm0s_src_pmu");
3
clk_set_rate(clk, rate);/* rate单位hz */
时钟频率范围
IC设计的频率是100M,如果超频需要考虑加压(logic路加压)
总线时钟配置
1.2.5 PMU
总线时钟只有PCLK_SRC_PMU是可以配置时钟的,其下面的时钟都是gating(详细见时钟树),只能开关,不能
设置频率,如果希望修改频率,只能修改PCLK_SRC_PMU的频率。而且频率只能从PPLL分频下来。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
pmucru: pmu-clock-controller@ff750000 {
2
assigned-clocks = <&pmucru PCLK_SRC_PMU>;
3
4
assigned-clock-rates = <100000000>;
};
可以放在pmucru节点,也可以放在设备的节点里面。
时钟频率范围
IC设计的频率是100M,如果超频需要考虑加压(logic路加压)
1.2.6 PMU_I2C
时钟配置
需要注意I2c0\4\8在pmucru模块中,3399的芯片i2c有两个时钟,一个控制时钟clk_i2c0_pmu一个配置时钟
pclk_i2c0_pmu。控制时钟的频率只能从PPLL(676M)分频,配置时钟频率是从pclk_pmu_src来,自身只是gating
不能修改频率,如果修改频率就要修改pclk_pmu_src(见1.2.1)。
频率设置方法(以i2c0为例)
1.dts中设置,但是只在节点初始化的时候调用一次。
1
i2c0: i2c@ff3c0000 {
2
clocks =
3
clock-names = "i2c", "pclk";
4
assigned-clocks = <&pmucru SCLK_I2C0_PMU>;
5
assigned-clock-rates = <50000000>;
6
<&pmucru SCLK_I2C0_PMU>, <&pmucru PCLK_I2C0_PMU>;
}
可以放在pmucru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
I2C的驱动文件drivers/i2c/busses/i2c-rk3x.c中:
1
i2c->clk = devm_clk_get(&pdev->dev, "i2c");
2
i2c->pclk = devm_clk_get(&pdev->dev, "pclk");
3
clk_set_rate(i2c->clk, rate);/* rate单位hz */
时钟频率范围
一般使用控制时钟频率不超过100M,配置时钟不超过100M。如果超频需要考虑加压(logic路加压)
1.2.7 PMU_SPI
时钟配置
需要注意spi3在pmucru模块中,3399的芯片spi有两个时钟,一个控制时钟clk_spi3_pmu一个配置时钟
pclk_spi3_pmu。控制时钟的频率只能从PPLL(676M)分频,配置时钟频率是从pclk_pmu_src来,自身只是gating
不能修改频率,如果修改频率就要修改pclk_pmu_src(见1.2.1)。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
spi3: spi@ff350000 {
2
clocks = <&pmucru SCLK_SPI3_PMU>, <&pmucru PCLK_SPI3_PMU>;
3
clock-names = "spiclk", "apb_pclk";
4
assigned-clocks = <&pmucru SCLK_SPI3_PMU>;
5
assigned-clock-rates = <50000000>;
6
};
可以放在pmucru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
SPI的驱动文件drivers/spi/spi-rockchip.c中:
1
rs->apb_pclk = devm_clk_get(&pdev->dev, "apb_pclk");
2
rs->spiclk = devm_clk_get(&pdev->dev, "spiclk");
3
clk_set_rate(rs->spiclk, rate);/* rate单位hz */
时钟频率范围
一般使用控制时钟频率不超过50M,配置时钟不超过50M。如果超频需要考虑加压(logic路加压)
时钟配置
1.2.8 PMU_WIFI
需要注意WIFI在pmucru模块中,3399的芯片wifi支持小数分频和整数分频。clk_wifi_div由PPLL整数分频得
到,clk_wifi_frac是由clk_wifi_div做输入时钟然后使用小数分频器分频的(小数分频需要注意输入时钟要是输出时钟
的20倍以上,否则时钟Jitter很差)。具体使用时整数分频能满足走整数分频,整数分频不能满足走小数分频。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
pmucru: pmu-clock-controller@ff750000 {
2
compatible = "rockchip,rk3399-pmucru";
3
assigned-clocks = <&pmucru SCLK_WIFI_PMU>;
4
5
assigned-clock-rates = <26000000>;
};
可以放在pmucru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
1
struct clk *clk;
2
clk = clk_get(NULL, "clk_wifi_pmu");
3
clk_set_rate(clk, rate);/* rate单位hz */
时钟频率范围
这个主要看wifi模组使用是什么晶振,一般常见的24M 26M 37.4M 40M。
时钟配置
1.2.9 PMU_UART4
需要注意uart4在pmucru模块中,3399的芯片uarti有两个时钟,一个控制时钟clk_uart4_pmu一个配置时钟
pclk_uart4_pmu。控制时钟支持小数分频和整数分频。clk_uart4_div由PPLL整数分频得到,clk_uart4_frac是由
clk_uart4_div做输入时钟然后使用小数分频器分频的(小数分频需要注意输入时钟要是输出时钟的20倍以上,否则
时钟Jitter很差)。具体使用时整数分频能满足走整数分频,整数分频不能满足走小数分频。配置时钟频率是从
pclk_uart4_pmu来,自身只是gating不能修改频率,如果修改频率就要修改pclk_pmu_src(见1.2.1)。
频率设置方法
1. dts中设置,但是只在节点初始化的时候调用一次。
1
uart4: serial@ff370000 {
2
clocks = <&pmucru SCLK_UART4_PMU>, <&pmucru PCLK_UART4_PMU>;
3
clock-names = "baudclk", "apb_pclk";
4
assigned-clocks = <&pmucru SCLK_UART4_PMU>;
5
assigned-clock-rates = <24000000>;
6
};
可以放在pmucru节点,也可以放在设备的节点里面。
2. 驱动中设置频率
UART的驱动文件drivers/tty/serial/8250/8250_dw.c
1
data->clk = devm_clk_get(&pdev->dev, "baudclk");
2
data->pclk = devm_clk_get(&pdev->dev, "apb_pclk");
3
clk_set_rate(data->clk, rate);/* rate单位hz */
时钟频率范围
这个主要看uart要求的波特率是多少,一般uart的频率是波特率 * 16(HZ),一般我们平台默认支持115200、
1500000两种,其他波特率要具体看PLL的频率是否可以分到。
2
时钟间依赖关系
2.1
普通的父子关系
时钟结构图及时钟树如下:
普通的父子关系的依赖关系就是,子时钟开启的时候需要开启父时钟,时钟结构会保证此操作,只需要开启子时钟即
可,时钟结构会自动索引其父时钟并开启。只要其子时钟有在工作,父时钟就不能关闭,正常情况时钟的开关是有引
用计数,如上图中的enable_cnt,子时钟或者本身时钟被enable后计数加一,disable的时候计数减一,直到计数减
为零,时钟才会被关闭。
2.2
不同模块间NOC复用
在设计NOC的时候,有一些模块之间的Noc是复用,这就要求任何一个模块在使用的时候,NOC时钟都要开
启,而且NOC的父时钟的整个时钟通路都要开启。 有这种特殊要求的有如下时钟(目前代码中都已经处理,保证
NOC时钟常开):
2.3
不同模块间GRF复用
在设计GRF的时候,有一些模块之间的GRF时钟是复用,这就要求任何一个模块在GRF寄存器读写的时候,公
用的GRF时钟都要开启,而且GRF的父时钟的整个时钟通路都要开启。 有这种特殊要求的有如下时钟(目前代码中都
已经处理,保证GRF时钟常开):
GRF
CON
GRF
CON
aclk_cci_grf
grf_a72_perf
pclk_grf(alive)
grf_iomux
aclk_cci_grf
grf_a53_perf
pclk_grf(alive)
grf_soc_con[0~8]
aclk_cci_grf
grf_cpu_status
pclk_grf(alive)
grf_usb3phy
aclk_cci_grf
grf_cpu_con
pclk_grf(alive)
grf_ddrc
pclk_grf(alive)
grf_gpio2/3/4
pclk_perihp_grf
grf_hsic
pclk_grf(alive)
grf_io_vsel
pclk_perihp_grf
grf_hsicphy
pclk_grf(alive)
grf_saradc
pclk_perihp_grf
grf_usbhost0
pclk_grf(alive)
grf_tsadc
pclk_perihp_grf
grf_usbhost1
pclk_grf(alive)
grf_usb20_phy
pclk_perihp_grf
grf_usbphy
pclk_grf(alive)
grf_dll
pclk_perihp_grf
grf_usb20_host
pclk_grf(alive)
grf_alive_lf_ena
pclk_perihp_grf
grf_pcie
pclk_grf(alive)
grf_cphy
pclk_grf(alive)
grf_uphy
pclk_vio_grf
grf_soc_con[9, 20~26]
pclk_grf(alive)
grf_pcie
pclk_vio_grf
grf_hdcp
pclk_grf(alive)
grf_sd
aclk_usb3_grf
grf_sta_usb3otg
aclk_gpu_grf
grf_gpu_perf
aclk_usb3_grf
grf_usb3_perf
3
时钟频率值
3.1
可设置的时钟频率
时钟名称
最高频率
可以设置频率
CCI
600M
(cpll/gpll/npll/vpll) / (1~32)
ACLK_CENTER
300M
(cpll/gpll/npll) / (1~32)
DDR_PCLK
200M
(cpll/gpll) / (1~32)
ACLK_PERIHP
300M
(cpll/gpll) / (1~32)
ACLK_PERILP0
300M
(cpll/gpll) / (1~32)
AHB_PERILP1
150M
(cpll/gpll) / (1~32)
ACLK_VCODEC
400M
(cpll/gpll/npll/ppll) / (1~32)
ACLK_VDU
400M
(cpll/gpll/npll/ppll) / (1~32)
CLK_VDU_CORE
300M
(cpll/gpll/npll) / (1~32)
CLK_VDU_CA
300M
(cpll/gpll/npll) / (1~32)
ACLK_IEP
400M
(cpll/gpll/npll/ppll) / (1~32)
ACLK_RGA
400M
(cpll/gpll/npll/ppll) / (1~32)
CLK_RGA_CORE
400M
(cpll/gpll/npll/ppll) / (1~32)
EMMC
200M
(cpll/gpll/npll/ppll/upll/24M) / (1~128)
SDMMC/SDIO
400/300/240M
(cpll/gpll/npll/ppll/upll/24M) / (1~128)
CLK_PCIE_REF
24/100M
(npll/24M) / (1~128)
CLK_PCIE_CORE
250M
(cpll/gpll/npll) / (1~128)
CLK_PCIE_PM
25M/24M
(cpll/gpll/npll/24M) / (1~128)
ACLK_GMAC
300M
(cpll/gpll) / (1~32)
ACLK_EMMC
300M
(cpll/gpll) / (1~32)
M0-PERILP
300M
(cpll/gpll) / (1~32)
CRYPTO
200M
(cpll/gpll/ppll) / (1~32)
SPI
100M
(cpll/gpll) / (1~128)
I2S/SPDIF
Frac<=50M
(cpll/gpll) / (1~128)
SARADC
20M
24M/ (1~256)
TSADC
10M
24M/ (1~1024)
ACLK_VIO
400M
(cpll/gpll/ppll) / (1~32)
CLK_EDP
200M
(cpll/gpll) / (1~32)
时钟名称
最高频率
可以设置频率
ACLK_ISP0/1
400M
(cpll/gpll/ppll) / (1~32)
CLK_ISP0/1_JPE
500M
(cpll/gpll/npll) / (1~32)
ACLK_HDCP
400M
(cpll/gpll/ppll) / (1~32)
CLK_DP_CORE
200/100/10M
(cpll/gpll/npll) / (1~32)
ACLK_VOP0/1
400M
(cpll/gpll/npll/vpll) / (1~32)
DCLK_VOP0
600M
(cpll/gpll/vpll) / (1~256)
DCLK_VOP1
300M
(cpll/gpll/vpll) / (1~256)
CLK_VOP0/1_PWM
200M
(cpll/gpll/vpll/24M) / (1~32)
ACLK_USB3
300M
(cpll/gpll/npll) / (1~32)
PCLK_ALIVE
100M
(gpll) / (1~32)
PCLK_PMU
100M
(ppll) / (1~32)
GPU
500M
(cpll/gpll/npll/upll/ppll) / (1~32)
M0-EC
200M
(cpll/gpll) / (1~32)
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : No Creator : Typora Producer : Typora Create Date : 2019:01:28 02:57:08 Modify Date : 2019:01:28 02:57:08 Page Count : 25 Page Mode : UseOutlines Warning : [Minor] Ignored duplicate Info dictionaryEXIF Metadata provided by EXIF.tools