對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文件進一步理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章