RK 平台MIPI 点屏注意事项

news2024/11/28 15:44:46

转自: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 节点中的信息,它们也是会直接影响到显示效果的:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一步一步教你写kubernetes sidecar

什么是sidecar&#xff1f; sidecar&#xff0c;直译为边车。 如上图所示&#xff0c;边车就是加装在摩托车旁来达到拓展功能的目的&#xff0c;比如行驶更加稳定&#xff0c;可以拉更多的人和货物&#xff0c;坐在边车上的人可以给驾驶员指路等。边车模式通过给应用服务加装一…

Python命名空间和作用域

命名空间定义了在某个作用域内变量名和绑定值之间的对应关系&#xff0c;命名空间是键值对的集合&#xff0c;变量名与值是一一对应关系。作用域定义了命名空间中的变量能够在多大范围内起作用。 命名空间在python解释器中是以字典的形式存在的&#xff0c;是以一种可以看得见…

OCPC系列三 - 展开说说广告业务及算法介绍

系列分享&#xff1a; OCPC系列 - OCPC介绍扫盲贴来啦_高阳很捷迅的博客-CSDN博客 OCPC系列 - PID算法&#xff08;理解PID算法&#xff09;-比例控制算法、积分控制算法、微分控制算法_高阳很捷迅的博客-CSDN博客 名词解释 先简单介绍下以下名称解释&#xff0c;方便下面阅…

Flink基础介绍-1 概述

Flink基础介绍-1 概述 一、Flink介绍1.1 批处理计算引擎1.2 流式计算引擎1.3 批处理和流处理 一、Flink介绍 Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状…

PDF转HTML格式怎么弄?将PDF转换为HTML的三种简便方法

PDF和HTML是两种常见的文档格式&#xff0c;它们在用途和外观上有很大的差异。然而&#xff0c;令人惊讶的是&#xff0c;这两种看似毫不相关的格式实际上可以相互转换。 一些网页编辑人员在更新网站内容时&#xff0c;通常会先将内容保存为PDF文件&#xff0c;然后在发布时将…

软件测试——性能测试

性能测试基础 为什么要进行性能测试&#xff08;WHY&#xff09;&#xff08;最重要&#xff09; 应用程序是否能够很快的响应用户的要求&#xff1f;应用程序是否能处理预期的用户负载并有盈余能力&#xff1f;应用程序是否能处理业务所需要的事务数量&#xff1f;在预期和非…

全网最详细,性能测试各种测试场景分析+性能测试基准测(超细总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面对日益复杂的业…

【JAVA程序设计】(C00135)基于Servlet+jsp的旅游管理系统

基于Servletjsp的旅游管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本项目为基于Servletjsp的旅游管理系统:本项目分为二种角色&#xff1a; 管理员&#xff1a; 用户管理&#xff08;增删改查&#xff09;、线路管理&#xff08;增删改查&#xff09;、景点管…

对SRC并发漏洞挖掘的思考

对SRC并发漏洞挖掘的思考 1.burpsuite Turbo插件使用2.并发点赞测试3.并发验证码测试4.某代金券逻辑测试5.有限制的并发验证码绕过6.对于并发漏洞的思考 1.burpsuite Turbo插件使用 Turbo Intruder是一个用于发送大量HTTP请求并会分析其结果的Burp Suite扩展。它旨在补充Burp …

实景三维浪潮翻涌,新技术“席卷”石家庄!

5月11日&#xff0c;“全自主、全流程、全覆盖”2023实景三维新技术研讨会石家庄站暨航测与遥感学术交流会在石家庄凯旋金悦大酒店圆满举行。 本次会议由中国测绘学会、中国地理信息产业协会指导&#xff0c;河北省测绘学会、河北省地理信息产业协会主办&#xff0c;武汉大势智…

Grafana安装、升级与备份(02)

一、安装Grafana软件包 Grafana部署非常简单,直接使用yum命令从官网拉到安装再启动就可以了,本次使用的grafana版本为9.5.0 官网下载地址:Download Grafana | Grafana Labs # wget yum install -y https://dl.grafana.com/oss/release/grafana-9.5.0-1.x86_64.rpm # yum …

js:正则表达式常用方法总结test、exec、match、matchAll、replace、replaceAll、search

文章目录 正则使用testmatch/matchAll不加g加ggroup 的使用 matchAll不加g加g exec不加g加g searchreplace 正则使用 常用的几种方法有&#xff1a;test、exec、match、matchAll、replace、replaceAll、search test // 匹配返回true&#xff0c;不匹配false /e/.test("…

高通摄像头打不开报错SOF Freeze!

目录 报错日志 代码分析 报错日志 E/mm-camera( 647): <MCT ><ERROR> 95: mct_bus_sof_thread_run: Session 3: Hinting SOF freeze to happen. Sending event to dump infoE/mm-camera( 647): <MCT ><ERROR> 57: server_debug_dump_dat…

大模型来了,自动驾驶还远吗?关键看“眼睛”

感知系统是自动驾驶最重要的模块之一&#xff0c;被视为智能车的“眼睛”&#xff0c;对理解周围环境起到至关重要的作用。随着深度学习以及传感器技术的发展&#xff0c;感知系统呈现出迅猛的发展趋势&#xff0c;涌现出各种新技术&#xff0c;性能指标不断提升。本文将围绕感…

手撕机器学习算法--一步步推导-------NFL(没有免费午餐定理)

文章目录 前言一、NFL是什么&#xff1f;二、表现形式三、介绍四、手动推导 前言 其实机器学习也好&#xff0c;深度学习也罢&#xff0c;在我看来&#xff0c;代码编程终究是不重要的&#xff0c;因为现成的库&#xff0c;其数学原理&#xff0c;其公式推导才是我们需要理解的…

bind查找用法

inclue中的root 也取了名字 引用的时候应该是 引用外面的名字再引用里面的名字&#xff0c;包括rootview也是 binding.errorView.errorView.visibility View.GONE binding.errorView.statusHintIcon?.visibility View.GONE

绩效管理常见的7大误区,越用企业越走下坡路!

绩效管理是企业中非常重要的一个环节&#xff0c;但是很多企业在实施过程中常常会犯一些误区&#xff0c;导致绩效管理的实际效果和预期效果相差甚远。下面我们一起来看看企业中常见的七个绩效管理误区。 1、公司战略和绩效没有关联 绩效管理需要与企业战略相结合&#xff0c;…

【大数据学习篇7】小试牛刀统计并且分析天猫数据

本项目基于搭建大数据环境&#xff0c;通过将数据存放在HDFS上&#xff0c;从HDFS中获取数据&#xff0c;然后根据实际需求通过Spark或Spark SQL对数据进行读取分析&#xff0c;将分析结果存储到HBase表中&#xff0c;最终通过 ECharts数据可视化工具基于Python Web平台实现数据…

【深入浅出】条件概率的链式法则:定义、公式与应用

前言 在概率论的研究中&#xff0c;条件概率是一种非常重要的概念。当多个随机事件发生时&#xff0c;我们有时需要考虑它们同时发生的概率。条件概率的链式法则就是一种用于计算多个随机事件同时发生的概率的方法。本文将会介绍条件概率的链式法则的定义、公式以及应用。 定…

[集合论]集合与二元关系

目录 二元关系导图集合集合表示方法对等差等于两个集合的相对补的或关系 关系序偶与笛卡尔积笛卡尔积 ------不满足交换律 不满足结合律 关系条件 集合与关系划分与覆盖等价关系 (取余、等)商集 偏序关系---自反 反对称 传递(大于等于 小于等于 整除关系 包含 cover 幂集子集关…