Linux MIPI DSI驱动调试笔记-设备树DCS格式序列之配置LCD初始化代码
Posted Engineer-Bruce_Yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux MIPI DSI驱动调试笔记-设备树DCS格式序列之配置LCD初始化代码相关的知识,希望对你有一定的参考价值。
点击上方「嵌入式云IOT技术圈」,选择「置顶公众号」第一时间查看嵌入式笔记!
上一篇文章,我们简单的列举了MIPI-DSI
驱动的一些常用参数的基本解读,但是那仅仅是走马观花走了一遍,真正深入往里钻的话还是很难的,文章如下:
Linux MIPI DSI LCD设备驱动开发调试细节学习笔记(一)
1、MIPI LCD初始化序列描述
在上一篇文章中,我们看到荣品的屏设备树中有这么一段代码,但是里面的数据是什么含义呢?
panel-init-sequence = [
05 78 01 11
05 78 01 29
];
今天来详细记录下我学习在设备树中适配MIPI-DSI LCD
初始化代码的详细过程。Linux提供了配置初始化代码的接口,相应的设备树也就支持了,这部分在内核的文档里有写:
kernel/Documentation/devicetree/bindings/display/panel/simple-panel.txt
这个文档里简单描述了一下:
- panel-init-sequence:
- panel-exit-sequence:
A byte stream formed by simple multiple dcs packets.
byte 0: dcs data type
byte 1: wait number of specified ms after dcs command transmitted
byte 2: packet payload length
byte 3 and beyond: number byte of payload
翻译过来大概的意思是:
初始化序列
退出序列
由简单的多个dcs数据包形成的字节流
第0个字节:dcs数据类型
第1个字节:发送dcs命令后等待指定的毫秒数
第2个字节:数据包有效载荷长度
第3个字节及以后:有效载荷的字节数
一般情况下LCD屏会有初始化和反初始化的过程,但是在实际应用中,一般还很少会用到反初始化,所以LCD面板厂家一般都是只提供初始化代码,在MIPI DSI驱动中,我们需要将这些厂家提供的初始化代码转换为相应的DCS序列,关于初始化序列和退出序列的描述,由于我用的平台是瑞芯微,瑞芯微提供的技术文档也有相应的描述:具体参数配置方法,查看原厂瑞芯微给的文档的案例描述:
关于 DCS
类型是怎么来理解的,瑞芯微文档中也可以看到对它的描述:
个人的理解方法:
如果只有一个数据,对应的命令类型是0x05
;如果有两个数据,对应的命令类型是0x15
;如果多于两个数据,对应的命令类型是0x39
。
2、具体的配置方法(举例)
最近由于需要调试MIPI接口的LCD显示屏,然而我已经很久没调过驱动了;厂家给了我下面这一段初始化代码,我一看一脸懵逼,对于好多年没搞驱动的我不免觉得有点心虚,怕是月底验收任务的时候要被扣KPI了,厂商的初始化代码如下:
SET_GENERIC(0x02);
W_D(0x80);W_D(0xAB);
SET_GENERIC(0x02);
W_D(0x81);W_D(0x4B);
SET_GENERIC(0x02);
W_D(0x82);W_D(0x84);
SET_GENERIC(0x02);
W_D(0x83);W_D(0x88);
SET_GENERIC(0x02);
W_D(0x84);W_D(0xA8);
SET_GENERIC(0x02);
W_D(0x85);W_D(0xE3);
SET_GENERIC(0x02);
W_D(0x86);W_D(0xB8);
SET_GENERIC(0x02);
W_D(0x87);W_D(0x5A);
SET_GENERIC(0x02);
W_D(0xB1);W_D(0x38);
SET_GENERIC(0x01);
W_D(0x11);
delay_ms(120);
SET_GENERIC(0x01);
W_D(0x29);
那么这个初始化代码是什么含义呢?厂家一般不会告诉我,也不会给我提供寄存器手册,因为那是他们的知识产权,所以我也没必要知道他们到底设置了什么东西,我只需要知道它们就是协助我点屏的重要步骤之一就可以了。
我们就简单的认为这个初始化代码包含三类指令,分别是:
SET_GENERIC
W_D
delay_ms
不同厂家提供的初始化代码是不同的,但格式基本上都是大同小异,有的初始化代码很少,也有的超级长,比如荣品的设备树里就有一个更长的,如下所示,这个是已经将初始化代码转换为DCS
格式的了:
可见有些LCD面板厂家提供的初始化代码也是很多的,所以搞这个真的还是要有点耐心的,否则很容易出错,一旦出错,可能屏幕都点不亮。以上只是举一个简单的例子,我们需要将上面厂家给我的初始化命令转化成对应的DCS
格式,然后添加到设备树的初始化序列里,这样驱动在加载的时候才能够被正确识别到。
首先感谢CSDN网友提供以下思路:
https://blog.csdn.net/sunqinglin4826/article/details/104848529
https://blog.csdn.net/weixin_42399752/article/details/101108550
https://blog.csdn.net/dearsq/article/details/52354593
既然要将初始化代码转换成DCS
格式,那么就衍生出下面的步骤:
数个数
以SET_GENERIC
为开始,下一个SET_GENERIC
(不包含这次的SET_GENERIC
和Delay
)为结束作为一次数据发送,数一数一共有几个数据。
看延时
看看厂家提供的初始化代码里面有没有延时。
确定了以上步骤以后,我们就需要将初始化代码改写成下面的格式:
命令类型+延时数量+数据长度+数据
2.1、普通序列
SET_GENERIC(0x02);
W_D(0x80);W_D(0xAB);
如上,有三个数据,所以命令类型为39
,所以第一个序列要这么写:
以下每一个字节一一进行对应:
命令类型 延时数量 数据长度 数据1 数据2 数据3
39 00 03 02 80 AB
2.2、带延时的序列
SET_GENERIC(0x01);
W_D(0x11);
delay_ms(120);
如上,有个数据,1个延时,所以命令类型为15
,所以带延时的序列要这么写:
以下每一个字节一一进行对应:
命令类型 延时数量(转16进制) 数据长度 数据1 数据2
15 78 02 01 11
2.3、将厂家给的序列转换为DCS
格式序列
以此类推,从厂家给我们的初始化代码转换为序列就是:
39 00 03 02 80 AB
39 00 03 02 81 4B
39 00 03 02 82 84
39 00 03 02 83 88
39 00 03 02 84 A8
39 00 03 02 85 E3
39 00 03 02 86 B8
39 00 03 02 87 5A
39 00 03 02 B1 38
15 78 02 01 11
15 00 02 01 29
所以在设备树里的初始化序列就应该这么写,把上面转换的结果复制到下面来:
panel-init-sequence = [
39 00 03 02 80 AB
39 00 03 02 81 4B
39 00 03 02 82 84
39 00 03 02 83 88
39 00 03 02 84 A8
39 00 03 02 85 E3
39 00 03 02 86 B8
39 00 03 02 87 5A
39 00 03 02 B1 38
15 78 02 01 11
15 00 02 01 29
];
所以我们就不难理解以上荣品的DTS里初始化序列的含义:
panel-init-sequence = [
05 78 01 11
05 78 01 29
];
第一行:
05表示
DCS
命令类型,表示只有一个数据。78表示延时时间为(0x78)=> 120ms
01表示指令的数据长度只有一个字节
11表示的就是数据
同理,第二行也是一样的理解,到这里我们就彻底的掌握了设备树关于初始化序列的配置方法了,如果想详细了解驱动代码里是怎么实现的,那么也可以去追一追代码,我觉得这种实现模式太优秀了,不得不说Linux内核实现的DSI驱动设计思想真的很棒!
还有很多内容,分几个章节来写吧,今天就学习总结到这了。
往期精彩
如何添加APP到Buildroot里(以瑞芯微rv1126为例)
瑞芯微RV1109配置GPIO设备树修改笔记(熟悉新平台从点灯大法开始)
新产品立项了,作为嵌入式软件工程师该如何来开展设计工作?(个人经验分享)
觉得本次分享的文章对您有帮助,随手点[在看]
并转发分享,也是对我的支持。
以上是关于Linux MIPI DSI驱动调试笔记-设备树DCS格式序列之配置LCD初始化代码的主要内容,如果未能解决你的问题,请参考以下文章
Linux MIPI DSI驱动调试笔记-LCD时序参数配置
Linux MIPI DSI驱动调试笔记-LCD时序参数配置
Linux MIPI DSI LCD设备驱动开发调试细节学习笔记
Linux MIPI DSI LCD设备驱动开发调试细节学习笔记