RK 平台MIPI 点屏注意事项

转自:https://www.cnblogs.com/chorm590/p/11658360.html

rk 平台关于 MIPI 屏幕的点屏流程已经非常完善了,基本上只要确定了硬件没问题、接线没问题、屏幕没问题,再稍稍配置一下 dtsi 里的参数就可以的了。

MIPI 点屏流程大致可以概括为以下几步:

1、确认硬件环境;

2、确认相关接口管脚;

3、配置屏幕背光 dts;

4、配置 MIPI 屏幕参数;

5、屏幕显示效果调校。

1、确认硬件环境

确认硬件环境这个活理论上来说是由硬件人员来提供保证的,大多数软件人员都不懂这块的知识,只能相信他人。但他人毕竟是他人,你无法保证他人不会犯迷糊,所以有的时候身为软件人员,要和硬件打交道的话,会很痛苦。

言归正传,所谓确认硬件环境,无非就是要确认以下几点信息:

1、MIPI 排线接口电路正确;

2、板端接口到屏端接口的走线正确;

3、供电符合要求。

保证了以上三点就可以开始软件点屏了。

2、确认相关接口管脚

这个是要根据板端原理图来确认哪些引脚是接到我们要点的屏幕上去的。

例如,通常 rk 的芯片都会有多组视频信号输送接口,如 lcd0 ~ lcdx。我们要找到属于我们的那个管脚。

还要找到控制背光开关的管脚。由于背光电流强度是由 pwm 来决定的,所以还要再确认好是哪组 pwm 用于控制我们要点的屏幕。

3、配置屏幕背光 dts

直接修改 kernel 的 dts 文件即可。

不同板端所使用的 dts 文件通常不一致,所以这步要自行确认自己使用的是哪一个文件。不过这个文件通常都位于以下目录中:

./kernel/arch/arm/boot/dts/

在你的 dts 文件中,主要是要找到 backlight 节点,然后再配置 pwm 与 gpio 信息,如下所示:

    backlight {
        compatible = "pwm-backlight";
        pwms = <&pwm2 0 25000>;
        brightness-levels = <
              ...
              >;
        default-brightness-level = <200>;
        enable-gpios = <&gpio7 GPIO_C6 GPIO_ACTIVE_HIGH>;
    };

其次再将对应的 pwm 节点置为可用状态:

&pwm2 {
        status = "okay";
};

然后可以关注一下以下节点配置,它表明了这个屏幕的参数被记载的节点名称,后续初始化屏幕时就会去这里指定的节点里查找信息:

&rk_screen {
     display-timings = <&disp_timings>;
};

最后是将输送视频信号的相关功能置为开启状态,这个需要参考原理图才能决定填哪个了:

&lcdc0 {
    status = "okay";
    rockchip,mirror = <NO_MIRROR>;
    ...
}

4、配置MIPI屏幕参数

这一步就是配置上一步中提到的 display-timins = <&disp_timings>; 的信息了。

通常这个节点的信息会独立保存在一个文件后缀为 dtsi 的文件中。它在配置好以后是通过前面的 dts 文件 include 进来使用的。

这个 dtsi 文件中的信息主要有以下四种节点:

1、disp_mipi_init: mipi_dsi_init 节点;

2、disp_timings: display-timings 节点;

3、disp_mipi_power_ctr: mipi_power_ctr 节点;

4、disp_mipi_init_cmds: screen-on-cmds 节点。

disp_mipi_init: mipi_dsi_init

这个节点一般记载有以下信息:

disp_mipi_init: mipi_dsi_init{
    compatible = "rockchip,mipi_dsi_init";
    rockchip,screen_init    = <1>;
    rockchip,dsi_lane        = <4>;
    rockchip,dsi_hs_clk        = <600>;
    rockchip,mipi_dsi_num    = <1>;
};

screen_init 参数表示这块屏幕是否需要做初始化操作。通常 MIPI 屏幕都是要做的,置 1 表示需要,置 0 表示不需要。

dsi_lane 表示屏幕用于传输信息的通道数量。这个要根据屏幕规格书业确认,例如:

这就表示这块 MIPI 屏幕有 4 组数据线,所以填 4 就好。

dsi_hs_clk 表示总时钟数,单位为 MHZ。

mipi_dsi_num 一般填 1 就好。

disp_timings: display-timings

这个节点中的内容关乎于屏幕的参数信息。它的结构如下示例所示:

