移植Linux系统到iMX6开发板之LVDS显示屏驱动程序的框架分析与移植

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

今天记录一下项目中的关于LVDS显示屏的驱动程序的分析与移植。因为驱动源码厂家已经提供好,我们需要做的就是读懂驱动程序的代码,以及平台层的匹配过程,以及如何在uboot中获取lvds参数,来匹配你的具体显示屏的参数。

首先我们来大致分析一下驱动程序的重要的结构部分:

1.mxc_ipuv3_fb.c 是imx6具体显示模块平台核心的驱动,最终用于把fb_info结构体注册到
framebuffer驱动核心层中。
2.mxc_dispdrv.c 通用注册handle接口,用于统一管理imx6显示模块的各种接口,
比如lvds,lcd,hdmi等显示接口。
3.ldb.c是LVDS 驱动的具体实现过程。

分析:
mxc_ipuv3_fb.c中
在mxc_ipuv3_fb.c文件中初始化mxcfb_init函数注册mxcfb_driver结构体,
当mxcfb_driver结构体成员驱动name与平台设备层中name匹配相同时调用mxcfb_probe初始化函数。
imx6具体显示模块平台核心的驱动的工作主要是在mxcfb_probe里完成。

以下是将重要的函数抽出来分析,并不是具体的代码程序。具体的代码程序见最后的分析。

mxcfb_probemxcfb_init_fbinfoframebuffer_allocmxcfb_option_setupfb_get_options(根据uboot传进来的参数,比较是否匹配,获取分辨率,bpp等参数)mxcfb_dispdrv_initmxc_dispdrv_gethandleif (!strcmp(entry->drv->name, name) && (entry->drv->init)) //如果uboot传进来的参数名字与ldb_driver里注册的名字匹配时,就会进入就会执行ldb.c文件里的ldb_disp_init函数entry->drv->init  //mxc_dispdrv.c 调用对应driver的init函数,这里就是ldb driver对应的init了。mxcfb_registerregister_framebufferentry->drv->init是如何调用ldb_disp_init?当ldb.c中ldb_grv结构体中的name与uboot传进来的名字相匹配,就会调用.init,static struct mxc_dispdrv_driver ldb_drv = {.name 	= DISPDRV_LDB,.init 	= ldb_disp_init,.deinit	= ldb_disp_deinit,.setup = ldb_disp_setup,
};

ldb.c中ldb_probe()
第三步调用mxcfb_dispdrv_init函数,它会调用在mxc_dispdrv.c文件的mxc_dispdrv_gethandle函数;
根据uboot传到内核的显示设备name(ldb),在dispdrv_list链表中匹配获取对应的driver handle;
这里是获取的是ldb的handle,它的注册是ldb_probe()里的mxc_dispdrv_register函数的,它将自己
添加到dispdrv_list。通过entry->drv->init函数,当从uboot获取的显示设备名字和ldb driver里
注册的名字match匹配时,就会执行ldb.c文件里的ldb_disp_init函数(具体见另一个文档,告诉你
如何实现参数匹配),然后通过结构体fb_videomode[]来设置屏幕的分辨率、刷新频率、上下左右
页边距、行扫描脉宽、场扫描脉宽等参数。ldb_disp_init函数是LVDS驱动具体实现函数。

ldb_disp_initret = fb_find_mode(具体硬件参数的匹配过程,分析见另一篇文章链接为:)return ret

上面大致框架分析好后,一定要看一下具体硬件的参数匹配过程,见上面链接(链接:iMX6开发板移植Linux系统之LVDS显示屏驱动程序分析之LVDS参数的匹配过程分析),然后就是如何设置我的参数,来匹配我的开发板了:

首先在这个结构体中,需要知道具体的参数:

/* include/linux/fb.h */struct fb_videomode {  
2.     const char *name;  “LDB-WSVGA”    /* 名字 */  
3.     u32 refresh;        60    /* 刷新频率 */  
4.     u32 xres;           1024  //行像素  
5.     u32 yres;           768   //列像素  
6.     u32 pixclock;       19528(14065) //时钟频率,单位ps,14430  
7.     u32 left_margin;    140   // HBPD(horizontal back porch):80  
8.     u32 right_margin;   160   // HFPD(horizontal front porth):48  
9.     u32 upper_margin;   20    // VBPD(vertical back porch),15  
10.    u32 lower_margin;   12    // VFBD(vertical front porch),2  
11.    u32 hsync_len;      20    // HSPW(horizontal sync pulse width):32  
12.    u32 vsync_len;      3     // VSPW(vertical sync pulse width):47  
13.    u32 sync;           0 
14.    u32 vmode;          
15.    u32 flag;  
16.};  

我们的参数为:

