RK3399驱动240*320的小尺寸mipi屏幕

一、概述

本文描述了RK3399驱动240*320小尺寸mipi屏幕遇到的问题及解决方法,同时给出了屏幕显示及触摸旋转的方法。

二、准备

2.1 硬件

因有需要用RK3399驱动一块小尺寸240320屏幕的需求,这里准备了一张RK3399板卡及型号为KD028QVFIA038-MIPI的240320像素mipi屏幕,触摸型号是FT5436。

2.2 开发环境

这里我用的虚拟机搭建ubuntu18.04开发环境,然后安装好交叉编译工具链并且将sdk包拷贝到ubuntu。

三、调试

3.1 触摸FT5436调试

3.1.1 驱动修改

修改内核源码drivers/input/touchscreen下Makefile文件,在最后新增:

obj-$(CONFIG_TOUCHSCREEN_FTS)        += focaltech_touch/

然后修改当前目录下Kconfig文件,在最后新增:

source "drivers/input/touchscreen/focaltech_touch/Kconfig"

触摸驱动一般都可以找液晶屏幕供应商提供,将触摸驱动代码解压到drivers/input/touchscreen目录下:
在这里插入图片描述
这里有触摸屏驱动源码链接

3.1.2 menuconfig配置

在内核目录下输入make ARCH=arm64 menuconfig命令打开配置图形界面,调整配置:

Device Drivers  --->
	Input device support  --->
		[*]   Touchscreens  --->
			[*]   Focaltech Touchscreen
			(focaltech_touch) Focaltech ts directory name
3.1.3 设备树修改

修改内核目录arch/arm64/boot/dts/rockchip下对应RK3399板卡型号的设备树文件,我这里是rk3399-linux.dts,触摸对应引脚使用的是iic3接口,硬件连接方式如下:
在这里插入图片描述
在设备树新增以下部分

&i2c3 {
   
   
	status = "okay";
    focaltech: focaltech@38 {
   
   
        compatible = "focaltech,fts";
        reg = <0x38>;
        focaltech,reset-gpio = <&gpio4 29 GPIO_ACTIVE_LOW>;
        focaltech,irq-gpio = <&gpio4 26 IRQ_TYPE_LEVEL_LOW>;
        focaltech,max-touch-number = <5>;
        focaltech,display-coords =  <0 0 240 320>;
        tp-supply = <&vcc3v0_tp>;
    };
};

其中reg = <0x38>里面的0x38对应的是触摸屏iic地址,根据实际触摸屏型号修改,reset-gpioirq-gpio分别对应的是液晶复位脚和触摸中断引脚,需要根据实际连接的IO来配置,max-touch-number对应最大支持同时触摸的点数,display-coords对应屏幕尺寸,需要根据实际尺寸修改。

3.1.4 触摸屏测试

内核部分修改后直接编译,编译完成后更新板卡固件进行测试。首先上电后可以通过demsg查看触摸部分日志上有没有相关报错,如果没有可以查看/dev/input下有没有生成相应eventX,如果生成了可以直接cat eventX然后点击屏幕看看串口有没有反应,因为触摸使用的是电容屏,所以一般不需要校准,尺寸配置没问题就能正常使用,另外也可以用linux下的event test工具测试,网上有相关教程,这里我的板卡上配置完成之后直接就能正常使用。

3.2 MIPI屏幕调试

3.2.1 硬件连接

这里硬件连接如下:
在这里插入图片描述

本身屏幕分辨率比较低,所以硬件上只连接了1个lanes,背光连接pwm引脚来驱动。

3.2.2 设备树修改

同触摸部分,修改内核目录arch/arm64/boot/dts/rockchip下对应RK3399板卡型号的设备树文件rk3399-linux.dts,这里面会涉及到时序及命令配置,对屏幕显示非常重要,如果参数有问题可能会存在不显示、有条纹、花屏、显示区域不对等各种问题。
时序部分可以参考屏幕手册:
在这里插入图片描述
在这里插入图片描述
这里的参数对应设备树的以下配置:

		display-timings {
   
   
			native-mode = <&timing0>;
			timing0: timing0 {
   
   
				clock-frequency = <6200000>; //60000000
				hactive = <240>;
				vactive = <320>;

				hsync-len = <4>;              //20
				hback-porch = <20>;           //150
				hfront-porch = <40>;          //150

				vsync-len = <2>;
				vback-porch = <6>;           //24
				vfront-porch = <8>;          //8
				
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <1>;
				pixelclk-active = <0>;
			};
		};

