1. 程式人生 > >QCom MSM MDP顯示驅動一些點的簡記

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}

[email protected]:/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

[email protected]:/sys/class/graphics/fb0 # cat msm_fb_type                        

mipi dsi cmd panel

[email protected]:/sys/class/graphics/fb0 # cat bits_per_pixel                     

32

130|[email protected]:/sys/class/graphics/fb0 # cat dev

29:0

[email protected]:/sys/class/graphics/fb0 # cat modes

U:480x854p-0

[email protected]:/sys/class/graphics/fb0 # cat name

msmfb42_90501

[email protected]:/sys/class/graphics/fb0 # cat stride

1920

[email protected]:/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顯示的imagelinux核心啟動過程中保持顯示在螢幕上,知道開機動畫顯示,即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_triggerled組對映到不同的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);

每個ledbrightness_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;

1712      case PM8XXX_ID_WLED:

1713                      rc = led_wled_set(led, level);

1714                       if (rc < 0)

1715                                       pr_err("wled brightness set failed %d\n", rc);

1716                       break;

1717       case PM8XXX_ID_RGB_LED_RED:

1718       case PM8XXX_ID_RGB_LED_GREEN:

1719       case PM8XXX_ID_RGB_LED_BLUE:

1720                       led_rgb_set(led, level);

1721                       break;

1722       default:

1723                       dev_err(led->cdev.dev, "unknown led id %d", led->id);

1724                       break;

1725       }

1726

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                         mfd->dest = DISPLAY_LCD;

491

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顯示驅動一些簡記

