高通 android平台LCD驱动分析
??????? 當(dāng)開(kāi)發(fā)一款新的LCD驅(qū)動(dòng)時(shí)往往需要關(guān)注的是LCD最底層的驅(qū)動(dòng),即是LCD屏的初始化、亮屏、熄屏以及背光操作。個(gè)人覺(jué)得以下幾個(gè)問(wèn)題有必要弄清楚(參考Qualcomm芯片上的驅(qū)動(dòng)代碼):
1、如何添加一款新屏驅(qū)動(dòng)
??????? 下面以東芝屏為例(參照源代碼mipi_toshiba_video_wvga_pt.c mipi_toshiba.c)
??????? 模塊初始化:module_init(mipi_video_toshiba_wvga_pt_init);
??????? 在mipi_video_toshiba_wvga_pt_init()中主要工作是設(shè)置LCD屏的參數(shù),然后注冊(cè)一個(gè)名為mipi_toshiba的平臺(tái)驅(qū)動(dòng)和平臺(tái)設(shè)備。在注冊(cè)平臺(tái)設(shè)備時(shí)將LCD亮屏、熄屏以及背光操作添加到平臺(tái)設(shè)備中。在mipi_toshiba的平臺(tái)驅(qū)動(dòng)中利用probe函數(shù)調(diào)用msm_fb_add_device()。當(dāng)需要添加一款新屏的驅(qū)動(dòng)時(shí)最主要的工作就是注冊(cè)一個(gè)相關(guān)的平臺(tái)驅(qū)動(dòng)和平臺(tái)設(shè)備,可以參照上面的兩個(gè)源文件。這里需要說(shuō)明一下:msm_fb_add_device()函數(shù)里定義了一個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu)msm_fb_data_type mfd,這個(gè)結(jié)構(gòu)里包括了fb_info,還定義了panel有關(guān)的變量。
2、LCD驅(qū)動(dòng)是如何依次打開(kāi)MDP、MIPI DSI和LCD PANEL
??????? 首先在驅(qū)動(dòng)里注冊(cè)了三個(gè)平臺(tái)設(shè)備msm_fb,mdp,mipi_dsi,然后再對(duì)應(yīng)平臺(tái)驅(qū)動(dòng)probe的時(shí)候把各自設(shè)備的指針鏈接到一起,看下面的調(diào)用關(guān)系:
???????? 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, ...)
?
??????? 當(dāng)pdata->next指向this_dev時(shí),執(zhí)行pdata->on,pdata->off時(shí),即調(diào)用到mipi_toshiba_lcd_on和mipi_toshiba_lcd_off。
??????? 從上面的分析來(lái)看,從MDP到panel的調(diào)用順序應(yīng)該是:mdp_dsi_video_on-->mipi_dsi_on-->mipi_toshiba_lcd_on。msm_fb_blank_sub()是通過(guò)mfd->pdev->dev.platform_data來(lái)獲取pdata,再調(diào)用pdata->on(),從而完成上面的調(diào)用,在這里mfd->pdev->dev.platform_data指向的就是msm_fb設(shè)備的數(shù)據(jù)。
3、mfd是如何保存msm_fb設(shè)備的指針
???????? 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)
???????????????
??????? 從上面的調(diào)用關(guān)系來(lái)看,mfd->pdev最終指向了平臺(tái)設(shè)備msm_fb,值得一提的是,在這幾個(gè)函數(shù)中完成了mfd結(jié)構(gòu)的填充。
?
int panel_next_on(struct platform_device *pdev)
每次執(zhí)行完一個(gè)->on后執(zhí)行panel_next_on,執(zhí)行下一個(gè)->on
總結(jié)
以上是生活随笔為你收集整理的高通 android平台LCD驱动分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WINCE之“系统事件”——System
- 下一篇: MTK6589下传感器框架结构和代码分析