Linux内核显卡驱动(LVDS)初探

news2024/11/14 19:21:05

目录

0. 前言

1. menuconfig

2. 编译报错与打补丁

3.  设备树与display-timings

4. 拓展:RGB24


0. 前言

这次的工作主要是把某项目设备上(iMX6DL)的内核版本从 4.19.x 升级到 5.15.32,是作为该项目整个BSP升级计划的一部分。

该内核升级工作移交给笔者的时候,其实 5.15.32版本的内核已经初步移植好了,可以在设备上跑起来。只是显卡、声卡和网卡还未使能和配置,这便是笔者需要做的事情。

值得一提的是,笔者手上有 4.19.x 版本的内核 configs 和 zImage,可以作为开发时的参考。


1. menuconfig

一般而言,配置内核驱动,首先需要在menuconfig的图形界面里,把该选的配置、该设置的参数和该关闭的选项都给设置好。笔者大量参考了4.19.x的menuconfig设置。

首先我们查询手册和原理图,知道了显示器型号为 LG的LB070WV8SL02。

我们在 linux-menuconfig 里面如下设置:进入 Device Drivers ---> Graphics support

取消 < > IPUv3 Core support

进入 Display Panels:

进入 Display Interface Bridges:

进入 Frame buffer Devices:

进入 Backlight & LCD device support:

 进入 Console display driver support:

我们再在 linux-menuconfig 里面如下设置:进入 Device Drivers ---> MXC support drivers

 

 PS: 这里MXC的设置是笔者反反复复最多的,因为它跟后面编译报错的原因直接相关。

 如此这般配置,感觉上跟 4.19.x 的配置几乎一样或者说没有冲突。那么,退出menuconfig,直接编译内核,果不其然,一开始就报错了。


2. 编译报错与打补丁

现如今,linux内核的源代码已经极其庞大了,以至于完全可能发生两个不同时期由不同组织提交的不相关的源文件里存在重名函数的情况!如果把这些源文件都选中加入编译的话,那可不就发生报错了嘛。

笔者一开始发生的编译报错就是显示 multiple definitions。不过一开始,最好不要直接修改源代码,毕竟这样的修改牵一发而动全身(万一以后其他人要用这个函数呢)。

比如说 文件A 和 文件B 现在都有名字为 ipu_csi_init_interface(...)的函数(尽管它们内容完全不同),笔者想让 文件B妥协, 把文件B 排除于编译外。为了这个目的,又在menuconfig里面选了好久。。。但最后得出结论,如果通过menuconfig关闭一些选项来去除文件B,产生了连锁效应(很多其他文件也被排除了),反而会有更多的编译报错。

写文件A的公司 和 写文件B的公司 确实会把自己的文件好好测试,但的确不一定会考虑到跟世界上其他公司提交的文件产生冲突的情况。所以笔者在咨询了老法师同事的意见后,不得不采取了修改文件B的做法。把函数名改成了 imx_ipu_csi_init_interface(...),其他重名函数也就是加上了imx_前缀而已。

如此这般修改,再编译内核。确实就没有报错了。笔者就此写了专门的patch补丁文件,将这些把函数名修改的操作可以动态的执行于编译过程之中。


3.  设备树与display-timings

现在编译不报错了,把生成的zImage放到SD卡上,在设备上跑一下。看看打印输出和显示效果。

我们关注这几个关键字:fb、ldb、display-panel 和 /dev/fb0 ( frame buffer 显示设备的驱动名 ),看看打印输出里面有没有相关的信息。也可以结合4.19.x的打印输出一起看看。

结果,打印输出没有问题,但默认开机显示的 那两个Linux小企鹅是绿色的!也就是显示失真了。

那么我们需要研究一下设备树了。

dts文件里,跟显卡相关的地方如下:(截图是已经修改好的情况,原来很多内容是没有的)

 

 这其中 display-timings原来是没有的,但它却是调整显示屏时序的关键。

我们可以打开内核里面的panel-timing.yaml,里面有一些提示:

我们可以得到 hactive 和 vactive 的含义:

 通过查询器件手册,我们可知这块屏幕是800X480,主频是33.246MHz,所以 hactive=800,vactive=480,clock-frequency=33246000。

但其他参数,如 hback-porch、hfront-porch、vback-porch、vfront-porch、hsync-len和vsync-len,器件手册里没有直接提示。

通过查询网络上相关资料和讨论,LVDS时序配置有这么一个公式:

水平总周期 = hback-porch + hfront-porch + hsync-len + hactive

垂直总周期 = vback-porch + vfront-porch + vsync-len + vactive

