目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(),从而生成/dev/fbx的设备节点。这里最重要的数据结构是fb_ops,它包括fb打开、参数设置、画图、配置、内存映射等操作函数,芯片厂家通常提供了这部分的源码,因为这些操作一般是跟芯片内部的DMP和MIPI
DSI等部件打交道。

当开发一款新的LCD驱动时往往需要关注的是LCD最底层的驱动,即是LCD屏的初始化、亮屏、熄屏以及背光操作。个人觉得以下几个问题有必要弄清楚(参考Qualcomm芯片上的驱动代码):

1、如何添加一款新屏驱动

        下面以东芝屏为例(参照源代码mipi_toshiba_video_wvga_pt.c mipi_toshiba.c)

        模块初始化:module_init(mipi_video_toshiba_wvga_pt_init);

        在mipi_video_toshiba_wvga_pt_init()中主要工作是设置LCD屏的参数,然后注册一个名为mipi_toshiba的平台驱动和平台设备。在注册平台设备时将LCD亮屏、熄屏以及背光操作添加到平台设备中。在mipi_toshiba的平台驱动中利用probe函数调用msm_fb_add_device()。当需要添加一款新屏的驱动时最主要的工作就是注册一个相关的平台驱动和平台设备,可以参照上面的两个源文件。这里需要说明一下:msm_fb_add_device()函数里定义了一个非常重要的数据结构msm_fb_data_type
mfd,这个结构里包括了fb_info,还定义了panel有关的变量。

2、LCD驱动是如何依次打开MDP、MIPI DSI和LCD PANEL

        首先在驱动里注册了三个平台设备msm_fb,mdp,mipi_dsi,然后再对应平台驱动probe的时候把各自设备的指针链接到一起,看下面的调用关系:

mdp_probe(pdev)

                     |

                     |--->msm_fb_dev = platform_device_alloc('msm_fb', pdev->id)

                     |

                     |

                     |--->pdata = msm_fb_dev->dev.platform_data

                     |

                     |

                     |--->pdata->on = mdp_dsi_video_on

                     |

                     |

                     |--->pdata->off = mdp_dsi_video_off

                     |

                     |

                     |--->pdata->next = pdev

mipi_dsi_probe(pdev)

                     |

                     |--->mdp_dev = platform_device_alloc('mdp', pdev->id)

                     |

                     |

                     |--->pdata = mdp_dev->dev.platform_data

                     |

                     |

                     |--->pdata->on = mipi_dsi_on

                     |

                     |

                     |--->pdata->off = mipi_dsi_off

                     |

                     |

                     |--->pdata->next = pdev

mipi_toshiba_lcd_probe(pdev)

                     |

                     |

             msm_fb_add_device(pdev)

                     |

                     |

                     |--->pdata = pdev->dev.platform_data

                     |

                     |

                     |--->this_dev = msm_fb_device_alloc(pdata, type, id)

                                                                         |

                                                                         |

                                                                         |--->this_dev = platform_device_alloc()

                                                                         |

                                                                         |

                                                                         |--->platform_device_add_data(this_dev, pdata, ...)

当pdata->next指向this_dev时,执行pdata->on,pdata->off时,即调用到mipi_toshiba_lcd_on和mipi_toshiba_lcd_off。

从上面的分析来看,从MDP到panel的调用顺序应该是:mdp_dsi_video_on-->mipi_dsi_on-->mipi_toshiba_lcd_on。msm_fb_blank_sub()是通过mfd->pdev->dev.platform_data来获取pdata,再调用pdata->on(),从而完成上面的调用,在这里mfd->pdev->dev.platform_data指向的就是msm_fb设备的数据。

3、mfd是如何保存msm_fb设备的指针

msm_fb_add_device(pdev)

                     |

                     |--->fbi=framebuffer_alloc(sizeof(struct msm_fb_data_type),NULL)

                     |

                     |

                     |--->mfd=(struct msm_fb_data_type *)fbi->par

                     |

                     |

                     |--->mfd->pdev=this_dev  (this_dev即mipi_dsi)

                     |

                     |

                     |--->platform_set_drvdata(this_dev,mfd)

mipi_dsi_probe(pdev)

                     |

                     |--->mfd=platform_get_drvdata(pdev)

                     |

                     |

                     |--->mfd->pdev=mdp_dev

                     |

                     |

                     |--->platform_set_drvdata(mdp_dev,mfd)

