Android系統移植總結
學習Android系統移植已經一年有餘,至今也未能學得精髓,android的博大精深大家皆知,前面的路還很漫長,還等著我們繼續前行。根據前期所學以及參與專案實戰獲取到的經驗,把自己所掌握的,所理解的記錄成文,一來算是對所學知識的一個總結,二來給剛開始研究Android系統移植的同行以及愛好者提供參考。文中若有不對的地方還請批評指正,共同探討學習,不勝感激。
一、Android系統執行的硬體前提
一個系統要想執行,必然要有硬體的支援。而並非所有硬體都是必須的,只需保證三大必備硬體,系統即可正常執行。這三大硬體就是CPU+PMIC+Memory,當然現在可能很多處理器內部已整合有PMIC和Memory,那隻需要一個CPU硬體系統即可執行,但這幾個模組都是不可或缺的。相信各位都有一定計算機及電子知識,此處就不做詳細討論。
其實在專案開發中這種最小硬體系統經常使用,因為使用此方法可以更快速、準確的驗證系統是否可執行,是否穩定,可以有效排除其他外設的干擾。以MTK平臺開發為例,MTK會提供HW一個參考設計,同時也會Release給SW一包對應參考設計的Codebase。一個專案中HW對於這三大硬體的電路設計基本上會保留參考設計,所以SW基本上也就無需改動即可實現系統正常執行。因為MTK方案CPU和PMIC都是MTK自己的IC,基本上是固定搭配;通常會改動的就是Memory的型號,Memory會因為成本以及物料庫存等因素而換用其他型號。但是目前Memory的介面統一,電路設計上不會有差別,而且換用的型號也都是MTK驗證過的,通常不會有問題,所以對於硬體設計沒有明顯差異,只需在軟體上更改配置或做相容設計即可。
二、Android系統移植前期的主要工作
如前面所談,要想保證Android系統正常執行,只需保證三大硬體正常工作即可。所以Android系統移植的主要工作就是圍繞三大硬體展開。
(1) Memory配置
MTK平臺Memory的配置較為簡單,MTK對所驗證過的Memory做了初始化部分相容設計,對於我們來說基本上只需在Code中替換為專案實際使用的型號即可。當然一個專案一般會相容多個型號的Memory,此時就要考慮多個Memory的相容性,基本上只要EMMC ID(或NAND ID)不同即可實現相容,更復雜的情況有專門的FAQ講解。其次還有一個問題需要考慮就是MCP的分割槽大小(此處的分割槽並非我們平常講的android的幾個分割槽,而是MCP出廠時設定好的分割槽,如BOOT,RPMB,GP),因大多數MCP出廠時BOOT+RPMB+GP小於6MB,所以MTK將User分割槽起始地址設定在6MB處,但是還有可能一些型號的MCP三者之和大於6MB,這時就會導致系統不能開機,一直重啟。這時就需要修改MTK 預設設定來相容此中Memory。注:6592之後平臺MTK採取新的演算法來計算USER分割槽起始地址,不在存在此問題。
(2) GPIO配置
外設想要正常工作,GPIO的配置至關重要。GPIO的配置需要參考硬體電路圖及HW提供的GPIO List,需要根據所連外設將GPIO配置為相應的模式。MTK提供了豐富的GPIO功能口和常用GPIO變數供使用者選擇使用。通常當GPIO配置為功能口時無需配置上下拉及輸入輸出,MTK會根據具體的功能口智慧選擇上下拉和輸入輸出,而且在程式中通常也無需指定使用的是哪幾個GPIO,只需配置硬體使用的通訊方式即可,因為提供特定功能口的GPIO是固定的,並非所有GPIO都可作為此功能使用,程式會根據配置自動找到對應的GPIO。當GPIO作為普通的通用輸入輸出口使用時,需要根據具體的硬體功能來配置上下拉,輸入輸出模式等,在定義GPIO的變數時儘量使用系統提供的變數名,若找不到合適的變數名可以自己新增定義使用。
(3) PMIC配置
系統所有的電壓源和電流源均來自於PMIC。PMIC是整個系統的動力來源,PMIC是否能正常工作直接影響到整個系統是否能正常WORK。既然PMIC如此重要,MTK為減少客戶的工作量和工作難度,無論是在硬體上還是軟體上都直接幫我們完成了大部分工作,留給我們要做的微乎及微。系統上比較重要的電源均是固定的連結,不能任意改動,只是留了部分PIN根據不同外設需要來配置為相應的電壓。在使用電壓可變的LDO時,需要注意的是,當需要切換電壓時必須先下電再上電,否則會切換不成功。
三、Android系統移植的主要Porting工作
完成第二步的工作後即可實現最簡系統的正常執行,此後就是將各功能模組的驅動程式移植進系統,使外設能夠正常工作。各模組的Porting均可參考MTK提供的Driver AllIn One文件來完成,在此不做闡述。需要重點檢查的兩個點仍是GPIO配置和上電時序,只有確保這兩點配置正確,Code的Porting才有意義。
四、MTK平臺Android系統的組成
完成Android系統驅動移植之後,就可以編譯出能夠正常工作的系統映象。生成的系統映象主要有Preloader 、lk(uboot) 、bootimg 、systemimg 、cache 、userdata 等。在系統開機啟動時,CPU內部固化的Bootloader會把preloader載入到CPU內部自帶的SRAM中執行。Preloader主要完成Memory和PMIC的初始化,為後面載入lk提供執行環境。在lk階段主要完成GPIO的初始化(即GPIO預設模式,其他模式在驅動中用到時還會再次配置)和LCM的初始化。Lk執行結束後會向kernel跳轉,由kernel來完成各模組驅動的載入和初始化。再完成驅動模組的初始化後就開始為Android系統的執行做準備,此部分的工作由init來完成,init會根據不同啟動模式來載入相應的init.rc指令碼檔案完成Android執行環境的初始化。
五、Android系統移植心得體會
在Android系統移植的過程中難免遇到各種各樣的問題,如果能快速定位導致該問題的原因,將會大大節省我們的時間。經常使用的一個辦法就是交叉驗證來快速定位,若無法滿足交叉驗證,可以將改問題劃分為幾個大的模組,逐個排查,先鎖定大的方向,再逐步細分,最終找到Root Cause。
六、結語
首先感謝各位耐心的閱讀本文,因個人能力所限,部分地方個人理解可能存在差錯,講解可能不夠清晰透徹,歡迎各位批評指正,多多補充。一個人的能力是有限的,後續的學習大家相互交流,共同探討,大家才能夠更快的成長。