MTK平台如何兼容多个LCD

LCD兼容方案

受限于硬件资源,通常一台整机都会兼容多个器件。LCD也不例外,本文以MTK6739平台为例进行分析,如何兼容多个LCD。基本的LCD兼容就不多做说明了,可以参考MTK驱动文件Driver_All_in_One中如何配置lcd的方法。

方案1:硬件读ID方案

硬件读ID分为两种,一种是读取GPIO口,一种是读取ADC口。

  1. 如下原理图中LCD_ID接的是MTK6739平台的AUXIN2 ADC接口。

å¨è¿éæå¥å¾çæè¿° 

 2.软件通道确认。使用ADC2(AUXIN2)进行客制化时,请注意channel的填写:ADC2 (AUXIN2) 对应channel 为12。

å¨è¿éæå¥å¾çæè¿°

  1. 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 mid

       IMM_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
 #endif

        if ((adc_value>400)&&(adc_value<2000) )
24
        {
                 return 1;//找到LCD,返回1
26
         }
27
        else
29
                return 0;

}

  1. 此方案中兼容的LCD ID为0.9V,当adc_value值落在400到2000之间时,compare_id返回1,否则继续下一个lcd循环查找。(LCD个数由项目声明在make文件中,例如k39tv1_bsp.mk中CUSTOM_LK_LCM宏控声明。)
  2. 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方案

  1. 此方案是通过软件读取LCD IC寄存器来实现的,与方案1相同的地方是同样在Compare ID文件中实现兼容。
  2. 软件读取代码如下:
  3. .注意不同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:备用的方案尽量预留,避免出现其他问题。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值