disp_timings: display-timings {
    native-mode = <&timing0>;
    compatible = "rockchip,display-timings";
    timing0: timing0 {
        screen-type = <SCREEN_MIPI>;
        out-face    = <OUT_P666>;
        clock-frequency = <50000000>;
        
        hactive = <800>;
        vactive = <1280>;
        
        hback-porch = <32>;
        hfront-porch = <32>;
        
        vback-porch = <32>;
        vfront-porch = <22>;
        
        hsync-len = <4>;
        vsync-len = <4>;
        
        hsync-active = <0>;
        vsync-active = <0>;
        
        de-active = <0>;
        pixelclk-active = <0>;
        
        swap-rb = <0>;
        swap-rg = <0>;
        swap-gb = <0>;
    };
    
};

这个节点的信息含义不作过多解释,这里仅关注如何填值。

这块节点的信息基本要从屏幕规格书中来。

screen_type 可填的值有:SCREEN_MIPI , SCREEN_DUAL_MIPI。

out-face 可填的值有:OUT_P565 , OUT_P666 , OUT_P888。

后面的信息就要查阅屏幕规格书,通常可以找到 INPUT_SIGNAL_TIMING 章节,其中通常会记载有类似信息:

clock-frequency 就是上图中的 DCLK frequency 中的数据。这些表格中,我们一般取 Typ 列的值来使用。

hactive 与 vactive 就是屏幕分辨率,这个信息对应于上图表中的 Horizontal Display Area 与 Vertical Display Area。

hback-porch 对应于 Hs Back Porch。

hfront-porch 对应于 Hs Front Porch。

vback-porch 对应于 Vs Back Porch。

vfront-porch 对应于 Vs Front Porch。

hsync-len 对应于Hs pulse width。

vsync-len 对应于 VS Pulse Width。

通常填好这几个参数就可以了。

disp_mipi_power_ctr: mipi_power_ctr

这个节点记载 MIPI 屏幕的重置脚与使能脚的信息。根据实际情况配置即可。

disp_mipi_power_ctr: mipi_power_ctr {
    compatible = "rockchip,mipi_power_ctr";
    mipi_lcd_rst:mipi_lcd_rst{
        compatible = "rockchip,lcd_rst";
        rockchip,gpios = <&gpio7 GPIO_B4 GPIO_ACTIVE_HIGH>;
        rockchip,delay = <100>;
    };
    mipi_lcd_en:mipi_lcd_en {
        compatible = "rockchip,lcd_en";
        rockchip,gpios = <&gpio0 GPIO_A2 GPIO_ACTIVE_HIGH>;
        rockchip,delay = <100>;
    };
};

disp_mipi_init_cmds: screen-on-cmds

这个节点中记载的是屏幕的初始化指令。指令内容通常需要厂家提供。厂家给过来的指令有可能不是直接适配到 RK 平台的,需要做转换。

