安卓系統從power鍵按下釋放,到lcm驅動顯示,整個驅動的載入流程as follows:
lk階段:
首先執行main.c(vendor/mediatek/proprietary/bootable/bootloader/preloader/platform/mt6739/src/core/main.c)檔案,然後執行
platform_init(/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6739/platform.c),然後執行mt_disp_init((void *)g_fb_base);
然後執行disp_lcm_probe -->
其中重點分析下 disp_lcm_probe(vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6739/disp_lcm.c)
check_lcm_node_from_dt() == 0 讀取dts節點資訊?
if (_lcm_count() == 0) 得到lcm的數量,如果為0返回null,如果為1,則
(_lcm_count()返回的是lcm_count,而lcm_count是從mt65xx_lcm_list.c中extern過來的lcm_count= sizeof(lcm_driver_list) / sizeof(lcm_driver *))
lcm_drv = lcm_driver_list[0]; 讀取這個陣列的第乙個元素;
lcm_driver_list陣列從mt65xx_lcm_list.c中extern過來的
這個陣列中在新增lcm驅動的時候新增了各個驅動的lcm_drv
比如,我們要新增名為eighty_80的lcm驅動
那麼我們就會在vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/mt65xx_lcm_list.c新增
+extern lcm_driver eighty_80_lcm_drv;
並且在lcm_driver *lcm_driver_list中新增
#if defined(eighty_80)
&eighty_80_lcm_drv,//對應lcm驅動的主函式
#endif
其中&eighty_80_lcm_drv則對應驅動檔案中的lcm_drv
這樣的話,lcm_drv= lcm_driver_list[0];就是取得驅動檔案中的lcm_drv
如果為大於乙個lcm驅動,首先是for迴圈,依次遍歷lcm_driver_list這個陣列:lcm_drv=lcm_driver_list[i],遍歷取得各個lcm驅動的lcm_drv
之後會做判斷if(lcm_drv->compare_id() != 0)
這個函式會呼叫到lk中lcm ic 驅動檔案的compare_id函式,返回lcd的id,如果id存在,就會break跳出遍歷,告訴系統使用當前這個lcm,這樣的話遍歷的目的就是取得機器上當前所使用的lcm的各種資訊
之後會將這個lcm的各類資訊傳遞給kernel…………這裡 disp_lcm_probe就執行完
–>然後執行到primary_display_init(vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6739/primary_display.c)
–> 執行pgc->plcm= disp_lcm_probe,將當前使用的lcm驅動模型賦值給pgc->plcm
–> 之後執行ret = disp_lcm_init(pgc->plcm)就是呼叫到這個lcm驅動檔案中的各個函式,進行初始化,load引數等等。到這裡就把lcm lk載入流程串通了。
kernel階段:
驅動入口函式:mtkfb_init(kernel-4.4/drivers/misc/mediatek/video/mt6739/videox/mtkfb.c)–> 執行mtkfb_driver的mtkfb_probe
–> 執行_parse_tag_videolfb(mtkfb.c) --> primary_display_init(kernel-4.4/drivers/misc/mediatek/video/mt6739/videox/primary_display.c)
–> mtkfb_find_lcm_driver(mtkfb.c)
–> mtkfb_fbinfo_init(mtkfb.c)初始化fbi
–>disp_lcm_probe():
check_lcm_node_from_dt() == 0 讀取dts節點資訊?
if (_lcm_count() == 0) 得到lcm的數量,如果為0返回null,如果為1,則
lcm_drv = lcm_driver_list[0]; if (plcm_name == null) 讀取lcm_driver_list這個陣列的第乙個元素,islcmfound = true;islcminited = false;
if (strcmp(lcm_drv->name, plcm_name):比較lcm_drv->name和 plcm_name,如果kernel lcm name和lk lcm name不同,return null;
lcm_driver_list陣列從mt65xx_lcm_list.c(kernel-4.4/drivers/misc/mediatek/lcm/mt65xx_lcm_list.c)中extern過來的
這個陣列中在新增lcm驅動的時候新增了各個驅動的lcm_drv
執行lcm_drv = lcm_driver_list[i]遍歷取得各個lcm驅動的lcm_drv, if (!strcmp(lcm_drv->name, plcm_name))如果kernel lcm name和lk lcm name一致,
islcmfound = true;islcminited = true;lcmindex = i; 然後break 跳出遍歷。去執行相應lcm ic驅動的函式。
MTK驅動 lcm驅動載入及呼叫流程
使用mt6739平台4.4核心,按下開機鍵,液晶開始顯示,從而進入lk載入lcm的階段 lk執行流程 開機執行 vendor mediatek proprietary bootable bootloader 目錄下 從preloader platform mt6739 src core main.c...
MTK平台 LCM相容原理
kernel階段 總結 環境 android p 今天想記錄和分享的是mtk平台lcm的相容,當然,在學習相容原理的時候肯定需要大概知道lcm的載入流程,於是借鑑前輩們的經驗 文章最後會貼上參考的文章 淺顯的去學習了一下,lcm方面深入的知識以後有機會再慢慢研究,保持一顆學習的心 kmain pla...
MTK平台驅動除錯指南
gpio設定篇 一 gpio有關的函式 1 gpio modesetup 函式原型 void gpio modesetup kal uint16 pin,kal uint16 conf dada 功能 設定gpio的工作模式是作為gpio,還是作為專有功能介面。引數 pin gpio 的pin腳號,...