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

news2024/11/15 14:03:48

目录

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/177318.html

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

相关文章

PX4+Offboard模式+代码控制无人机起飞(Gazebo)

参考PX4自动驾驶用户指南 https://docs.px4.io/main/zh/ros/mavros_offboard_cpp.html 新建ros项目工程 mkdir -p px4_offboard_ws/src接着进入文件编译一下 cd px4_offboard_ws catkin_make进入src目录&#xff0c;创建ros功能包 catkin_create_pkg t1_offboard_rtakeoff …

Springboot+vue基于java的家教管理平台

系统分为用户和管理员&#xff0c;教师三个角色 用户的主要功能有&#xff1a; 1.用户注册和登陆系统 2.查看系统的公告信息 3.用户查看家教教师简历信息 4.用户查看课程信息 5.用户查看招聘教师信息&#xff0c;在线应聘教师 6.用户个人中心修改个人资料&#xff0c;修改密码…

Python数据清洗2

一、函数数据处理 1.在dataframe中使用apply方法&#xff0c;调用自定义函数对数据进行处理 2.可以使用astype函数对数据进行转换 3.可以使用map函数进行数据转换 二、数据分组运算 1.使用groupby方法进行分组计算&#xff0c;得到分组对象GroupBy 2.语法为df.groupby(…

在甲骨文云容器实例(Container Instances)上部署chrome

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署chrome。 Step1. 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&#xff0c;…

LInux(四)进程控制(创建、终止、等待、替换)

目录 一、进程创建 1、pid_t fork(void) 2、写时拷贝技术&#xff08;父子进程间代码共享、数据独有&#xff09; 3、vfork()--创建一个子进程 4、fork创建子进程流程是什么样的&#xff1f; 5、一个关于fork的程序 6、程序a 7、 程序b 二、进程终止 1、在main函数中…

E2PROM 蓝桥杯 stm32 AT24C02读写函数

本文 代码使用 HAL 库 。 文章目录前言一、AT24C02 读写函数&#xff1a;1. 读函数2. 写函数&#xff1a;二. AT24C02 读写地址&#xff0c;原理图三. 延时问题总结下一节讲解 MCP4017。使用 E2PROM 来计算板子的上电次数 实验效果。前言 本文 先列出 AT24C02 读写函数 &#…

【蓝桥杯】简单数论3——素数

1、素数判断 素数定义:只能被1和自己整除的正整数。注:1不是素数&#xff0c;最小素数是2。 判断一个数n是不是素数:当n≤时&#xff0c;用试除法;n>时&#xff0c;试除法不够用&#xff0c;需要用高级算法&#xff0c;例如Miller_Rabin算法。 试除法&#xff1a;用[2, n…

MySQL —— 库操作

目录 一、库操作 1. 创建数据库 2. 创建数据库案例 二、字符集和校验规则 1. 查看系统默认字符集以及校验规则 2. 查看数据库支持的字符集 3. 查看数据库支持的字符集校验规则 4. 校验规则对数据库的影响 三、操纵数据库 1. 查看数据库 2. 显示创建语句 3. 修改数…

Pandas 数据可视化

数据可视化Joyful Pandas基本绘图动手学数据分析2 第二章&#xff1a;数据可视化2.7 如何让人一眼看懂你的数据&#xff1f;2.7.1 任务一2.7.2 任务二2.7.3 任务三2.7.4 任务四2.7.5 任务五2.7.6 任务六2.7.7 任务七Joyful Pandas Datawhale社区 Joyful Pandas 基本绘图 一维…

《深入浅出计算机组成原理》学习笔记 Day9

乘法器1. 顺序乘法2. 并行加速方法3. 电路并行参考1. 顺序乘法 以 13913 \times 9139为例&#xff0c;131011012,9101001213_{10} 1101_2, 9_{10} 1001_21310​11012​,910​10012​。用列竖式的方式计算&#xff1a; 在二进制下&#xff0c;由于只有 0 和 1&#xff0c;计…