我们再看一下手册:

 所以可以推算:

1056 = hback-porch + hfront-porch + hsync-len + 800

hback-porch + hfront-porch + hsync-len = 256

525 = vback-porch + vfront-porch + vsync-len + 480

vback-porch + vfront-porch + vsync-len = 45

而且只要确保 水平和垂直参数总和是 25645就行,具体每一项大小可以自定。所以我们最终可以得到:

		display-timings {
			native-mode = <&timing0>;
			timing0: hsd100pxn1 {
				clock-frequency = <33246000>;
				hactive = <800>;
				vactive = <480>;

				hback-porch = <88>;
				hfront-porch = <88>;
				hsync-len = <80>;

				vback-porch = <10>;
				vfront-porch = <10>;
				vsync-len = <25>; 
			};
		};

这样一设置,再编译出zImage,放到板子上一跑,小企鹅颜色就正常了。


4. 拓展:RGB24

设备树里有这么一个参数,interface_pix_fmt

interface_pix_fmt 指LCD HW 输出信号格式。如RGB565,RGB888(即RGB24),GRB888,BGR888,RGB666等。顾名思义,interface_pix_fmt 就是一个LCD 接口输出一个像素的格式。
一个18bit的LCD有可能输出RGB666, BGR666,GBR666.

一个24bit的LCD有可能输出RGB24, BGR24,GBR24.

查询器件手册,可知这块屏幕的输出信号格式为24bit。所以笔者选择了RGB24这种最常见的格式。选择BGR24、GBR24会出现三种原色位置对调的情况。

在有些场合,比如屏幕数据线接错,新屏幕接口顺序变动等情况下,可以改变这个interface_pix_fmt 参数。让显示效果最终还是正确的。以软件的设置减少硬件变动的工作量。

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

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

相关文章

Spring Cloud Alibaba商城实战项目基础篇(day03)

五、后台管理 5.1、商品服务 5.1.1、三级分类 5.1.1.1、查询所有菜单与子菜单 我们需要维护所有菜单以及各种子菜单&#xff0c;子菜单里面可能还有子菜单&#xff0c;所以我们采用递归的方式进行书写。 我们先在CategoryController中修改list方法&#xff0c;让他以组装树…

Day868.索引(上) -MySQL实战

索引&#xff08;上&#xff09; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于索引&#xff08;上&#xff09;的内容。 某一个 SQL 查询比较慢&#xff0c;分析完原因之后&#xff0c;可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引&…

linux部署java项目cpu占用100%的排除故障

用top -c命令查看cpu占用高的进程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/12af3f060fb84ce98b24c7247546b50b.png 发现cpu占用为99%的进程pid为24857 用top -Hp 24857查看cpu占用最高的线程 发现占用cpu97.3%的线程id为24926 将24926转为16进制 通过jstack查看进…

袋式除尘器—选型计算

1.处理气体量的计算计算袋式除尘器的处理气体时&#xff0c;首先要求出工况条件下的气体量&#xff0c;即实际通过袋式除尘器的气体量&#xff0c;并且还要考虑除尘器本身的漏风量。这些数据&#xff0c;应根据已有工厂的实际运行经验或检测资料来确定&#xff0c;如果缺乏必要…

Day09 - 子类父类多继承多层继承多态

1. 子类中访问父类中的私有属性和私有方法 如果想使用父类中的私有属性和私有方法,那么就需要在父类中,为这些私有的属性和方法,提供相应的公有的接口方法来间接访问2. 如何为父类中的属性进行初始化 在子类中如果定义了自己的初始化方法,那么这时父类的初始化方法就不会再执…

尚硅谷AJAX教程

优点&#xff1a;无需刷新页面获取数据&#xff0c;允许你根据用户事件来更新部分页面内容 缺点&#xff1a;没有浏览历史&#xff0c;不能回退&#xff0c;存在跨域&#xff0c;SEO不友好 原生XHR请求 get请求 <body><button>获取数据</button><scri…

弹性可微调,基于LCN光敏材料的触觉模拟系统

对于AR/VR体验来讲&#xff0c;体感、触觉模拟很重要&#xff0c;但现阶段还没有一种方便消费者使用、轻便的体感方案&#xff0c;因此Meta等公司不断在探索更好的体感技术。比如近期&#xff0c;Nature发表了一项来自荷兰埃因霍芬理工大学的新研究&#xff0c;该研究由Meta Re…

svg的path标签的d属性

<svgwidth"200"height"200"viewBox"0 0 200 200"style"border: 1px solid red"><pathd"M10 10 L110 10 L110 110 L10 110 Z"fill"none "stroke"green"></path></svg>运行效果…