那如何转换呢?我这里直接援引某位大神博客(https://blog.csdn.net/sdkdlwk/article/details/78698494)中的内容了,如下图所示:

我这里需要额外强调一点:0x29 和 0x39 是有区别的,不可通用,如果你发现自己的指令内容没有错,但就是点不起来,那么可以尝试一下更改 0x29 系或 0x39 系看看效果。

5、屏幕显示效果调校

如果按照上面的配置能正常显示自然是最好,但也不能排除仍然无法显示,或者是显示的效果不好的。这种情况就需要调校上一步中的参数信息了。

首先是屏幕初始化指令,指令一定要正确,这里说的正确除了指令内容正确外还得保证指令成功写了出去。有些屏幕它的单条初始化指令是很长的,而 RK 默认的单条指令长度又有限制,当指令内容过长时,就会导致段错误的发生,直接引起无法开机。

如何解决这个问题呢?答案是增大系统中保存指令的空间。在哪里改?在 uboot 中。

./u-boot/drivers/video/screen/lcd_mipi.c

在这份代码中会去解析 dtsi 中的指令,并存于一个数组中,直接将数组长度增大即可,如下图所示:

当然,不敢保证所有人的代码结构都和笔者的是一样的,如果你的代码中并没有这样一个数组,那么还可以改这个结构体:

./u-boot/drivers/video/transmitter/mipi.dsi.h

在这个头文件中有一个结构体 struct dcs_cmd,将它里面的 cmds 数组的长度更改一下即可:

如果改了这个仍然不起效果,那可能你的代码是被改动过的。这个时候就需要自行跟踪源码,看看它究竟把这些初始化指令保存到哪里去的。一般直接跟踪上面提到的 lcd_mipi.c 中的 rk_mipi_screen_init_dt 函数就可以的了。

其次是时钟信息。时钟不正确会导致显示不出来内容或者颜色有偏差。这里说的时钟包含:rockchip,dsi_hs_clk 与 clock-frequency。尤其是 dsi_hs_clk 节点,它代表总时钟,clock-frequency 代表单通道的时钟,因此前者时钟总是要比后者时钟大。关于这个关系的确定,我再贴上另一个大神博客(https://blog.csdn.net/u012715694/article/details/51751006)中的内容,如下图所示:

最后还得关注下disp_timins 节点中的信息,它们也是会直接影响到显示效果的:

实在不行的话,就用最笨的办法,一个一个去调去试,看看哪个出来的效果最好。当然,如果你有专业的理论知识可以直接计算出来,那就最好不过了。笔者很遗憾,笔者没有!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/20777.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

i春秋 Misc Web 爆破-1

打开链接是PHP源码 代码审计&#xff1a; include "flag.php"; 表示文件中包含flag.php文件&#xff0c;即根目录下存在flag.php $a $_REQUEST[hello]; 命名一个变量a来接收超全局变量$_REQUEST&#xff08;接收表单’hello’数据&#xff0c;请求一个为hello的参…

顶级白帽黑客必备的十大黑客技术

1.熟悉Linux系统和命令行操作&#xff1a; Linux是黑客的基石&#xff0c;几乎所有黑客工具和技术都是在Linux平台上运行的&#xff0c;熟悉Linux系统和命令行操作是必须的。 2.掌握网络协议和TCP/IP模型&#xff1a; 了解TCP/IP模型、网络协议和通信流程是黑客攻击的基础&a…

Java并发编程:并发问题和多线程技术的应用和优化

章节一&#xff1a;引言 在当今的软件开发领域中&#xff0c;多线程编程是一项至关重要的技术。随着处理器核心数量的增加和计算机系统的并行性的不断提高&#xff0c;充分利用多核心处理器的能力已成为现代软件开发的关键要素之一。Java作为一种强大的编程语言&#xff0c;在…

世界超高清大会发布重大技术成果:博冠自主创新推动8K摄像机攻关

一、世界超高清大会背景介绍&#xff1a; 近日&#xff0c;由工业和信息化部、国家广播电视总局、中央广播电视总台、广东省人民政府主办的2023世界超高清视频产业发展大会在广州越秀国际会议展览中心盛大召开。自2018年创办以来&#xff0c;大会已成功举办四届&#xff0c;成…

安装Ubuntu18.04双系统、干净卸载,并在Ubuntu系统中安装CARLA模拟器

Ubuntu系统安装 Ubuntu系统安装参照流程 Ubuntu 双系统安装流程_ubuntu双系统_地球被支点撬走啦的博客-CSDN博客 Ubuntu系统卸载 1.将开机启动项设置默认为Windows&#xff0c;进入BIOS设置界面调整BootDevice中Windows和Ubuntu的顺序&#xff0c;将Windows调整在Ubuntu前边…

PMP课堂模拟题目及解析(第11期)

101. 一家咨询公司的负责人启动一个项目来扩大公司提供的服务数量&#xff0c;这公司具有竞争优势、出色的企业知识以及卓越的声誉&#xff0c;高管团队担心与增加新服务相关的负面业务结果的可能性。若要评估负面业务结果的可能性和影响&#xff0c;项目经理应该使用什么&…

Protell99SE祭文

Protell99SE祭文 大概是在21年前的今天&#xff0c;我和你结合在一起&#xff0c;陪伴走过无数的设计。 我的感觉&#xff0c;大概是在2021年吧&#xff0c;你逐渐离我远去。啊&#xff0c;Protel99SE时代一去不复返了。 我用了你21年&#xff0c;虽着AD软件的到来&#xff…

Word控件Spire.Doc 【文本框】教程(5): 插入、读取和删除表格

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

Linux基本指令和操作(3)

目录 一. date指令 -- 显示时间 二. cal指令 -- 日历打印指令 三. find指令 -- 查找文件 四. grep指令 -- 行过滤指令 五. zip/unzip指令 -- 压缩和解压缩 六. tar指令 -- 解压/打包 或 查看压缩包内文件 七. bc指令 -- 计算器 八. uname指令 -- 获取电脑和操作系统相关…

JAVA - 字符串工具类StringBuilder和StringBuffer

文章目录 目录 文章目录 前言 二.常用方法演示 1.append()用于将指定的字符串添加到当前StringBuilder对象的末尾 2.delete()&#xff1a;用于删除StringBuilder对象中指定位置的字符。 3.insert()&#xff1a;用于在指定位置插入指定字符串。 4.replace()&#xff1a;用于替换…

中睿天下成为国家信息安全漏洞库(CNNVD)一级技术支撑单位

近日&#xff0c;中国信息安全测评中心公布2023年度国家信息安全漏洞库技术支撑单位名单&#xff0c;中睿天下荣获中国信息安全测评中心颁发的“国家信息安全漏洞库&#xff08;CNNVD&#xff09;技术支撑单位等级&#xff08;一级&#xff09;证书”&#xff0c;成为该领域最高…

提高运算放大器输出功率

运算放大器的串联&#xff1a;如何同时实现高精度和高输出功率 复合放大器 复合放大器由两个单独放大器组合而成&#xff0c;分别具有不同的特性。 图1所示就是这种结构。放大器1为低噪声精密放大器ADA4091-2。 在本例中&#xff0c;放大器2为AD8397,具有高输出功率&#xff…

【游戏逆向】某某游戏邮件遍历分析

邮件常常用来远程交易&#xff0c;这样可以节省交易时间&#xff0c;并且降低数据的需求。邮件遍历的分析&#xff0c;一般是以邮件名字&#xff0c;邮件数量等为突破口。不过有些游戏的邮件名字并不存放在邮件对象中&#xff0c;或者在对象中也不会改变邮件的本地显示&#xf…

全网独家首发最牛最全面的JMeter使用BeanShell断言

BeanShell简介 BeanShell是使用Java语法的一套脚本语言&#xff0c;在JMeter的多种组件中都有BeanShell的身影&#xff0c;如&#xff1a; 定时器&#xff1a;BeanShell Timer前置处理器&#xff1a;BeanShell PreProcessor采样器&#xff1a;BeanShell Sampler后置处理器&am…

内网渗透(七十二)之域权限维持之伪造域控

伪造域控 2022年1月10日,国外安全研究员Kaido发文称发现了一种新的伪造域控方式,安全研究员只需要新建一个机器账户,然后修改机器账户的UserAccountControl属性为8192。活动目录就会认为这个机器账户就是域控,然后就可以使用这个新建的机器账户进行DCSync操作了。由于修改…

(2020)End-to-end Neural Coreference Resolution论文笔记

2020End-to-end Neural Coreference Resolution论文笔记 Abstract1 Introduction2 Related Work3 Task4 Model4.1 Scoring Architecture4.2 Span Representations5 Inference6 Learning7 Experiments7.1 HyperparametersWord representationsHidden dimensionsFeature encoding…

Maven基础使用

Maven 学习目标 理解Maven的用途掌握Maven的基本操作掌握Maven如何创建Web项目 Maven是什么 面临问题 在学习Maven之前&#xff0c;我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统&#xff0c;项目中肯定要用到一些jar包&#xff0c;比如说myb…

分布式锁解决方案_基于Redisson实现的分布式锁实现

Redisson介绍&#xff1a; https://github.com/redisson/redisson/wiki Redisson - 是一个高级的分布式协调Redis客服端&#xff0c;能帮助用户在分布式环境中轻松实现一些Java的对象&#xff0c;Redisson、Jedis、Lettuce是三个不同的操作 Redis 的客户端&#xff0c;Jedis、…

element-plus 问题

对话框内部下拉框会在左上角 在对话框内打开下拉框后点击关闭按钮&#xff0c;尚未关闭的下拉框会在左上角出现&#xff08;或闪现&#xff09; 解决方案&#xff1a; popper-append-to-body 此方法失效&#xff0c;改用 :teleported"false" teleported&#xff1a;…

思维中的世界

⾝体的空间&#xff0c;以⾏为为导向的空间 感官⼩矮⼈ 当我们观察特定的事物时&#xff0c;⼤脑的相应区域就会被“点亮”&#xff0c;并变得 活跃起来。 ⾝体映射到⼤脑上&#xff0c;映射到“感官⼩矮⼈”上&#xff0c; 即从左⽿延伸&#xff0c;过⼤脑顶⾻&#xff0c;…