对MTK安卓平台LCM驱动的理解

一个项目兼容两块LCM或者更多,在工作中很常见,但是最近碰到个麻烦的事情,两块屏读出的ID总是相同的,搞了很久最后只能通过ADC的方法读LCM的一个分压电阻的电压来区分,具体做法是:
使用封装好了的ADC函数
extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata);

该函数第一个参数是ADC通道选择,查看硬件原理图就知道;第二个参数是一个数组指针,用来存放ADC采样得到的原始数据;最后一个参数貌似是采样频率,设置成NULL即可;如此得到ADC的原始采样数据后通过下面计算公司就可以得到电压值:
adcVol=data[0]*1000+data[1]*10; //单位:mV

例如我的代码段是:

extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata);
static unsigned int lcm_compare_id(void)
{
    int data[4];
    int adcVol=0;

    int res=IMM_GetOneChannelValue(0,data,0);
    adcVol=data[0]*1000+data[1]*10;

    #ifdef BUILD_LK
        printf("[zlg0374@163.com]adcVol= %d mV \n", adcVol);
    #endif  

    return (adcVol>800)?0:1;
}

在解决LCM的兼容问题过程中对MTK安卓平台的LCM驱动有了一点新理解:
1、LCM驱动的架构
A、LCM驱动源码
…\mediatek\custom\common\kernel\lcm…
B、LCM配置
…\mediatek\config\project\ProjectConfig.mk
源码目录中有一个文件是mt65xx_lcm_list.c,所有的lcm会在这个文件中声明一下自己的驱动,如果config文件中配置了某个lcm,那么这个lcm就会被放到一个列表中,如果兼容多个lcm,那么在config文件中配置了几个lcm,列表中就有几个lcm驱动。
2、如果只有一个lcm,那么系统不做区分,只要上电直接加载这个驱动;但是如果兼容好几块lcm,那么系统上电后就会按照列表中的顺序依次调用驱动中的读ID函数,如果发现ID匹配,那么就加载这个驱动,如果列表从头至尾ID都不匹配,最后加载列表最末端的那个驱动。
3、驱动在列表中的排列顺序不受config文件中配置lcm的先后顺序影响,而是根据mt65xx_lcm_list.c中的顺序排列。

具体这些分析可以参考…\mediatek\platform\mt6572\lk\disp_drv.c文件进一步理解。

你可能感兴趣的:(安卓驱动)