news 2026/4/3 3:06:22

57.Linux MIPI接口屏幕

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
57.Linux MIPI接口屏幕

57.Linux MIPI接口屏幕

对于mipi DSI接口来,我们需要学习如何调试 MIPI DSI 接口屏幕

RK3588有两个MIPI接口


分别为MIPI0 MIPI1

调试 MIPI 屏幕主要有三部分内容:

1)、屏幕背光调试,这个是首先要搞定的,背光不亮,屏幕也就什么都看不到。这个比较简单,属于 PWM 相关知识,后面也会讲解如何调试背光。

2)、向屏幕发送初始化序列,前面已经说了这点,需要用到逻辑分析仪。

3)、调试屏幕的 DPI 参数,最后需要调试 MIPI 屏幕的 DPI 参数,也就是 HBP、 HFP、VBP、 VFP 等这些参数。

我们后面编写驱动的时候也是按照这三大内容逐步调试的。


背光 PWM 节点设置

屏幕接口背光控制 IO 连接到了 RK3588 的 GPIO0_C0 引脚上,我们需要将 GPIO0_ C0 复用为 PWM1

rk3588s-pinctrl.dtsi

添加pinctl的信息

pwm1{/omit-if-no-ref///添加下面节点pwm1m0_pins:pwm1m0-pins{rockchip,pins=/* pwm1_m0 */<0RK_PC03&pcfg_pull_none>;};};

GPIO0_C0找到文档中的寄存器配置章节Rockchip RK3588 TRM V1.0-Part2 20220309中的6.27BUS_IOC register Description中全局搜索gpio0c0_sel,只有两处地方使用了PMU2_IOC_GPIO0C_IOMUX_SEL_L以及BUS_IOC_GPIO0C_IOMUX_SEL_L

我们设置为PWM1_M0,因此 <0 RK_PC0 3 &pcfg_pull_none>;将 GPIO0_C0 引脚设置

为 PWM1 功能。 配置完毕默认禁用引脚的上下拉电阻,即不启用上拉和下拉。 pinctl就设置完了

在rk3588s.dtsi中

向pwm1追加内容pinctl的内容

pwm1:pwm@fd8b0010{compatible="rockchip,rk3588-pwm","rockchip,rk3328-pwm";reg=<0x00xfd8b00100x00x10>;interrupts=<GIC_SPI344IRQ_TYPE_LEVEL_HIGH>;#pwm-cells=<3>;pinctrl-names="active";pinctrl-0=<&pwm1m0_pins>;clocks=<&cru CLK_PMU1PWM>,<&cru PCLK_PMU1PWM>;clock-names="pwm","pclk";status="disabled";};

PWM 和相关的 IO 已经准备好了,

backlight 节点设置

还需要一个节点来将屏幕背光和 pwm1m0_pins 连接起来。这个节点就是 backlight,

①、节点名称要为“backlight”。

②、节点的 compatible 属性值要为“pwm-backlight”,因此可以通过在 Linux 内核中搜索“pwm-backlight”来查找 PWM 背光控制驱动程序,这个驱动程序文件为drivers/video/backlight/pwm_bl.c,感兴趣的可以去看一下这个驱动程序。

③、 pwms 属性用于描述背光所使用的 PWM 的通道以及 PWM 频率,比如本章我们要使用的 pwm1, pwm 频率设置为 40KHz。那么 pwms 属性就可以设置为:

pwms=<&pwm10250000>

一共有 4 个参数,第 1 个“pwm1”表示使用 PWM1;第 2 个“0”就是使用通道 0,也就是 PWM1;第 3 个 25000 是 PWM 的周期,单位是 ns,也就是 25000ns,换算成频率就是

40KHz;最后一个 0 是极性设置,可以设置为 PWM_POLARITY_NORMAL(对应的值为 0)或者 PWM_POLARITY_INVERTED(对应的值为 1),第一个是正常极性,第二个极性翻转。

④、 brightness-levels 属性描述亮度级别,范围为 0~255, 0 表示 PWM 占空比为 0%,也就是亮度最低, 255 表示 100%占空比,也就是亮度最高。至于设置几级亮度,大家可以自行填写此属性。

⑤、 default-brightness-level 属性为默认亮度级别。根据上述

根据上述 5 点设置 backlight 节点,我们分析一下 RK3588 的设备树关于 backlight 节点的配置, 配置内容如下:

&backlight{pwms=<&pwm10250000>;default-brightness-level=<255>;status="disabled";};{backlight1:backlight1{compatible="pwm-backlight";pwms=<&pwm150250000>;brightness-levels=<0202021212222232324242525262627272828292930303131323233333434353536363737383839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255>;default-brightness-level=<255>;status="disabled";};};

汇总下来设置背光使用 pwm5, PWM 频率为 40KHz。

设置 256 级背光(0~255)。

设置默认背光等级为 255(最亮)。

屏幕背光就设置好了。

这是烧写应该就会点亮,不亮很有可能就是没有初始化屏幕.

接下来看dsi0节点

rk3588-atk-devkit.dtsi

&dsi0{status="disabled";//rockchip,lane-rate = <1000>;dsi0_panel:panel@0{status="okay";compatible="simple-panel-dsi";reg=<0>;backlight=<&backlight>;reset-delay-ms=<10>;enable-delay-ms=<10>;prepare-delay-ms=<10>;unprepare-delay-ms=<10>;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=[230002FE21230002040023000200642300022A00....23000200642300022A00];panel-exit-sequence=[0500012805000110];disp_timings0:display-timings{native-mode=<&dsi0_timing0>;dsi0_timing0:timing0{clock-frequency=<132000000>;hactive=<1080>;vactive=<1920>;hfront-porch=<15>;hsync-len=<4>;hback-porch=<30>;vfront-porch=<15>;vsync-len=<2>;vback-porch=<15>;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>;};};};};

部分参数说明:

MIPI 使用的是 DSI0。 这里的 status = “disabled”;表示禁用,但是我们在 rk3588-atk-lcds.dtsi 中设置 dsi1启用,并重写了 dsi0 里的参数。所以我们在这里看到的参数基本都会被重写。设置 MIPI 速率,这里在 RK3588 上已经不启用了,因为会根据屏幕配置的时钟参数自动计算,大家可以看看前面的计算公式。

panel 子节点,初始化 MIPI 屏幕的具体参数就在此节点里面。我们重点看一下 panel 子节点下的各个属性。

设置屏幕背光使用示例代码中的 backlight 节点。

设置 MIPI

屏幕一些模式:

MIPI_DSI_MODE_VIDEO:主控采用 video 模式。MIPI_DSI_MODE_VIDEO_BURST:使用 video 的 Burst 模式。MIPI_DSI_MODE_LPM:支持 LP 模式,也就是在 LP 模式下传输初始化序列。MIPI_DSI_MODE_EOT_PACKET:禁止 HS 模式下的 EoT 包。

屏幕采用 RGB888 格式。

使用 4lanes。

前面说了,在这个 rk3588-evb.dtsi 配置的 panel-init-sequence 和 disp_timings0 都会被重写,因为正点原子有几个分辨率的屏幕,分别是 5.5 英寸 720x1280MIPI 屏, 5.5 英寸1080x1920MIPI 屏幕, 10.1 英寸 800x1280MIPI 屏幕,所以写在一个 dts 里肯定是不实际的。rk3588-evb.dtsi 里的 dsi0 配置就是模板,现在我们要重写这里面的参数,以 720P 的 MIPI 屏幕为例。打开 rk3588-atk-lcds.dtsi,找到以下代码

#ifdefined(ATK_LCD_TYPE_MIPI_TX0_5P5_720X1280)&disp_timings0{native-mode=<&mipi0_5p5_720x1280_timing>;};&dsi0_panel{panel-init-sequence=[390004B9 FF8394390007BA6303686B B2 C0//15 00 02 36 01(倒向显示)//15 00 02 36 02(正向显示)1500023601...];};mipi0_5p5_720x1280_timing:timing1{clock-frequency=<65000000>;hactive=<720>;vactive=<1280>;hfront-porch=<48>;hsync-len=<8>;hback-porch=<52>;vfront-porch=<16>;vsync-len=<6>;vback-porch=<15>;hsync-active=<0>;vsync-active=<0>;de-active=<0>;pixelclk-active=<0>;};

panel-init-sequence描述了要发送给屏幕的初始化序列,非常重要!

内容中第一行39 00 04 B9 FF 83 94按照上一小节的要求填写字节流

可以看出,真正发送给屏幕初始化序列是“B9 FF 83 94”,这个也就是屏幕厂商给到你的初始化序列。其中第一个 0X39 就是图 22.8-1 中的指令, DCS 长写指令,是个长数据包。后续我们会用逻辑分析仪抓取波形,会发现这个包就是长数据包格式。

05 64 01 11

0X05 对应 DCS 短写指令,是个短数据包格式。 0X64 表示这条初始化序列发送以后延时 100ms(0X64)再发送下一条; 0X01 说明负载只有 1 个字节; 0X11 就是最终要发送出去的负载值。

同时我们也来看看重写的 720P 的时序参数,在 rk3588-atk-lcd.dtsi 找到以下代码

mipi0_5p5_720x1280_timing:timing1{clock-frequency=<65000000>;hactive=<720>;vactive=<1280>;hfront-porch=<48>;hsync-len=<8>;hback-porch=<52>;vfront-porch=<16>;vsync-len=<6>;vback-porch=<15>;hsync-active=<0>;vsync-active=<0>;de-active=<0>;pixelclk-active=<0>;};

display-timings0 就是 MIPI 屏幕的 DPI 时序参数,也就是 HFP、 HBP 等等这些时序信息,根据自己所使用的屏幕实际参数填写。

编写完毕后,编译设备树、烧写

在系统中的体现

1.屏幕亮度

ls/sys/class/backlight/-l cat/sys/class/backlight/backlight/brightness 查看当前亮度值255echo200>/sys/class/backlight/backlight/brightness 设置亮度值

2.显示画面

先关闭qt界面

/etc/init.d/S50systemui stop

stoping systemui… done.

fbset-fb/dev/fb0 mode"800x1280-0"#D:0.000MHz,H:0.000kHz,V:0.000Hzgeometry8001280800128032timings0000000accel true rgba8/16,8/8,8/0,0/0endmode

还需要先关闭系统自带的图形界面

ps aux|grep-E"qt|Xorg|weston"# 查找图形进程 root8440.30.951885676012?Sl10:160:12/usr/bin/weston root11360.00.212454422976?Ss10:160:00/usr/libexec/weston-keyboard root11370.00.312721625040?Ss10:160:00/usr/libexec/weston-desktop-shell root25610.00.058521068ttyFIQ0 S+11:160:00grep-E qt|Xorg|weston
# 终止主进程和子进程(PID对应你的查询结果) kill-984411361137

接着我们就可以使用LCD那样的操作app来实现对屏幕的操作啦

查看43章节的简单示例,并在板子上运行,就可以看到效果

想要显示复杂效果,就需要高级的GUI界面啦,如安卓、QT、lvgl

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 20:20:28

LangFlow缓存机制提升重复请求响应速度

LangFlow缓存机制提升重复请求响应速度 在构建基于大语言模型&#xff08;LLM&#xff09;的AI应用时&#xff0c;开发者常常面临一个看似微小却严重影响效率的问题&#xff1a;为什么我刚调试过的流程&#xff0c;再次运行还要等好几秒&#xff1f; 尤其是在使用 LangChain 搭…

作者头像 李华
网站建设 2026/3/31 6:04:43

LangFlow InfluxDB适配器支持时序数据分析

LangFlow InfluxDB适配器支持时序数据分析 在工业传感器每秒产生数万条读数、金融行情数据毫秒级刷新的今天&#xff0c;一个核心问题摆在AI系统面前&#xff1a;如何让大语言模型真正“感知”现实世界的时间脉搏&#xff1f; 传统的LangChain应用往往依赖静态知识库或一次性输…

作者头像 李华
网站建设 2026/3/11 21:25:55

LangFlow电商推荐引擎构建案例分析

LangFlow电商推荐引擎构建案例分析 在电商平台竞争日益激烈的今天&#xff0c;用户打开一个购物应用的几秒钟内&#xff0c;能否看到“懂自己”的商品推荐&#xff0c;往往决定了这次访问是否会转化为实际购买。传统的推荐系统依赖历史行为数据和协同过滤算法&#xff0c;虽然能…

作者头像 李华
网站建设 2026/4/1 6:53:11

高可靠性ARM工业控制主板设计:全面讲解

高可靠性ARM工业控制主板设计&#xff1a;从理论到实战的系统性解析工业现场的“心跳”——为什么我们需要更可靠的工控核心&#xff1f;在一座现代化智能工厂里&#xff0c;一条自动化产线每分钟产出数十件产品。突然&#xff0c;主控系统卡顿半秒&#xff0c;机械臂动作错位&…

作者头像 李华
网站建设 2026/4/1 13:20:21

微信小程序+vue小程序管理后台

请问&#xff1a;使用微信云开发&#xff0c;小程序项目可以直接在微信开发者工具上传部署&#xff0c;那么vue管理后台应该如何上线&#xff1f;

作者头像 李华
网站建设 2026/3/30 22:11:03

LangFlow安全机制说明:保障企业数据隐私与合规

LangFlow安全机制深度解析&#xff1a;构建可信的AI工作流平台 在金融、医疗和政务等高敏感行业&#xff0c;每一次与大语言模型&#xff08;LLM&#xff09;的交互都可能涉及客户隐私或内部机密。当企业试图利用LangChain快速搭建智能客服、知识问答系统时&#xff0c;一个现实…

作者头像 李华