2 分钟阅读 次阅读

简介

LVDS(Low-Voltage Differential Signaling)是一种常用的显示屏接口,适用于高分辨率和高刷新率的显示需求。在嵌入式系统中,适配 LVDS 屏幕的核心是通过设备树配置 LVDS 接口和屏幕参数,并确保驱动支持和系统正确初始化屏幕显示。

本文将从概括性流程开始,逐步展开详细的适配步骤,帮助新手理解和完成 LVDS 屏幕的适配。


概括性适配流程

  1. 收集屏幕参数:获取 LVDS 屏幕的分辨率、时序参数(如像素时钟频率、同步信号极性)、数据格式(如 JEIDA/ VESA)及背光控制方式。
  2. 修改设备树(DTS):配置 LVDS 接口节点,添加屏幕的显示参数和背光控制节点。
  3. 驱动适配:确认内核对 LVDS 屏幕的支持,必要时增加或修改屏幕驱动。
  4. 编译与烧录:编译内核和设备树,生成镜像文件并烧录至开发板。
  5. 调试与验证:通过串口或系统日志检查 LVDS 屏幕初始化是否成功,并调整参数解决问题。

完整适配流程

1. 收集屏幕参数

在适配 LVDS 屏幕之前,需掌握以下关键信息:

  • 分辨率:屏幕的宽度和高度(如 1920x1080)。
  • 时序参数
    • 像素时钟频率(Pixel Clock):单位 MHz,如 74.25MHz
    • 同步信号极性:HSYNC 和 VSYNC 的极性(正/负)。
    • 前沿、后沿、同步脉冲宽度:水平和垂直方向的时序信息。
    • 总像素数:包括显示区、同步区和空白区的像素。
  • 数据格式
    • LVDS 数据传输协议(如 JEIDA-24 或 VESA-24)。
    • 单通道或双通道(Single/Dual Channel)。
  • 背光控制
    • 背光的控制方式(PWM 或 GPIO)。
    • 最大亮度值和默认亮度值。

屏幕规格书(Datasheet)通常包含这些参数,若无规格书,可向屏幕供应商索取。


2. 修改设备树(DTS)

设备树是硬件描述的核心,用于定义 LVDS 接口的配置和屏幕的显示参数。

2.1 定位设备树文件

  • 设备树文件位于 kernel/arch/arm64/boot/dts/rockchip/
  • 文件名通常与开发板名称相关(如 rk3568-evb.dts)。
  • 修改主 DTS 文件或其包含的 DTSI 文件。

2.2 配置 LVDS 接口

在设备树中,找到显示子系统的节点(如 display-subsystemlvds),启用 LVDS 并配置屏幕的参数。例如:

&lvds {
    status = "okay";      // 启用 LVDS
    panel {
        compatible = "lvds-panel"; // 屏幕驱动绑定名称
        reg = <0>;
        ports {
            #address-cells = <1>;
            #size-cells = <0>;

            port@0 {
                reg = <0>;
                lvds_out: endpoint {
                    remote-endpoint = <&lvds_in>;
                };
            };
        };
    };
};

2.3 添加屏幕显示时序

根据屏幕参数,配置显示时序(Display Timings)。以下是一个示例配置:

panel {
    compatible = "lvds-panel";  // 绑定屏幕驱动
    backlight = <&backlight>;   // 背光节点
    power-supply = <&vcc_lcd>;  // 屏幕电源节点
    data-mapping = "jeida-24";  // 数据格式,可能为 "jeida-24" 或 "vesa-24"
    width-mm = <344>;           // 屏幕宽度(毫米)
    height-mm = <193>;          // 屏幕高度(毫米)

    display-timings {
        native-mode = <&timing0>;
        timing0: timing0 {
            clock-frequency = <74250000>; // 像素时钟频率(Hz)
            hactive = <1920>;
            vactive = <1080>;
            hfront-porch = <88>;
            hback-porch = <148>;
            hsync-len = <44>;
            vfront-porch = <4>;
            vback-porch = <36>;
            vsync-len = <5>;
            hsync-active = <0>;  // HSYNC 极性
            vsync-active = <0>;  // VSYNC 极性
            pixelclk-active = <0>;
        };
    };
};

2.4 添加背光控制

如果屏幕需要背光控制,在设备树中添加背光节点。例如:

backlight: backlight {
    compatible = "pwm-backlight";  // 使用 PWM 控制背光
    pwms = <&pwm0 0 50000 0>;      // PWM 参数
    brightness-levels = <0 50 100 150 200 255>; // 亮度等级
    default-brightness-level = <200>;          // 默认亮度
};

3. 驱动适配

3.1 检查驱动支持

  • Rockchip 平台通常已支持 LVDS 屏幕,驱动位于 kernel/drivers/gpu/drm/rockchip/
  • 确认内核是否已支持所需的屏幕型号和 LVDS 接口参数。

3.2 增加自定义驱动

如果屏幕需要特定的初始化过程,可以在 kernel/drivers/gpu/drm/panel/ 中新增驱动文件。例如:

static const struct drm_display_mode lvds_screen_mode = {
    .clock = 74250,
    .hdisplay = 1920,
    .hsync_start = 1920 + 88,
    .hsync_end = 1920 + 88 + 44,
    .htotal = 1920 + 88 + 44 + 148,
    .vdisplay = 1080,
    .vsync_start = 1080 + 4,
    .vsync_end = 1080 + 4 + 5,
    .vtotal = 1080 + 4 + 5 + 36,
    .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
};

确保在驱动 Makefile 中添加新驱动文件。


4. 编译与烧录

4.1 编译内核

根据修改的设备树和驱动,重新编译内核:

make ARCH=arm64 rockchip_defconfig
make ARCH=arm64 -j$(nproc)

4.2 生成镜像

使用 Rockchip 提供的 mkimage.sh 脚本生成固件镜像:

./mkimage.sh

4.3 烧录至开发板

使用 Rockchip 的烧录工具(如 RKDevTool)将固件烧录到设备。


5. 调试与验证

5.1 查看启动日志

通过串口或 adb shell 查看启动日志:

dmesg | grep drm

检查是否有显示子系统或 LVDS 初始化失败的报错。

5.2 测试显示效果

确认屏幕是否点亮,显示是否正常。如果屏幕无显示或出现异常(如花屏、闪屏),可进一步检查:

  • 时间参数是否与屏幕规格一致。
  • 数据格式(JEIDA/VESA)是否正确。

5.3 调试背光

若背光不工作,检查 PWM 或 GPIO 配置是否正确。


常见问题与解决

  1. 屏幕无显示
    • 确保 LVDS 节点在设备树中已启用。
    • 检查时序参数是否正确。
    • 确认屏幕的供电和连接无误。
  2. 花屏或闪屏
    • 调整时序参数(如像素时钟频率)。
    • 确认 LVDS 数据格式(JEIDA-24 或 VESA-24)。
  3. 背光未点亮
    • 检查背光节点配置是否正确。
    • 确保 PWM 控制信号有效。

留下评论