整屏刷新频率 60M
屏幕分辨率 1024*768
时钟频率 14065
left_margin 40(单位像素)
right_margin 40(单位像素)
upper_margin 10(单位像素)
lower_margin 3(单位像素)
行扫描脉宽 hsync_len 80(单位像素时间)
场扫描脉宽vsync_len 10(单位像素时间)

在i.mx6中,关于lvds液晶屏的这个结构体参数(系统lvds接口支持的lcd时序参数都在此了)所属文件为:driver/video/mxc/ldb.c

static struct fb_videomode ldb_modedb[] = {{"LDB-WXGA", 60, 1280, 800, 14065,40, 40,10, 3,80, 10,0,FB_VMODE_NONINTERLACED,FB_MODE_IS_DETAILED,},{"LDB-XGA", 60, 1024, 768, 15385,220, 40,21, 7,60, 10,0,FB_VMODE_NONINTERLACED,FB_MODE_IS_DETAILED,},{"LDB-WSVGA", 60, 1024, 600, 19528,140, 160,20, 12,20, 3,0,FB_VMODE_NONINTERLACED,FB_MODE_IS_DETAILED,},{"LDB-WSVGA480", 60, 1024, 480, 23000,140, 160,20, 12,20, 3,0,FB_VMODE_NONINTERLACED,FB_MODE_IS_DETAILED,},{"LDB-1080P60", 60, 1920, 1080, 7692,100, 40,30, 3,10, 2,0,FB_VMODE_NONINTERLACED,FB_MODE_IS_DETAILED,},{"LDB-QXGA", 30, 2048, 1536, 9746,5, 150,9, 3,5, 1,0,FB_VMODE_NONINTERLACED,FB_MODE_IS_DETAILED,},};

我们选用"LDB-WSVGA"这个结构体里的内容作为我们的参数,将参数修改好适合我们的的参数。

经过后来做实验,发现启动后显示屏显示的有问题,显示的不完全,经过后来的搜索,我在uboot启动后,输入参数,来覆盖上面的结构体参数,屏幕显示就正常了。具体原因没有分析,以后有时间再做具体分析。
uboot启动后输入的具体参数为:

setenv bootargs_mmc 'setenv bootargs ${bootargs} ip=off root=/dev/mmcblk0p1 rootwait rw video=mxcfb0:dev=ldb,LDB-WSVGA,if=RGB24,bpp=32 video=mxcfb1:off video=mxcfb2:off ldb=sin0 fbmem=28M fb0base=0x27b00000 '

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

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

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

相关文章

Java api 1.8 中文 帮助文档

java 1.6 帮助文档 中文 链接:http://download.csdn.net/detail/qw599186875/9608735 英文 Java1.8 帮助文档 英文 中文 – 谷歌版 在线版: https://blog.fondme.cn/apidoc/jdk-1.8-google/下载链接:http://download.csdn.net/detail/qw599186875/980219…

设计模式记--Observer Pattern观察者模式

