rk3588_mipi

参考文章:docs/Common/DISPLAY/Rockchip_RK3588_Developer_Guide_MIPI_DSI2_CN.pdf

DSC:Display Stream Compression显示流压缩。

DSI:Display serial Interface显示串行接口。

RK3588 有两个 DSI-2 控制器和两个独⽴的物理的 D/C-PHY, 可以同时最多 ⽀持两路 MIPI 输出。

MIPI Dsi:MIPI DSI基于差分信号传输,可以降低引脚数量和硬件设计复杂度,并保持良好的硬件兼容性

RK3588 dsi显示图

如上图所示,VP 与 DSI绑定后,通过 DCPHY接口至panel。

panel

在Linux内核中,面板相关的代码通常位于 drivers/gpu/drm/panel/ 目录下。这个目录包含了与不同类型的显示面板相关的驱动程序。

常见的面板类型:

  1. MIPI DSI(Display Serial Interface):一种常见的用于智能手机、平板等设备的高带宽显示接口。
  2. LVDS(Low Voltage Differential Signaling):用于连接显示器和主板之间的显示接口,常见于笔记本和台式机中。
  3. eDP(Embedded DisplayPort):用于嵌入式设备的显示接口,通常用于高分辨率的显示屏。
  4. VGA:一种传统的模拟显示接口,虽然现代设备较少使用,但某些嵌入式系统仍然支持。

panel 相关结构体与接口

在Linux内核的显示子系统中,有一些专门的结构体和接口用于描述和控制面板,例如:

  • struct drm_panel:这是描述显示面板的核心结构体,包含了面板的初始化、关闭、控制和时序等操作。
  • panel_operations:提供了一组操作面板的函数,如初始化、设置分辨率、开关面板等。

示例代码

以下是一个简单的面板驱动结构,展示了如何初始化和控制显示面板:

struct drm_panel {
    struct device *dev;
    int (*prepare)(struct drm_panel *panel);
    int (*unprepare)(struct drm_panel *panel);
    int (*enable)(struct drm_panel *panel);
    int (*disable)(struct drm_panel *panel);
    int (*get_modes)(struct drm_panel *panel, struct drm_display_mode *mode);
    struct list_head panel_list;
};

总结

在Linux驱动中,panel 通常指的是显示设备相关的硬件组件,面板驱动负责与显示硬件交互,控制屏幕的显示内容、刷新频率、分辨率等参数。面板驱动是Linux显示子系统中不可或缺的部分,广泛应用于嵌入式设备、移动设备、笔记本电脑等硬件中。

如dts

&backlight_mipi {
	compatible = "pwm-backlight";
	pwms = <&pwm1 0 25000 0>;
	enable-gpios = <&gpio4 RK_PB7 GPIO_ACTIVE_HIGH>;
	status = "okay";
	brightness-levels = <
		  0  20  20  21  21  22  22  23
		  ............................
		248 249 250 251 252 253 254 255
	>;
	default-brightness-level = <200>;
};

&pwm1 {
	status = "okay";
	pinctrl-0 = <&pwm1m1_pins>;
};


&dsi0 {
	status = "okay";
	rockchip,lane-rate = <500000>;
	dsi0_panel: panel@0 {
	status = "okay";
	compatible = "simple-panel-dsi";
	reg = <0>;

	reset-gpios = <&gpio2 RK_PC0 GPIO_ACTIVE_LOW>;
	pinctrl-names = "default";
	pinctrl-0 = <&lcd_rst_gpio>;

	backlight = <&backlight_mipi>;
	init-delay-ms = <60>;
	reset-delay-ms = <60>;
	enable-delay-ms = <60>;
	prepare-delay-ms = <60>;
	unprepare-delay-ms = <60>;
	disable-delay-ms = <60>;
	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 = [
		39 00 04 FF 98 81 03										   
		...................
		05 00 01 35	//TE on
		05 78 01 11	//sleep out
		05 00 01 29	//display on
	];
		
	panel-exit-sequence = [
		05 78 01 28
		05 78 01 10
	];

	disp_timings0: display-timings {
		native-mode = <&dsi0_timing0>;
		dsi0_timing0: timing0 {
			clock-frequency = <82000000>;
			hactive = <720>;
			vactive = <1440>;
			hback-porch = <100>;
			hfront-porch = <100>;
			vback-porch = <30>;
			vfront-porch = <20>;
			hsync-len = <30>;
			vsync-len = <2>;
			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <0>;
			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>;
			};
		};
	};
};


&dsi0_in_vp2 {
	status = "disabled";
};

&dsi0_in_vp3 {
	status = "okay";
};

&mipi_dcphy0 {
	status = "okay";
};

&route_dsi0 {
	status = "okay";
	connect = <&vp3_out_dsi0>;
};

&pinctrl {
	lcd {
		lcd_rst_gpio: lcd-rst-gpio {
			rockchip,pins = <2 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>;
		};
	};
	goodix {
		goodix_irq: goodix-irq {
			rockchip,pins = <4 RK_PC3 RK_FUNC_GPIO &pcfg_pull_up>;
		};
	};
};

&i2c5 {
	status = "okay";
	pinctrl-names = "default";
		pinctrl-0 = <&i2c5m0_xfer>;

	goodix_ts@14 {
		status = "okay";
		compatible = "goodix,gt1x";
		reg = <0x14>;
		goodix,rst-gpio = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>;
		goodix,irq-gpio = <&gpio4 RK_PC3 IRQ_TYPE_LEVEL_LOW>;
		pinctrl-names = "default";
		pinctrl-0 = <&goodix_irq>;

		gtp_resolution_x = <720>;
		gtp_resolution_y = <1440>;
		gtp_int_tarigger = <1>;
		gtp_change_x2y = <0>;
		gtp_overturn_x = <0>;
		gtp_overturn_y = <0>;
		gtp_send_cfg = <0>;
		gtp_touch_back = <0>;
		gtp_touch_wakeup = <1>;

	};
};

 代码功能分析

设置背光pwm

dsi

dsi主要包括

上电时序、mipi传输格式 。

 屏上电与屏下电初始化时序。

timing屏刷新频率、分辨率、时钟。

timing:通常指的是显示时序,即控制显示设备如何同步绘制图像的一系列时序参数。

不同的显示器或面板有特定的时序要求,只有满足这些要求,图像才能正确显示,否则可能出现闪烁、变形或无信号等问题。

  • 前肩(Front Porch):在有效显示区域结束到同步脉冲开始之间的间隔。
  • 后肩(Back Porch):在同步脉冲结束到下一行/帧有效显示区域开始之间的间隔。
  • 同步脉宽(Sync Width):同步信号保持激活的时间宽度。

hsync-len 像素周期

hs-active 有效电平

刷新率 = 时钟 / ((有效宽度 + HSYNC宽(HSPW) + HBP + HFP) * (有效高度 + VSYNC宽(VSPW) + VBP + VFP))

148500000/((1920+88+44+148)*(1080+4+5+36))

绑定panel

最后则是i2c触摸屏。

文件系统排查

查看dsi有没有注册成功

查看 看VOP timing 和 Connector 信息

cat  /sys/kernel/debug/dri/0/summary

 查看 DSI相关 clk tree

 

参考文章

屏幕驱动参数详解:影响显示效果的关键设置-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值