高通 android平台LCD驱动分析
目前手机芯片厂家提供的源码里包含整个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驱动分析的更多相关文章
- 高通Android平台硬件调试之Camera篇
之前一段时间有幸在高通android平台上调试2款camera sensor,一款是OV的5M YUV sensor,支持jpeg out,同时也支持AF,调试比较比较简单,因为别的项目已经在使用了, ...
- 高通Android display架构分析
目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...
- 高通Android display分析【转】
本文转载自:http://blog.csdn.net/zhangchiytu/article/details/6777039 高通7系列硬件架构分析 如上图,高通7系列 Display的硬件部分主要由 ...
- 高通安卓调试LCD几方面总结
来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...
- 高通android开发摘要
一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...
- Linux加载DTS设备节点的过程(以高通8974平台为例)
DTS是Device Tree Source的缩写,用来描述设备的硬件细节.在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码, ...
- 高通移植mipi LCD的过程LK代码
lk部分:(实现LCD兼容) 1. 函数定位 aboot_init()来到target_display_init(): 这就是高通原生lk LCD 兼容的关键所在.至于你需要兼容多少LCD 就在whi ...
- Linux的LCD驱动分析及移植
测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 LCD驱动分析 LCD屏的驱动总体上分成两块,一块是GUI ...
- LCD驱动分析(二)帧缓冲设备作为平台设备
参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一> S3C2440 LCD驱动(FrameBuffer)实例开发<二> 1.平台设备注册 1.1在li ...
随机推荐
- Spark技术内幕: Shuffle详解(三)
前两篇文章写了Shuffle Read的一些实现细节.但是要想彻底理清楚这里边的实现逻辑,还是需要更多篇幅的:本篇开始,将按照Job的执行顺序,来讲解Shuffle.即,结果数据(ShuffleMap ...
- linux及windows文件共享
http://blog.csdn.net/pipisorry/article/details/51812022 本文主要说明 linux和windows文件共享, windows和ubuntu互相访问 ...
- storm消费kafka实现实时计算
大致架构 * 每个应用实例部署一个日志agent * agent实时将日志发送到kafka * storm实时计算日志 * storm计算结果保存到hbase storm消费kafka 创建实时计算项 ...
- iOS开发之*.a静态库注意事项
以*.a静态库的形式引入工程的(比如:libUploadLib.a),*.a里面的class有category形式实现时,除了在工程Target的 Build Phases里面的 Link Binar ...
- 收藏了4年的Android 源码分享
Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...
- Deploying Customizations in Oracle E-Business Suite Release 12.2
DeployingCustomizations in Oracle E-Business Suite Release 12.2 This documentdescribes how to deploy ...
- xpath技术解析xml以及案例模拟用户登录效果
问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! xpath就在此情况下产生了--主要是用于快速获取所需的[节点对象]. 在dom4j中如何使用xPath技术 1) ...
- Linux IPC实践(8) --共享内存/内存映射
概述 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据(如图). 共享内存 VS ...
- org.apache.poi.ss.usermodel 类操作excel数据遗漏
直接上图. 错误程序: 循环读取每一行的单元格数据部分 //for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) ...
- Android Studio查看应用数字签名-android学习之旅(76)
Android Studio和Eclispe还是有比较大的区别,在这地方,eclipse可以直接在设置里面,而AS就需要通过Terminal来查看 步骤 1.首先定位到.android 一般都是在C盘 ...