配置上除了可以参考屏幕手册,也可以让屏幕供应商提供配置文件,这里我没有参考手册是根据提供的配置文件来设置的,差异也不会很大,这里面clock-frequency代表的是像素时钟频率(单位:Hz),这里是6.2 MHz。它决定了每秒传输的像素数,计算公式为:
pixel clock=总行时间×总帧时间×刷新率
其中:
总行时间 = 水平有效像素(hactive) + 水平前沿(hfront-porch) + 水平同步脉宽(hsync-len) + 水平后沿(hback-porch)
总帧时间 = 垂直有效行数(vactive) + 垂直前沿(vfront-porch) + 垂直同步脉宽(vsync-len) + 垂直后沿(vback-porch)
比如这里:

hactive = <240>;        // 水平有效像素
hfront-porch = <40>;    // 水平前沿
hsync-len = <4>;        // 水平同步脉宽
hback-porch = <20>;     // 水平后沿

vactive = <320>;        // 垂直有效行数
vfront-porch = <8>;     // 垂直前沿
vsync-len = <2>;        // 垂直同步脉宽
vback-porch = <6>;      // 垂直后沿

总行时间=240(hactive)+40(hfront-porch)+4(hsync-len)+20(hback-porch)=304 像素
总帧时间=320(vactive)+8(vfront-porch)+2(vsync-len)+6(vback-porch)=336 行
目标刷新率为 60 Hz:
pixel clock=304×336×60=6,128,640 Hz≈6.13 MHz
这里clock-frequency配置直接取的6.2MHz,频率可以根据实际显示结果微调。
接下来就是命令部分配置,命令配置如果根据手册里面来配置会非常耗时,一般不建议这么做,可以直接找屏幕供应商提供,以下是设备树具体配置:

		panel-exit-sequence = [
			05 0A 01 28
			05 00 01 10
		];

        panel-init-sequence = [
            39 00 04 DF 98 51 E9 
            15 00 02 DE 00
			39 00 05 B7 38 97 38 11
			39 00 21 C8 3F 38 33 2F 32 34 2F 2F 2D 2C 27 1A 14 0A 06 0E 3F 38 33 2F 32 34 2F 2F 2D 2C 27 1A 14 0A 06 0E
			39 00 04 B9 33 08 CC
			39 00 09 BB 44 7A 30 40 7C 60 70 70
			39 00 03 BC 38 3C
			39 00 03 C0 31 20
			15 00 02 C1 12
			39 00 0A C3 08 00 0A 10 08 54 45 71 2C
			39 00 12 C4 00 A0 79 0E 0A 16 79 0E 0A 16 79 0E 0A 16 82 00 03
			39 00 07 D0 04 0C 6B 0F 07 03
			39 00 03 D7 13 00

			15 01 02 DE 02
			39 00 04 B7 63 00 0C
			39 00 06 B8 1D A0 2F 04 33
			39 00 05 C1 10 66 66 01
			15 00 02 DE 00
            05 78 01 11

			15 01 02 DE 02
			39 01 04 C5 4E 00 00
			39 01 04 CA 30 20 F4

			15 01 02 DE 04
			15 01 02 D3 3C

			15 01 02 DE 00
            05 00 01 29
        ];

其中panel-init-sequence代表初始化序列,在显示屏上电初始化时执行,用于配置显示屏的寄存器,使其进入正常工作模式,panel-exit-sequence代表退出序列,在显示屏关闭或进入睡眠模式时执行,用于安全关闭显示屏,防止损坏或残留图像。
设备树里面还包括显示基本参数配置:

		dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST)>;
		dsi,format = <MIPI_DSI_FMT_RGB888>;
		dsi,lanes = <1>;

其中:
dsi,flags表示DSI 模式标志,用于指定DSI接口的工作模式,这里配置为MIPI_DSI_MODE_VIDEO(视频模式)和MIPI_DSI_MODE_VIDEO_BURST(突发传输);
dsi,format代表像素格式,用于定义像素数据的颜色格式,MIPI_DSI_FMT_RGB888表示每个像素用24位(3字节)表示,R/G/B 各占8位(标准真彩色);
dsi,lanes表示数据通道数量,用于指定DSI接口使用的数据通道(Data Lane)数量,实际根据屏幕分辨率及硬件连接来配置,这里硬件上只连了1个lanes,所以配置为1。
以下为完整设备树部分配置:

