高通 LCD驅動框架簡述

2021-08-20 03:35:39 字數 4482 閱讀 7127

目錄

一 lcd硬體結構框架

二 不同的硬體結構lcd的驅動框架簡述

三 rgb介面lcd驅動簡述(以戶外手機(android5.1)為例)

3.1 硬體線路框架

3.2 軟體驅動框架

3.2.1 第一層:核心層

3.2.2 第二層:fb驅動層

3.2.3 第三層:具體lcd驅動

mdp: mobile display processor:移動顯示處理器

dsi: display serial inte***ce : 顯示器序列介面

mdss : ********** display sub system : 多**顯示子系統

dcs (displaycommandset):dcs是乙個標準化的命令集,用於命令模式的顯示模組

一 lcd硬體結構框架:

一般情況下,固定**、對講機、帶實體按鍵的手機(老人機,戶外手機)等等都會使用rgb介面的lcd,而對螢幕要求較高的裝置比如目前流行的不帶實體按鍵智慧型手機,平板電腦,廣告機等都會使用hdmi、mipi、lvds等介面的lcd屏。

lcd硬體結構框架如下圖:

二 不同的硬體結構lcd的驅動框架簡述

由上圖可知,不同介面的lcd有不同的硬體結構,自然而然就有不同的驅動框架:

rgb介面lcd驅動框架:分為兩部分

1 核心層驅動

2 lcd控制器驅動

這兩部分 核心層驅動已經有核心統一提供了,我們需要完成的是 lcd控制器驅動,大致思路通過platform匯流排掛在lcd控制器,在

prob中完成 fb_info的建立,初始化,註冊等工作。

lvds、hdmi(dsi)、mipi(dsi)等介面的lcd驅動框架:分為兩部分

1 核心驅動

2 lvds、hdmi、mipi介面控制器驅動

三 rgb介面lcd驅動簡述

3.1 硬體線路框架

本文驅動是基於高通平台msm8909,msm8909lcd介面是mipi介面,而我們的戶外手機對螢幕要求不高,有實體按鍵,所以用rgb介面的lcd即可,所以cpu與lcd之間需要乙個 mipi轉rgb的轉換晶元,本文使用icn6211轉換晶元,框圖如下:

3.2 軟體驅動框架

在linux裝置中,lcd是乙個很重要的外設,lcd顯示採用了幀緩衝(framebuffer)技術,所以lcd驅動也叫framebuffer驅動,所以lcd驅動框架就是圍繞 幀緩衝 展開工作,下面解釋一下什麼是幀緩衝,幀緩衝(framebuffer)是linux系統為顯示裝置提供的乙個介面,它將顯示緩衝區抽象出來,遮蔽影象硬體的底層差異,允許上層應用程式在圖形模式下直接對顯示緩衝區進行讀寫操作。使用者不必關係物理顯示緩衝區的具體位置及存放方式,這些都由幀緩衝裝置驅動本身來完成。對於幀緩衝裝置而言,只要在顯示緩衝區中與顯示點對應的區域寫入顏色值,對應的顏色會自動在螢幕上顯示。幀緩衝為標準字元裝置。

幀緩衝裝置最關鍵的乙個資料結構體是fb_info結構,。包括了關於幀緩衝裝置屬性和操作的完整描述,這個結構體的定義如下所示。

/kenrel/include/linux/fb.h

struct fb_info ;

struct fb_ops ;

注意以下解析中,會經常將lcd裝置稱呼為fb裝置fb裝置驅動大致分為三層

第一層:核心層

第二層:***平台驅動,fb驅動層

第三層:具體lcd驅動

第一層:核心層 

功能:1為底層裝置驅動提供註冊介面,為上層使用者訪問提供訪問控制介面

kernel\drivers\video\fbmem.c

第二層:fb驅動層

功能: 1 填充 struct fb_info

2 呼叫 fbmem.c的 register_framebuffer註冊 fb裝置

kernel\video\msm\mdss\mdss_fb.c //fb驅動 ***平台(msm高通平台裝置驅動)

