MTK6739_安卓12屏幕调试笔记

需要的资料

屏幕厂商资料

供应商一般会提供一份包含供电电压、初始化代码、proch参数、屏幕尺寸的txt文档参考如下,和相应的屏幕规格书
TXT文档如下

EK79007+BOE7.0 IPS	1024x600_IPS //IC型号、封装厂商、玻璃、屏幕尺寸
//以下为电压
VDD= 1.8V
RESET=VDD;
STBYB=VDD;
VGH= 18V
VGL= -6V
AVDD= 9.6V
VCOM= 3.2V(TPY.//以下为proch参数
MIPI CLK Speed:340Mbps(170MHZ)
H back porch:160
H front porch:160 
H pulse width:10
V back porch:23
V front porch:12
V pulse width:1
//以下为初始化参数
MIPI command:
regw(0x80,0xAB);
regw(0x81,0x4B);//00=1LANE 01=2LANE 10=3LANE 11=4LANE
regw(0x82,0x84);
regw(0x83,0x88);
regw(0x84,0xA8);
regw(0x85,0xE3);
regw(0x86,0xB8);
注:請用MIPI短包(0x15)下初始化

规格书部分内容如下
规格书内pin脚定义

主板硬件资料

主板硬件资料一般需要注意的有以下几个点
1、各个电源的使能引脚,reset的引脚
如我拿到的主板原理图的VDD是通过LDO产生的,故需要查看LDO是否使用对应电压的LDO,使能引脚是否使能。
又比如该屏幕需要使用VGL VGH我拿到的主板是通过同一个DCDC搭配不同外设通过二极管隔离达到的,实际上只需要一个引脚控制DCDC的使能。
2、mipi lane
我拿到的主板是默认支持4lane故可以直接使用该参数

兼容

屏幕的兼容我是参考

https://blog.csdn.net/hismee/article/details/107185470

这个链接进行配置的,以下是我的配置方式

LK阶段

路径:
vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm
首先复制源代码内的一个屏幕(最好是IC相同的)
我复制的屏幕为EK79007_WSVGALNL_DSI_VDO
将文件夹EK79007_WSVGALNL_DSI_VDO复制并从命名为EK79007_BOE_70_IPS(名字可以自己取)
并将内部的.C文件修改为ek79007_boe_70_ips(名字可以自己取,但是建议与文件夹相同,区分大小写)
1、将初始化代码替换

以下为修改后初始化代码

static struct LCM_setting_table lcm_initialization_setting[] =
{

    {0x80,1,{0xAB}},
    {0x81,1,{0x4B}},
    {0x82,1,{0x84}},
    {0x83,1,{0x88}},
    {0x84,1,{0xA8}},
    {0x85,1,{0xE3}},
    {0x86,1,{0xB8}}, 
    {0x11,1,{0x00}},
    {REGFLAG_DELAY,150,{}},
    {0x29,1,{0x00}},
    {REGFLAG_END_OF_TABLE, 0x00, {}},
};

修改前

static struct LCM_setting_table lcm_initialization_setting[] =
{
    {0x25,1,{0x55}},
    {0x36,1,{0x01}},
    //{0x25,1,{0x00}},

    {0xB1,1,{0x30}},
    {0xB2,1,{0x10}},
    {0x80,1,{0x47}},
    {0x81,1,{0x40}},
    {0x82,1,{0x04}},
    {0x83,1,{0x77}},
    {0x84,1,{0x0f}},
    {0x85,1,{0x70}},
    {0x86,1,{0x70}},
    //{0x25,1,{0x00}},
    
    //{0x11,1,{0x00}},
    {REGFLAG_DELAY,150,{}},
    //{0x29,1,{0x00}},
    //{REGFLAG_DELAY,70,{}},
    {REGFLAG_END_OF_TABLE, 0x00, {}},
};

2、修改proch参数

原始代码

static void lcm_get_params(LCM_PARAMS *params)
{
		memset(params, 0, sizeof(LCM_PARAMS));
	
		params->type   = LCM_TYPE_DSI;

		params->width  = FRAME_WIDTH;
		params->height = FRAME_HEIGHT;
		
    #if (LCM_DSI_CMD_MODE)
		params->dsi.mode   = CMD_MODE;
    #else
		params->dsi.mode   = BURST_VDO_MODE;	//SYNC_EVENT_VDO_MODE;		//SYNC_PULSE_VDO_MODE;
    #endif
	
		// DSI
		/* Command mode setting */
		// Three lane or Four lane
		params->dsi.LANE_NUM				= LCM_TWO_LANE;
		
		//The following defined the fomat for data coming from LCD engine.
		params->dsi.data_format.color_order = LCM_COLOR_ORDER_RGB;
		params->dsi.data_format.trans_seq   = LCM_DSI_TRANS_SEQ_MSB_FIRST;
		params->dsi.data_format.padding     = LCM_DSI_PADDING_ON_LSB;
		params->dsi.data_format.format      = LCM_DSI_FORMAT_RGB888;

		// Highly depends on LCD driver capability.
		// Not support in MT6573
		params->dsi.packet_size=256;

		// Video mode setting		
		params->dsi.intermediat_buffer_num = 0;

		params->dsi.PS=LCM_PACKED_PS_24BIT_RGB888;
		params->dsi.word_count=FRAME_WIDTH*3;
		
		params->dsi.vertical_sync_active				= 10;
		params->dsi.vertical_backporch					= 8;
		params->dsi.vertical_frontporch					= 6;
		params->dsi.vertical_active_line				= FRAME_HEIGHT; 

		params->dsi.horizontal_sync_active				= 10;
		params->dsi.horizontal_backporch				= 60;
		params->dsi.horizontal_frontporch				= 60;
		params->dsi.horizontal_blanking_pixel = 60;
		params->dsi.horizontal_active_pixel				= FRAME_WIDTH;
		
		// Bit rate calculation
		// Every lane speed
		//params->dsi.pll_div1=0;				// div1=0,1,2,3;div1_real=1,2,4,4
		//params->dsi.pll_div2=0;				// div2=0,1,2,3;div1_real=1,2,4,4	
		//params->dsi.fbk_div =0x12;    // fref=26MHz, fvco=fref*(fbk_div+1)*2/(div1_real*div2_real)	
		params->dsi.cont_clock 	= 1;
		params->dsi.ssc_disable = 0;
		params->dsi.PLL_CLOCK 	= 300;
		
}

其中 params->dsi.LANE_NUM 为LANE的线数 我这里使用4LINE 修改为
params->dsi.LANE_NUM = LCM_FOUR_LANE;

参数对应txt中的参数
params->dsi.vertical_sync_activeV pulse width (也叫VSC)
params->dsi.vertical_backporchV back porch (也叫VBP)
params->dsi.vertical_frontporchV front porch (也叫VFP)
params->dsi.horizontal_sync_activeV pulse width(也叫HSC)
params->dsi.horizontal_backporchH back porch(也叫HBP)
params->dsi.horizontal_frontporchH front porch (也叫HFP)
params->dsi.vertical_active_line屏幕V方向尺寸
params->dsi.horizontal_active_pixel屏幕H方向尺寸

由于各家FAE叫法不同,如不清楚的 可以直接找FAE沟通

params->dsi.PLL_CLOCK 该参数个人也没有研究清楚具体的对应公式,我直接使用的值为MIPI CLK Speed 中的170。有大神可以提点一下小弟
我参考的是文档

https://blog.csdn.net/zuoyioo7/article/details/79021459?spm=1001.2014.3001.5502

3、修改各种GPIO引脚

首先根据硬件原理图找到具体的引脚标号,然后修改dws文件

vendor\mediatek\proprietary\bootable\bootloader\lk\target\tb8765ap1_bsp_1g_k419\dct\dct\codegen.dws
vendor\mediatek\proprietary\bootable\bootloader\preloader\custom\tb8765ap1_bsp_1g_k419\dct\dct\codegen.dws
其中tb8765ap1_bsp_1g_k419 为项目名称

原始代码中初始化使用的引脚通过GPIO_LCM_RST 宏定义的reset
通过GPIO_LCD_BL_EN定义的背光引脚
代码如下

#ifdef GPIO_LCM_PWR_EN
#define GPIO_LCD_PWR_EN      GPIO_LCM_PWR_EN
#else
#define GPIO_LCD_PWR_EN      0xFFFFFFFF
#endif

#ifdef GPIO_LCM_RST
#define GPIO_LCD_RST      GPIO_LCM_RST
#else
#define GPIO_LCD_RST      0xFFFFFFFF
#endif

#ifdef GPIO_LCM_BL_EN
#define GPIO_LCD_BL_EN      GPIO_LCM_BL_EN
#else
#define GPIO_LCD_BL_EN      0xFFFFFFFF
#endif

我修改为

#define GPIO_LCM_RESET 	(GPIO83 | 0x80000000)
#define GPIO_LCM_POWER18 	(GPIO13  | 0x80000000)  //该IO是控制VDD的
#define GPIO_LCM_POWER33 	(GPIO124 | 0x80000000)	//该IO是控制vgh  vgl avdd vcom的电压的

然后在函数lcm_init lcm_suspend中修改对应的代码,以满足规格书提供的时序

在这里插入图片描述

4、读取ID
lcm_compare_id函数为读取id的函数,初步调试的时候建议不读取ID,由于该IC的屏幕读取ID有问题,故默认代码也未读取ID,如需要读取ID,可以参考其他屏幕的该部分代码。要注意屏幕读取ID的寄存器操作说明。
5、修改屏幕名称
原始代码

LCM_DRIVER ek79007_wsvgalnl_dsi_vdo_lcm_drv = 
{
  .name				= "EK79007_WSVGALNL_DSI_VDO",

将以上的ek79007_wsvgalnl_dsi_vdo_lcm_drv 修改一个vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\mt65xx_lcm_list.c 内没有的名称
.name 这个值可以自己取,只是一串字符串,但是注意与后续修改的kernel内保持一致

LCM_DRIVER ek79007_boe_70_ips_wsvga_dsi_lcm_drv = 
{
  .name				= "ek79007_boe_70_ips",

6、将添加的屏幕加入编译
将文件夹内的makefile内的
obj-y += VVX10F008B00_WUXGA_DSI_VDO.o
修改为

obj-y += ek79007_boe_70_ips.o 

注意 名称与文件夹内的.C文件一样,且区分大小写。
在以下文件内
vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\mt65xx_lcm_list.c
添加

#if defined(EK79007_BOE_70_IPS)
extern LCM_DRIVER ek79007_boe_70_ips_wsvga_dsi_lcm_drv;
#endif

以及在

LCM_DRIVER *lcm_driver_list[] = {

数组内添加

#if defined(EK79007_BOE_70_IPS)
	&ek79007_boe_70_ips_wsvga_dsi_lcm_drv,
#endif

最后在文件
vendor\mediatek\proprietary\bootable\bootloader\lk\project\tb8765ap1_bsp_1g_k419.mk
修改

CUSTOM_LK_LCM="ek79007_boe_70_ips"

以及修改

BOOT_LOGO := wsvga

其中CUSTOM_LK_LCM 后面的参数记得带引号,参数值与#if defined(EK79007_BOE_70_IPS) 内的参数有关全小写
BOOT_LOGO的参数后面的wsvga 参数值与屏幕尺寸有关,根据屏幕尺寸选择(可以参考https://blog.csdn.net/hismee/article/details/107185470 文档内,有部分尺寸说明)vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo\文件内的不同文件夹名称,如没有可以添加

修改
device\mediateksample\tb8765ap1_bsp_1g_k419\ProjectConfig.mk
内的
BOOT_LOGO
LCM_HEIGHT
LCM_WIDTH
其中tb8765ap1_bsp_1g_k419 这个对应项目名称
BOOT_LOGO 与vendor\mediatek\proprietary\bootable\bootloader\lk\project\tb8765ap1_bsp_1g_k419.mk 内的logo相同
LCM_HEIGHT LCM_WIDTH 为屏幕尺寸

以上LK部分代码修改基本完毕

kernel阶段

1、添加屏幕的文件
由于安卓12最低要求使用kernel4.19故需要在以下路径
kernel-4.19\drivers\misc\mediatek\lcm
同样复制相似的屏幕 修改文件夹名称和文件名称(与LK阶段相同)
2、修改初始化代码
内容同LK阶段,可以直接将LK阶段的代码直接拷贝
3、修改GPIO
修改
kernel-4.19\drivers\misc\mediatek\dws\mt6739\tb8765ap1_bsp_1g_k419.dws
同时也需要按照LK的方式修改 kernel阶段的时序
同时kernel阶段的gpio建议通过设备树读取
可以在kernel-4.19\drivers\misc\mediatek\lcm\文件夹目录内添加读取设备树的.文件并修改makefile
并通过late_initcall 函数使其调用
4、修改屏幕名称
屏幕名称应与IK相同,建议LCM_DRIVER的指针名称也跟LK相同
5、将添加的屏幕添加并编译到软件中
在文件
kernel-4.19\drivers\misc\mediatek\lcm\mt65xx_lcm_list.h
内添加

#if defined(EK79007_BOE_70_IPS)
extern struct LCM_DRIVER ek79007_boe_70_ips_wsvga_dsi_lcm_drv;
#endif

并在
kernel-4.19\drivers\misc\mediatek\lcm\mt65xx_lcm_list.c
文件内的

struct LCM_DRIVER *lcm_driver_list[] = {

数组内添加

#if defined(EK79007_BOE_70_IPS)
	&ek79007_boe_70_ips_wsvga_dsi_lcm_drv,
#endif

最后在
kernel-4.19\arch\arm\configs\tb8765ap1_bsp_1g_k419_debug_defconfig
kernel-4.19\arch\arm\configs\tb8765ap1_bsp_1g_k419_defconfig
文件内修改
CONFIG_CUSTOM_KERNEL_LCM
CONFIG_LCM_HEIGHT
CONFIG_LCM_WIDTH
以上三个参数

CONFIG_CUSTOM_KERNEL_LCM="ek79007_boe_70_ips"
CONFIG_LCM_HEIGHT="600"
CONFIG_LCM_WIDTH="1024"

以上屏幕基本添加完成
在调试过程中遇到问题可以多与FAE沟通。

特别强调一点(我遇到的大坑),MTK在安卓11(我知道的是)开始,代码内默认打开了AAL,如果没有AAL的许可证,会出现在kernel阶段息屏后不能点亮屏幕,且在log中有

AAL is not working:no license key

参考FAQ22764将AAL关闭
一般建议关闭 MTK_AAL_SUPPORT 宏

附上FAQ内的部分内容

AAL requires a license, if you have already obtained it, Please
configuration as follows:
(1)device/mediatek/[Project]/ProjectConfig.mk
MTK_AAL_SUPPORT = yes
(2)kernel/arch/arm64/configs/Myproject_debug_defconfig
CONFIG_MTK_AAL_SUPPORT=y
(3)vendor\mediatek\proprietary\custom&project\hal\aal\cust_aal.cpp
int InitFunction = 2; //enable CABC InitFunction = 0 : CABC and DRE disable InitFunction = 2 : CABC enable InitFunction = 4 :
DRE enable InitFunction = 6 : DRE and CABC enable Then, full build
this project.

参考文档:
1、https://blog.csdn.net/hismee/article/details/107185470
2、https://blog.csdn.net/hffyfdt/article/details/84021383
3、http://blog.chinaunix.net/uid-12461657-id-3244929.html
4、https://blog.csdn.net/zuoyioo7/article/details/79021459?spm=1001.2014.3001.5502
5、https://blog.csdn.net/zuoyioo7/article/details/79021936?spm=1001.2014.3001.5502
6、https://blog.csdn.net/zuoyioo7/article/details/78961675?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值