直有一種強迫症,不把整個流程屢清楚就是藍瘦香菇。做項目讀博客多了,也就慢慢地搞清楚了。
安卓系統從power鍵按下釋放,到lcm驅動顯示,整個驅動的加載流程as follows:
lk階段,還是先執行main.c (vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\kernel)
其中執行 platform_init(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\platform.c)
其中調用mt_disp_init((void*)g_fb_base);(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\mt_disp_drv.c)
其中就調用到primary_display_init(NULL);(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\primary_display.c這裏kernel和lk下各有一個這個文件,應該是先調用lk中的,不對的請指正)
primary_display_init中的流程就比較清楚了:
pgc->plcm = disp_lcm_probe( lcm_name……
lcm_param = disp_lcm_get_params(pgc->plcm);
ret = disp_lcm_init(pgc->plcm);
其中重點分析下 disp_lcm_probe(vendor\vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6735\disp_lcm.c,其中disp_lcm.c是與ic原始驅動(lk層)最直接關聯的函數,幾乎上一一對應,要讀懂呀!)
check_lcm_node_from_DT() == 0 讀取dts節點信息?
if (_lcm_count() == 0) 得到lcm的數量,如果爲0返回NULL,如果爲1,則
lcm_drv = lcm_driver_list[0]; 讀取這個數組的第一個元素;
lcm_driver_list數組從mt65xx_lcm_list.c中extern過來的
這個數組中在添加lcm驅動的時候添加了各個驅動的lcm_drv
比如,我們要添加名爲Eighty_80的lcm驅動
那麼我們就會在mt65xx_lcm_list.c的LCM_DRIVER*lcm_driver_list[]中添加
#if defined(EIGHTY_80)
&Eighty_80_lcm_drv,
#endif
其中&Eighty_80_lcm_drv則對應驅動文件中的lcm_drv
這樣看的話,lcm_drv= lcm_driver_list[0];就是取得驅動文件中的lcm_drv
如果爲大於一個lcm,則lcm_drv=lcm_driver_list[i],遍歷取得各個lcm驅動的lcm_drv
之後會if(lcm_drv->compare_id() != 0)
這個函數會調用到lk中驅動文件的compare_id函數,返回lcd的id,(剛做的時候我也不知道lk的驅動和kernel的驅動不一樣,後來才知道)
如果id存在,就會break跳出遍歷,打印dprintf(INFO,"wewill use lcm: %s\n";告訴系統使用當前這個lcm
這樣的話遍歷的目的就是取得機器上當前所使用的lcm的各種信息
之後會將這個lcm的各類信息傳遞給kernel…………這裏 disp_lcm_probe就結束了
再回到primary_display_init()
前面pgc->plcm= disp_lcm_probe,將當前使用的lcm驅動模型賦值給pgc->plcm
之後的disp_lcm_***(pgc->plcm)(就一個disp_lcm_get_params 和 disp_lcm_init)就是調用到這個lcm驅動文件中的對應函數,進行初始化,load參數。
到這裏就把lcm加載流程串通了。
lk(對lcm)做了幾件事:
a. led_init() (本質上就僅僅是關背光,路徑:/lk/platform/mt6537/mt_leds.c中的mtxx_backlight_off())
b: compare id
c.get_params
d.lcm_init
e:load_boot_logo
f: show_boot_logo
g:mtxx_backlight_on()(本質上就是開背光,路徑:/lk/platform/mt6537/mt_leds.c中的mtxx_backlight_on(),直接調用硬件驅動setbacklight,這與kernel啓動後對背光的cust有很大的區別)
我這裏使用的是mt6735平臺,Android M,所以代碼因爲版本的差異有所不同,這就是我最討厭mtk的地方,不對各個平臺進行具體的說明,導致開發新手hin茫然!
最後,吃水不忘挖井人:
參考文檔:
MTK_Android_Boot_Up_Flow(customer).pdf 這是mtk官網出的開機加載步驟
mtk設備模型之LCM--學習http://blog.csdn.net/gnnulzy/article/details/52622742
這是參考的一個帖子,比我寫的生動形象,感謝前輩