- 軟件要求
- compare_id 必須保證可以正確讀取,通過resume 打印信息查看id 讀取是否成功與正確,確認OK後需要刪除resume compare_id代碼,避免由於頻繁resume 讀取id導致系統可能發生重啓;
- LCD 刷新率 控制在50fps-65fps,須通過fps工具(com.edburnette.fps2d-1.apk) 查看實際刷新率數據,特殊情況再行處理,幀率的高低會影響:GPS、閃屏、功耗、射頻等,提高或降低LCD幀率, 修改PLL: params->dsi.PLL_CLOCK=202;
- 整機靜電不通過的情況下,軟件必須增加esd_check&esd_recover(通用版本IC驅動必須實現, 若不同供應商若無法達到esd,由其自行解決);
- 常見效果確認
- Fliker (閃屏) 是否存在——整屏幕背光閃、邊角及灰色界面下閃爍(通過查看主界面、計算器界面等驗證)
- Moire(波紋) 是否存在
- 色調差異(冷、暖色溫)
- 亮度數據(Lux單位)、對比度數據、色彩數(65K、16K等)
- 配置LCM
- 配置LCM時先要把logo 分辨率指定正確,如: HD分辨率配置爲hd720
- LCM 移植完成後務必確認刷新率即幀率FPS: 要求50fps-65fps, 除非FAE 特別要求,否則不允許超出此範圍
- LCM 代碼分佈 在lk和kernel
LK: alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/
Kernel: alps/kernel-3.18/drivers/misc/mediatek/lcm/
- 範例
以晶尚10寸屏爲例,首先,確認模組打樣和硬件原理圖管腳是否能夠對應上,正確後。依據如下步驟:
- 保證當前工程全編譯過的前提下(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
//在內核配置文件裏直接修改會直接定死屏分辨率,不適配多種屏的方案
- 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.增加定義,參考相類似的屏驅動。注意定義要大寫。
- 修改驅動文件
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腳置低,喚醒時置高(避免可能的電源不穩的問題)