mdp_probe(pdev)

                     |

                     |--->mfd=platform_get_drvdata(pdev)

                     |

                     |

                     |--->mfd->pdev=msm_fb_dev

                     |

                     |

                     |--->platform_set_drvdata(msm_fb_dev,mfd)

               

        从上面的调用关系来看,mfd->pdev最终指向了平台设备msm_fb,值得一提的是,在这几个函数中完成了mfd结构的填充。

int panel_next_on(struct platform_device *pdev)

每次执行完一个->on后执行panel_next_on,执行下一个->on

高通 android平台LCD驱动分析的更多相关文章

  1. 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...

  2. 高通Android display架构分析

    目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...

  3. 高通Android display分析【转】

    本文转载自:http://blog.csdn.net/zhangchiytu/article/details/6777039 高通7系列硬件架构分析 如上图,高通7系列 Display的硬件部分主要由 ...

  4. 高通安卓调试LCD几方面总结

    来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...

  5. 高通android开发摘要

    一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...

  6. Linux加载DTS设备节点的过程(以高通8974平台为例)

    DTS是Device Tree Source的缩写,用来描述设备的硬件细节.在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码, ...

  7. 高通移植mipi LCD的过程LK代码

    lk部分:(实现LCD兼容) 1. 函数定位 aboot_init()来到target_display_init(): 这就是高通原生lk LCD 兼容的关键所在.至于你需要兼容多少LCD 就在whi ...

  8. Linux的LCD驱动分析及移植

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 LCD驱动分析 LCD屏的驱动总体上分成两块,一块是GUI ...

  9. LCD驱动分析(二)帧缓冲设备作为平台设备

    参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>   S3C2440 LCD驱动(FrameBuffer)实例开发<二> 1.平台设备注册 1.1在li ...

随机推荐

  1. JobTracker,TaskTracker简述

    JobTracker 负责接收用户提交的作业,负责启动.跟踪任务执行.JobSubmissionProtocol是JobClient与JobTracker通信的接口.InterTrackerProto ...

  2. Unity UGUI图文混排源码(四) -- 聊天气泡

    这里有同学建议在做聊天气泡时,可以更改为一张图集对应多个Text,这样能节省资源,不过我突然想到每个Text一个图集,可以随时更换图集,这样表情图更丰富一些,于是我就先将现有的聊天demo改为了聊天气 ...

  3. 安卓2.x的版本使用4.x的主题

    现在,还有大部分安卓开发者在开发安卓APP时使用的是2.x的SDK版本,为了兼容2.x的手机这本倒无可厚非,但最令人头痛的就是2.x版本的主题是在太丑了,这是安卓刚推出时只考虑到了实用,并没考虑到美观 ...

  4. springMVC+Hibernate4+spring整合实例二(实例代码部分)

    UserController.java 代码: package com.edw.controller; import java.io.IOException; import java.io.Print ...

  5. Android开发_TextView跑马灯

    关键代码: android:singleLine="true" android:ellipsize="marquee" android:focusable=&q ...

  6. Java基础---Java---正则表达式-----匹配、切割、替换、获取等方法

    正则表达式:符合一定规则的表达式 作用:用于专门操作字符串 特点:用于一些特定的符号来表示一些代码操作,这样就简化书写,主要是学习一些特殊符号的使用 好处:可以简化对字符串的复杂操作. 弊端:符号定义 ...

  7. 关于新版本,iOS10的相关内容,兼容iOS 10 资料整理笔记

    1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserN ...

  8. Android的ProgressBar进度条-android学习之旅(三十一)

    ProgressBar 简介 ProgressBar是一种很常用的Ui,用于给复杂的操作显示进度,提供更好的用户相应.使用setProgress()incrementProgressBy()来设置进度 ...

  9. hive支持in用法是从0.3.2版本后

    写hive 用in 如分时段,分类型,分平台统计点击量 select substr(createtime,12,2) hour,logtype,os_id,count(*)  from  wizad_ ...

  10. [GitHub]第七讲:GitHub issues

    文章转载自:http://blog.csdn.net/loadsong/article/details/51591701 Github 上的每个项目仓库,都有三套基础设置可供使用:一个是通过 Gith ...