参考文章: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/
目录下。这个目录包含了与不同类型的显示面板相关的驱动程序。
常见的面板类型:
- MIPI DSI(Display Serial Interface):一种常见的用于智能手机、平板等设备的高带宽显示接口。
- LVDS(Low Voltage Differential Signaling):用于连接显示器和主板之间的显示接口,常见于笔记本和台式机中。
- eDP(Embedded DisplayPort):用于嵌入式设备的显示接口,通常用于高分辨率的显示屏。
- 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