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 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深入黑暗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值