第三層:具體lcd驅動

功能:1 實際lcd 初始化資訊

3.2.1 第一層:核心層

kernel\drivers\video\fbmem.c //核心層

lcd驅動核心層:fbmem.c (input.c):核心為所有lcd及顯示器抽象出來的統一的驅動模型,即lcd模型或者稱為framebuffer模型,抽象出來的模型遮蔽掉了硬體的差異,為使用者體統一提供lcd顯示介面,上層應用可以直接操作讀寫該介面用來操作lcd裝置。

作用:1 為底層裝置驅動提供註冊介面

2 為上層使用者訪問提供訪問控制介面

分析fbmem.c

//註冊fb_info結構體

int register_framebuffer(struct fb_info *fb_info)

static int do_register_framebuffer(struct fb_info *fb_info)

static struct fb_info *file_fb_info(struct file *file)

static ssize_t fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)

...}

return (err) ? err : cnt;

}//要特別說明一下.read = fb_read,函式

static const struct file_operations fb_fops = ;

fbmem_init(void)

3.2.2 第二層:fb驅動層

kernel\video\msm\mdss\mdss_fb.c //fb驅動 ***平台(msm高通平台裝置驅動)

功能:1 填充 struct fb_info

2 呼叫 fbmem.c的 register_framebuffer註冊 fb裝置

分析mdss_fb.c

static int mdss_fb_register(struct msm_fb_data_type *mfd)

static int mdss_fb_probe(struct platform_device *pdev)

static const struct dev_pm_ops mdss_fb_pm_ops = ;

//對應msm8909-mdss.dtsi mdss_fb0: qcom,mdss_fb_primary ,

{}};export_compat("qcom,mdss-fb");

static struct platform_driver mdss_fb_driver = ,

};static struct fb_ops mdss_fb_ops = ;

int __init mdss_fb_init(void)

module_init(mdss_fb_init);

3.2.3 第三層:具體lcd驅動

kernel\video\msm\mdss\mdss_spi_panel.c

功能:實際lcd 初始化資訊 : 遍歷裝置樹,尋找fb裝置節點。初始化lcd螢幕,註冊lcd螢幕

int mdss_spi_panel_init(struct device_node *node,struct spi_panel_data    *ctrl_pdata,bool cmd_cfg_cont_splash)

//find device node of spi panel

static struct device_node *mdss_spi_find_panel_of_node(struct platform_device *pdev, char *panel_cfg)

static int mdss_spi_panel_probe(struct platform_device *pdev)

}static const struct of_device_id mdss_spi_panel_match = ,

{},};static struct platform_driver this_driver = ,

};static int __init mdss_spi_display_init(void)

module_init(mdss_spi_display_init);

本文只講框架,除錯過程有機會補充,以上。

高通平台LCD驅動分析

目前手機晶元廠家提供的原始碼裡包含整個lcd驅動框架,一般廠家會定義乙個 fb.c的原始檔,註冊乙個平台裝置和平台驅動,在驅動的probe函式中來呼叫register framebuffer 從而生成 dev fbx的裝置節點。這裡最重要的資料結構是fb ops,它包括fb開啟 引數設定 畫圖 配置...

高通 android平台LCD驅動分析

目前手機晶元廠家提供的原始碼裡包含整個lcd驅動框架,一般廠家會定義乙個 fb.c的原始檔,註冊乙個平台裝置和平台驅動,在驅動的probe函式中來呼叫register framebuffer 從而生成 dev fbx的裝置節點。這裡最重要的資料結構是fb ops,它包括fb開啟 引數設定 畫圖 配置...

高通平台LCD開發

lcd除錯主要有三個任務 1.供電 2.背光 3.lcd驅動 vdd 2.8v 給ic內部供電 vddio 1.8v 給gpio供電 mdss dsi0 qcom,mdss dsi mdss dsi0 qcom,mdss dsi ctrl0 1a94000 主要有兩個gpio需要配置,reset和t...