高通平台lcm 总结
以下几幅图是最近的一段时间对自己模块LCM的一些总结,目前只是完成了一部分,而且描述的不是特别到位,后期会不断更新和修改的。
第一幅是LCM的总体移植框架和组件图。介绍了LCM驱动的分部和调试屏的步骤和要点。
分lk和kernel两个部分,具体哪些.c,如何添加一块新屏,大体的步骤和方法。
第二幅图是屏的初始化流程图,分为lk和kernel两部分。Lk部分如下所示:
系统起来的时候会调用 bootable/bootloader/lk/app/aboot/aboot.c, 在这个函数里面的 aboot_init()函数里调用显示屏初始化函数target_display_init(),在这个函数里面调用gcdb_display_init()。
在这个函数中有个相当重要的函数就是oem_panel_select(),定义在oem_panel.c中,它根据高通私有代码传进来的hw_id 来决定你到底使用哪一款LCD,并把panel相关数据信息填充到数据结构中--init_panel_data(),gcdb_display_init()中执行完 oem_panel_select()确定使用的panel和panel相关信息后,通过函数指针赋值了一系列与此panel相关的功能函数,包括pll,背光,clk,供电相关的初始化和使能函数,以便在下面进行调用。
同时, 开始执行 一系列屏初始化流程。第一步,上电,执行pdata->power_func,打开一些ldo,使能一些系统电源,拉高一些gpio, 使得屏得到供电,并且在里面对屏做reset,调用的函数是target_panel_reset(),在里面对reset引脚做高低高操作。然后使能时钟,调用pdata->clk_func,接着做一些使能pll,分配framebuffer,通过fbcon_setup(&(panel->fb))函数设置记录显示的分辨率和显示地址等全局指针。接下来进入msm_display_config()函数针对LVDS_PANEL,MIPI_VIDEO_PANEL,MIPI_CMD_PANEL等类型进行dsi和mipi配置。
经过一些列dsi参数置最后调用 mdss_dsi_panel_initialize(),使用mdss_dsi_cmds_tx()向lcm的driver ic发送了初始化代码。并判断,如果 target_panel_auto_detect_enabled()打开了话,就使用高通平台的lcm read_id函数mdss_dsi_read_panel_signature()进行id读取。
完成这一系列操作以后执行msm_display_on(),点亮屏,最后一个阶段调用pdata->bl_func(1)打开背光。这样整个LK的lcm初始化就完成了。LK的初始化流程图如下所示。
接下来是kernel阶段LCM的初始化过程。
kernel阶段,首先会在驱动中注册三个平台设备,msm_fb,mdp,mipi_dsi。mdp模块是高通内部的显示控制芯片,mipi_dsi是传输协议层设备,msm_fb是高通显卡的驱动设备。
首先执行的是mdp驱动的probe,进行硬件资源包括时钟,中断,iommu,总线,DMA的初始化,注册一些接口以供fb设备使用。mdp初始化以后初始化dsi控制器,在mdss_dsi_ctrl_probe函数中,调用了一个函数mdss_ds_config_panel,这个函数中,通过名字匹配去获取panel设备节点,如果没有匹配成功就去调用msm-mtp.dtsi设定的预制panel device node。
接下来执行函数dsi_panel_device_register()注册panel_device设备节点。在这个注册函数中,确定了是DSI_VIDEO_MODE还是MIPI_CMD_MODE,获取了一些资源如gpio,regulatot,dsi-lane相关的信息,重要的是它注册了一个event_handler:mdss_dsi_event_handler,这个事件处理函数会接受其他层传进来的各种event事件包括点亮,熄灭屏等等。也是通过这个event_handler,dsi驱动层与fb层,mdp层进行通信。
然后执行mdss_dsi_panel_init函数进行panel的初始化。这个函数通过解析dtsi文件获取了屏的名字,分辨率,物理尺寸,dsi类型,porch参数,色彩格式,初始化指令,背光模式等一些列参数,并且把它们一一填充到pinfo这个结构体中,并且注册了一些on off ,设置背光,选择模式等操作函数。接下来是mdss_fb设备的初始化,在mdss_fb_probe函数中,通过调用mfd->mdp.init_fnc去初始化mdp,通过lcd_backlight_registered()去注册背光驱动。
在系统开机动画起来的时候,会调用函数mdss_fb_open打开fb控制器,在里面会执行mdss_fb_blank_sub()并传入FB_BLANK_UNBLANK event参数,执行mdss_fb_blank_unblank()函数。这个函数中,通过调用mfd->mdp.on_fnc()执行了mdp驱动中的on_fnc函数,就是mdp3_ctrl_on()函数,该函数向之前dsi驱动中的event handler发送三个事件MDSS_EVENT_LINK_READY,MDSS_EVENT_UNBLANK,MDSS_EVENT_PANEL_ON调用mdss_dsi_panel驱动中mdss_dsi_on()。
在里面执行了配置dsi,上电,reset,发送指令一些列操作从而将屏点亮。这样kernel部分的屏初始化就完成了。
下图就是KERNEL阶段的初始化流程图。
第四幅图,是点亮屏熄灭屏从上层到底层的数据传输图。
如果要灭屏,上层会调用PowerManagerService提供的方法。整个过程的调用关系是goToSleep->goToSleepInternal-> updatePowerStateLocked->updateDisplayPowerStateLocked->
requestPowerState->sendUpdatePowerStateLocked->mHandler.sendMessage(msg)-> updatePowerState->animateScreenStateChange->setScreenState->scheduleScreenUpdate->
postScreenUpdateThreadSafe->mPhotonicModulator.setState->mLock.notifyAll-> mBlanker.requestDisplayState->initPowerManagement->callbacks.onDisplayStateChange->
setHalAutoSuspendModeLocked->nativeSetAutoSuspend
最后到nativeSetAutoSuspend()这个本地方法,是在
frameworks/base/services/jni/com_android_server_power_PowerManagerService.cpp
调用的,调用里面的autosuspend_enable(),这个函数会往/sys/power/state节点中写入
mem。
这个节点,是在kernel/kernel/power/main.c当中创建的sysfs文件节点,一旦往里面写入值就会调用相应的store函数。灭屏,上层写入mem,调用了store当中的suspend函数,于是系统就会走suspend流程。传递到屏这边,在msm_fb系统中调用suspend函数,
经过一些列调用,走到mdss_fb_blank_blank(),调用mfd->mdp.off_fnc,调用mdp_ctrl.c
的mdp_ctrl_off函数,于是panel->set_backlight(panel, 0)关闭背光,通过发送
MDSS_EVENT_BLANK 给dsi驱动中的event_handler,调用mdss_dsi_blank()执行一系列下电灭屏的操作。这样整个灭屏流程就执行完了。
亮屏的话,同样是从PowerManagerService提供方法wake up,最后就调用jni的autosuspend_disable(),往/sys/power/state节点中写入on,最后调用suspend流程点亮屏。
流程图如下所示。
第五幅图,总结了背光调节从上层到底层是如何传输的。
当用户在手机的setting-display-backlights调节背光时,系统将会调用
packages\apps\Settings\src\com\android\settings\BrightnessPreference.java去实现。在这里面设置亮度调节范围0-255,通过powermanagerservice.java的接口setBrightness实现服务。这个方法定义在LightService.java中,调用setBrightness()--->setLightLocked()--->setLight_native()。
这个本地方法在frameworks\base\services\jni\com_android_server_LightsService.cpp下实现。在这个文件下,init_native函数中,调用hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module)获取 lights硬件抽象层模块lights.default.so并加载,调用hall层函数devices->lights[light]->set_light(devices->lights[light],&state)设置亮度。hall层的代码是hardware/qcom/display/liblight/lights.c。
在这里面实现了open_lights,close_lights,rgb_to_brightness等函数。最关键是,调节亮度时候,会调用其中的set_light_backlight(),通过write_int往/sys/class/leds/lcd-backlight/brightness写值。这个文件节点在kernel层创建。kernel层,在Mdss_dsi_panel.c文件里,有一个背光控制函数static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata,u32 bl_level), 参数背光值就是通过这个bl_level进行调节的。
经过一层层调用,实际上在kernel/drivers/leds/Led-class.c中创建的sysfs文件节点/sys/class/leds/lcd-backlight/brightness,并且在store函数中,把当前亮度值存到led_cdev->brightness变量中, 一层层传到驱动的bl_level。这样,就形成了上层到底层的背光调节值的传递。
以上几幅图,总体上概括了LCM驱动部分以及一些上层的关系,流程。这样的整理对自己的模块理解和熟悉是相当有帮助的。随着工作的深入,我会不断补充和完善这个文档,希望能够在实际工作中取得良好的效果。
高通平台lcm 总结相关推荐
- android 高通平台有前途吗,华为鸿蒙计划要适配高通平台了,可以告别安卓搭载鸿蒙OS了?...
鸿蒙走出这一步是可以想象到的,看来华为打造这个系统希望的结果是万物皆可盘呀,所以一开始就提出了开源,也就意味着这次是高通,下次就可以是联发科,甚至更多的手机品牌也完全就可以搭载!早期我们一直在说国产手 ...
- 高通平台android7.1系统显示旋转180度
实现方法 内核层修改 kernel\msm-3.18\arch\arm\boot\dts\qcom\dsi-panel-lm215w-lvds-1080p-video.dtsi增加qcom,mdss- ...
- 高通平台modem部分mbn文件的OTA和PDC升级方法
高通平台modem部分mbn文件的OTA和PDC升级方法 最近需要采用一种移动物联网卡,发现在apns-conf.xml增加了对应apn信息后,部分设备采用新的xml就可以支持新卡,但部分设备还不行, ...
- 高通平台device tree生成platform device的过程(MSM8909)
点击打开链接 在arch/arm/kernel/setup.c中,通过customize_machine函数中的machine_desc->init_machine();来调用高通平台的mach ...
- 高通平台msm8909 LK 实现LCD 兼容
前段时间小米出现红米note2 换屏门,现在我们公司也要上演了:有两个供应商提供不同IC 的LCD panel. 软件区分的办法是读取LCD IC 的ID 寄存器,下面解析高通平台LK中LCD兼容的过 ...
- 华为鸿蒙加快完善,替换安卓!华为鸿蒙OS生态持续扩大:或适配高通平台
近段时间,鸿蒙OS手机版本逐渐揭开庐山真面目,不少网友已经上手体验了一段时间. 从目前大量网友的反馈来看,处于开发者公测阶段的鸿蒙OS手机版本已经大大出乎意料,整体体验已经非常完善,流畅度.动画效果等 ...
- matepad适配鸿蒙,消息称华为 MatePad2 搭载骁龙888 4G 华为鸿蒙OS计划适配高通平台...
今日早些时候,代号为瓦格纳和马克思 2 的两款华为 MatePad Pro 2 系列平板电脑出现在了 Geekbench 基准测试平台数据库中,工程机跑分处于主流水准,预计配合鸿蒙系统体验更佳. 据此 ...
- 高通android开源代码下载,高通平台Android源码bootloader分析之sbl1(三)
前两篇博文分析了启动流程.代码流程.cdt,接下来就分析另外几个需要格外关注的部分. ##log系统 sbl1中的log系统也是sbl1部分调试会经常接触得部分高通平台在sbl中做的log系统并不是很 ...
- 高通平台camera 移植过程
1 camera基本代码架构 高通平台对于camera的代码组织,大体上还是遵循Android的框架:即上层应用和HAL层交互,高通平台在HAL层里面实现自己的一套管理策略:在kernel中实现se ...
最新文章
- JSP获得客服端MAC地址
- spring webflow
- [java]处理utf-8 bom字符串的bom头
- python批量读取csv文件-Python读取/批量读取文件
- RabbitMQ之交换机的四种类型和属性
- 多个工作表同时处理+选中不连续的单元格和工作表
- jdbc 4.0连接mysql_使用JDBC连接操作数据库
- Fortran入门教程(二)——数据类型
- 是否可以将现有图表导入到 think-cell?
- 新型搜索引擎Blekko欲赶超谷歌 再获3000万美元投资
- linux安装Vim-plug和配置.vimrc文件
- 李白藏头诗鸿蒙,【表白的诗句藏头诗】表白的诗句60句
- 微信小程序如何实现登录注册带源码
- WIFI视频传输方案
- terracotta安装配置与集群过程
- 物联网学习笔记(一)
- 纳米饮水思源,原子结构探秘
- 用三个与非门设计或门两种方法
- Http抓包工具--查尔斯
- 折射率随波长变化MATLAB仿真