&dsi {
   
   
	status = "okay";
	rockchip,lane-rate = <500>;  
	panel@0 {
   
   
		compatible ="simple-panel-dsi";
		reg = <0>;
		backlight = <&backlight>;
		enable-gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;
		reset-gpios = 
<think>我们正在讨论RK3568平台上的MIPI屏幕驱动适配问题。用户需要点亮一块4英寸、分辨率为720x720的MIPI屏幕。根据引用[1]和[2]的内容,我们可以总结出以下步骤: 1. **硬件连接确认**:确保MIPI屏幕RK3568开发板的MIPI接口正确连接。注意检查电源、背光、复位等信号线。 2. **获取屏幕规格书**:需要从屏幕厂商获取该屏幕的规格书(Datasheet),其中包含关键的时序参数、初始化序列等。 3. **配置设备树(DTS)**:在Linux内核中,需要修改设备树文件来配置MIPI DSI控制器和屏幕参数。主要配置包括: - 屏幕分辨率:720x720 - 时序参数:根据规格书配置hfp, hbp, hsync, vfp, vbp, vsync等(引用[2]中提到屏幕刷新原理) - MIPI传输参数:如lane数量(通常为1、2或4 lane)、数据传输速率等 - 屏幕初始化序列:通过DCS命令初始化屏幕(可能需要通过dts中的`panel-init-sequence`属性配置) 4. **编写或修改驱动程序**:如果屏幕驱动在内核中不存在,可能需要编写新的驱动RK平台通常使用DRM框架,可以参照已有驱动(如rk3568_mipi_dsi.c)进行适配。 5. **调试**:通过示波器测量MIPI信号,检查时序是否正确。同时,使用内核调试工具(如dmesg)查看驱动加载日志,排查问题。 6. **优化性能**:如引用[1]所述,优化时序参数配置以提高刷新率,降低延迟。 **注意事项**: - 4英寸720x720的屏幕属于小尺寸方形屏幕,需要特别注意像素时钟和刷新率的设置,以确保显示稳定。 - 需要确认屏幕MIPI接口是DPI(并行)还是DSI(串行),RK3568支持MIPI DSI接口。 下面提供一个设备树配置的示例片段(仅供参考,实际参数需根据屏幕手册填写): ```dts &dsi0 { status = "okay"; panel@0 { compatible = "your-panel-compatible"; // 替换为实际的兼容字符串,或使用通用面板驱动 reg = <0>; backlight = <&backlight>; // 如果有背光控制 reset-gpios = <&gpio0 RK_PC5 GPIO_ACTIVE_LOW>; // 复位引脚配置 // 屏幕尺寸和分辨率 width-mm = <70>; // 屏幕物理宽度(毫米) height-mm = <70>; // 屏幕物理高度(毫米) // 分辨率 panel-width = <720>; panel-height = <720>; // 时序参数(需要根据屏幕手册调整) prepare-delay-ms = <20>; // 上电后复位前的延时 reset-delay-ms = <20>; // 复位脉冲宽度 init-delay-ms = <100>; // 复位后到初始化序列开始的延时 // 水平同步参数(单位:像素) hfront-porch = <10>; hback-porch = <10>; hsync-len = <8>; hsync-active = <0>; // 同步极性 // 垂直同步参数(单位:行) vfront-porch = <15>; vback-porch = <15>; vsync-len = <4>; vsync-active = <0>; // 同步极性 // 像素时钟(单位:Hz) clock-frequency = <50000000>; // 50MHz,需要根据实际计算 // MIPI DSI参数 dsi-channel = <0>; lanes = <4>; // 使用4条数据通道 // 屏幕初始化序列(使用DCS命令) panel-init-sequence = [ 39 00 04 B9 F1 12 83 // ... 更多初始化命令 ]; // 显示模式 display-timings { native-mode = <&panel_timing>; panel_timing: timing0 { clock-frequency = <50000000>; hactive = <720>; vactive = <720>; hfront-porch = <10>; hback-porch = <10>; hsync-len = <8>; vfront-porch = <15>; vback-porch = <15>; vsync-len = <4>; hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <0>; }; }; }; }; ``` **调试技巧**: - 如果屏幕无法点亮,首先检查复位信号和电源是否正常。 - 使用`vop`打印(`echo 8 > /sys/module/drm/parameters/debug`)可以查看DRM的调试信息。 - 使用示波器检查MIPI时钟和数据线是否有信号。 引用[1]中提到,未来会加强兼容性开发,因此如果遇到问题,可以关注RK3568驱动的最新更新。此外,引用[2]解释了屏幕刷新原理,确保刷新率设置合理(通常不低于60Hz)。 §§相关问题§§ 1. 如何获取MIPI屏幕的规格书和初始化序列? 2. 在RK3568平台上调试MIPI屏幕时常见问题有哪些? 3. 如何测量MIPI屏幕的刷新率和延迟? </think>根据引用内容,RK3568平台上点亮4寸720×720分辨率MIPI屏幕的方法可分为以下步骤: ### 一、硬件准备 1. **屏幕规格确认** 确保屏幕支持MIPI DSI接口,物理尺寸为4英寸,分辨率为720×720(方形) 2. **接口匹配** 检查RK3568开发板的MIPI DSI接口与屏幕物理接口是否匹配(通常采用30/40pin FPC连接器) ### 二、驱动适配关键步骤 1. **设备树配置** 修改Linux内核设备树文件(.dts): ```dts &dsi0 { status = "okay"; panel@0 { compatible = "your-panel-compatible"; reg = <0>; width-mm = <70>; // 4英寸屏幕物理宽度 height-mm = <70>; // 4英寸屏幕物理高度 // 时序配置(需参考屏幕手册) display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <36000000>; // 像素时钟(计算值) hactive = <720>; // 水平分辨率 vactive = <720>; // 垂直分辨率 hfront-porch = <30>; // 水平前沿 hback-porch = <30>; // 水平后沿 hsync-len = <10>; // 水平同步 vfront-porch = <15>; // 垂直前沿 vback-porch = <15>; // 垂直后沿 vsync-len = <4>; // 垂直同步 }; }; // MIPI参数 dsi-lanes = <2>; // 数据通道数(1/2/4) lane-rate = <500>; // 传输速率(Mbps) }; }; ``` 2. **初始化序列配置**驱动代码中添加屏幕初始化序列(参考屏幕厂商提供的Datasheet): ```c static const u16 panel_init_sequence[] = { 0xFD, 0x01, // 上电延时 0xB0, 0x00, // 配置命令1 0xB1, 0x18, // 配置命令2 ... // 完整初始化序列 0xFF, 0xFF // 结束标志 }; ``` 3. **背光控制** 配置PWM背光驱动(需连接背光控制线): ```dts backlight: backlight { compatible = "pwm-backlight"; pwms = <&pwm1 0 25000 0>; // PWM控制器配置 brightness-levels = <0 255>; default-brightness-level = <128>; }; ``` ### 三、调试流程 1. **信号测量** 使用示波器检查MIPI时钟线(CLK+/-)和数据线(DATA+/-)信号质量,确保符合MIPI DSI规范[^2] 2. **时序验证** 通过`v4l2-ctl --device /dev/video0 --all`命令验证时序参数是否正确应用 3. **刷新率优化** 计算实际刷新率: $$ \text{刷新率} = \frac{\text{像素时钟}}{\text{(水平像素 + 消隐) × (垂直行 + 消隐)}} $$ 目标值应≥60Hz避免闪烁[^2] ### 四、常见问题解决 - **无显示**:检查复位信号时序,确认`reset-gpios`配置正确 - **/撕裂**:调整DSI PHY时序参数(如`dsi-hs-clk`) - **颜色异常**:检查像素格式配置(RGB888/RGB565) - ****:优化vfront-porch/vback-porch值减少刷新延迟 > **注意事项**: > 1. 方形需特殊处理方向参数,在驱动中设置`rotation = <90>`旋转显示方向 > 2. 小尺寸建议启用省电模式,配置`dsi-lp-mode`参数 > 3. 参考RK官方驱动文档`Documentation/devicetree/bindings/display/rockchip/dw-mipi-dsi.yaml` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深入黑暗

创作不易,希望大家支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值