TA的每日心情 | 奋斗 2025-6-6 13:54 |
|---|
签到天数: 49 天 连续签到: 1 天 [LV.5]常住居民I
进士
- 积分
- 1093
|
本帖最后由 eefocus_3828686 于 2022-11-19 14:40 编辑
1、概述飞凌嵌入式RK3568J开发板的屏幕接口支持HDMI、LVDS、MIPI、EDP、RGB,涵盖种类够多。关于各个屏幕之间的切换,可以在uboot启动过程中进入用户配置模式进行切换,也可以在kernel的设备树源码中进行切换。关于在uboot启动过程中切换显示屏幕,在飞凌官方视频中
https://www.bilibili.com/video/B ... 2c8009c69c091533e16
有详细的介绍,本文使用mipi接口将在设备树文件中进行配置,过程在下文会进行提及。使用飞凌嵌入式RK3568J开发板的调试mipi接口屏幕,分为硬件和软件两个部分。
2、硬件部分
2.1首先来看飞凌嵌入式RK3568J开发板底板留出的mipi dsi接口端子位号是P6
实际位置在开发板底部如下图红框处
从硬件图中看出 飞凌嵌入式RK3568J开发板底板留出的mipi dsi接口 资源如下:
4 lane数据mipi加mipi时钟,连接的是RK3568的dsi1
4个IO,分别是MIPI_PWM、MIPI_EN、MIPI_ACC_INT、MIPI_TP_INT
一路I2C接口
一路5V电源
2.2、再来看看用户实际手上的MIPI LCD情况
屏幕接口如下,发现和飞凌嵌入式RK3568J开发板底板接口线序和电平和端子引脚完全对不上 (-_-) 。。。
看来只能自制转接板。
2.3 所需材料
5V转3V3电源芯片,这里选择常用的1117就行
5V转1V8芯片,这里选择SGM2034,电路如下
转接线和转接端子,因为我的屏幕只有24pin,所以我只用24pin的排线和端子
背光升压芯片,5V转10V+,使用SGM3752,电路如下
转接板,使用了一块万能的端子转接板,线路全靠飞 (-_-),如下图
最终通过手工飞线焊接,焊接和调试过程略过,能正常输出3V3和1V8,点亮背光电压约16V,飞凌嵌入式RK3568J开发板底板接口和屏幕端子接口各个信号对接成功。转接板效果如下,这里I2C接口没有使用到因为我的屏幕不带触摸板
3、软件部分
3.1 首先看飞凌嵌入式RK3568J开发板底板所用到设备树文件 kernel\arch\arm64\boot\dts\rockchip\OK3568-C-common.dtsi
修改节点 forlinx_control 使用mipi,其他配置为off,这个节点在uboot里会对显示接口作判断
接着找到dsi1节点
下面介绍节点关于panel重要参数的含义
status = "okay";使能节点
compatible = "simple-panel-dsi";和驱动文件匹配,使用全局搜索可以找到匹配驱动文件为kernel\drivers\gpu\drm\panel\panel-simple.c
reset-delay-ms = <60>;
enable-delay-ms = <60>;
prepare-delay-ms = <60>;
unprepare-delay-ms = <60>;
disable-delay-ms = <60>;这些都是一些上下电延时配置
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;mipi参数
panel-init-sequence = [...]; 屏幕上电初始化参数
panel-exit-sequence = [...]; 屏幕下电初始化参数
display-timings 屏幕时序参数
3.2. 这里重点介绍panel-init-sequence和display-timings
首先是panel-init-sequence,里边填写的就是屏幕厂商给出的初始化列表,以下是我的屏初始化参数,是长这样的:
- Generic_Long_Write_3P(0xFF,0x98,0x81,0x03);
- Generic_Short_Write_1P(0x01,0x00);
- Generic_Short_Write_1P(0x02,0x00);
- Generic_Short_Write_1P(0x03,0x73);
- Generic_Short_Write_1P(0x04,0x00);
- Generic_Short_Write_1P(0x05,0x00);
- Generic_Short_Write_1P(0x06,0x0A);
- Generic_Short_Write_1P(0x07,0x00);
- Generic_Short_Write_1P(0x08,0x00);
- Generic_Short_Write_1P(0x09,0x01);
- Generic_Short_Write_1P(0x0A,0x00);
- Generic_Short_Write_1P(0x0B,0x00);
- Generic_Short_Write_1P(0x0C,0x01);
- Generic_Short_Write_1P(0x0D,0x00);
- Generic_Short_Write_1P(0x0E,0x00);
- Generic_Short_Write_1P(0x0F,0x1D);
- Generic_Short_Write_1P(0x10,0x1D);
- Generic_Short_Write_1P(0x11,0x00);
- Generic_Short_Write_1P(0x12,0x00);
- Generic_Short_Write_1P(0x13,0x00);
- Generic_Short_Write_1P(0x14,0x00);
- Generic_Short_Write_1P(0x15,0x00);
- Generic_Short_Write_1P(0x16,0x00);
- Generic_Short_Write_1P(0x17,0x00);
- Generic_Short_Write_1P(0x18,0x00);
- Generic_Short_Write_1P(0x19,0x00);
- Generic_Short_Write_1P(0x1A,0x00);
- Generic_Short_Write_1P(0x1B,0x00);
- Generic_Short_Write_1P(0x1C,0x00);
- Generic_Short_Write_1P(0x1D,0x00);
- Generic_Short_Write_1P(0x1E,0x40);
- Generic_Short_Write_1P(0x1F,0x80);
- Generic_Short_Write_1P(0x20,0x06);
- Generic_Short_Write_1P(0x21,0x02);
- Generic_Short_Write_1P(0x22,0x00);
- Generic_Short_Write_1P(0x23,0x00);
- Generic_Short_Write_1P(0x24,0x00);
- Generic_Short_Write_1P(0x25,0x00);
- Generic_Short_Write_1P(0x26,0x00);
- Generic_Short_Write_1P(0x27,0x00);
- Generic_Short_Write_1P(0x28,0x33);
- Generic_Short_Write_1P(0x29,0x03);
- Generic_Short_Write_1P(0x2A,0x00);
- Generic_Short_Write_1P(0x2B,0x00);
- Generic_Short_Write_1P(0x2C,0x00);
- Generic_Short_Write_1P(0x2D,0x00);
- Generic_Short_Write_1P(0x2E,0x00);
- Generic_Short_Write_1P(0x2F,0x00);
- Generic_Short_Write_1P(0x30,0x00);
- Generic_Short_Write_1P(0x31,0x00);
- Generic_Short_Write_1P(0x32,0x00);
- Generic_Short_Write_1P(0x33,0x00);
- Generic_Short_Write_1P(0x34,0x04);
- Generic_Short_Write_1P(0x35,0x00);
- Generic_Short_Write_1P(0x36,0x00);
- Generic_Short_Write_1P(0x37,0x00);
- Generic_Short_Write_1P(0x38,0x3c);
- Generic_Short_Write_1P(0x39,0x35);
- Generic_Short_Write_1P(0x3A,0x01);
- Generic_Short_Write_1P(0x3B,0x40);
- Generic_Short_Write_1P(0x3C,0x00);
- Generic_Short_Write_1P(0x3D,0x01);
- Generic_Short_Write_1P(0x3E,0x00);
- Generic_Short_Write_1P(0x3F,0x00);
- Generic_Short_Write_1P(0x40,0x00);
- Generic_Short_Write_1P(0x41,0x88);
- Generic_Short_Write_1P(0x42,0x00);
- Generic_Short_Write_1P(0x43,0x00);
- Generic_Short_Write_1P(0x44,0x1f);
- Generic_Short_Write_1P(0x50,0x01);
- Generic_Short_Write_1P(0x51,0x23);
- Generic_Short_Write_1P(0x52,0x45);
- Generic_Short_Write_1P(0x53,0x67);
- Generic_Short_Write_1P(0x54,0x89);
- Generic_Short_Write_1P(0x55,0xAB);
- Generic_Short_Write_1P(0x56,0x01);
- Generic_Short_Write_1P(0x57,0x23);
- Generic_Short_Write_1P(0x58,0x45);
- Generic_Short_Write_1P(0x59,0x67);
- Generic_Short_Write_1P(0x5A,0x89);
- Generic_Short_Write_1P(0x5B,0xAB);
- Generic_Short_Write_1P(0x5C,0xCD);
- Generic_Short_Write_1P(0x5D,0xEF);
- Generic_Short_Write_1P(0x5E,0x11);
- Generic_Short_Write_1P(0x5F,0x01);
- Generic_Short_Write_1P(0x60,0x00);
- Generic_Short_Write_1P(0x61,0x15);
- Generic_Short_Write_1P(0x62,0x14);
- Generic_Short_Write_1P(0x63,0x0E);
- Generic_Short_Write_1P(0x64,0x0F);
- Generic_Short_Write_1P(0x65,0x0C);
- Generic_Short_Write_1P(0x66,0x0D);
- Generic_Short_Write_1P(0x67,0x06);
- Generic_Short_Write_1P(0x68,0x02);
- Generic_Short_Write_1P(0x69,0x07);
- Generic_Short_Write_1P(0x6A,0x02);
- Generic_Short_Write_1P(0x6B,0x02);
- Generic_Short_Write_1P(0x6C,0x02);
- Generic_Short_Write_1P(0x6D,0x02);
- Generic_Short_Write_1P(0x6E,0x02);
- Generic_Short_Write_1P(0x6F,0x02);
- Generic_Short_Write_1P(0x70,0x02);
- Generic_Short_Write_1P(0x71,0x02);
- Generic_Short_Write_1P(0x72,0x02);
- Generic_Short_Write_1P(0x73,0x02);
- Generic_Short_Write_1P(0x74,0x02);
- Generic_Short_Write_1P(0x75,0x01);
- Generic_Short_Write_1P(0x76,0x00);
- Generic_Short_Write_1P(0x77,0x14);
- Generic_Short_Write_1P(0x78,0x15);
- Generic_Short_Write_1P(0x79,0x0E);
- Generic_Short_Write_1P(0x7A,0x0F);
- Generic_Short_Write_1P(0x7B,0x0C);
- Generic_Short_Write_1P(0x7C,0x0D);
- Generic_Short_Write_1P(0x7D,0x06);
- Generic_Short_Write_1P(0x7E,0x02);
- Generic_Short_Write_1P(0x7F,0x07);
- Generic_Short_Write_1P(0x80,0x02);
- Generic_Short_Write_1P(0x81,0x02);
- Generic_Short_Write_1P(0x82,0x02);
- Generic_Short_Write_1P(0x83,0x02);
- Generic_Short_Write_1P(0x84,0x02);
- Generic_Short_Write_1P(0x85,0x02);
- Generic_Short_Write_1P(0x86,0x02);
- Generic_Short_Write_1P(0x87,0x02);
- Generic_Short_Write_1P(0x88,0x02);
- Generic_Short_Write_1P(0x89,0x02);
- Generic_Short_Write_1P(0x8A,0x02);
- Generic_Long_Write_3P(0xFF,0x98,0x81,0x04);
- Generic_Short_Write_1P(0x70,0x00);
- Generic_Short_Write_1P(0x71,0x00);
- Generic_Short_Write_1P(0x82,0x0F);
- Generic_Short_Write_1P(0x84,0x0F);
- Generic_Short_Write_1P(0x85,0x0D);
- Generic_Short_Write_1P(0x32,0xAC);
- Generic_Short_Write_1P(0x8C,0x80);
- Generic_Short_Write_1P(0x3C,0xF5);
- Generic_Short_Write_1P(0xB5,0x07);
- Generic_Short_Write_1P(0x31,0x45);
- Generic_Short_Write_1P(0x3A,0x24);
- Generic_Short_Write_1P(0x88,0x33);
- Generic_Long_Write_3P(0xFF,0x98,0x81,0x01);
- Generic_Short_Write_1P(0x22,0x09);
- Generic_Short_Write_1P(0x31,0x00);
- Generic_Short_Write_1P(0x53,0x93);
- Generic_Short_Write_1P(0x55,0xA2);
- Generic_Short_Write_1P(0x50,0x81);
- Generic_Short_Write_1P(0x51,0x85);
- Generic_Short_Write_1P(0x62,0x0D);
- Generic_Long_Write_3P(0xFF,0x98,0x81,0x01);
- Generic_Short_Write_1P(0xA0,0x00);
- Generic_Short_Write_1P(0xA1,0x1A);
- Generic_Short_Write_1P(0xA2,0x28);
- Generic_Short_Write_1P(0xA3,0x13);
- Generic_Short_Write_1P(0xA4,0x16);
- Generic_Short_Write_1P(0xA5,0x29);
- Generic_Short_Write_1P(0xA6,0x1D);
- Generic_Short_Write_1P(0xA7,0x1E);
- Generic_Short_Write_1P(0xA8,0x84);
- Generic_Short_Write_1P(0xA9,0x1C);
- Generic_Short_Write_1P(0xAA,0x28);
- Generic_Short_Write_1P(0xAB,0x75);
- Generic_Short_Write_1P(0xAC,0x1A);
- Generic_Short_Write_1P(0xAD,0x19);
- Generic_Short_Write_1P(0xAE,0x4D);
- Generic_Short_Write_1P(0xAF,0x22);
- Generic_Short_Write_1P(0xB0,0x28);
- Generic_Short_Write_1P(0xB1,0x54);
- Generic_Short_Write_1P(0xB2,0x66);
- Generic_Short_Write_1P(0xB3,0x39);
- Generic_Short_Write_1P(0xC0,0x00);
- Generic_Short_Write_1P(0xC1,0x1A);
- Generic_Short_Write_1P(0xC2,0x28);
- Generic_Short_Write_1P(0xC3,0x13);
- Generic_Short_Write_1P(0xC4,0x16);
- Generic_Short_Write_1P(0xC5,0x29);
- Generic_Short_Write_1P(0xC6,0x1D);
- Generic_Short_Write_1P(0xC7,0x1E);
- Generic_Short_Write_1P(0xC8,0x84);
- Generic_Short_Write_1P(0xC9,0x1C);
- Generic_Short_Write_1P(0xCA,0x28);
- Generic_Short_Write_1P(0xCB,0x75);
- Generic_Short_Write_1P(0xCC,0x1A);
- Generic_Short_Write_1P(0xCD,0x19);
- Generic_Short_Write_1P(0xCE,0x4D);
- Generic_Short_Write_1P(0xCF,0x22);
- Generic_Short_Write_1P(0xD0,0x28);
- Generic_Short_Write_1P(0xD1,0x54);
- Generic_Short_Write_1P(0xD2,0x66);
- Generic_Short_Write_1P(0xD3,0x39);
- Generic_Long_Write_3P(0xFF,0x98,0x81,0x00);
- Generic_Short_Write_1P(0x35,0x00);
- Generic_Short_Write_1P(0x36,0x03);
- Generic_Short_Write_1P(0x11,0x00);
- Delay (120);
- Generic_Short_Write_1P(0x29,0x00);
- Delay (20);
复制代码
转换为panel-init-sequence[]格式是这样
我们可以通过kernel源码对参数panel-init-sequence的解析来得到转换规则
看kernel\drivers\gpu\drm\panel\panel-simple.c文件里的几个结构体
其中panel_cmd_desc就是和panel-init-sequence对应的
如39 00 04 FF 98 81 03分别对应data_type(39) delay(00) payload_length(04) payload(FF 98 81 03)
如15 00 02 01 00分别对应data_type(15) delay(00) payload_length(02) payload(10 00)
data_type的取值和含义在kernel\include\video\mipi_display.h文件下
在kernel\drivers\gpu\drm\panel\panel-simple.c文件中可知延时参数是在写完本次命令后再近些延时操作
再看看display-timings,其实就是LCD屏的扫描时序参数
屏幕厂商给出的参数是这样
直接按对应的参数填入设备树即可
3.3 驱动框架简单说明
RK3568的显示使用的是drm框架,我们添加屏幕重点关注kernel\drivers\gpu\drm\panel\目录即可,该目录下飞凌嵌入式RK3568J开发板使用的驱动文件是panel-simple.c,设备树中的dsi1节点会和该文件匹配,panel-simple.c文件中依次执行 panel_simple_init() --> mipi_dsi_driver_register() --> panel_simple_dsi_probe() --> panel_simple_probe() --> drm_panel_init() --> drm_panel_add() --> mipi_dsi_attach() 等函数来完成mipi屏幕驱动工作。
4、效果展示
由于使用的屏幕没有触摸功能,使用USB鼠标进行操作即可
|
|