關於不同晶元方案的自動識別,比如tp晶元、gsensor等的自動識別在實際生產和應用中都是很有必要的,大大簡化軟體維護和發布流程。以下的說明以mtk的智慧型機平台為基礎,對於其他平台該方法並不適用,因為mtk自己有一套裝置驅動管理流程,相當於在同一類驅動上都加了一層管理層。(1)在註冊mtk的tp的platform_driver時,名字是#define tpd_device "mtk-tpd",所以其他tp備選晶元的i2c_driver中的driver->name也都必須是tpd_device,方便裝置掛接。為什麼一開始不加修改的在配置檔案中同時編譯兩個tp型號,會出現編譯錯誤(可能是執行錯誤)?因為每個tp的驅動都有i2c_add_driver,不可能在同乙個tpd_device名字上掛接兩個i2c裝置。
(2)新的方法,就是在第乙個編譯載入的tp驅動中做讀id號的判斷,如果沒有識別到正確的id,認定該晶元不符,則執行i2c_del_driver,以保證後來編譯執行的其他tp能夠繼續掛接上tpd_device的platform_driver。
(3)過程:以melfas和mstar兩顆tp晶元為例,如果前者在後者之前編譯載入,後者不做改動,前者驅動做一定的修改。
定義個單檔案內的全域性變數:static int i2c_tetect =0;
melfas的i2c_driver定義如下:
[cpp]
view plain
copy
print?
在它的tpd_probe中開始做個判斷,沒有讀到正確的id,i2c_tetect=-1;同時該函式也返回-1。注意:tpd_load_status = 1;是在每個tp probe驅動最後中都存在的語句,表示該驅動載入成功。
(4)在melfas的驅動中本地的tpd_local_init中,
[cpp]
view plain
copy
print?
5)在mtk的tpd管理器中,
[cpp]
view plain
copy
?它會依次執行每個tp驅動的tpd_local_init,只有tpd_load_status為1的才是已經完整probe的驅動,即刻退出迴圈;否則繼續下乙個tp的匹配尋找。當然,此處也可以已
tpd_local_init函式的返回值作為判斷標準,probe成功的返回0,不成功的會提前返回-1。
在實際生產中碰到過乙個問題:tp的自動識別是靠讀取melfas的裝置id號來判斷的,如果讀取不成功則是mstar的tp。但是存在乙個問題,如果開機melfas的tp在第一次開機公升級過程中斷電,會造成tp不能工作也不能讀id號,必須強制公升級才能保證tp的後續工作。這樣當讀取id不成功有兩種可能:一是melfas的tp,得強制公升級;二是mstar的tp,所以程式中必須做判斷處理。處理的原則必須保證:
1,mstar tp可用 (驗證ok)
2,melfas 正常開機可用 (驗證ok)
3,melfas 第一次開機公升級斷電可再次公升級並可用(驗證ok)
4,melfas 第一次開機公升級只公升一次(驗證ok)
MTK平台 LCM相容原理
kernel階段 總結 環境 android p 今天想記錄和分享的是mtk平台lcm的相容,當然,在學習相容原理的時候肯定需要大概知道lcm的載入流程,於是借鑑前輩們的經驗 文章最後會貼上參考的文章 淺顯的去學習了一下,lcm方面深入的知識以後有機會再慢慢研究,保持一顆學習的心 kmain pla...
MTK功能機平台抓log
好久沒用這個了,記錄備忘。主make檔案修改 kal trace output full kal debug level slim debug kal rich debug kal normal debug kal slim debug kal release kal.如果想不進工程模式設定就可以抓...
MTK功能機感測器介紹
由於目前用mtk功能機來做穿戴裝置,所以感測器是很重要的一塊,特意記錄下來!motion sensor gesture support type typedef enum srv sensor type enum 由上面這結構體,基本就可以知道mtk功能機目前所支援的種類。其中srv sensor ...