LCD兼容方案
受限于硬件资源,通常一台整机都会兼容多个器件。LCD也不例外,本文以MTK6739平台为例进行分析,如何兼容多个LCD。基本的LCD兼容就不多做说明了,可以参考MTK驱动文件Driver_All_in_One中如何配置lcd的方法。
方案1:硬件读ID方案
硬件读ID分为两种,一种是读取GPIO口,一种是读取ADC口。
- 如下原理图中LCD_ID接的是MTK6739平台的AUXIN2 ADC接口。
2.软件通道确认。使用ADC2(AUXIN2)进行客制化时,请注意channel的填写:ADC2 (AUXIN2) 对应channel 为12。
- MTK平台通过LCD的驱动代码lcm_compare_id函数在平台初始化lk阶段进行判断ID,代码如下:
xref: /39P/alps/vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/ili9881d_hd720_dsi/
01
extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int *rawdata);//声明通道
02
static unsigned int lcm_compare_id(void)
03
{
unsigned int rawdata=0;
07
int data[4] = {0, 0, 0, 0};
08
int adc_value=0;
09
//HSD adc midIMM_GetOneChannelValue(12,data,&rawdata); //AUXADC2, 1.5V is 4096
adc_value=data[0]*1000+data[1]*10;
15
#ifdef BUILD_LK
16
printf("LCM_ID_ili9881c adc_value = %d\n",adc_value);
17
#else
18
printk("LCM_ID_ili9881c adc_value = %d\n",adc_value);
19
#endifif ((adc_value>400)&&(adc_value<2000) )
24
{
return 1;//找到LCD,返回1
26
}
27
else
29
return 0;}
- 此方案中兼容的LCD ID为0.9V,当adc_value值落在400到2000之间时,compare_id返回1,否则继续下一个lcd循环查找。(LCD个数由项目声明在make文件中,例如k39tv1_bsp.mk中CUSTOM_LK_LCM宏控声明。)
- GPIO口读取ID方法基本一致, 首先包含一下头文件。
8 #ifdef BUILD_LK
9 #include <platform/mt_gpio.h>
10 #include <platform/mt_i2c.h>
11 #include <platform/mt_pmic.h>
12 #include <platform/upmu_common.h>
13 #elif defined(BUILD_UBOOT)
14 #include <asm/arch/mt_gpio.h>
15 #else
16 #include <mt-plat/mt_gpio.h>
17 #include <mach/gpio_const.h>
18 #endif
使用函数static inline int gpio_get_value(unsigned gpio)读取具体LCD_ID接的GPIO口即可。
方案2:软件读ID方案
- 此方案是通过软件读取LCD IC寄存器来实现的,与方案1相同的地方是同样在Compare ID文件中实现兼容。
- 软件读取代码如下:
- .注意不同IC的LCD ID的读取寄存器是不一样的,需要查看datasheet或者咨询FAE获取。
static unsigned int lcm_compare_id(void)
{
unsigned int array[4];
char buffer[5];
unsigned int id=0;
//unsigned int rawdata=0;
int data[4] = {0, 0, 0, 0};
int adc_value=0;
//helitai adc high
//IMM_GetOneChannelValue(1,data,&rawdata); //AUXADC1, 1.5V is 4096
//adc_value=data[0]*1000+data[1]*10;
SET_RESET_PIN(1);
SET_RESET_PIN(0);
MDELAY(10);
SET_RESET_PIN(1);
MDELAY(100);
array[0] = 0x00043700;// read id return two byte,version and id
dsi_set_cmdq(array, 1, 1);
MDELAY(10);
read_reg_v2(0x04, buffer, 4);
id = buffer[0]<<8 | buffer[1]; //we only need ID
#ifdef BUILD_LK
printf("yyyyyyy thl_ykl:%s, LK jd9161_dsi_wvga_cmd debug: jd9161_dsi_wvga_cmd id = 0x%08x\n", __func__, id);
#else
printk("yyyyyyy lcm_compare_id:%s, kernel helitai rmjd9161_dsi_wvga_cmd horse debug: jd9161_dsi_wvga_cmd id = 0x%08x\n", __func__, id);
// printk("lcm_compare_id:%s, kernel rm68172_dsi_fwvga_cmd horse debug: rm68172_dsi_fwvga_cmd id1 = 0x%08x\n", __func__, id1);
#endif
//return 1;
if (LCM_ID_jd9161 == id)
{
return 1;
}
else
return 0;
//return (LCM_ID_jd9161a == id)?1:0;
//if(id)
//return 0;
//else
//return 0;
}
总结
简单介绍了MTK平台LCD ID的兼容方案,总结两种方案的优缺点如下:
兼容方案 | 优点 | 缺点 |
---|---|---|
硬件ADC/GPIO | 获取ID简单 | 兼容LCD有限 |
软件ID | 可以兼容的IC更多 | 寄存器读取可靠性有待验证 |
思考1:用多个GPIO口实现更多LCD的兼容。
思考2:两种方案混合使用,避免获取软件ID出现的可靠性问题。
思考3:备用的方案尽量预留,避免出现其他问题。