先来看一下 board-9615.c 文件

MACHINE_START(MSM9615_CDP, "QCT MSM9615 CDP")
.map_io = msm9615_map_io,
.init_irq = msm9615_init_irq,
.handle_irq = gic_handle_irq,
.timer = &msm_timer,
.init_machine = msm9615_cdp_init,    // 在这个函数里面调用 mdm9615_init_fb
.reserve = msm9615_reserve,
#ifdef CONFIG_FB_MSM
.init_early = mdm9615_allocate_memory_regions,   // 在这个函数里面allocate frambuffer 空间
#endif
MACHINE_END

static void __init msm9615_cdp_init(void)
{
msm9615_common_init();
#ifdef CONFIG_FB_MSM
mdm9615_init_fb();
#endif
}

static void __init mdm9615_allocate_memory_regions(void)
{
mdm9615_allocate_fb_region();  // 这个函数定义在 board-9615-display.c 文件里
}

kernel启动时  在 start_kernel函数中调用 setup_arch(&command_line)函数, 在setup_arch函数中调用
mdm9615_allocate_memory_regions,从而分配了 frambuffer的空间。

start_kernel----->setup_arch------> mdesc->init_early(即 mdm9615_allocate_memory_regions)

设备初始化时调用 mdm9615_init_fb()
mdm9615_init_fb()函数定义在 board-9615-display.c 文件中

void __init mdm9615_init_fb(void)
{
platform_device_register(&msm_fb_device);

#if 0 //Modified by BroadMobi
platform_device_register(&ebi2_epson_s1d_panel_device);
#else
platform_device_register(&ebi2_sh1106_panel_device);
#endif

msm_fb_register_device("ebi2_lcd", &ebi2_lcdc_pdata);
}
该函数依次向platform总线添加 msm_fb设备 ,ebi2_sh1106设备 , ebi2_lcd设备

下面来看看LCD驱动初始化流程吧,从这个sh1106 oled屏初始化开始看起。

static int __init sh1106_init(void)
{
int ret;
struct msm_panel_info *pinfo;

ret = platform_driver_register(&this_driver); // 注册ebi2_sh1106驱动, 在probe函数中获得 platform_data
if (!ret) { // 若驱动注册成功, 填充panel_info
pinfo = &sh1106_panel_data.panel_info;
pinfo->xres = PANEL_WIDTH;
pinfo->yres = PANEL_HEIGHT;
MSM_FB_SINGLE_MODE_PANEL(pinfo);
pinfo->type = EBI2_PANEL;
pinfo->pdest = DISPLAY_1;
pinfo->wait_cycle = 0x821000;  //EBI2 cfg0寄存器配置, 读写等待时间
pinfo->bpp = 16;
pinfo->fb_num = 2;
pinfo->lcd.vsync_enable = FALSE;

ret = platform_device_register(&this_device); // register ebi2_sh1106 device again, probe function will be called again
if (ret)
platform_driver_unregister(&this_driver);
}

return ret;
}

首先注册ebi2_sh1106驱动,在probe函数中获得platform_data。若注册成功,填充panel_info结构体(分辨率,类型,bpp等),然后再次
注册ebi2_sh1106设备,probe函数中的 msm_fb_add_device(pdev)函数将被调用,这个函数定义在 msm_fb.c 文件中。

msm_fb_add_device()函数主要功能:

创建 ebi2_lcd 平台设备, 并将 ebi2_sh1106 设备的 platform_data (sh1106_panel_data)传递给 ebi2_lcd 平台设备的 platform_data。 创建一个 fb_info 结构体,填充 mfd(msm_fb_data_type),分别将 mfd 和 fbi 放到 mfd_list

和 fbi_list 的全局数组中,最后向系统注册 EBI2_LCD 平台设备。

EBI2_LCD 平台设备再次注册, EBI2_LCD 平台驱动的probe函数也将被再次调用, 现在来看看 ebi2_lcd.c中的probe函数
再次调用 ebi2_lcd_probe函数,主要实现下面功能:
1. 从 platform_device结构体中获得 mfd (msm_fb_data_type)结构体;
2. 创建 mdp platform_device结构体,将从 ebi2_sh1106 设备获得的 platform_data (sh1106_panel_data)再次传递给 mdp 平台设备;
3. 设置mdp platform_device 的platform_data(msm_fb_panel_data)的 on/off接口,并将EBI2_LCD platform_device结构体赋值给msm_fb_panel_data中的next指针,即mdp platform_device 是 EBI2_LCD (LCDC)的父节点;
4. 设置 EBI2_CHIP_SELECT_CFG0 寄存器的 6-7位 0x01 ,即设置 EBI2_CS(4)为 LCD device connected, 设置 EBI2_LCD_CFG0寄存器(调整各种信号的时间长度,需要多调试,否则可能因时序问题出现各种bug, 图像偏移,字符扭曲等现象);
5. 获得读写屏寄存器的 cmd_port ,data_port 地址
6. 注册 mdp 平台设备

mdp 平台设备注册,系统必然会调用到该设备驱动的probe函数, 在 ebi2_host.c文件中

ebi2_host_probe()函数实现下面功能:
1. 创建 msm_fb 平台设备, 并将从 ebi2_sh1106 设备一路传递过来的 platform_data (sh1106_panel_data)赋值给msm_fb 的 platform_data
2. 初始化 msm_fb 的 on/off函数接口, 并将 mdp 的 platform device结构体赋值给 msm_fb platform_data (sh1106_panel_data)的 next, 即  msm_fb device 是  mdp device的父节点
3. 再次注册   msm_fb device 到系统中

