MTK lcm 驅動加載流程 android M

直有一種強迫症,不把整個流程屢清楚就是藍瘦香菇。做項目讀博客多了,也就慢慢地搞清楚了。

安卓系統從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

這是參考的一個帖子,比我寫的生動形象,感謝前輩


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章