观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新. 从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需要有发布者(Publish),也可称为被观察的目标 (…

前端学习(64):css继承属性小结

今天来总结一点关于css中哪些属性可以被继承,哪些不可以被继承。不是很全,仅供大家参考,也方便于自己以后复习。 一、不能被继承的属性 1、display:规定元素应该生成的框的类型 2、文本属性: vertical-align、 text…

iMX6开发板移植Linux系统之LVDS显示屏驱动程序分析之LVDS参数的匹配过程分析

学习交流加 个人qq: 1126137994个人微信: liu1126137994学习交流资源分享qq群: 962535112 上一篇分析LVDS驱动程序移植过程的文章(文章链接为:移植Linux系统到iMX6开发板之LVDS显示屏驱动程序的框架分析与移植&#xf…

日常spoken英语学习

今天遇到一个老外,说:can you speak engilsh dou you know coffee in here 我是想了半天,第一有点蒙,第二确实忘了,咖啡馆在哪了,回了一句:Iam think 感觉不知道如何组织语言了,口…

【C++深度剖析教程9】初探C++标准库

在这之前&#xff0c;我写的C程序不能叫做标准的C程序&#xff0c;因为里面写的大多数还带有C语言的影子。今天我们来学习C标准库。 首先看一下例子&#xff1a;操作符<<的原生意义是按位左移。那么我们重载这个操作符&#xff0c;将变量或者常量&#xff0c;左移到一个…

Quartus II常见问题集锦

1、 【问题】Pin Planner 的使用问题&#xff1a;在QuartusII 7.2 &#xff0c;时序仿真都通过&#xff0c;但是&#xff0c;一旦使用Pin Planner设定引脚后&#xff0c;时序仿真就发生变化&#xff0c;与功能仿真结果不一致&#xff0c;不是理想的结果。使用Pin Planner时要注…

员工考核UI网页界面(PS大屏文件资料)

现分享人员管理可视化数据统计网页UI、员工考核数据可视化UI网页界面模版的UI源文件&#xff0c;供UI设计师们快速获取PSD源文件完成工作。 若需更多 大屏组件&#xff0c;请移步小7的另一篇文章&#xff1a;数据可视化大屏组件&#xff0c;大屏PSD设计源文件(大屏UI设计规范)…

【C++深度剖析教程10】C++中的字符串类

首先我们看看C语言&#xff1a; C语言不支持真正意义上的字符串C语言用字符数组和一组函数实现字符串操作语言不支持自定义类型&#xff0c;一次无法获得字符串类型 从C到C中的进化过程中引入了自定义类型 在C中&#xff0c;可以通过类完成字符串类型的定义 C标准库提供了st…

docker 使用中遇到的问题

1.执行docker run hello 命令建立镜像过程中报错 开始以为是加速器的问题&#xff0c;将/etc/docker/daemon.json 文件删除还是不行 后来执行了这两条命令&#xff1a;就不报错了如下图&#xff1a; systemctl daemon-reloadsystemctl restart docker.service 参考&#xff1…

广州技术沙龙第 2、3 期参会者twitter、blog、兴趣大合集

随着组织者越来越有经验&#xff0c;我们在第 2、3 期报名的时候&#xff0c;让参会者填上自己的 twitter、blog和兴趣方向&#xff0c;为的就是让大家方便地找到与自己志同道合的朋友&#xff0c;今天推出第一个合集&#xff0c;祝大家找到新朋友。 注&#xff1a;twitter 账号…

maven 解决冲突

1.Maven之jar包冲突解决&#xff08;理解maven 产生冲突的原因&#xff09; 导致jar包冲突的原因 1、mvn的传递依赖特性&#xff1a;mvn编译打包除了会引入直接申明的依赖&#xff0c;还会引入间接申明的依赖 2、mvn的依赖仲裁规则&#xff1a; 1&#xff09;. 按照项目总控P…

jz2440开发板修改UBOOT支持NAND FLASH

很多天没有看嵌入式的东西了&#xff0c;今天来看一下&#xff0c;继续之前移植uboot到jz2440开发板。今天我们来实现Uboot支持NAND FLASH。 在之前的文章里&#xff08;点击连接查看之前的记录&#xff09;&#xff0c;我们为了编译通过把NAND FLASH 给屏蔽掉了&#xff0c;现…

i.MX6网卡驱动程序fec.c的分析(AR8035网卡驱动程序的详细分析)之一

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 因为做的项目需要用到ethercat主站&#xff0c;而用ethercat主站&#xff0c;标准的网卡网络协议栈性能就无法达到要求&#xff0c;需要根据ethercat官…

TOAD常用快捷键

现在在企业中&#xff0c;操作oracle数据库的客户端&#xff0c;除了PL/SQL外&#xff0c;使用的较多的就是TOAD了&#xff01; 为此&#xff0c;我在网上搜索了下&#xff0c;整理了些简单TOAD的使用技巧&#xff0c;现分享给大家。 常用快捷键&#xff1a; F8 调出以前执行的…

i.MX6网卡驱动程序fec.c的分析(AR8035网卡驱动程序的详细分析)之二

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天接着分析上次没有分析完的i.MX6网卡驱动程序。上一篇分析了iMX6网卡驱动程序的driver与device的加载过程&#xff08;点击可以查看上一篇文章&…

文档视图

IntelliFMEA是从IntelliQMS项目的子项目&#xff0c;可单独发布。在IntelliQMS中的APQP插件设计了一个更为完整的项目管理。在IntelliFMEA中的项目管理只是对FMEA有关的文档进行管理的一种方式。IntelliFMEA文档视图的工作方式是:1. 浏览和级联显示IntelliFMEA当前项目的文档清…

阅读ethercat官方文档关于ethercat网卡驱动程序的一些内容

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 改造iMX6&#xff08;fec&#xff09;网卡驱动程序前期工作之&#xff1a;阅读ethercat-1.5.2.pdf文档的第四章内容。 ethercat-1.5.2.pdf文档链接&a…

事务和锁

事务和锁 事务的定义 事务&#xff08;Transaction&#xff09;&#xff0c;一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 事务…

数据库表的字段中含空格怎么办?

数据库建表&#xff1a; create table t1203 ("ha ha" varchar(100));查询语句&#xff1a;select "ha ha" from t1203;插入数据&#xff1a;insert into t1203("ha ha") values(hello world);其他类似.... 转载于:https://www.cnblogs.com/s…