以mtk6737平台hx8363a的wvga屏举例说明
一、前期准备:
1、拿到LCD显示屏样品,叫供应商提供屏初始化参数、proch值、芯片数据手册、屏规格书。
2、找到主板LCD接口相关的硬件原理图。
3、需要USB转串口的工具,方便查看开机过程的串口log。
4、正式进入LCD驱动移植前,建议在前一天把系统代码完整编译过一遍(编译userdebug或者eng版本),
确保刷机后可以开机和打印串口log。
二、开始移植LK部分
1、打开硬件原理图查看LCD接口部分,了解以下几点
a、给屏供电是用独立的外部2.8V LDO芯片,还是mtk的PMIC输出2.8V。
b、reset引脚和ID引脚的gpio号(兼容多个屏才需要检测ID引脚)。
c、这个lcd屏的mipi接口是多少lane,可查看原理图lcd座子上有几组DATA网络,或者咨询负责硬件设计的人员。
d、建议把供应商提供的屏规格书核对一下,主要查看屏的fpc排线PIN脚和主板原理图中是否能对应上。
2、将供应商提供的屏初始化参数用UE工具修改成mtk平台的LCM_setting_table格式(如下举例),修改后请多
核对几遍
LCM_setting_table格式是: {
寄存器地址,要发送的参数个数, {
要发送的参数列表 }},
假设供应商提供的初始化参数是这样(不同供应商给的参数格式不一样,需要自己仔细观察规律,也可以询问FAE):
LCM_Write(Gen,0,6,0xFF,
0x77,
0x01,
0x00,
0x00,
0x13);
LCM_Write(Gen,0,2,0xEF,
0x08);
-->改成LCM_setting_table格式就是:
{
0xFF,5,{
0x77,0x01,0x00,0x00,0x13}},
{
0xEF,1,{
0x08}},
摘取屏驱动.c文件的部分屏初始化代码:
static struct LCM_setting_table lcm_initialization_setting[] = {
{
0xFF,5,{
0x77,0x01,0x00,0x00,0x13}},
{
0xEF,1,{
0x08}},
{
0xFF,5,{
0x77,0x01,0x00,0x00,0x10}},
{
0xC0,2,{
0x63,0x00}},
{
0xC1,2,{
0x10,0x02}},
{
0xC2,2,{
0x20, 0x02}},
…
…
{
0x11,1,{
0x00}},
{
REGFLAG_DELAY,120,{
}},
{
0x29,1,{
0x00}},
{
REGFLAG_DELAY,20,{
}},
{
REGFLAG_END_OF_TABLE,0x00,{
}}
};
3、假如供应商没有提供屏驱动.c文件,可以在目录vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/中
找一份来复制,文件夹命名为hx8363a_wvga_dsi_vdo_dz
a、文件夹里面的c文件重命名为hx8363a_wvga_dsi_vdo_dz.c
b、修改Makefile中为obj-y += hx8363a_wvga_dsi_vdo_dz.o
c、把前面第2步修改好格式的lcm_initialization_setting初始化参数替换到这个.c文件中
d、文件命名规则可以是:芯片名称_分辨率简称_dsi_vdo_供应商简称
常见的屏分辨率:
qvga 320x240
vga 640x480
wvga 800x480
svga 800x600
qhd 960×540
hd720 1280x720
fhd 1920x1080
4、修改c文件中的分辨率宏定义
#define FRAME_WIDTH (480)
#define FRAME_HEIGHT (800)
5、修改延时和结束的REGFLAG宏定义
#define REGFLAG_DELAY 0xFC(用lcm_initialization_setting中没出现过的值)
#ifdef REGFLAG_END_OF_TABLE
#undef REGFLAG_END_OF_TABLE
#endif
#define REGFLAG_END_OF_TABLE 0xFD(用lcm_initialization_setting中没出现过的值)
6、修改c文件最底部的LCM_DRIVER定义,请注意检查名称
LCM_DRIVER hx8363a_wvga_dsi_vdo_dz_lcm_drv =
{
.name = "hx8363a_wvga_dsi_vdo_dz",
…..
};
7、修改lcm_init函数
static void lcm_init(void)
{
#ifdef BUILD_LK //这里的上电部分,采用PMIC输出2.8V供电
pmic_set_register_value(MT6351_PMIC_RG_VIO28_VOSEL, 5);//不同平台PMIC寄存器可能有差异
pmic_set_register_value(PMIC_RG_VIO28_EN, 1);
pmic_set_register_value(PMIC_RG_VLDO28_EN_0, 1);
pmic_set_register_value(PMIC_RG_VLDO28_EN_1, 1);
#if 0
mt_set_gpio_mode(GPIO_LCD_POWER_EN, GPIO_MODE_00);//这里面是外部2.8V LDO的控制方式
mt_set_gpio_dir(GPIO_LCD_POWER_EN, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_LCD_POWER_EN, GPIO_OUT_ONE);//拉高使能脚
#endif
#endif
MDELAY(20);
SET_RESET_PIN(1);//复位引脚拉高
MDELAY(10);
SET_RESET_PIN(0);//拉低
MDELAY(10);
SET_RESET_PIN(1);//拉高
MDELAY(120); //这里一般延时120ms
push_table(lcm_initialization_setting, sizeof(