日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

高通平台MSM8916LCM模块移植(一)-bootloader部分

發布時間:2025/4/16 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高通平台MSM8916LCM模块移植(一)-bootloader部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此次移植打算分成兩個模塊來說,bootloader部分和kernel部分。在實際的移植調試過程中也是這么分成了兩個部分分別調試。

? ? ? ? ? ?高通平臺中的bootloader叫做LK(Little Kernel,對于LCM來說LK部分相當重要,它不僅要負責開機部分的LCD顯示任務,還要負責傳參給kernel的LCM驅動,指導kernel選擇合適的LCM參數。

1、LK中LCM啟動流程


注:read_panel_id()和read_panel_id_ddr3()為私有添加,非高通庫上代碼。
在這個流程圖中,需要著重了解的有oem_panel_select() mdss_dsi_initialize() 和read_panel_id()函數,這三個函數主要是做lcd兼容,下面來具體看函數內容。

2、oem_panel_select()

這個函數在 android/bootloader/lk/target/msm8916/oem_panel.c文件中主要是識別不同IC,賦值給參數panel_id,panel_id的使用在同一文件中的 init_panel_data()函數中。[objc]?view plaincopy
  • /********************************************************??
  • *Name:????????oem_panel_select??
  • *Function:????selection?different?lcm?panel??
  • *Description:?1)This?func?will?be?roaded?twice,first?time?use?default?value??
  • [objc]?view plaincopy
  • ????????????????second?time?depend?on?lk_lcd_id?value?match?correct?branch.??
  • *Author:??????Jerry.peng??
  • *********************************************************/??
  • bool?oem_panel_select(const?charchar?*panel_name,?struct?panel_struct?*panelstruct,??
  • ????????????struct?msm_panel_info?*pinfo,??
  • ????????????struct?mdss_dsi_phy_ctrl?*phy_db)??
  • {??
  • ????uint32_t?soc_version?=?board_soc_version();??
  • ????uint32_t?gpio_state?=?0;??
  • ??
  • ????gpio_tlmm_config(LCM_GPIO_DETECT,?0,?GPIO_INPUT,?GPIO_NO_PULL,?GPIO_8MA,?GPIO_ENABLE);<span?style="color:#33ff33;">?</span><span?style="color:#009900;">//這個主要是硬件檢測lcd_id引腳,用來區分同一IC不同模組廠屏</span>??
  • ????mdelay(10);??
  • ????gpio_state?=?gpio_status(LCM_GPIO_DETECT);??
  • ????dprintf(CRITICAL,?"[PHC]:oem_panel.c?soc_version?=?0X%x?value,gpio_state=%d\n",soc_version,gpio_state);??
  • ????????????if(0x6089?==?lk_lcd_id?||?0xFFFF?==?lk_lcd_id){?????????????????????<span?style="color:#009900;">??//lk_lcd_id?是自己設定的一個全局變量,賦值在mipi_dsi.c文件中</span>??
  • ????????????????if(gpio_state){????????????????????????????????????????????<span?style="color:#009900;">//這個是同一個IC,不同模組廠的情況,由之前說的lcd_id引腳來判定</span>??
  • ????????????????????panel_id?=?ILI9806E_WVGA_VIDEO_HONGTAO_PANEL;??
  • ????????????????????dprintf(CRITICAL,"[PHC]:?ILI9806E?hongtao?panel?choosed\n");??
  • ????????????????}?else?{??
  • ????????????????????panel_id?=?ILI9806E_WVGA_VIDEO_HAIFEI_PANEL;??
  • ????????????????????dprintf(CRITICAL,"[PHC]:?ILI9806E?haifei?panel?choosed\n");??
  • ????????????????}??
  • ????????????}??
  • [objc]?view plaincopy
  • else?if(0x8018?==?lk_lcd_id){?????????????????????????????????????<span?style="background-color:?rgb(255,?255,?255);"><span?style="color:#009900;">//此處為IC(OTM8019)的情況</span></span>??
  • ????if(gpio_state){??
  • ????????panel_id?=?OTM8019_WVGA_VIDEO_SUXIAN_PANEL;??
  • ????????dprintf(CRITICAL,"[PHC]:?otm8019?panel?choosed\n");??
  • ????}?else?{??
  • ????????panel_id?=?OTM8019_WVGA_VIDEO_HAOSHITONG_PANEL;??
  • ????????dprintf(CRITICAL,"[PHC]:?otm8018b?panel?choosed\n");??
  • ????}??
  • }??
  • [objc]?view plaincopy
  • ????????????else?if?(0x3551?==?lk_lcd_id){???????????????????????????????<span?style="font-family:?Arial,?Helvetica,?sans-serif;"><span?style="color:#009900;">//此處為IC(NT35512S)的情況</span></span>??
  • ??
  • ????????????????????panel_id?=?NT35512S_WVGA_VIDEO_HAIFEI_PANEL;??
  • ????????????????????dprintf(CRITICAL,"[PHC]:?NT35512S?haifei?panel?choosed\n");??
  • ????????????}??
  • panel_init:??
  • ????pinfo->pipe_type?=?MDSS_MDP_PIPE_TYPE_RGB;??
  • ????return?init_panel_data(panelstruct,?pinfo,?phy_db);??
  • }??

  • 3、mdss_dsi_initialize()

    mdss_dsi_initialize() 在文件Android/bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c 中

    在 mipi_dsi.c 文件開始先申明全局變量 lk_lcd_id

    [cpp]?view plaincopy
  • uint32_t?lk_lcd_id?=?0xFFFF;??

  • [cpp]?view plaincopy
  • /*****************************************************************?
  • *Name:????????mdss_dsi_panel_initialize?
  • *Function:????Read?LCM?id?&?send?lcm?config?
  • *Descritpion:?1/?soc_version?use?for?identify?T3F?project?
  • ??????????????2/?lcm_id_retry?usr?for?identify?2?lane?or?4lane?mipi?
  • *******************************************************************/??
  • int?mdss_dsi_panel_initialize(struct?mipi_dsi_panel_config?*pinfo,?uint32_t??
  • ????????broadcast)??
  • {??
  • ????int?status?=?0;??
  • ??????
  • #if?(DISPLAY_TYPE_MDSS?==?1)??
  • <span?style="background-color:?rgb(255,?255,?255);"><span?style="color:#cc33cc;">???if?(0xffff?==?lk_lcd_id?){??????????????????????????????????????</span><span?style="color:#009900;">//洋紅色這部分代碼是自己添加的和上面函數所說的oem_panel_select()配合使用</span><span?style="color:#cc33cc;">??
  • ????????????lk_lcd_id?=?read_panel_id();???????????????????</span><span?style="color:#009900;">?//此為讀ID的函數調用處</span><span?style="color:#cc33cc;">??
  • ????????target_force_cont_splash_disable(true);??
  • ????????msm_display_off();??
  • ????????target_force_cont_splash_disable(false);??
  • ????????target_display_init(NULL);?????????????????????????????</span><span?style="color:#009900;">//從上面流程圖看以看出,這個是屏初始化的開始函數,相當于第二次初始化屏幕</span><span?style="color:#cc33cc;">??
  • ????????return?1;??
  • ????}</span></span>??
  • ????if?(pinfo->panel_cmds)?{??
  • ????????if?(broadcast)?{??
  • ????????????status?=?mdss_dual_dsi_cmds_tx(pinfo->panel_cmds,??
  • ????????????????????pinfo->num_of_panel_cmds);??
  • ??
  • ????????}?else?{??
  • ????????????status?=?mipi_dsi_cmds_tx(pinfo->panel_cmds,??
  • ????????????????????pinfo->num_of_panel_cmds);??
  • ????????????if?(!status?&&?target_panel_auto_detect_enabled())??
  • ????????????????status?=??
  • ????????????????????mdss_dsi_read_panel_signature(pinfo->signature);??
  • ????????}??
  • ????????dprintf(CRITICAL,"[PHC]:?status=%d\n",status);??
  • ????}??
  • #endif??
  • ????return?status;??
  • }??
  • 4、read_panel_id()

    read_panel_id()為讀取LCM ID的函數,里面包括讀取各中IC函數,詳細看下面代碼。

    [cpp]?view plaincopy
  • <pre?name="code"?class="cpp">/*****************************************************************?
  • *Name:????????read_panel_id?
  • *Function:????Read?LCM?id?
  • *Descritpion:?1/?lcm_id_retry?usr?for?identify?2?lane?or?4lane?mipi?
  • ??????????????2/?lcm_id_retry?==?0?means?2?lane?
  • *Author:??????Jerry.peng?
  • *******************************************************************/??
  • uint32_t?read_panel_id(void)??
  • {??
  • ????uint32_t?lcd_id?=?0xffff;??
  • [cpp]?view plaincopy
  • <span?style="white-space:pre">????</span>if(?mdss_dsi_read_ili9806e_id()?)??
  • <span?style="white-space:pre">????????</span>lcd_id?=?0x6089;???????/*?panel?ic?is?ili9806e?*/??
  • <span?style="white-space:pre">????</span>else?if(?mdss_dsi_read_otm8018b_id())??
  • <span?style="white-space:pre">????????</span>lcd_id?=?0x8018;???????/*?panel?ic?is?otm8018b?*/??
  • <span?style="white-space:pre">????</span>else?if(?mdss_dsi_read_nt35512s_id()?)??
  • <span?style="white-space:pre">????????</span>lcd_id?=?0x3551;???????/*?panel?ic?is?nt35512s?*/??
  • ????if(lcd_id?==?0xffff){??
  • ????????lcd_id?=?0x1283;??
  • ????????dprintf(CRITICAL,"[PHC]:?no?panel?id?readed?use?default?\n");??
  • ????return?lcd_id;??
  • }??

  • 不同IC的讀取ID的函數都大同小異,我這里就用ili9806e這顆IC來舉例:[cpp]?view plaincopy
  • <pre?name="code"?class="cpp">static?struct?mipi_dsi_cmd?apex_ili9806e_panel_set_cmd[]?=?{??
  • ???????{sizeof(apex_ili9806e_cmd0),?apex_ili9806e_cmd0},??
  • };??
  • ??
  • static?char?apex_ili9806e_panel_set_pkt_size[4]?=?{0x08,?0x00,?0x37,?0x80};??
  • static?struct?mipi_dsi_cmd?apex_ili9806e_panel_set_pkt_size_cmd[]?=?{??
  • ????{sizeof(apex_ili9806e_panel_set_pkt_size),?apex_ili9806e_panel_set_pkt_size},};??
  • static?char?apex_ili9806e_panel_manufacture_id[4]?=?{0x00,?0x00,?0x06,?0xA0};??
  • static?struct?mipi_dsi_cmd?apex_ili9806e_panel_manufacture_id_cmd[]?=?{??
  • ????{sizeof(apex_ili9806e_panel_manufacture_id),?apex_ili9806e_panel_manufacture_id},};??
  • [cpp]?view plaincopy
  • <pre?name="code"?class="cpp">static?bool?mdss_dsi_read_ili9806e_id(void)??
  • {??
  • ????char?rec_buf[24];??
  • ????char?*rp?=?rec_buf;??
  • ????uint32_t?*lp,temp,ret,?data?=?0;??
  • ??
  • ??
  • ????????ret?=?mipi_dsi_cmds_tx(apex_ili9806e_panel_set_cmd,?ARRAY_SIZE(apex_ili9806e_panel_set_cmd));??
  • ????????mdelay(10);??
  • ????????ret?=?mipi_dsi_cmds_tx(apex_ili9806e_panel_set_pkt_size_cmd,?ARRAY_SIZE(apex_ili9806e_panel_set_pkt_size_cmd));??
  • ????????mdelay(10);??
  • ????????ret?=?mipi_dsi_cmds_tx(apex_ili9806e_panel_manufacture_id_cmd,?ARRAY_SIZE(apex_ili9806e_panel_manufacture_id_cmd));??
  • ????????mdelay(10);??
  • ????????if(ret?==?1)??
  • ????????????lcm_id_retry?+=?1;??
  • ????????mipi_dsi_cmds_rx(&rp,?3);??
  • ??
  • ??
  • ????????lp?=?(uint32_t?*)rp;??
  • ????????data?=?(uint32_t)*lp;??
  • ????????data?=?ntohl(data);??
  • ??
  • ??
  • ????????data?=?data?&?0xFF;??
  • ????????dprintf(CRITICAL,"[PHC]:?ili9806e?id:?0x%x\n",?data);??
  • ????????if(data?==?0x98)?{??
  • ????????????lcm_id_retry?=?0;??
  • ????????????return?true;??
  • ????????}??
  • ????????else??
  • ????????????return?false;??
  • }??
  • ? ? ? ?到此,整個lk中LCM兼容和移植的主體部分就已經完成了,剩下就是填LCM參數進.h文件,這里再對整個流程進行一個補充整理。
    ? ? ? ?首先解釋下為什么不用高通默認的兼容方法,因為高通默認的兼容需要用到各種硬件id,平臺id,這些都是在SBL中設定的,修改起來麻煩,而且可以兼容的屏幕個數有限,我上面所說的這種方法加上我拓展的一些代碼,已經可以兼容十多塊屏幕。
    整個兼容方法的思路是,在LCM進行第一遍初始化的時候,什么都不變,但進行到mipi_dsi.c文件中的mdss_dsi_initialize()函數的時候,回去讀當前使用的LCM IC 的id
    ,如果和默認的屏幕id一樣,則不進行第二次初始化,若不一樣,則重新初始化,這個時候全局變量lk_lcd_id已經被賦值,當第二遍初始化到了oem_panel.c文件的oem_panel_select()函數中,函數根據lk_lcd_id的值來匹配正確的屏幕變量。匹配完成之后繼續未完成的屏幕初始化,至此整個流程走完,屏幕點亮!

    ? ? ? 文章介紹完畢,如有錯誤歡迎大家指正~

    0

    總結

    以上是生活随笔為你收集整理的高通平台MSM8916LCM模块移植(一)-bootloader部分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。