一、概述
本文描述了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-gpio和irq-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 =

最低0.47元/天 解锁文章
2400

被折叠的 条评论
为什么被折叠?



