屏适配指南
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, };
屏配置步骤
屏配置需要以下操作:
- 为 LCD 适配一款 panel 驱动。
- 确保一条正确的数据通路。
具体配置步骤如下:
- 配置 panel 驱动:
- 数据通路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 中没有正确配置一条数据通道,显示驱动无法完成初始化。