QCom MSM MDP显示驱动一些点的简记
简要记录了Qualcom MSM8xxx MDP Framebuffer驱动中的一些点。
Framebuffer设备的sysfs
330static int msm_fb_create_sysfs(struct platform_device *pdev)
331{
332 int rc;
333 struct msm_fb_data_type *mfd = platform_get_drvdata(pdev);
334
335 rc = sysfs_create_group(&mfd->fbi->dev->kobj, &msm_fb_attr_group);
336 if (rc)
337 MSM_FB_ERR("%s: sysfs group creation failed, rc=%d\n", __func__,
338 rc);
339 return rc;
340}
root@android:/sys/class/graphics/fb0 # ls -al
-rw-r--r-- root root 4096 1970-06-27 09:37 bits_per_pixel
-rw-r--r-- root root 4096 1970-06-27 09:37 blank
-rw-r--r-- root root 4096 1970-06-27 09:37 console
-rw-r--r-- root root 4096 1970-06-27 09:37 cursor
-r--r--r-- root root 4096 1970-06-27 09:37 dev
-rw-r--r-- root root 4096 1970-06-27 09:37 mode
-rw-r--r-- root root 4096 1970-06-27 09:37 modes
-r--r--r-- root root 4096 1970-06-27 09:37 msm_fb_type
-r--r--r-- root root 4096 1970-06-27 09:37 name
-rw-r--r-- root root 4096 1970-06-27 09:37 pan
drwxr-xr-x root root 1970-06-27 08:28 power
-rw-r--r-- root root 4096 1970-06-27 09:37 rotate
-rw-r--r-- root root 4096 1970-06-27 09:37 state
-r--r--r-- root root 4096 1970-06-27 09:37 stride
lrwxrwxrwx root root 1970-06-27 09:37 subsystem -> ../../../../class/graphics
-rw-r--r-- root root 4096 1970-06-27 08:28 uevent
-rw-r--r-- root root 4096 1970-06-27 09:37 virtual_size
-r--r--r-- root root 4096 1970-06-27 08:28 vsync_event
root@android:/sys/class/graphics/fb0 # cat msm_fb_type
mipi dsi cmd panel
root@android:/sys/class/graphics/fb0 # cat bits_per_pixel
32
130|root@android:/sys/class/graphics/fb0 # cat dev
29:0
root@android:/sys/class/graphics/fb0 # cat modes
U:480x854p-0
root@android:/sys/class/graphics/fb0 # cat name
msmfb42_90501
root@android:/sys/class/graphics/fb0 # cat stride
1920
root@android:/sys/class/graphics/fb0 # cat virtual_size
480,2566
cont_splash_done field
Add support for "Continuous Splash Screen" feature.
The image displayed on the screen by the android bootloaderdriver should continue till the android animation shows up.
Delay the display initialization for MDP, display dependent clocksand panel power on functions.
bootloader显示的image在linux内核启动过程中保持显示在屏幕上,知道开机动画显示,即linux内核启动过程中不要出现黑屏。
Early suspend & Early resume
Early suspend是有wakelock还占有,系统还不能整体suspend,但是可以关闭屏幕、背光、输入等;在Early suspended状态时,重新打开屏幕、背光和输入,是为对应的early resume。
fb_register中相关设置如下:
1551 mfd->early_suspend.suspend = msmfb_early_suspend;
1552 mfd->early_suspend.resume = msmfb_early_resume;
1553 mfd->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 2;
1554 register_early_suspend(&mfd->early_suspend);
数据结构定义如下:
23/* The early_suspend structure defines suspend and resume hooks to be called
24 * when the user visible sleep state of the system changes, and a level to
25 * control the order. They can be used to turn off the screen and input
26 * devices that are not used for wakeup.
27 * Suspend handlers are called in low to high level order, resume handlers are
28 * called in the opposite order. If, when calling register_early_suspend,
29 * the suspend handlers have already been called without a matching call to the
30 * resume handlers, the suspend handler will be called directly from
31 * register_early_suspend. This direct call can violate the normal level order.
32 */
33enum {
34 EARLY_SUSPEND_LEVEL_BLANK_SCREEN = 50,
35 EARLY_SUSPEND_LEVEL_STOP_DRAWING = 100,
36 EARLY_SUSPEND_LEVEL_DISABLE_FB = 150,
37};
38struct early_suspend {
39#ifdef CONFIG_HAS_EARLYSUSPEND
40 struct list_head link;
41 int level;
42 void (*suspend)(struct early_suspend *h);
43 void (*resume)(struct early_suspend *h);
44#endif
45};
backlight
msm_fb_set_backlight以后是使用led_trigger调用真正led_classdev "wled"的brightnes_set去设置背光。
用户态ioctl通过msm_fb_set_backlight调用到msm_fb_panel_data::set_backlight,
"lcd_backlight".brightness_set -> msm_fb_panel_data::set_backlight -> "bkl_trigger".led_trigger -> "wled".brightness_set。然后找真正操作硬件IC部分。
驱动中设置背光则是绕过"lcd_backlight"设备直接通过backlight_worker工作执行到msm_fb_panel_data::set_backlight,然后-> "bkl_trigger".led_trigger -> "wled".brightness_set。
可以认为"lcd_backlight"是背光抽象设备,通过led_trigger的led组映射到不同的led_classdev设备
以三星DSI CMD屏为例:
In mipi_samsung.c
294static void mipi_samsung_set_backlight(struct msm_fb_data_type *mfd)
295{
296 if (!cci_fb_UpdateDone){
297 printk("Taylor: No BL before LCM on\n");
298 return;
299 }
300
301 pr_debug("Taylor: %s : Set BL:%d\n",__func__, mfd->bl_level);
302 if ((mipi_samsung_pdata->enable_wled_bl_ctrl)
303 && (wled_trigger_initialized)) {
304 led_trigger_event(bkl_led_trigger, mfd->bl_level);
305 return;
306 }
307}
kernel/drivers/leds/leds-pm8xxx.c
#define PM8XXX_LEDS_DEV_NAME "pm8xxx-led"
2283static struct platform_driver pm8xxx_led_driver = {
2284 .probe = pm8xxx_led_probe,
2285 .remove = __devexit_p(pm8xxx_led_remove),
2286 .driver = {
2287 .name = PM8XXX_LEDS_DEV_NAME,
2288 .owner = THIS_MODULE,
2289 },
2290};
pm8xxx_led_probe会对pm8038_led_info数组中的每个led使用设置led_classdev字段,并且初始化work item,然后使用led_classdev_register向系统注册每个led设备。
2197 INIT_WORK(&led_dat->work, pm8xxx_led_work);
2198 INIT_WORK(&led_dat->modework, pm8xxx_mode_work);
2199 INIT_WORK(&led_dat->testwork, pm8xxx_test_work);
每个led的brightness_set字段设置为pm8xxx_led_set。
1790static void pm8xxx_led_set(struct led_classdev *led_cdev,
1791 enum led_brightness value)
1792{
1793 struct pm8xxx_led_data *led;
1794
1795 led = container_of(led_cdev, struct pm8xxx_led_data, cdev);
1796
1797 if (value < LED_OFF || value > led->cdev.max_brightness) {
1798 dev_err(led->cdev.dev, "Invalid brightness value exceeds");
1799 return;
1800 }
1801
1802 led->cdev.brightness = value;
1803 schedule_work(&led->work);
1804}
1730static void pm8xxx_led_work(struct work_struct *work)
1731{
1732 int rc;
1733
1734 struct pm8xxx_led_data *led = container_of(work,
1735 struct pm8xxx_led_data, work);
1736
1737 if (led->pwm_dev == NULL) {
1738 __pm8xxx_led_work(led, led->cdev.brightness);
1739 } else {
1740 rc = pm8xxx_led_pwm_work(led);
1741 if (rc)
1742 pr_err("could not configure PWM mode for LED:%d\n",
1743 led->id);
1744 }
1745}
对PM8XXX_ID_WLED,是使用__pm8xxx_led_work
1692static void __pm8xxx_led_work(struct pm8xxx_led_data *led,
1693 enum led_brightness level)
1694{
1695 int rc;
1696
1697 mutex_lock(&led->lock);
1698
1699 switch (led->id) {
1700 case PM8XXX_ID_LED_KB_LIGHT:
1701 led_kp_set(led, level);
1702 break;
1703 case PM8XXX_ID_LED_0:
1704 case PM8XXX_ID_LED_1:
1705 case PM8XXX_ID_LED_2:
1706 led_lc_set(led, level);
1707 break;
1708 case PM8XXX_ID_FLASH_LED_0:
1709 case PM8XXX_ID_FLASH_LED_1:
1710 led_flash_set(led, level);
1711 break;
1727 mutex_unlock(&led->lock);
1728}
led_wled_set写电源管理芯片pm8xxx的控制寄存器,控制wled。
Framebuffer fb_info::node
registered_fb它是一个数组,它的类型就是struct fb_info,它用于保存我们调用register_framebuffer传进来的struct fb_info。
num_registered_fb代表注册帧缓冲设备的个数。
1522 for (i = 0; i < FB_MAX; i++)
1523 if (!registered_fb[i])
1524 break;
1525 fb_info->node = i;
相当于找到一个空的次设备号。
Framebuffer像素格式
主屏Framebuffer格式 RGBA8888, config时指定;屏格式为RGB565或RGB888,由overlay pipe做转换。
In mipi_dsi_probe()
481 /*
482 * get/set panel specific fb info
483 */
484 mfd->panel_info = pdata->panel_info;
485 pinfo = &mfd->panel_info;
486
487 if (mfd->panel_info.type == MIPI_VIDEO_PANEL)
488 mfd->dest = DISPLAY_LCDC;
489 else
490
492 if (mdp_rev == MDP_REV_303 &&
493 mipi_dsi_pdata->get_lane_config) {
494 if (mipi_dsi_pdata->get_lane_config() != 2) {
495 pr_info("Changing to DSI Single Mode Configuration\n");
496#ifdef CONFIG_FB_MSM_MDP303
497 update_lane_config(pinfo);
498#endif
499 }
500 }
501
502 if (mfd->index == 0)
503 mfd->fb_imgType = MSMFB_DEFAULT_TYPE; // configed as RGBA8888 for fb0
504 else
505 mfd->fb_imgType = MDP_RGB_565;
msmfb_update_notify/ msmfb_no_update_notify
用于CABL功能时,统计直方图使用;
更新屏幕前complete(&msmfb_update_notify)从而在准确时间点启动直方图统计;2*HZ后,msmfb_no_update_notify_timer超时,在timer超时回调中complete(&mfd->msmfb_no_update_notify)结束直方图统计。
sw_refresher
使用定时器去触发mdp_refresh_screen,添加work进行dma_fnc调用。
针对某些接口的VIDEO模式屏且控制器没有hw_refresh支持时,可以使用sw_refresher。
FB_ACTIVATE_VBL标志涵义
fb_var_screeninfo结构体的成员变量activate的值设置FB_ACTIVATE_VBL,表示要等到下一个垂直同步事件出现时,再将当前要渲染的图形缓冲区的内容绘制出来。这样做的目的是避免出现屏幕闪烁,即避免前后两个图形缓冲区的内容各有一部分同时出现屏幕中。
QCom MSM MDP显示驱动一些点的简记的更多相关文章
- android系统平台显示驱动开发简要:Samsung LCD接口篇『三』
平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...
- 音响音箱/恒温壶/电量显示/电子数字时钟等LED数码管显示驱动IC-VK1640B 8段12位/12段8位显示
市面上最常用的数码管为七段/八段显示,八段数码管比七段数码管多一个发光二极管单元(比七段数码管多一个点),又按能显示多少个"8"可分为1位.2位.4位等等.数码管又分为共阳极驱动/ ...
- MSP430常见问题之LCD 显示驱动类
Q1:晶体一般都是接32768,然后使用液晶很正常.我打算将晶体接6M的替换32768,那么液晶还能正常显示吗A1:看你所用的LCM 模块时序极限是多少HZ,然后看6M情况下,MSP430去驱动LCM ...
- android系统平台显示驱动开发简要:LCD驱动调试篇『四』
平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...
- android系统平台显示驱动开发简要:LCD常用接口篇『二』
平台信息:内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客 ...
- android系统平台显示驱动开发简要:LCD基本原理篇『一』
平台信息:内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博客 ...
- [置顶] Windows显示驱动(WDDM)编程初步(2)
欢迎转载[作者:张佩][原文:http://www.yiiyee.cn/Blog/wddm2/] 第二部分专门只讲VIDPN.这是后面内容的基础.WDDM框架用VIDPN这个概念,来描述它所要处理的显 ...
- STM32F412应用开发笔记之八:迪文串口屏显示驱动
迪文的显示屏使用起来比较方便,其使用串口通讯,即可支持RS232,又可以支持TTL电平.在NUCLEO-F412ZG实验板上,USART2已经引到了CN9上,我们就利用USART2来实现与迪文串口屏的 ...
- msm audio platform 驱动代码跟踪
sound/soc/soc-core.c static int __init snd_soc_init(void) { #ifdef CONFIG_DEBUG_FS snd_soc_debugfs_r ...
随机推荐
- 找到多个与名为“Index”的控制器匹配的类型的解决方法!
“/”应用程序中的服务器错误. 找到多个与名为“Index”的控制器匹配的类型.如果为此请求(“{controller}/{action}/{id}”)提供服务的路由在搜索匹配此请求的控制器时没有指定 ...
- 夺命雷公狗—angularjs—11—service的基本概念
我们先来研究下service里面的四大服务.. value 变量 constant 常量 factory 工厂模式 service 服务 <!DOCTYPE html> <ht ...
- hql语句查询实体类采用list方法的返回结果集
在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:1.查询全部字段的情况下,如"from 实体类", ...
- 在 wxWidgets 的介绍中看到的一句话
3. wxwidgets提供的gui是大量使用宏的,这就意味着它是在尽可能的使用目标系统native的gui样式. ——你可以访问wxwidgets网站,看看那些开发的软件的截图,全是系统native ...
- 学习K&R时初学者经常遇到的一个问题——EOF
学习K&R时初学者经常遇到的一个问题——EOF
- 不小心rm删除文件怎么办
不小心rm删除文件怎么办 rm 命令的副作用越来越显现.而且rm掉之后的东西想找回来很困难.有2个原则: 1 永远不要在root下操作,尤其是rm命令 2 写一个别名,代替rm 我就是在~/.bash ...
- android 项目学习随笔八(xUtils的BitmapUtils模块)
xUtils的BitmapUtils模块: 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象: 支持加载网络图片和本地图片: 内存管 ...
- JAVA学习方法
我觉得要想学好的话,首先,你得会用,能玩的起来,然后才会慢慢激发你的兴趣,它为何这么用?就这样一步一步的去探索,不断地积累,总结.编程讲究的是思维,死记硬背是没有意义的,想学好编程就一个字:敲,俩字 ...
- JVM 指令集
指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int ...
- Perl的基本语法<总结> (转载)
前言:这篇文章是花了我很多时间.费了我很多心血才完成的,虽然连我自己都觉得无法达到尽善尽美的境界,但希望能帮助大家入门,稍微了解到Perl 到底是个什么样的东西,Perl到底有那些强大的功能,那么这篇 ...