Edit online

屏适配指南

4 Dec 2024
Read time: 4 minute(s)

本章节介绍 LCD 外设在 Luban 上的适配方法。用户可选择以下任意方式配置屏参数:

  • 将以下屏参数写入 panel 驱动源码中:
    注:

    对于屏时序参数,只有当 board.dts 文件的 panel 结点没有设置 display-timings 子节点时,此方式才会生效。

    • 时序参数
      /* Init the videomode parameter, dts will override the initial value. */
      static struct videomode panel_vm = {
          .pixelclock = 130000000,
          .hactive = 1080,
          .hfront_porch = 160,
          .hback_porch = 160,
          .hsync_len = 40,
          .vactive = 1920,
          .vfront_porch = 10,
          .vback_porch = 20,
          .vsync_len = 8,
          .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
              DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE
      };
      
    • 屏接口参数
      static int panel_bind(struct device *dev, struct device *master, void *data)
      {
          ...
          dsi->format = DSI_FMT_RGB888;
          dsi->mode = DSI_MOD_VID_PULSE;
          dsi->lane_num = 4;
          ...
      }

屏配置方式

方式一:将屏参数写入到 board.dts 文件中。关于 panel_lvds 参数,可查看 Panel_LVDS

方式二:将屏参数写入 panel 驱动源码中。

提示:

仅在 board.dts 文件的 panel 结点不存在 display-timings 子节点,方式二才会生效。

  • 时序参数

    /* Init the videomode parameter, dts will override the initial value. */
    static struct videomode panel_vm = {
        .pixelclock = 130000000,
        .hactive = 1080,
        .hfront_porch = 160,
        .hback_porch = 160,
        .hsync_len = 40,
        .vactive = 1920,
        .vfront_porch = 10,
        .vback_porch = 20,
        .vsync_len = 8,
        .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
            DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE
    };
  • 屏接口参数

    struct panel_dsi dsi = {
        .mode = DSI_MOD_VID_BURST,
        .format = DSI_FMT_RGB888,
        .lane_num = 4,
    };

屏配置步骤

屏配置需要以下操作:

  1. 为 LCD 适配一款 panel 驱动。
  2. 确保一条正确的数据通路。
具体配置步骤如下:
  1. 配置 panel 驱动:
    • 使能 Luban SDK 提供的 RGB/ LVDS panel 驱动,详见 Panel 配置

    • 编写一个 panel 驱动,详情可查看屏驱动支持

  2. 数据通路
    LCD 正常显示时,显示模块会形成一条完整的数据通道。
    fb0 --> display engine  --> display interface  --> panel
    数据通道的关系在 board.dts 中体现,以 LVDS 屏幕为例:
    &fb0 {
        port {
            fb0_out: endpoint {
                remote-endpoint = <&de0_in>;
            };
        };
    };
    
    &de0 {
        status = "okay";
        port@0 {
            reg = <0>;
            de0_in: endpoint {
                remote-endpoint = <&fb0_out>;
            };
        };
    
        port@1 {
            reg = <1>;
            de0_out: endpoint {
                remote-endpoint = <&lvds0_in>;
            };
        };
    };
    
    &rgb0 {
        status = "disabled";
        port@0 {
            reg = <0>;
            rgb0_in: endpoint {
                remote-endpoint = <&rgb0_in>;
            };
        };
    
        port@1 {
            reg = <1>;
            rgb0_out: endpoint {
                remote-endpoint = <&panel_rgb_in>;
            };
        };
    };
    
    &lvds0 {
        status = "okay";
        port@0 {
            reg = <0>;
            lvds0_in: endpoint {
                remote-endpoint = <&de0_out>;
            };
        };
    
        port@1 {
            reg = <1>;
            lvds0_out: endpoint {
                remote-endpoint = <&panel_lvds_in>;
            };
        };
    };
    
    &dsi0 {
        status = "disabled";
        port@0 {
            reg = <0>;
            dsi0_in: endpoint {
                remote-endpoint = <&dsi0_in>;
            };
        };
    
        port@1 {
            reg = <1>;
            dsi0_out: endpoint {
                remote-endpoint = <&panel_dsi_in>;
            };
        };
    };
    在上述例子中,board.dts 通过 port 和 status 结点,配置了一条数据通道。
    fb       |      de    |     |     lvds    |     panel
    port  --> port0   port1 -->  port0   port1 -->  port

    如果 board.dts 中没有正确配置一条数据通道,显示驱动无法完成初始化。