日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

高通 android平台LCD驱动分析

發(fā)布時(shí)間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高通 android平台LCD驱动分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目前手機(jī)芯片廠家提供的源碼里包含整個(gè)LCD驅(qū)動(dòng)框架,一般廠家會(huì)定義一個(gè)xxx_fb.c的源文件,注冊(cè)一個(gè)平臺(tái)設(shè)備和平臺(tái)驅(qū)動(dòng),在驅(qū)動(dòng)的probe函數(shù)中來(lái)調(diào)用register_framebuffer(),從而生成/dev/fbx的設(shè)備節(jié)點(diǎn)。這里最重要的數(shù)據(jù)結(jié)構(gòu)是fb_ops,它包括fb打開(kāi)、參數(shù)設(shè)置、畫(huà)圖、配置、內(nèi)存映射等操作函數(shù),芯片廠家通常提供了這部分的源碼,因?yàn)檫@些操作一般是跟芯片內(nèi)部的DMP和MIPI DSI等部件打交道。

??????? 當(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。