msm_fb device 被再次注册, msm_fb driver中的probe函数迟早也会被再调用一次
在 msm_fb_probe 函数中,调用 msm_fb_register(mfd)函数,该函数会对前面讲到的fb_info结构体进行填充,
设置fb_var_screen和fb_fix_screen结构体的显示参数,包括图像显示格式、可见分辨率、虚拟分辨率、红绿蓝
色域的偏移、帧率、虚拟基地址等等一些参数,并将高通平台自带的fb_ops接口填充到fb_info结构体里面,然后
调用register_framebuffer来创建fb0 device。至此,fb0的建立已经完成,应用层可以对fb0节点的控制来操

作framebuffer缓冲区。

从头看来发现整个LCD驱动的流程都是通过相应的platform_device中的id 和probe函数控制从底到上的顺序 来初始化各个功能模块

ebi2_sh1106(具体的屏驱动)--->EBI2_LCD(LCDC)--->mdp--->msm_fb

通过这种方法可以控制驱动注册的先后顺序,值得学习。

QUALCOMM MDM9X15 LCD初始化流程相关推荐

  1. Uboot 板级初始化流程and so on

    -------------------------- 本文以U-boot 2018.09源码 mips mt7621进行举例说明. 此预期的理论初始化流程适用于全U-boot和SPL(Secondar ...

  2. OSAL初始化流程分析

    我使用的协议栈版本及例子信息: ZigBee2006\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SampleApp    ...

  3. Linux内核网络栈1.2.13-网卡设备的初始化流程

    参考资料 <<linux内核网络栈源代码情景分析>> 网卡设备的初始化 本文主要描述一下网卡设备的整个初始化的过程,该过程主要就是根据设备的硬件信息来获取与传输网络数据,注册相 ...

  4. 开机流程简介--init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)

    init 处理系统初始化流程 (/etc/rc.d/rc.sysinit) 还记得上面提到 /etc/inittab 里头有这一句' si::sysinit:/etc/rc.d/rc.sysinit ...

  5. 关于Flutter初始化流程,我必须告诉你的是...

    作者:闲鱼技术-然道 1. 引言 最近在做性能优化的时候发现,在混合栈开发中,第一次启动Flutter页面的耗时总会是第二次启动Flutter页面耗时的两倍左右,这样给人感觉很不好.分析发现第一次启动 ...

  6. SpringMVC源码剖析(三)- DispatcherServlet的初始化流程

    我们启动web服务器,在浏览器中输入地址,就可以看到浏览器上输出我们写好的页面.为了更好的理解上面这个过程,你需要学习关于Servlet生命周期的三个阶段,就是所谓的"init-servic ...

  7. 深入分析 Flutter 初始化流程

    在调研 Flutter 动态化方案的时候,需要了解 Flutter 加载 dart 产物的流程,阅读了一部分源码,顺便也读了初始化相关的代码.于是梳理了一遍 Flutter 的初始化流程 flutte ...

  8. android6.0源码分析之Camera API2.0下的初始化流程分析

    1.Camera2初始化的应用层流程分析 Camera2的初始化流程与Camera1.0有所区别,本文将就Camera2的内置应用来分析Camera2.0的初始化过程.Camera2.0首先启动的是C ...

  9. caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)

    深度学习 Caffe 初始化流程理解(数据流建立) 之前在简书的文章,搬迁过来 ^-^ 本文是作者原创,如有理解错误,恳请大家指出,如需引用,请注明出处. #Caffe FeatureMap数据流的建 ...

最新文章

  1. 【单调队列】【DP】城市交通(jzoj 1749)
  2. 具有Spring的简单工作流引擎
  3. C语言整数与字符串相互转换
  4. 【OpenCV学习】梯度化一张图片
  5. api-ms-win-crt-runtimel1-1-0.dll缺失的终极解决方案
  6. SpringBoot 1.快速搭建一个 SpringBoot Maven工程
  7. Skype for Business Server 2015-01-基础环境-准备
  8. Java多线程 | 用多个线程模拟实现银行叫号系统
  9. CREO:CREO软件的简介、安装(七大步骤)、学习路线大全(CREO软件各模块界面解释—菜单栏快速栏工作区、草绘/零件/工程图/装配设计讲解)、案例应用(几十个案例)之详细攻略
  10. 快速截图工具——百度输入法的扩展功能
  11. python报错Statements must be separated by newlines or semicolons解决方法
  12. C#莱姆达表达式的使用
  13. 中国大学mooc慕课题库答案怎么查,这里全有了
  14. 静态路由 动态路由 默认路由 默认网关
  15. android kl文件编辑,Android手机固件的简单修改教程
  16. iOS手机自带浏览器Safari无法长按保存图片
  17. 解决前端跨域的问题.Access to XMLHttpRequest at http://xxx.xxx from origin 'http://localhost:8000' has been bl
  18. 基于JAVA某日杂商店进销存管理系统设计计算机毕业设计源码+数据库+lw文档+系统+部署
  19. 在Nasa网站下载最新 MODIS 数据的详细步骤 ------十分详细
  20. 学习别人的方法,借鉴

热门文章

  1. 朋友圈可以修改可见范围了
  2. 笔记本硬盘与移动硬盘之间的转换
  3. 关于微信小程序文字水平垂直居中
  4. 国产数据库-达梦数据库安装
  5. 【烈日炎炎战后端】计算机网络(4.2万字)
  6. 微软输入法自动导入小鹤双拼
  7. 识别 Cisco交换机型号
  8. 学习路之数据库:sql查询时添加一列固定值
  9. 吴恩达OpenAI最新课程:prompt-engineering-for-developers读书笔记
  10. Web安全测试:使用火狐浏览器修改请求参数