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顯示的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;
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_