RK322X/RK3328 HDMI-PHY-PLL配置指南
:::info 文档信息
文档标识:RK-KF-YF-108 · 发布版本:V1.1.0 · 发布日期:2020-04-09 · 页数:13 · 语言:中文
原始文档:Rockchip_Developer_Guide_HDMI-PHY-PLL_Config_CN.pdf
:::
章节大纲
- RK322X/RK3328 HDMI-PHY-PLL配置指南(P1)
- 概述(P5)
- PHY配置计算说明(P5)
- PRE-PLL计算过程(P5)
- POST-PLL计算过程(P6)
- 计算工具的使用(P6)
- 代码中新增PHY配置说明(P8)
- LINUX 3.10内核(P8)
- LINUX 4.4/4.19内核(P10)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
1. 概述
RK322X/RK3328 芯片 HDMI PHY PLL 除了供 HDMI PHY 使用外,还作为显示的时钟源,供HDMI/CVBS/VOP 使用。在产品开发设计中,当需要增加对某些特殊分辨率的支持时,需要新增 PHY PLL 配置,以便 PHY 能输出该分辨率对应的时钟频率。
2. PHY配置计算说明
PLL 计算包括两部分,PRE-PLL 和 POST-PLL 计算。
2.1 PRE-PLL计算过程
PRE-PLL 计算过程如图所示,其中 $F_{REF}$ 为 24Mhz:
PRE-PLL($F_{pre-VCO}$)的频率 VCO 是由 pre-pll-pre-divider[5:0] 和 pre-pll-feedback- divider[11:0] 控制的。在 RK3328 芯片还可以由 pre-pll-fractional-feedback-divider[23:0]控制,支持浮点运算。
TMDS CLOCK 通道频率 $F_{TX3}$ 由 tmds-dividera[1:0] 和 tmds-dividerb[1:0] 控制。
pin_hdmi20_tmdsclk 频率 $F_{pin_hdmi20_tmdsclk}$ 由 tmds-dividera[1:0] 和 tmds-
dividerc[1:0] 控制。
pin_hdmi20_prepclk 频率 $F_{pin_hdmi20_prepclk}$ 计算方法如下:
当 pin_hdmi20_pclk 的频率 ($F{pin_hdmi20_pclk}$) 为 $F{pre-VCO}$ 的 1/5 时,可以使能 VCO/5 直接获取 pin_hdmi20_pclk 。其他频率计算如下:其中需要注意两个 CLOCK, pin_hd20_tmdsclk 为 HDMI 输出的 TMDS CLOCK, pin_hd20_pclk为 HDMI 输出的 PIXEL CLOCK。此外还有需要注意的地方:
pin_hd20_pclk频率是由pin_hd20_prepclk以 1~10 的倍数分频得到。在no-repeating模式下,两种频率相等。2.pin_hd20_prepclk和pin_hd20_tmdsclk的频率在 8-bit 色深下相等。在 10-bit 色深下,pin_hd20_tmdsclk等于 1.25 倍pin_hd20_prepclk频率。目前 RK 平台仅支持 8-bit 和 10-bit两种色深。
如其中第一点所述,实际使用中,在非 4K-YUV420 的场景下, pin_hd20_pclk 与
pin_hd20_prepclk 始终相等。 4K-YUV420 的场景下 pin_hd20_pclk 是 pin_hd20_prepclk 的两
倍。
2.2 POST-PLL计算过程
POST-PLL 计算过程如下:
POST-PLL 用来产生差分串行时钟,其频率 $F_{diff-sclk}$ 总是 pin_hdmi20_tmdsclk 的五倍。
当 post-pll-post-divider 未使能时(0xaa[3:2] = 0),$F{diff-sclk}$ 与 $F{post-VCO}$ 相等。否则计算方法为:
POST-PLL 计算较为简单,且 LINUX 4.4/4.19 内核驱动中的 post_pll_cfg_table 已经包含所有场景,无需另行添加。
LINUX 3.10 内核需要根据当前需要支持分辨率对应的的 TMDS CLOCK 所处的区间以及芯片的版本,直接使用 post_pll_cfg_table 当中相应的配置。具体说明请见 3.2 节。
需要注意的是,无论是 PRE-PLL 还是 POST-PLL,VCO 的频率都必须在 1.4~3.0Ghz 之间(实际使用中最大可以放宽到 3.2Ghz)。
2.3 计算工具的使用
实际工作中可以使用计算工具 cal_innophy 进行计算,该计算工具可通过 RK 技术支持窗口获取。
使用方法为:
cal_innophy 148500000 185625000 1
其中三个参数的含义分别为
| 参数 | 说明 |
|---|---|
| 148500000 | PIXLE CLOCK |
| 185625000 | TMDS CLOCK |
| 1 | 是否使用浮点计算,RK322X系列芯片不支持浮点计算只能为0 |
其中第三项参数,推荐优先为 0,不使用浮点计算。当不使用浮点计算不出时,再设置为 1 进行计算。
TMDS CLOCK在不同色深的情况下,与PIXLE CLOCK的比率不同,详见2.1节。
计算结果为:
148500000, 185625000, 4, 495, 0, 2, 2, 1, 3, 2, 2, 0, 0x816817
各项参数含义为:
| 参数 | 说明 |
|---|---|
| 148500000 | pixel clock |
| 185625000 | tmds clock |
| 4 | pre-pll-pre-divider |
| 495 | pre-pll-feedback-divider |
| 0 | tmds-dividera |
| 2 | tmds-dividerb |
| 2 | tmds-dividerc |
| 1 | tmds-dividerd |
| 3 | pclk-dividera |
| 2 | pclk-dividerb |
| 2 | pclk-dividerc |
| 0 | pclk-dividerd |
| 0x816817 | pre-pll-fractional-feedback-divider |
计算结果分别对应 2.1 节中说明的各项寄存器配置。如何在驱动中新增计算出的配置请见本文第 3 节。本工具只计算了 PRE-PLL 的配置。
针对 POST-PLL,当 TMDS CLOCK <= 74.25MHz 时,RK322X 和 RK3328 早期样片配置一致,但与RK3328 量产芯片的配置存在差异,需要在芯片版本上做区分。
在 LINUX 4.4/4.19 内核中,POST-PLL 的配置较为简单,已经包含在了 post_pll_cfg_table 当中,驱动会查找合适的配置,无需在驱动中另行添加新的配置。
LINUX 3.10 内核的 POST-PLL 配置分为 RK322XH_V1_PLL_TABLE 和 EXT_PLL_TABLE 两个 TABLE。可以根据所需 TMDS CLOCK 以及当前使用芯片的版本,直接选用 post_pll_cfg_table 当中对应值,在相应的 TABLE 中添加配置,详见 3.2 节。
3. 代码中新增PHY配置说明
LINUX 3.10 内核以及 LINUX 4.4/4.19 内核将 PHY 的配置保存在对应的 TABLE 中,根据当前输出分辨率的 PIXEL CLOCK 和 TMDS CLOCK 选择对应的配置并设置到对应的寄存器中。相同分辨率的不同色深模式的配置不同(TMDS CLOCK 不同),所以如果需要同时支持 8-bit 和 10-bit 的色深,需要在TABLE 中添加两项配置,详见2.1节。
3.1 LINUX 3.10内核
LINUX 3.10 内核驱动 HDMI 需要在特定的 TABLE 中新增对应的配置项,路径为:
kernel/drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.c
LINUX 3.10 内核驱动中包含两个 TABLE, RK322XH_V1_PLL_TABLE 适用于 TMDS CLOCK <= 74.25MHz 且所用芯片为 RK3328 量产芯片的场景。 EXT_PLL_TABLE 适用于 TMDS CLOCK > 74.25MHz 且所用芯片为 RK3328 早期样片和 RK322X 的场景。
static const struct ext_pll_config_tab RK322XH_V1_PLL_TABLE[] = {
{27000000, 27000000, 8, 1, 90, 3, 2,
2, 10, 3, 3, 4, 0, 1, 80,
8, 0xE8FBA7},
{27000000, 33750000, 10, 1, 90, 1, 3,
3, 10, 3, 3, 4, 0, 1, 80,
8, 0xE8FBA7},
{59400000, 59400000, 8, 1, 99, 3, 1,
1, 1, 3, 3, 4, 0, 18, 80,
8, 0xE6AE6B},
{59400000, 74250000, 10, 1, 99, 0, 3,
3, 1, 3, 3, 4, 0, 18, 80,
8, 0xE6AE6B},
{74250000, 74250000, 8, 1, 99, 1, 2,
2, 1, 2, 3, 4, 0, 18, 80,
8, 0xE6AE6B},
};
static const struct ext_pll_config_tab EXT_PLL_TABLE[] = {
{27000000, 27000000, 8, 1, 90, 3, 2,
2, 10, 3, 3, 4, 0, 1, 40,
8, 0xE8FBA7},
{27000000, 33750000, 10, 1, 90, 1, 3,
3, 10, 3, 3, 4, 0, 1, 40,
8, 0xE8FBA7},
{59400000, 59400000, 8, 1, 99, 3, 1,
1, 1, 3, 3, 4, 0, 1, 40,
8, 0xE6AE6B},
{59400000, 74250000, 10, 1, 99, 0, 3,
3, 1, 3, 3, 4, 0, 1, 40,
8, 0xE6AE6B},
{74250000, 74250000, 8, 1, 99, 1, 2,
2, 1, 2, 3, 4, 0, 1, 40,
8, 0xE6AE6B},
{74250000, 92812500, 10, 4, 495, 1, 2,
2, 1, 3, 3, 4, 0, 2, 40,
4, 0x816817},
{148500000, 148500000, 8, 1, 99, 1, 1,
1, 1, 2, 2, 2, 0, 2, 40,
4, 0xE6AE6B},
{148500000, 185625000, 10, 4, 495, 0, 2,
2, 1, 3, 2, 2, 0, 4, 40,
2, 0x816817},
{297000000, 297000000, 8, 1, 99, 0, 1,
1, 1, 0, 2, 2, 0, 4, 40,
2, 0xE6AE6B},
{297000000, 371250000, 10, 4, 495, 1, 2,
0, 1, 3, 1, 1, 0, 8, 40,
1, 0x816817},
{594000000, 297000000, 8, 1, 99, 0, 1,
1, 1, 0, 2, 1, 0, 4, 40,
2, 0xE6AE6B},
{594000000, 371250000, 10, 4, 495, 1, 2,
0, 1, 3, 1, 1, 1, 8, 40,
1, 0x816817},
{594000000, 594000000, 8, 1, 99, 0, 2,
0, 1, 0, 1, 1, 0, 8, 40,
1, 0xE6AE6B},
};
struct ext_pll_config_tab 的定义为:
struct ext_pll_config_tab {
u32 pix_clock;
u32 tmdsclock;
u8 color_depth;
u8 pll_nd;
u16 pll_nf;
u8 tmsd_divider_a;
u8 tmsd_divider_b;
u8 tmsd_divider_c;
u8 pclk_divider_a;
u8 pclk_divider_b;
u8 pclk_divider_c;
u8 pclk_divider_d;
u8 vco_div_5;
u8 ppll_nd;
u16 ppll_nf;
u8 ppll_no;
u32 frac;
};
各项参数说明见下表:
| 参数 | 说明 |
|---|---|
| pix clock _ | HDMI输出分辨率的pixel clock |
| tmdsclock | HDMI输出分辨率的tmds clock |
| color depth _ | HDMI输出色深8/10 bits |
| pll nd _ | pre-pll-pre-divider |
| pll nf _ | pre-pll-feedback-divider |
| tmsd divider a _ _ | tmds-dividera |
| tmsd divider b _ _ | tmds-dividerb |
| tmsd divider c _ _ | tmds-dividerc |
| pclk divider a _ _ | pclk-dividera |
| pclk divider b _ _ | pclk-dividerb |
| pclk divider c _ _ | pclk-dividerc |
| pclk divider d _ _ | pclk-dividerd |
| vco div 5 _ _ | pin hd20 pclk是否直接由VCO / 5所得,特定clock情况下使用 _ _ |
| ppll nd _ | post-pll-pre-divider |
| ppll nf _ | post-pll-feedback-divider |
| ppll no _ | post-pll-post-divider |
| frac | pre-pll-fractional-feedback-divider |
ppll_nd,ppll_nf,ppll_no 对应 LINUX 4.19/4.4 内核 post_pll_config 中的 prediv,fbdiv,postdiv。其值的选择需要根据 TMDS CLOCK 以及芯片版本,选择方法详见 3.2 节。
需要注意的是,部分版本的sdk代码较旧不包括 frac。RK322X 系列的芯片 PHY 的版本不支持浮点,所以 frac 只能为 0。
3.2 LINUX 4.4/4.19内核
LINUX 4.4/4.19 内核需要新增 PHY 配置时,需在 PRE-PLL 的配置 TABLE: pre_pll_cfg_table 中新增对应的配置,而 POST-PLL 的配置 TABLE: post_pll_cfg_table 目前配置已经涵盖了 PHY 所支持的所有分辨率,无需再新增配置。路径为:
kernel/drivers/phy/rockchip/phy-rockchip-inno-hdmi-phy.c
static const struct pre_pll_config pre_pll_cfg_table[] = {
{ 27000000, 27000000, 1, 90, 3, 2, 2, 10, 3, 3, 4, 0, 0},
{ 27000000, 33750000, 1, 90, 1, 3, 3, 10, 3, 3, 4, 0, 0},
{ 40000000, 40000000, 1, 80, 2, 2, 2, 12, 2, 2, 2, 0, 0},
{ 40000000, 50000000, 1, 100, 2, 2, 2, 1, 0, 0, 15, 0, 0},
{ 59341000, 59341000, 1, 98, 3, 1, 2, 1, 3, 3, 4, 0, 0xE6AE6B},
{ 59400000, 59400000, 1, 99, 3, 1, 1, 1, 3, 3, 4, 0, 0},
{ 59341000, 74176250, 1, 98, 0, 3, 3, 1, 3, 3, 4, 0, 0xE6AE6B},
{ 59400000, 74250000, 1, 99, 1, 2, 2, 1, 3, 3, 4, 0, 0},
{ 65000000, 65000000, 1, 130, 2, 2, 2, 1, 0, 0, 12, 0, 0},
{ 65000000, 81250000, 3, 325, 0, 3, 3, 1, 0, 0, 10, 0, 0},
{ 71000000, 71000000, 3, 284, 0, 3, 3, 1, 0, 0, 8, 0, 0},
{ 71000000, 88750000, 3, 355, 0, 3, 3, 1, 0, 0, 10, 0, 0},
{ 74176000, 74176000, 1, 98, 1, 2, 2, 1, 2, 3, 4, 0, 0xE6AE6B},
{ 74250000, 74250000, 1, 99, 1, 2, 2, 1, 2, 3, 4, 0, 0},
{ 74176000, 92720000, 4, 494, 1, 2, 2, 1, 3, 3, 4, 0, 0x816817},
{ 74250000, 92812500, 4, 495, 1, 2, 2, 1, 3, 3, 4, 0, 0},
{ 83500000, 83500000, 2, 167, 2, 1, 1, 1, 0, 0, 6, 0, 0},
{ 83500000, 104375000, 1, 104, 2, 1, 1, 1, 1, 0, 5, 0, 0x600000},
{ 85750000, 85750000, 3, 343, 0, 3, 3, 1, 0, 0, 8, 0, 0},
{ 88750000, 88750000, 3, 355, 0, 3, 3, 1, 0, 0, 8, 0, 0},
{ 88750000, 110937500, 1, 110, 2, 1, 1, 1, 1, 0, 5, 0, 0xF00000},
{108000000, 108000000, 1, 90, 3, 0, 0, 1, 0, 0, 5, 0, 0},
{108000000, 135000000, 1, 90, 0, 2, 2, 1, 0, 0, 5, 0, 0},
{119000000, 119000000, 1, 119, 2, 1, 1, 1, 0, 0, 6, 0, 0},
{119000000, 148750000, 1, 99, 0, 2, 2, 1, 0, 0, 5, 0, 0x2AAAAA},
{148352000, 148352000, 1, 98, 1, 1, 1, 1, 2, 2, 2, 0, 0xE6AE6B},
{148500000, 148500000, 1, 99, 1, 1, 1, 1, 2, 2, 2, 0, 0},
{148352000, 185440000, 4, 494, 0, 2, 2, 1, 3, 2, 2, 0, 0x816817},
{148500000, 185625000, 4, 495, 0, 2, 2, 1, 3, 2, 2, 0, 0},
{162000000, 162000000, 1, 108, 0, 2, 2, 1, 0, 0, 4, 0, 0},
{162000000, 202500000, 1, 135, 0, 2, 2, 1, 0, 0, 5, 0, 0},
{296703000, 296703000, 1, 98, 0, 1, 1, 1, 0, 2, 2, 0, 0xE6AE6B},
{297000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 2, 0, 0},
{296703000, 370878750, 4, 494, 1, 2, 0, 1, 3, 1, 1, 0, 0x816817},
{297000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 0, 0},
{593407000, 296703500, 1, 98, 0, 1, 1, 1, 0, 2, 1, 0, 0xE6AE6B},
{594000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 1, 0, 0},
{593407000, 370879375, 4, 494, 1, 2, 0, 1, 3, 1, 1, 1, 0x816817},
{594000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 1, 0},
{593407000, 593407000, 1, 98, 0, 2, 0, 1, 0, 1, 1, 0, 0xE6AE6B},
{594000000, 594000000, 1, 99, 0, 2, 0, 1, 0, 1, 1, 0, 0},
{ ~0UL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
static const struct post_pll_config post_pll_cfg_table[] = {
{33750000, 1, 40, 8, 1},
{33750000, 1, 80, 8, 2},
{33750000, 1, 10, 2, 4},
{74250000, 1, 40, 8, 1},
{74250000, 18, 80, 8, 2},
{148500000, 2, 40, 4, 3},
{297000000, 4, 40, 2, 3},
{594000000, 8, 40, 1, 3},
{ ~0UL, 0, 0, 0, 0}
};
struct pre_pll_config 和 struct post_pll_config 定义如下,LINUX 4.4/4.19 内核相当于拆分了 3.10 内核中的 struct ext_pll_config_tab 。
struct pre_pll_config {
unsigned long pixclock;
unsigned long tmdsclock;
u8 prediv;
u16 fbdiv;
u8 tmds_div_a;
u8 tmds_div_b;
u8 tmds_div_c;
u8 pclk_div_a;
u8 pclk_div_b;
u8 pclk_div_c;
u8 pclk_div_d;
u8 vco_div_5_en;
u32 fracdiv;
};
struct post_pll_config {
unsigned long tmdsclock;
u8 prediv;
u16 fbdiv;
u8 postdiv;
u8 version;
};
pre_pll_config 各项参数说明见下表:
| 参数 | 说明 |
|---|---|
| pixclock | HDMI输出分辨率的pixel clock |
| tmdsclock | HDMI输出分辨率的tmds clock |
| prediv | pre-pll-pre-divider |
| fbdiv | pre-pll-feedback-divider |
| tmds div a _ _ | tmds-dividera |
| tmds div b _ _ | tmds-dividerb |
| tmds div c _ _ | tmds-dividerc |
| pclk div a _ _ | pclk-dividera |
| pclk div b _ _ | pclk-dividerb |
| pclk div c _ _ | pclk-dividerc |
| pclk div d _ _ | pclk-dividerd |
| vco div 5 en _ _ _ | pin hd20 pclk是否直接由VCO / 5所得,特定clock情况下使用 _ _ |
| fracdiv | pre-pll-fractional-feedback-divider |
post_pll_config 各项参数说明见下表:
| 参数 | 说明 |
|---|---|
| tmdsclock | HDMI输出分辨率的tmds clock |
| prediv | post-pll-pre-divider |
| fbdiv | post-pll-feedback-divider |
| postdiv | post-pll-post-divider |
| version | 芯片版本,POST-PLL配置需根据时钟和芯片版本确定,其值含义: 1--RK322X与RK322XH早期样片,tmds clock为74.25Mhz及以下的配置 2--RK322XH量产芯片,tmds clock为74.25Mhz及以下的配置 3--RK322X与RK322XH芯片,tmds clock为74.25Mhz以上的配置,两者配置相同 4--RK322X部分芯片POST VCO为1080Mhz时不稳定,为270Mhz时工作稳定,需要特 别区分出来 |
以 TMDS CLOCK 为 74.25Mhz,RK3328 量产芯片为例,POST-PLL 配置选择方法如下:
- 首先在
post_pll_cfg_table中根据 TMDS CLOCK 找到对应的区间。如 TMDS CLOCK 为74.25Mhz 时,33.75Mhz < TMDS CLOCK <= 74.25Mhz,找到对应的二项:
{74250000, 1, 40, 8, 1},
{74250000, 18, 80, 8, 2},
- 根据芯片版本进一步选择,此时是 RK3328 量产芯片,TMDS CLOCK <= 74.25Mhz,所以 version的值应选择 2,所以最终选择:
{74250000, 18, 80, 8, 2},
- 最终配置值为:prediv = 18,fbdiv = 80, postdiv = 8。在 LINUX 3.10 内核的驱动中对应
structext_pll_config_tab中的 ppll_nd, ppll_nf, ppll_no 三项。由于是 RK3328 量产芯片切 TMDS CLOCK <= 74.25Mhz,所以需要添加在RK322XH_V1_PLL_TABLE当中。