五、kernel修改屏幕配置

2.3、修改屏幕配置

2.3.1、配置

  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;
    };
    
  2. 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、参数分析

  1. size,width = <66>size,height = <156>;

    这两行定义了显示面板的物理宽度和高度,单位为毫米。在这个例子中,显示面板的宽度为 66mm,高度为 156mm。

  2. 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 接口的行为。

  3. dsi,format = <MIPI_DSI_FMT_RGB888>;

    这一行指定了显示数据的格式为 RGB888,也就是每个像素使用 24 位色深。

  4. dsi,lanes = <4>;

    这里定义了 MIPI DSI 使用的传输通道数。<4> 表示使用 4 条数据通道来传输数据。

  5. panel-init-sequencepanel-exit-sequence

    • panel-init-sequence:这部分是显示面板的初始化命令序列,通常这些命令会发送到显示器,以设置其工作模式、时序和其他显示参数。
    • panel-exit-sequence:这部分是显示器退出时的命令序列,通常用于关闭显示或进入低功耗状态。
  6. 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...:实际发送给显示器的命令数据。根据显示器的要求,可能是字节值或者具体的控制字。

一般规则:

  1. 命令长度和数据格式:

    • command_length 是 8 位或 16 位数字,表示该命令的数据长度(以字节为单位)。例如,39 05 表示这个命令的数据长度为 39 个字节。
    • command_data 是命令的具体数据,可以是控制信号、颜色数据、时序数据等。显示器根据这些命令来改变其状态。
  2. 控制命令:控制命令通常以 0x15 开头,表示“发送控制命令”,后面跟随的字节可能是控制代码和数据。例如:

    15 00 02 51 ff
    

    这表示发送一个控制命令 0x15,后面紧跟着控制数据 00 02 51 ff

  3. 数据命令:数据命令通常以 0x39 开头,表示“发送数据”,后面是要发送的字节流。例如:

    39 05 05 2a 00 00 04 37
    

    这表示发送一个数据命令 0x39,后面是数据 05 05 2a 00 00 04 37

  4. 延迟命令:一些命令可能会包含延迟时间,通常会在 panel-init-sequence 中插入一个延迟命令。延迟命令通常以 0x15 命令为基础,例如:

    15 00 02 51 ff
    

    后面的数据可能包含延迟时间,表示等待指定的毫秒数。

  5. 不同命令的功能:

    • 0x39:通常用于写数据命令,包含显示控制或时序调整数据。
    • 0x15:通常用于写控制命令或控制信号。
    • 0x29:可能用于显示控制或使能显示。
    • 0x2A, 0x2B, 0x2C:通常涉及像素数据的写入或显示区块控制。
  6. 编写时注意事项:

    • 确保命令与显示器的数据手册一致。每个显示器的初始化命令和顺序可能会有所不同,必须根据显示器的要求来编写命令。
    • 如果显示器要求在某些命令之间等待(如发送完初始化命令后等待几毫秒),应插入延迟命令。
    • 初始化序列中的命令顺序非常重要,错误的顺序可能会导致显示器不正常工作。

示例:

以下是一个典型的 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         // 数据命令,控制显示区域设置
];
posted @ 2025-05-22 14:26  暮云星影  阅读(103)  评论(0)    收藏  举报