簡要記錄了Qualcom MSM8xxx MDP Framebuffer驅動中的一些點。 Framebuffer裝置的sysfs 330static int msm_fb_create_sysfs(struct platform_device *pdev) 331{ 332         int rc;

JavaScript基礎 顯示/隱藏效果 擊圖片,DIV顯示,圖片更換,擊更換後的圖片,DIV隱藏

努力學習 不出 圖片 視頻教程 .cn clas == display 推薦 鎮場詩:    清心感悟智慧語,不著世間名與利。學水處下納百川,舍盡貢高我慢意。    學有小成返哺根,願鑄一良心博客。誠心於此寫經驗,願見文者得啟發。—————————————————————

文字溢出時,實現在末尾顯示三個省略效果

png code nowrap -o .com 會有 mage order ips 有時我們會有這樣的需求:當文本內容較多,寬度超出父容器時,就在最後顯示三個點,代表還有東西被折疊起來了。如下圖 具體實現 HTML 如下 1 <div> 2 <

2.3擊菜單顯示div再擊就隱藏

odi script play chrome charset wid amp gre log 事件:onclick 屬性:display 利用if語句實現 <!DOCTYPE html><html><head><meta chars

notepad++自動對齊使用空格代替Tab並將空格顯示為小

什麽 d+ targe 制表符 eight ++ get python width 一、說明 對大多數語言而言自動對齊使用空格還是tab對編譯運行並沒有什麽影響,但對python問題就很大;因為就算是縮進看起來是一樣的但某些行用空格某些行用tab運行會報錯。 另外除了空格替

CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 開發板 第二件事就是 LED 驅動個燈

mina pla stat handle software imp led rdo .com /* * board_led.c * * Created on: 2018年7月3日 * Author: admin */ #include "boa

Smail 中的一些

rect direct rtu 本地 vat 基本類型 bject invoke 對象 smali中所有操作都需要經過寄存器, 本地寄存器以v開頭, 參數寄存器以p開頭, 非static方法中p0是this 沒有-object後綴的操作指令表示操作的對象是基本類型 inv

很高興在51CTO博客安家,以後會分享一些膠機技術交流文章,希望有人喜歡。

尋找 今天 功能 是個 客戶 靜下心 謝謝 希望 它的 每天寫點新東西,已經是養成多年的老習慣了,很早就想打造一個技術交流類的資訊博客了,無奈時間有限,能靜下心來把專業性文章寫完也不容易。自從有了微博,感覺想找點專業的自已喜歡的技術類文章也變難了。 大家都愛上了刷微博,刷朋

micropython驅動sh1106亮oled

研究 ifconfig nat 模塊 通過 路由器 code iso 就是 繼上一帖給esp32刷入micropython之後,忍不住給以esp12e也刷了micropython 這裏先說一下webrepl: 通過wifi可以和esp8266交互,以及便攜的傳輸文件

echarts圖表tooltip浮動框顯示單位——散

專案中要求在圖表的浮動提示窗上顯示相對應的單位如圖: 方法有二,如下: 方法1: 利用自定義提示框進行拼接: 但是這樣的話根據後臺返回的資料格式的不同進行處理,在tooltip的formatter中進行拼接即可,注意這樣的話要考慮的情況比較多。 方法2(如果和後臺商量好可以

HBase相關的一些

1、在執行Hbase時,如果遇到出錯之後:   可以通過{HBASE_HOME}目錄,我的是在/usr/soft/hbase下的logs子目錄中的日誌檔案檢視錯誤原因。2、啟動關閉Hadoop和HBase的順序一定是:  啟動Hadoop2.7.4—>啟動HBase—>關閉HBase—>關

vue2.0實現擊後顯示,再次擊隱藏

all element cli html glob .com 狀態 right sna 描述。點擊系統切換,彈出系統切換框。再次點擊系統切換,隱藏。點擊其他地方。也會隱藏 在layout.vue中寫的html代碼 1、在main.js中寫入全局函數 // 定義全局點擊

替代HT1623代替HT1625替代HT1626 系列液晶顯示驅動IC/完全相容裸片:VK1623/VK1625/VK1626

型 號:VK1623 / 品 牌:VINTEK/VINKA/元泰 封裝形式:QFP100 LQFP100 DICE/裸片 COB邦定片 定製COG 概述: VK1623是一個48x8的LCD駆動器.可軟體程式控制使其適用於多樣化的LCD應用線路.僅用到3至4條訊號線便可控制LCD駆動器,除此之

localStorage使用例項-進入顯示廣告,選關閉之後,重新整理網頁不再出現

仿一下京東官網頂部的廣告關閉,效果為第一次進入官網會出現廣告,然後點選關閉,重新整理網頁不會再顯示廣告,但是當清除localStorage存入的資料,重新整理網頁會再顯示廣告。 html程式碼 <div class="header"> <div class="

問題:windows---筆記本外接顯示器,在系統更新後,外接顯示器沒有反應,右鍵開啟顯示設定,選檢測後提示未檢測到其他顯示器

由於系統更新後,驅動程式也更新了,所以需要重新設定驅動來解決這個問題。 1.可以下載一個驅動精靈來檢測一下是否有未升級的顯示卡驅動,重新升級後,再重新啟動系統。 2.下載好了驅動也沒有改變的話就點選快捷鍵Windows+ X 進入裝置管理器頁面 顯示介面卡的位置會有一個帶有----

TextView右上角顯示小紅,小紅根據TextView的長度移動,小紅被TextView擠出去不顯示的問題;

大概就是圖片這個樣,這個功能很常見,本來我以為很簡單,誰知道真的很簡單; 遇到點小問題,記錄一下,哈哈; 小紅點的Drawable: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http

顯示,再次選除自身外隱藏效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <

專案--選按鈕顯示資料,選空白處隱藏資料

點選空白處隱藏資料 點選按鈕顯示資料在這裡插入程式碼片 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

學習 iOS Application Security 需要注意的一些

0. 基礎環境 iPhone 5s 64bit iOS 8.1 已越獄 1. dyld: Library not loaded: /usr/lib/libpcre.0.dylib     ==》 apt-get install pcre 2. 安裝Python 2.

合泰 HT1632顯示 驅動程式碼

void DisplayDriverProcess(void) {     LCD_CS1=0;     HT1632C_Writer_AllDATA(0x00, image1, 48);     LCD_