MTK平台LCD驅動架構詳解(一)

來源:互聯網
上載者:User

標籤:mtk   驅動   linux   kernel   架構   

        許多學習嵌入式的進入MTK開發平台,很多東西都會感到很陌生。在MTK平台上你可以簡簡單單幾分鐘就點亮一塊屏。加上MTK快速開發的節奏,也很少有時間自己整理學習。如果不思進取,不加班加點學習。很容易就慢慢……。這也難怪有些人說MTK造就了一批懶人,毀掉了一批工程師。但其實都是基於linux開發,核心的東西都是一樣一樣的。我剛入行業,在迷茫之際,自己整理跟蹤源碼。想慢慢找回自己熟悉的感覺,掌握MTK的整體架構。也希望能給有需要的人帶來些協助。好吧!前話說到這,開始正題。

本文肯定有不少地方會出現錯誤和不理解,而且很多地方不夠深入,歡迎批評指正。畢竟都是個人理解,希望能和大家多多交流。大家一起慢慢吃透MTK。隨便提一句,如果不熟悉“linux平台裝置驅動”模型的,可以找相關資料看看。

註:-->表示函數之間的調用


一、平台驅動:Mtkfb.c

就從Mtkfb.c檔案開始說起吧。路徑在:alps\mediatek\platform\common\kernel\drivers\video\Mtkfb.c

在該檔案中,我們能非常熟悉的看到核心的原態。下面我刪截了一部分大家最熟悉的源碼。

static struct platform_driver mtkfb_driver ={    .driver = {        .name    = MTKFB_DRIVER,#ifdef CONFIG_PM        .pm     = &mtkfb_pm_ops,#endif        .bus     = &platform_bus_type,        .probe   = mtkfb_probe,        .remove  = mtkfb_remove,        .suspend = mtkfb_suspend,        .resume  = mtkfb_resume,.shutdown = mtkfb_shutdown,    },};

/* Register both the driver and the device */int __init mtkfb_init(void){    int r = 0;    MSG_FUNC_ENTER();#ifdef DEFAULT_MMP_ENABLE    MMProfileEnable(1);init_mtkfb_mmp_events();    init_ddp_mmp_events();    MMProfileStart(1);#endif    /* Register the driver with LDM */    if (platform_driver_register(&mtkfb_driver)) {        PRNERR("failed to register mtkfb driver\n");        r = -ENODEV;        goto exit;    }#ifdef CONFIG_HAS_EARLYSUSPEND   register_early_suspend(&mtkfb_early_suspend_handler);#endif    DBG_Init();//#ifdef MTK_DISP_CONFIG_SUPPORTConfigPara_Init();//In order to Trigger Display Customization Tool..//#endifexit:    MSG_FUNC_LEAVE();    return r;}
module_init(mtkfb_init);module_exit(mtkfb_cleanup);

看了上面代碼,大家肯定知道mtkfb_probe函數是核心。但暫時我還不想說這一塊,因為底層架構還沒分析完,熟悉平台裝置驅動的都知道:僅僅有driver是跑不到probe函數的。在入口函數上面的注視,有寫同時註冊driver和device。不知道是MTK掩人耳目還是同事的錯誤標註,反正我沒在裡面找到註冊device相關的代碼。這一塊希望看過本文的人能提供解釋。

二、平台裝置:Mt_devs.c

事實上我在另外的地方跟到了device的註冊函數。在Mt_devs.c中,路徑在:mediatek\platform\common\kernel\drivers\video(在bootable\bootloader\lk目錄下也有一份一樣的,目前不能給出明確解釋。)

1、在該檔案中:__init int mt_board_init(void)函數-->platform_device_register(&mt6575_device_fb),在mt6575_device_fb結構體中我們能看到disp_device.name = "mtkfb"。對比Mtkfb.c中的結構體mtkfb_driver.name = MTKFB_DRIVER。我們能發現兩者同名。這又到了我們熟悉的地方。出現同名裝置,不管先後,核心會調用Mtkfb.c中的probe函數。這時我們可以開始分析probe函數了。

2、在這之前,有個問題我得說明,我們先來看看__init int mt_board_init(void)函數的調用過程:Main.c裡的kmain函數-->platform_early_init-->board_init-->mt_board_init。源頭追溯到了C函數的入口Main.c。我之所以去跟,是因為Mt_devs.c中並不是以我們熟悉的模組的形式註冊的裝置,也就是根本沒有module_init()入口標記,而且mt_board_init一個函數中做了幾乎所有平台裝置的註冊工作。這是和平時學習有別的地方,所以特意說明。也免得大家和我開始一樣,一直疑惑裝置驅動檔案為啥沒入口函數。

時候不早了,該下班了。下次接著“第三點”,說說mtkfb_probe函數裡邊的工作

待續…………




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.