逆序对问题、树状数组与离散化

目录 一、前言 二、逆序对问题 1、暴力法 2、归并排序法 3、树状数组与逆序对&#xff08;最巧妙最好的方法&#xff09; &#xff08;1&#xff09;倒序 &#xff08;2&#xff09;正序 &#xff08;3&#xff09;离散化 三、例题 1、小朋友排队&#xff08;lanqiao…

springBoot——SpringBoot 整合 Mybatis 流程

SpringBoot 整合持久层SpringBoot 整合 Mybatis 流程一、添加依赖1. pom.xml二、写配置文件1. application.yml三、写 Java 文件1. entity2. dao3. service4. controller5. mapper四、建立数据库五、测试SpringBoot 整合 Mybatis-Plus 流程一、添加依赖1. pom.xml二、写配置文件…

linux基本功系列之chattr命令

文章目录一. chattr命令介绍二. 语法格式及常用选项三. 参考案例3.1 给指定文件添加隐藏属性&#xff0c;阻止文件被修改&#xff1a;3.2 撤销i属性3.3 允许补充&#xff08;追加&#xff09;内容&#xff0c;无法覆盖/删除内容总结前言&#x1f680;&#x1f680;&#x1f680…

LabVIEW监控操纵杆,键盘或鼠标

LabVIEW监控操纵杆&#xff0c;键盘或鼠标在LabVIEW中从操纵杆/鼠标/键盘获取数据在LabVIEW中监控我的输入设备如何知道键盘上按了哪些键&#xff1f;用轮询的方式监控鼠标&#xff0c;键盘或操纵杆的动作。要在LabVIEW中监控这些设备&#xff0c;可以使用内置的输入设备采集VI…

【STM32】寄存器原理

如果我们想要深入去学习STM32单片机的存储原理和方式&#xff0c;就要花时间去了解STM32单片机有关寄存器的基本原理 单片机型号&#xff1a;正点原子STM32F103ZET6 目录 寄存器的定义 寄存器分类 存储器映射 寄存器映射 通过地址访问控制单元运作 通过定义宏来取代直接访…

C++ 哈希表查询_进入哈希函数结界的世界

1. 前言 哈希表或称为散列表&#xff0c;是一种常见的、使用频率非常高的数据存储方案。 哈希表属于抽象数据结构&#xff0c;需要开发者按哈希表数据结构的存储要求进行 API 定制&#xff0c;对于大部分高级语言而言&#xff0c;都会提供已经实现好的、可直接使用的 API&…

基于PythonOpenCv的视频图像处理

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

【教程】虚拟环境与Pytorch安装保姆级教学

【教程】虚拟环境与Pytorch安装保姆级教学NVIDIA驱动安装虚拟环境创建激活/退出相关库的安装Pycharm内设置虚拟环境Pytorch安装安装地址可能遇到的问题处理报错安装卡顿测试是否安装完成参考NVIDIA驱动安装 NVIDIA驱动可在官网进行安装&#xff1a;NVIDIA驱动官网 命令行输入…

一文上手决策树:从理论到实战

一、基础概念 决策树是一类极为常用的机器学习方法&#xff0c;尤其是在分类场景。决策树通过树形结构来递归地将样本分割到不同的叶子结点中去&#xff0c;并根据每个叶子结点中的样本构成对该结点中的样本进行分类。 我们可以从两个视角来理解决策树模型。 第一种视角是将…

Python副业技术总结,手把手教你用宝塔面板部署Django程序

前言 最近写了几个Django项目&#xff0c;写完以后怎么让对方测试成了问题&#xff0c;因为之前都是自己在本地写的练习项目&#xff0c;对于部署这一块很陌生&#xff0c;不知道怎么操作&#xff0c;内心很忐忑。没办法&#xff0c;只能硬着头皮上&#xff0c;一边百度&#…