Redux Toolkit 调用 API 的四种方式

Redux Toolkit 调用 API 的四种方式 上篇笔记写的比较乱&#xff0c;加上这回又学了点新的东西&#xff0c;所以重新整合一下。 本地 API 用的是 json-server&#xff0c;端口设置在 3005&#xff0c;数据包含&#xff1a; {"users": [{"id": 1,"n…

数据分析-深度学习 Pytorch Day9

迁移学习通过利用数据、任务或模型之间的相似性&#xff0c;将在旧领域学习过的模型应用于新领域来求解新问题。生活中常用的“举一反三”、“照猫画虎”就很好地体现了迁移学习的思想。利用迁移学习的思想&#xff0c;可以将已有的一些训练好的模型&#xff0c;迁移到我们的任…

【Kotlin】泛型 ② ( 可变参数 vararg 关键字与泛型结合使用 | 使用 [] 运算符获取指定可变参数对象 )

文章目录一、可变参数 vararg 关键字与泛型结合使用二、使用 [] 运算符获取指定可变参数对象一、可变参数 vararg 关键字与泛型结合使用 如果 泛型类型 T 的参数 是 vararg 可变参数 , 则在接收 可变参数 时 , 需要使用 Array<out T> 类型 的变量进行接收 ; 参数为 vara…

分房管理系统Rose模型设计过程

文章目录 一、模型总体设计 1 创建系统的Use Case 视图 2 创建系统的 Logical 视图 3 创建系统的 Class 框图 4 创建系统的 StateChart 框图 5 创建系统的 Activity 框图 二、软件模块结构图设计 1 根据系统功能进行第一级分解 2 完成第二级分解 3 完成第三级分解 4 整合得到完…

从零开始的python基础教程

一、Getting Started 如果使用的是mac或linux系统&#xff0c;需要输入 python3 比如运行 python3 app.py 可以直接在终端的>>>符号后执行python代码 print("*" * 10) 1、实现 在相关终端当运行“python”为CPython&#xff0c;这是python的默认实现 Jy…

大数据--spark

什么是SparkApache Spark 的架构基础是弹性分布式数据集 (RDD)&#xff0c;这是一种只读的多组数据项&#xff0c;分布在机器集群上&#xff0c;以容错方式维护。[2] Dataframe API 作为 RDD 之上的抽象发布&#xff0c;随后是 Dataset API。在 Spark 1.x 中&#xff0c;RDD 是…

39-剑指 Offer 41. 数据流中的中位数

题目 如何得到一个数据流中的中位数&#xff1f;如果从数据流中读出奇数个数值&#xff0c;那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值&#xff0c;那么中位数就是所有数值排序之后中间两个数的平均值。 例如&#xff0c; [2,3,4] 的中位…

50个常用的 Numpy 函数详解

目录 一、创建数组 1、Array 2、Linspace 3、Arange 4、Uniform 5、Random.randint 6、Random.random 7、Logspace 8、zeroes 9、ones 10、full 11、Identity 二、数组操作 12、min 13、max 14、unique 15、mean 16、medain 17、digitize 18、reshape 19、…

详解1247:河中跳房子(二分经典例题)

1247&#xff1a;河中跳房子【题目描述】每年奶牛们都要举办各种特殊版本的跳房子比赛&#xff0c;包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行&#xff0c;在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和…

《Unity Shader 入门精要》第6章 Unity 中的基础光照

第6章 Unity 中的基础光照 6.1 我们是如何看到这个世界的 通常来说我们要模拟真实的光照环境来生成一张图像&#xff0c;需要考虑3种物理现象&#xff1a; 首先&#xff0c;光线从光源&#xff08;light source&#xff09;中被发射出来然后&#xff0c;光线和场景中的一些物…

JavaScript while 循环

文章目录JavaScript while 循环while 循环do/while 循环比较 for 和 while笔记列表JavaScript while 循环 只要指定条件为 true&#xff0c;循环就可以一直执行代码块。 while 循环 while 循环会在指定条件为真时循环执行代码块。 语法 while (条件) {需要执行的代码 }本例中…

Redis内部的阻塞式操作以及应对方法

Redis之所以被广泛应用&#xff0c;很重要的一个原因就是它支持高性能访问&#xff0c;也正因为这样&#xff0c;我们必须要重视所有可能影响Redis性能的因素&#xff0c;不仅要知道具体的机制&#xff0c;尽可能避免异常的情况出现&#xff0c;还要提前准备好应对异常的方案。…