目前手機晶元廠家提供的原始碼裡包含整個lcd驅動框架,一般廠家會定義乙個***_fb.c的原始檔,註冊乙個平台裝置和平台驅動,在驅動的probe函式中來呼叫register_framebuffer(),從而生成/dev/fbx的裝置節點。這裡最重要的資料結構是fb_ops,它包括fb開啟、引數設定、畫圖、配置、記憶體對映等操作函式,晶元廠家通常提供了這部分的原始碼,因為這些操作一般是跟晶元內部的dmp和mipi dsi等部件打交道。
當開發一款新的lcd驅動時往往需要關注的是lcd最底層的驅動,即是lcd屏的初始化、亮屏、熄屏以及背光操作。個人覺得以下幾個問題有必要弄清楚(參考qualcomm晶元上的驅動**):
1、如何新增一款新屏驅動
下面以東芝屏為例(參照源**mipi_toshiba_video_wvga_pt.c mipi_toshiba.c)
模組初始化:module_init(mipi_video_toshiba_wvga_pt_init);
在mipi_video_toshiba_wvga_pt_init()中主要工作是設定lcd屏的引數,然後註冊乙個名為mipi_toshiba的平台驅動和平台裝置。在註冊平台裝置時將lcd亮屏、熄屏以及背光操作新增到平台裝置中。在mipi_toshiba的平台驅動中利用probe函式呼叫msm_fb_add_device()。當需要新增一款新屏的驅動時最主要的工作就是註冊乙個相關的平台驅動和平台裝置,可以參照上面的兩個原始檔。這裡需要說明一下:msm_fb_add_device()函式裡定義了乙個非常重要的資料結構msm_fb_data_type mfd,這個結構裡包括了fb_info,還定義了panel有關的變數。
2、lcd驅動是如何依次開啟mdp、mipi dsi和lcd panel
首先在驅動裡註冊了三個平台裝置msm_fb,mdp,mipi_dsi,然後再對應平台驅動probe的時候把各自裝置的指標鏈結到一起,看下面的呼叫關係:
mdp_probe(pdev)
||--->msm_fb_dev = platform_device_alloc('msm_fb', pdev->id)||
|--->pdata = msm_fb_dev->dev.platform_data||
|--->pdata->on = mdp_dsi_video_on||
|--->pdata->off = mdp_dsi_video_off||
|--->pdata->next = pdev
mipi_dsi_probe(pdev)
||--->mdp_dev = platform_device_alloc('mdp', pdev->id)||
|--->pdata = mdp_dev->dev.platform_data||
|--->pdata->on = mipi_dsi_on||
|--->pdata->off = mipi_dsi_off||
|--->pdata->next = pdev
mipi_toshiba_lcd_probe(pdev)||
msm_fb_add_device(pdev)||
|--->pdata = pdev->dev.platform_data||
|--->this_dev = msm_fb_device_alloc(pdata, type, id)||
|--->this_dev = platform_device_alloc()||
|--->platform_device_add_data(this_dev, pdata, ...)
當pdata->next指向this_dev時,執行pdata->on,pdata->off時,即呼叫到mipi_toshiba_lcd_on和mipi_toshiba_lcd_off。
從上面的分析來看,從mdp到panel的呼叫順序應該是:mdp_dsi_video_on-->mipi_dsi_on-->mipi_toshiba_lcd_on。msm_fb_blank_sub()是通過mfd->pdev->dev.platform_data來獲取pdata,再呼叫pdata->on(),從而完成上面的呼叫,在這裡mfd->pdev->dev.platform_data指向的就是msm_fb裝置的資料。
3、mfd是如何儲存msm_fb裝置的指標
msm_fb_add_device(pdev)
||--->fbi=framebuffer_alloc(sizeof(struct msm_fb_data_type),null)||
|--->mfd=(struct msm_fb_data_type *)fbi->par||
|--->mfd->pdev=this_dev(this_dev即mipi_dsi)||
|--->platform_set_drvdata(this_dev,mfd)
mipi_dsi_probe(pdev)
||--->mfd=platform_get_drvdata(pdev)||
|--->mfd->pdev=mdp_dev||
|--->platform_set_drvdata(mdp_dev,mfd)
mdp_probe(pdev)
||--->mfd=platform_get_drvdata(pdev)||
|--->mfd->pdev=msm_fb_dev||
|--->platform_set_drvdata(msm_fb_dev,mfd)
從上面的呼叫關係來看,mfd->pdev最終指向了平台裝置msm_fb,值得一提的是,在這幾個函式中完成了mfd結構的填充。
int panel_next_on(struct platform_device *pdev)
每次執行完乙個->on後執行panel_next_on,執行下乙個->on
**
高通 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...
高通 LCD驅動框架簡述
目錄 一 lcd硬體結構框架 二 不同的硬體結構lcd的驅動框架簡述 三 rgb介面lcd驅動簡述 以戶外手機 android5.1 為例 3.1 硬體線路框架 3.2 軟體驅動框架 3.2.1 第一層 核心層 3.2.2 第二層 fb驅動層 3.2.3 第三層 具體lcd驅動 mdp mobile...