標籤: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函數裡邊的工作
待續…………