[RK3399][Android7.1] Display模块配置屏幕时序方法

本文介绍了在Android 7.1系统下,基于RK3399板子如何配置Display模块的时序参数。内容涉及到mipi、lcd、edp等显示接口,时序配置可通过源代码或dts文件进行,以lg_lp079qx1_sp0v屏为例,详细解析了时序参数的设定方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OS: Android 7.1
Board: Firefly-RK3399
Kernel: v4.4.55

rk3399平台上提供了两种方法来配置屏的时序参数,uboot也一样。

时序参数写在源代码中:

比如当前用的edp屏, dts只有背光,gpio这些配置。
rk3399-firefly-edp.dts:

    edp_panel: edp-panel {
        compatible = "lg,lp079qx1-sp0v";
        bus-format = <MEDIA_BUS_FMT_RGB666_1X18>;
        backlight = <&backlight>;
        ......
        power_ctr: power_ctr {
               rockchip,debug = <0>;
               lcd_en: lcd-en {
                       gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
                       pinctrl-names = "default";
                       pinctrl-0 = <&lcd_panel_enable>;
                       rockchip,delay = <20>;
               };
            
RK3588 的 **DVP(Digital Video Port)** 是一种并行数字视频接口,支持 **BT.1120** 协议(8/10/12-bit YUV422 格式),常用于连接摄像头、传感器或外部显示设备。以下是 RK3588 通过 DVP 输出 BT.1120 的完整链路配置方法,涵盖硬件连接、设备树配置、时钟同步及调试要点。 --- ### **1. 硬件链路概述** RK3588 的 DVP 输出 BT.1120 的典型链路如下: 1. **数据源**:摄像头/传感器(输出 BT.1120 格式)→ RK3588 DVP 接收模块。 2. **数据路径**:DVP 接收 → VOP(Video Output Processor)处理 → 输出到显示接口(如 LVDS/HDMI)。 3. **时钟同步**:DVP 需要外部提供像素时钟(PCLK)或由 RK3588 生成。 #### **关键信号** - **数据信号**:`D[7:0]`(8-bit)或 `D[11:0]`(12-bit,BT.1120 支持)。 - **时钟信号**:`PCLK`(像素时钟,与数据同步)。 - **同步信号**:`HSYNC`(行同步)、`VSYNC`(场同步)、`FIELD`(场标识,可选)。 - **控制信号**:`PWDN`(电源下电)、`RESET`(复位)。 --- ### **2. 设备树配置** #### **2.1 启用 DVP 控制器** RK3588 的 DVP 控制器通常位于 `dvp@fe0d0000`(具体地址参考 `rk3588.dtsi`),需在设备树中启用并配置参数: ```dts / { compatible = "rockchip,rk3588"; /* DVP 控制器节点 */ dvp0: dvp@fe0d0000 { compatible = "rockchip,rk3588-dvp"; reg = <0x0 0xfe0d0000 0x0 0x10000>; interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru CLK_DVP_SRC>, <&cru CLK_DVP_DIV>; clock-names = "clk_dvp_src", "clk_dvp_div"; status = "okay"; /* DVP 输入配置(BT.1120 模式) */ ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; dvp0_in: endpoint { remote-endpoint = <&camera_out>; /* 连接摄像头输出 */ rockchip,format = "yuv422"; /* BT.1120 格式 */ rockchip,mode = "bt1120"; /* 明确指定 BT.1120 */ rockchip,bits = <8>; /* 8-bit 数据宽度(可选 10/12) */ rockchip,pclk-polarity = <0>; /* PCLK 极性(0=上升沿采样) */ rockchip,hsync-polarity = <0>; /* HSYNC 极性 */ rockchip,vsync-polarity = <0>; /* VSYNC 极性 */ }; }; }; }; /* 摄像头节点(示例) */ camera { compatible = "vendor,camera-model"; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; camera_out: endpoint { remote-endpoint = <&dvp0_in>; }; }; }; }; }; ``` #### **2.2 关键参数说明** - **`rockchip,format`**:必须为 `"yuv422"`(BT.1120 的标准格式)。 - **`rockchip,mode`**:明确指定 `"bt1120"`(部分驱动可能需要)。 - **`rockchip,bits`**:数据位宽(8/10/12-bit),需与摄像头输出匹配。 - **极性控制**:`pclk-polarity`、`hsync-polarity`、`vsync-polarity` 需与摄像头时序一致。 --- ### **3. VOP 配置(DVP → 显示输出)** DVP 接收的数据需通过 VOP 处理后输出到显示接口(如 LVDS)。以下是一个 VOP 配置示例: ```dts vop_b: vop@fe030000 { compatible = "rockchip,rk3588-vop-big"; reg = <0x0 0xfe030000 0x0 0x10000>; interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>; status = "okay"; /* VOP 输入端口(连接 DVP) */ ports { port@0 { reg = <0>; vop_b_in: endpoint { remote-endpoint = <&dvp0_out>; /* 连接 DVP 输出 */ rockchip,format = "yuv422"; }; }; /* VOP 输出端口(连接 LVDS/HDMI) */ port@1 { reg = <1>; vop_b_out: endpoint { remote-endpoint = <&lvds3_panel_in>; rockchip,format = "rgb888"; /* 转换为目标格式 */ }; }; }; }; ``` #### **3.1 DVP 与 VOP 的链路** 需在 DVP 节点中定义输出端口,并与 VOP 的输入端口关联: ```dts dvp0: dvp@fe0d0000 { ... ports { port@1 { reg = <1>; dvp0_out: endpoint { remote-endpoint = <&vop_b_in>; }; }; }; }; ``` --- ### **4. 时钟与同步配置** #### **4.1 像素时钟(PCLK)** - **外部提供**:摄像头生成 PCLK,通过 `clk_dvp_src` 引入 RK3588。 - **内部生成**:RK3588 通过 `CLK_DVP_DIV` 分频生成 PCLK(需在设备树中配置频率): ```dts clocks = <&cru CLK_DVP_SRC>, <&cru CLK_DVP_DIV>; clock-names = "clk_dvp_src", "clk_dvp_div"; assigned-clocks = <&cru CLK_DVP_DIV>; assigned-clock-rates = <74250000>; /* 示例:74.25MHz(对应 1080P@60fps) */ ``` #### **4.2 时序匹配** 确保 DVP 的时序参数(如 `hsync`、`vsync` 的前后沿)与摄像头输出一致,可通过 `display-timings` 节点定义: ```dts display-timings { dvp_timing: dvp-timing { hactive = <1920>; vactive = <1080>; hfront = <88>; hback = <148>; hsync-len = <44>; vfront = <3>; vback = <29>; vsync-len = <5>; clock = <74250>; /* 像素时钟(kHz) */ }; }; ``` --- ### **5. 内核驱动支持** #### **5.1 内核配置** 确保启用以下选项: ```conf CONFIG_VIDEO_ROCKCHIP_DVP=y # DVP 控制器驱动 CONFIG_DRM_ROCKCHIP=y # VOP 显示驱动 CONFIG_DRM_PANEL_SIMPLE=y # 简单面板驱动(如 LVDS) ``` #### **5.2 驱动交互** - DVP 驱动(`drivers/media/platform/rockchip/dvp/`)负责接收 BT.1120 数据。 - VOP 驱动将 YUV422 转换为 RGB 格式(如 `rgb888`)并输出到显示接口。 --- ### **6. 调试与验证** #### **6.1 检查 DVP 是否加载** ```bash dmesg | grep -i dvp ``` 正常输出应包含: ``` [drm] Found Rockchip DVP at 0xfe0d0000 [drm] DVP initialized with BT.1120 mode ``` #### **6.2 验证数据流** - 使用 `v4l2-ctl` 检查 DVP 接收的数据(需摄像头支持): ```bash v4l2-ctl --device=/dev/video0 --list-formats-ext ``` - 监控显示输出: ```bash modetest -M rockchip -s 0@0:1920x1080 ``` #### **6.3 常见问题** - **图像花屏**: - 检查 `hsync`/`vsync` 极性是否与摄像头一致。 - 确认像素时钟频率匹配(`clock` 参数)。 - **无输出**: - 检查设备树中 DVP 和 VOP 的端口连接(`remote-endpoint`)。 - 使用示波器测量 `PCLK` 是否有波形。 --- ### **7. 高级配置** #### **7.1 多路复用(MUX)** 若需共享 DVP 接口(如连接多个摄像头),需配置 `pinctrl` 和复用器: ```dts &pinctrl { dvp0_pins: dvp0-pins { rockchip,pins = < RK_PD0 0x1001 /* DVP_D0 */ RK_PD1 0x1001 /* DVP_D1 */ /* 其他引脚... */ >; }; }; ``` #### **7.2 动态分辨率切换** 通过 `drm_modeset` 接口动态调整分辨率: ```c struct drm_mode_modeinfo mode = { .hdisplay = 1280, .vdisplay = 720, .vrefresh = 60, /* 其他时序参数... */ }; drm_mode_set_config(&vop->crtc, &mode); ``` --- ### **总结** RK3588 DVP 输出 BT.1120 的关键步骤: 1. 配置 DVP 控制器节点,启用 BT.1120 模式。 2. 定义 DVP 与 VOP 的数据链路(端口连接)。 3. 匹配时钟和时序参数。 4. 通过内核驱动和调试工具验证数据流。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值