五、kernel修改屏幕配置
2.3、修改屏幕配置
2.3.1、配置
-
gpio
修改 ./rk_linux_sdk/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10.dtsi
&dsi0_panel { power-supply = <&vcc3v3_lcd0_n>; reset-gpios = <&gpio3 RK_PC0 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; pinctrl-0 = <&lcd0_rst_gpio>; rotation = <270>; // 设置屏幕旋转为90度 }; lcd0 { lcd0_rst_gpio: lcd0-rst-gpio { rockchip,pins = <3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>; }; }; &vcc3v3_lcd0_n { gpio = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>; enable-active-high; };
-
dsi0_panel
修改 ./rk_linux_sdk/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi
&dsi0 { status = "okay"; //power-supply = <&mipi_dsi0_power>; dsi0_panel: panel@0 { compatible = "simple-panel-dsi"; reg = <0>; //backlight = <&backlight>; //reset-gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_LOW>; //enable-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>; enable-delay-ms = <1035>; prepare-delay-ms = <399>; reset-delay-ms = <2000>; init-delay-ms = <20>; unprepare-delay-ms = <0>; disable-delay-ms = <20>; size,width = <66>; size,height = <156>; dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>; dsi,format = <MIPI_DSI_FMT_RGB888>; dsi,lanes = <4>; panel-init-sequence = [ 15 00 02 fe 26 。。。 15 00 02 fe 00 15 00 02 fa 07 15 00 02 c2 08 15 00 02 35 00 39 05 03 51 0d bb 05 c8 01 11 05 c8 01 29 ]; panel-exit-sequence = [ 05 78 01 28 05 00 01 10 ]; disp_timings0: display-timings { native-mode = <&dsi0_timing0>; dsi0_timing0: timing0 { clock-frequency = <178483200>; hactive = <1080>; vactive = <1920>; hsync-len = <8>; hback-porch = <8>; hfront-porch = <100>; vsync-len = <4>; vback-porch = <8>; vfront-porch = <8>; hsync-active = <0>; vsync-active = <0>; de-active = <1>; pixelclk-active = <0>; }; }; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; panel_in_dsi: endpoint { remote-endpoint = <&dsi_out_panel>; }; }; }; }; ports { #address-cells = <1>; #size-cells = <0>; port@1 { reg = <1>; dsi_out_panel: endpoint { remote-endpoint = <&panel_in_dsi>; }; }; }; };
2.3.2、参数分析
-
size,width = <66>
和size,height = <156>;
这两行定义了显示面板的物理宽度和高度,单位为毫米。在这个例子中,显示面板的宽度为 66mm,高度为 156mm。
-
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
这一行设置了 MIPI DSI 的工作模式标志:
MIPI_DSI_MODE_VIDEO
:使用视频模式。MIPI_DSI_MODE_VIDEO_BURST
:使用视频突发模式。MIPI_DSI_MODE_LPM
:启用低功耗模式。MIPI_DSI_MODE_EOT_PACKET
:启用数据包结束标志。
这些标志定义了 MIPI DSI 接口的行为。
-
dsi,format = <MIPI_DSI_FMT_RGB888>;
这一行指定了显示数据的格式为 RGB888,也就是每个像素使用 24 位色深。
-
dsi,lanes = <4>;
这里定义了 MIPI DSI 使用的传输通道数。
<4>
表示使用 4 条数据通道来传输数据。 -
panel-init-sequence
和panel-exit-sequence
panel-init-sequence
:这部分是显示面板的初始化命令序列,通常这些命令会发送到显示器,以设置其工作模式、时序和其他显示参数。panel-exit-sequence
:这部分是显示器退出时的命令序列,通常用于关闭显示或进入低功耗状态。
-
disp_timings0: display-timings
这部分定义了显示的时序设置:
clock-frequency = <178483200>;
:显示时钟频率为 178483200Hz。hactive = <1080>;
和vactive = <1920>;
:显示的有效像素分辨率为 1080x1920。hsync-len
,hback-porch
,hfront-porch
,vsync-len
,vback-porch
,vfront-porch
:这些是显示的水平同步宽度、水平回扫、水平前扫、垂直同步宽度、垂直回扫和垂直前扫的设置。这些值影响显示的刷新率和屏幕的扫描模式。hsync-active = <0>;
和vsync-active = <0>;
:这指定了同步信号的极性,0
表示低电平有效。de-active = <1>;
和pixelclk-active = <0>;
:分别表示显示使能信号和像素时钟的极性。
2.3.3、panel-init-sequence 设置规则
panel-init-sequence
是用于定义显示面板初始化时发送的命令序列的部分,它通常会在显示面板上电并准备启动时执行。这些命令直接控制显示器的各个功能,比如电源开关、显示模式、时序设置、颜色格式等。
设置规则:
panel-init-sequence
是一个数组,数组中的每个元素都是一个命令,这些命令按照初始化顺序发送到显示面板。通常,每个命令的格式如下:
<command_length> <command_data...>
其中:
command_length
:表示该命令数据的长度。command_data...
:实际发送给显示器的命令数据。根据显示器的要求,可能是字节值或者具体的控制字。
一般规则:
-
命令长度和数据格式:
command_length
是 8 位或 16 位数字,表示该命令的数据长度(以字节为单位)。例如,39 05
表示这个命令的数据长度为 39 个字节。command_data
是命令的具体数据,可以是控制信号、颜色数据、时序数据等。显示器根据这些命令来改变其状态。
-
控制命令:控制命令通常以
0x15
开头,表示“发送控制命令”,后面跟随的字节可能是控制代码和数据。例如:15 00 02 51 ff
这表示发送一个控制命令
0x15
,后面紧跟着控制数据00 02 51 ff
。 -
数据命令:数据命令通常以
0x39
开头,表示“发送数据”,后面是要发送的字节流。例如:39 05 05 2a 00 00 04 37
这表示发送一个数据命令
0x39
,后面是数据05 05 2a 00 00 04 37
。 -
延迟命令:一些命令可能会包含延迟时间,通常会在
panel-init-sequence
中插入一个延迟命令。延迟命令通常以0x15
命令为基础,例如:15 00 02 51 ff
后面的数据可能包含延迟时间,表示等待指定的毫秒数。
-
不同命令的功能:
0x39
:通常用于写数据命令,包含显示控制或时序调整数据。0x15
:通常用于写控制命令或控制信号。0x29
:可能用于显示控制或使能显示。0x2A
,0x2B
,0x2C
:通常涉及像素数据的写入或显示区块控制。
-
编写时注意事项:
- 确保命令与显示器的数据手册一致。每个显示器的初始化命令和顺序可能会有所不同,必须根据显示器的要求来编写命令。
- 如果显示器要求在某些命令之间等待(如发送完初始化命令后等待几毫秒),应插入延迟命令。
- 初始化序列中的命令顺序非常重要,错误的顺序可能会导致显示器不正常工作。
示例:
以下是一个典型的 panel-init-sequence
示例:
panel-init-sequence = [
39 05 05 2a 00 00 04 37 // 第一个初始化命令
39 05 05 2b 00 00 04 d7 // 第二个初始化命令
15 00 02 51 ff // 控制命令,可能是颜色设置或启用显示
15 00 02 35 00 // 控制命令,可能是显示模式的设置
39 05 03 44 02 6c // 数据命令,可能是时序设置
15 00 02 f0 50 // 控制命令,可能是电源控制
39 05 03 b0 0e 0e // 数据命令,控制显示区域设置
];