【MTK】LCM移植

  • 軟件要求
  1. compare_id 必須保證可以正確讀取,通過resume 打印信息查看id 讀取是否成功與正確,確認OK後需要刪除resume compare_id代碼,避免由於頻繁resume 讀取id導致系統可能發生重啓;
  2.  LCD 刷新率 控制在50fps-65fps,須通過fps工具(com.edburnette.fps2d-1.apk) 查看實際刷新率數據,特殊情況再行處理,幀率的高低會影響:GPS、閃屏、功耗、射頻等,提高或降低LCD幀率, 修改PLL: params->dsi.PLL_CLOCK=202;
  3.  整機靜電不通過的情況下,軟件必須增加esd_check&esd_recover(通用版本IC驅動必須實現, 若不同供應商若無法達到esd,由其自行解決);
  • 常見效果確認
  1. Fliker (閃屏) 是否存在——整屏幕背光閃、邊角及灰色界面下閃爍(通過查看主界面、計算器界面等驗證)
  2. Moire(波紋) 是否存在
  3. 色調差異(冷、暖色溫)
  4. 亮度數據(Lux單位)、對比度數據、色彩數(65K、16K等)

 

  • 配置LCM
  1. 配置LCM時先要把logo 分辨率指定正確,如: HD分辨率配置爲hd720
  2. LCM 移植完成後務必確認刷新率即幀率FPS: 要求50fps-65fps, 除非FAE 特別要求,否則不允許超出此範圍
  3. LCM 代碼分佈 在lk和kernel

LK: alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/

Kernel: alps/kernel-3.18/drivers/misc/mediatek/lcm/

 

  • 範例

以晶尚10寸屏爲例,首先,確認模組打樣和硬件原理圖管腳是否能夠對應上,正確後。依據如下步驟:

  1. 保證當前工程全編譯過的前提下(userdebug版本),更改如下內容:

alps/vendor/mediatek/proprietary/bootable/bootloader/lk/project/sm6737t_66_n.mk–> CUSTOM_LK_LCM=" jd9364_dsi_vdo_js"(先把之前兼容的屏全部去掉。)

 

alps/kernel-3.18/arch/arm64/configs/ sm6735_66_n_debug_defconfig &&sm6735_66_n_defconfig兩個文件更改內容:CONFIG_CUSTOM_KERNEL_LCM="jd9364_dsi_vdo_js" (先把之前兼容的屏全部去掉。)

並覈對以下內容:                             

*CONFIG_LCM_HEIGHT="1280"                        

*CONFIG_LCM_WIDTH="800"                             

CONFIG_MTK_LCM=y

//在內核配置文件裏直接修改會直接定死屏分辨率,不適配多種屏的方案

  1. alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm在此目錄下面單獨創建一個jd9364_dsi_vdo_js文件夾,內容可以先參考相類似的屏驅動

alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/ mt65xx_lcm_list.c增加jd9364_dsi_vdo_js定義,參考別的屏。注意定義要大寫。

alps/kernel-3.18/drivers/misc/mediatek/lcm在此目錄下面單獨創建一個jd9364_dsi_vdo_js文件夾,內容可以先參考相類似的屏驅動,lk和kernel兩個驅動文件一樣

alps/kernel-3.18/drivers/misc/mediatek/lcm/mt65xx_lcm_list.增加定義,參考相類似的屏驅動。注意定義要大寫

 

  1. 修改驅動文件

a.將模組廠給過來的初始化代碼合入lcm_initialization_setting[] = 此函數中,要按照MTK的格式,參考其他屏的配置

 

b.修改lcm_get_params(LCM_PARAMS *params)

{

........

          params->dsi.LANE_NUM = LCM_FOUR_LANE;   //4通道

          params->dsi.vertical_sync_active                = 10;//2    豎直同步信號

            params->dsi.vertical_backporch                    = 20;//30

            params->dsi.vertical_frontporch                    = 16;//20

      

            params->dsi.horizontal_sync_active                = 10;//12  水平同步信號

            params->dsi.horizontal_backporch                = 40;//60

            params->dsi.horizontal_frontporch                = 30;//60

            params->dsi.PLL_CLOCK=200;       //clock頻率

//esd check配置,晶尚的不支持

 //   params->dsi.esd_check_enable = 1;

  //  params->dsi.customization_esd_check_enable = 1;

 // params->dsi.lcm_esd_check_table[0].cmd = 0x0A;//9503v做esd-check 分別0A:9C,0B:00,0C:70

 //   params->dsi.lcm_esd_check_table[0].count = 1;

 //   params->dsi.lcm_esd_check_table[0].para_list[0] = 0x9c;

}

對應屏驅動文件中

lcm_compare_id(void){

return 1; //強制返回成功,先不管讀ID

……………..

}

c.單獨編譯lk 和bootimages模塊。以上內容保證更改正確,模組廠給的初始化是對應的,一般情況下是可以正常亮的。

如果能正常顯示。進入adb shell

 

輸入 # su

# cat  /proc/cmdline

能看到加載的是對應的屏驅動。

屏正常顯示後如果出現有時屏會閃動。降低時序:lcm_get_params(LCM_PARAMS * params) {

……

params->dsi.PLL_CLOCK=220;  //230  改動此內容

以上如果一開機就一直花屏,屏驅動也是跑的對應的驅動,而且此板子之前有兼容其它屏,而且其它屏能夠正常顯示的。那麼這個時候可以考慮找項目換一塊屏試試,此情況模組本身的問題概率比較大。

 

d.正常顯示之後,修改讀ID部分

對應函數:lcm_compare_id(void)

{

    array[0] = 0x00033700;// read id return two byte,version and id

    dsi_set_cmdq(array, 1, 1);

    read_reg_v2(0xDB, &buffer[0], 1);

    read_reg_v2(0xDC, &buffer[1], 1);

    device_id = buffer[0]<<8|buffer[1];

    return (0x9504 == device_id)  ? 1 : 0;

}

 

此部分可以找屏廠提供。爲了方便看打印。將讀ID函數重新在lcm_resume(void){

//最前面再次讀ID

lcm_compare_id();

……..

}     

 

如果相同IC不同玻璃做兼容:硬件上專門有一個GPIO腳控制,兩塊屏接在板子上開機 對應的這個腳的電壓會不一樣,這樣才能兼容。

如下圖AUX_IN1_LCD_ID這個管腳:

軟件上修改參考如下:

static unsigned int lcm_compare_id(void)

{    res = IMM_GetOneChannelValue(AUXADC_LCM_VOLTAGE_CHANNEL,data,&rawdata);

 

    lcm_vol = data[0]*1000+data[1]*10;

........

return ((0x9504 == device_id) && (lcm_vol>200 && lcm_vol<400)) ? 1 : 0;   

}

ID電阻對應的電壓值:

LCD_ID: 

if (lcm_vol > 200 && lcm_vol < 500)     //470k

if (lcm_vol > 500 && lcm_vol < 800)     //150k

if (lcm_vol > 800 && lcm_vol < 1000)    //100k

if (lcm_vol > 1000 && lcm_vol < 1300)   //51k

if (lcm_vol < 200))   //NULL

 

e.屏需要在休眠RST腳置低,喚醒時置高(避免可能的電源不穩的問題)

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