目前手机芯片厂家提供的源码里包含整个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. XML之DOM解析模型

    <?xml version= "1.0" encoding = "UTF-8"> <articles> <article cate ...

  2. 高通msm8994性能及温度监测脚本

    [plain] view plain copystartTime=$(date +%Y-%m-%d-%H-%M-%S)  pathName="/data/cpu_logs"  fi ...

  3. 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文

    . 一. 编译错误 1. "AndroidManifest.xml file not found" 错误 (1) 报错信息 报错信息 : -- Message Make : Inf ...

  4. 【Android应用开发】Android Studio 简介 (Android Studio Overview)

    一. Intelij IDEA 环境简介 Android Studio 来源 : Android Studio 是 Intelij IDEA 的免费版本 + Android SDK 集成的; -- I ...

  5. Android Studio设置代理更新下载SDK

    代理主机和端口号按下图设置即可,便可以轻松的下载更新SDK啦~~~

  6. hive中使用case、if:一个region统计业务(hive条件函数case、if、COALESCE语法介绍:CONDITIONAL FUNCTIONS IN HIVE)

    前言:Hive ql自己设计总结 1,遇到复杂的查询情况,就分步处理.将一个复杂的逻辑,分成几个简单子步骤处理. 2,但能合在一起的,尽量和在一起的.比如同级别的多个concat函数合并一个selec ...

  7. ROS(indigo)使用Qt Creator Plug in即ros_qtc_plugin

    更为详细版本请参考: http://blog.csdn.net/zhangrelay/article/details/52214411 结合看更为具体. 首先,先上原版参考: 1 http://wik ...

  8. iOS中 百度地图详解 韩俊强的博文

    需要准备工作按照下图引进类库 需要添加 添加的两个字符串为:NSLocationWhenInUseUsageDescription  /  NSLocationAlwaysUsageDescripti ...

  9. 今天我成为了CSDN博客专家

    刚刚收到了来自CSDN的回复,正如我的期待: 我随即回到自己的博客页面,欣喜地看到"专家"勋章被点亮了.Oh, yeah~ Q:我为什么要申请这个"专家"称号? ...

  10. Spark1.4从HDFS读取文件运行Java语言WordCounts并将结果保存至HDFS

    本次实验相关信息如下: 操作系统:Ubuntu 14 Hadoop版本:2.4.0 Spark版本:1.4.0 运行前提是Hadoop与Spark均已正确安装配置 2.在Linux中生成一个文件tes ...