MTK開發環境搭建全過程學習教程
MTK開發環境搭建全過程學習教程是本文要介紹的內容,主要是來了解MTK的開發環境的搭建,很詳細的講解了開發環境的過程,來看詳細內容。
一、開發環境設立
以下表述中提到的相關壓縮包或安裝文件到華禹ftp服務器下載,部分文件要到群共享里面下,那里是最新的。
華禹ftp服務器:IP:220.113.15.15,帳號為study-bbs.com,密碼為study-bbs0304
P1300的QQ群號: 15762255
P1300_Build_Guide.rar來自ftp服務器,“華禹\MTK相關部分”目錄下
手機開發板C語言開發視頻.rar來自ftp服務器,“華禹\MTK相關部分”目錄下
huayu109_ads1.2.rar來自ftp服務器,“華禹\旋風001手機模塊\1.工具類”目錄下
huayu102_ADS12_Patch_Windows.rar同上
huayu106_perlzip.rar同上
huayu108_SourceInsight3.5.rar同上
huayu101_p1300軟件使用工具及開發指南.rar同上
huayu201_P1300_V1.7_Release.rar文件來自群共享
huayu203_P1300_V1.7_Release_patch.rar文件來自群共享
FlashTool_v3.0844.00.rar文件來自群共享
1、開發主機要求及所需工具:
操作系統:Windows 2000, WinXP. 推薦Windows 2000 with SP2 or later.
編 譯 器:ADS (Arm Developer Suite) v1.2 [Build 842]
Perl解析:ActivePerl, 推薦使用ActivePerl 5.6.1版本
仿真工具:MTK PC Simulator
跟蹤工具:Catcher_L1 v3.10.01,從串口輸出調試信息,只做普通UI應用的話,大致不會用到,用PC仿真工具就好了
燒錄工具:FlashTool_UI v3.1.05 或 FlashTool_v3.0844.00
其他:PL2303_Driver_XP2K v204102,這是下載線用到的USB串口驅動,以前機器上裝過PL2303驅動的就不必再裝了
二、開發環境建立過程:
新建一個目錄,英文的好了,否則有些工具不認識中文路徑,這里以E:\MTK_P1300為例說明,下面我用文字和圖片簡單說明下安裝過程,更詳細的安裝過程可以看壓縮文件“手機開發板C語言開發視頻.rar”中的Flash文件“P1300_Build_Env.swf”。
(1)安裝ADS1.2
解壓文件huayu109_ads1.2.rar到某個目錄,比如說解壓到“E:\MTK_P1300”,解壓完后運行“E:\MTK_P1300\ADS1.2\Setup.exe”,一路按下一步,最后安裝License時選定文件“E:\MTK_P1300\ADS1.2\CRACK\ license.dat”,然后接著一路下一步直到安裝完。安裝完后刪掉目錄“E:\MTK_P1300\ADS1.2\”,節省磁盤空間。
(2)安裝ADS補丁
運行huayu102_ADS12_Patch_Windows.rar壓縮文件中的ADS_Patch_Window.exe,這是個自解壓的壓縮文件,選Unzip解壓到上一步ADS的安裝目錄(缺省是C:\Program Files\ARM\ADSv1_2),解壓過程中如果問到是否覆蓋,全部選覆蓋好了。
(3)安裝腳本解釋器Perl
直接運行壓縮包huayu106_perlzip.rar里面擴展名為msi的安裝文件,缺省安裝就好,一路Next,呵呵。
上述幾步完成后,編譯環境基本建立,此時可以開一個dos窗(開始菜單->運行->輸入cmd->確定)看一下,安裝正常應該能順利執行以下命令,如下圖:
注意看版本號,應該是ADS1.2 [Build 842],不是的話可能沒打補丁,或補丁打的位置不對,請看第2步ADS補丁部分的說明并重新打一次,直到版本號對為止,哈哈。
這是perl解釋器的運行畫面。
注1:上述安裝過程會自動創建編譯環境所需的環境變量,如果發現編譯不正常了,可能是安裝了其他編譯工具導致沖突,這時建議查看下系統環境變量,把Perl和ADS的安裝目錄調到最前面,同時從path中去掉可能會產生沖突的編譯工具鏈的路徑(例如winavr),如下圖所示(我是安裝到D盤滴,缺省是C盤,不過我C盤幾乎被我塞滿了):
如果嫌改path麻煩(因為要用到其他編譯工具鏈的時候還得改回去),還有一種辦法,就是改make.bat批處理,具體見注4中相關說明。
注2: 如果安裝ADS時,改變了默認安裝路徑,需要修改源碼中的設置,源碼目錄樹解壓過程見模擬器編譯環節相關介紹。
- make\Option.mak
- ----------------------------------
- ifeq ($(strip $(COMPILER)),ADS)
- DIR_ARM= c:\progra~1\arm\adsv1_2 # 修改這里
- DIR_ARM := $(strip $(DIR_ARM))
- DIR_TOOL = $(DIR_ARM)\bin
- DIR_ARMLIB = $(DIR_ARM)\lib
- DIR_ARMINC = $(DIR_ARM)\include
- endif
- ------------------------------------------------
比如改裝到D盤了,這里把紅色部分“c”改成“d”就好了
(4)代碼編輯環境
運行壓縮文件huayu108_Source Insight3.5.rar中的安裝文件安裝即可。至于編輯器,這個看個人喜好了,不過Source Inside看代碼蠻方便的。
(5)PC機模擬器
模擬器MTK PC Simulator是用來在PC上仿真調試用的,要安裝VC6 SP6(同時要安裝Uuicode 靜態和動態庫,沒有裝Unicode庫的可以用“huayu103_MTK模擬器DLL補丁.zip”中的庫,拷到系統目錄“%windir%\system32”下即可)。我機器上的VC是有裝Unicode庫的,沒裝過Unicode庫的如果在模擬器編譯或運行中出現問題,建議重裝下VC6,安裝時勾選Unicode庫,并打上相關補丁到SP6。
模擬器能模擬真機的大部分行為,這樣能給調試帶來很大便利,不需要每次改動都要燒錄。
模擬器要從源碼編譯,解壓壓縮包“huayu201_P1300_V1.7_Release.rar”里面的文件“HUAYU_P1300_V1.7_Release.rar”到目錄“E:\MTK_P1300”,此時會出現目錄“E:\MTK_P1300\P1300_V1.7_Release”,這就是P1300的代碼目錄樹了;接著打上最新的補丁,解壓壓縮包“huayu203_P1300_V1.7_Release_patch.rar”里面的壓縮文件“HUAYU_P1300_V1.7_Release_patch.rar”到目錄
“E:\MTK_P1300\P1300_V1.7_Release”,解壓時選擇全覆蓋以替換被修改過的文件,打補丁之前對目錄樹里面的文件進行修改過的,需要手動再加上去。
編譯PC仿真器之前需要先把剛才上面得到的目錄樹build一次,開一個dos窗,盤符和目錄轉到代碼目錄樹對應的盤符和目錄,例如:
- E:
- cd E:\MTK_P1300\P1300_V1.7_Release\
- make new
注3:第一次make的時候要用“make new”,make new的時間比較長(慢的機器搞不好要2小時以上),編譯過程中間會出現一些文件找不到的信息,只要編譯過程沒意外終止,那些信息可以忽略。編譯日志文件位置: build\NEOTEL25_06B\log\,要查看編譯過程有啥問題就看這個目錄下的文件了;生成的bin文件位置: build\NEOTEL25_06B\*.bin,下載燒錄就是燒bin文件。
這里順帶介紹下build的命令格式:
make new 清除后重新編譯整個項目
make resgen 重新生成資源
make remake重新編譯鏈接項目
make viewlog xxx 查看模塊xxx的編譯日志
make查看可以用make選項幫助信息
注4:如果機器上裝了其他gcc編譯工具鏈(比如winavr之類)的話可能要手動改下Path,否則編譯會出錯,修改Path的方法見注1,也可以修改批處理文件“E:\MTK_P1300\P1300_V1.7_Release\make.bat”,在“perl make2.pl %*”之前加上下面兩句:
- set PERL5LIB=D:\perl\lib
- set PATH=D:\perl\bin;d:\progra~1\arm\adsv1_2\bin;E:\MTK_P1300\P1300_V1.7_Release\tools;c:\windows\system32;c:\windows;c:\windows\system
注意,上面的路徑是我機器上的,不是缺省安裝路徑,要根據自己的實際安裝路徑做修改。
下面開始編譯PC仿真器了,用VC6打開工程文件“E:\MTK_P1300\P1300_V1.7_Release\plutommi\mmi\ PC_Simulator.dsw”,然后開始編譯,編譯時間比較長,具體看機器配置了,這時又可以干點別的啥了,呵呵。
因為仿真器工程涉及文件較多,編譯費時,建議編譯過程中電腦上少開窗口,特別是網絡類的,如QQ,有時會發現開QQ后,編譯過程中VC會掛死,呵呵。有可能是開QQ后防火墻過濾網絡數據占用較多系統資源,如果發現VC編譯特別慢或干脆掛死,可以重啟動一下電腦,只開必要的窗口,然后開始編譯。
如果編譯過程中發現怪異的問題,如:
- incomingstringiddef.h(120) : error C2059: syntax error : 'constant'
- 或者
- error C2065: 'STR_CM_REDIAL' : undeclared identifier
- 之類
這個時侯你可能需要看一下你VC相關路徑的設置順序,如下圖:
把VC原本的頭文件路徑調整到最前面,我剛開始編譯的時候SDK的頭文件在前面,編譯總是通不過,改一下就好了,庫也一樣都調整下比較保險,呵呵。
(6)Tracer跟蹤工具
解壓文件P1300_Build_Guide.rar到E:\MTK_P1300,然后在文件管理器進入目錄“E:\MTK_P1300\P1300_Build_Guide”,接著解壓Catcher_L1_v3.10.01.zip到當前目錄下的Catcher_L1_v3.10.01子目錄,進入子目錄Catcher_L1_v3.10.01,發送一個Catcher.exe的快捷方式到桌面。
在需要用到TRACE的時候,在代碼中使用函數
void kal_prompt_trace(module_type mod_id, const kal_char *fmt,...); 打印需要查看的信息,使用Catcher跟蹤查看。
這個有點類似Linux的Kernel Debug工具,具體使用方法見文檔《cather使用手冊.doc》,這個文檔可在壓縮包“huayu101_p1300軟件使用工具及開發指南.rar”里面找到。
(7)燒錄工具
解壓文件“E:\MTK_P1300\P1300_Build_Guide\ FlashTool_UI_exe_v3.1.05.zip”到當前目錄,然后進入目錄“E:\MTK_P1300\P1300_Build_Guide\FlashTool_v3.1.05”,發送一個Flash_tool.exe的快捷方式到桌面好了。
還有個下載工具FlashTool_v3.0844.00.rar,也是不用安裝,解壓后直接用的,據說燒錄速度比上面那個快。
具體使用方法見文檔《flash_tool_MT平臺使用教程.doc》,這個文檔可在壓縮包“huayu101_p1300軟件使用工具及開發指南.rar”里面找到。
(8)USB串口下載線驅動
運行壓縮文件
- “E:\MTK_P1300\P1300_Build_Guide\ PL2303_Driver_XP2K_v204102.zip”
里面的可執行文件進行安裝,一路下一步,這里不再贅述。
nucleus實時操作系統MTK手機軟件系統工程和配置簡介
MTK使用了nucleus實時操作系統,在其上做了個內核抽象層的封裝,以適應多種實時操作系統,如oscar、ThreadX、nucleus。整個軟件系統包括nucleus操作系統、平臺設備驅動、協議棧、文件系統、WGUI、MMI、J2ME等。在這里MMI部分幾乎包括了操作系統內核、協議棧、文件系統之上的所有部分,其中WGUI也在其中。
MTK的PC模擬版使用VC的編譯器和鏈接器生成,ARM版使用ADS1.2的編譯器和鏈接器生成。因為MTK的整個軟件系統是一個很龐大而且復雜的工程,并且要支持多個MTK的產品系列和多家客戶的客戶化支持,使用集成開發環境(IDE)已經無法勝任,而且很難做到整個工程的自動構建和資源、代碼的生成。所以MTK的軟件系統使用了windows下的GNU開發工具鏈(MinGW)來進行工程的管理、配置和構建,MTK將MinGW放到了第三方工具中。
另外還使用了perl腳本來解析用戶輸入的命令行參數,因此第三方工具中還包含了ActivePerl(windows下的perl解釋器)。不過,整個軟件系統并沒有使用MinGW的全部工具,好象只使用了make這個工具,由幾個Makefile控制了構建的過程,在編譯和鏈接時根據最終生成PC模擬版還是ARM版而分別調用VC的編譯器和鏈接器或ADS1.2的編譯器和鏈接器。
#p#
接下來我們從具體的工程實踐來看MTK的手機軟件系統。
一、MTK手機軟件系統的目錄結構簡介
MTK手機軟件系統的主要目錄如下所示,因整個工程的目錄樹非常龐大,為簡單起見和減小篇幅,去除了在工程結構中相對不重要的目錄。
- |-- Fast_DL
- |-- ROM
- |-- adaptation
- |-- applib
- |-- bootloader
- |-- config
- |-- custom
- ||-- app
- ||`-- TOP_6227_BB
- ||-- common
- ||-- drv
- |||-- LCD
- |||`-- TOP_6227_LCM
- ||`-- image_sensor
- ||`-- MT9D011
- |-- drv
- |-- fs
- |-- inc
- |-- init
- |-- interface
- |-- j2me
- |-- kal
- |-- make
- ||-- applib
- |||-- applib.def
- |||-- applib.inc
- |||-- applib.lis
- ||`-- applib.pth
- ||-- bootloader
- ||-- config
- ||-- custom
- |-- media
- |-- mmi
- |-- modis
- |-- mtk_lib
- |`-- MT6227
- |`-- S01
- |`-- gprs
- ||-- abm.lib
- ||-- adaptation.lib
- ||-- applib_inet.lib
- |-- nucleus
- |-- nvram
- |-- plutommi
- |-- tools
Fast_DL是開發時下載二進制映像和資源等的相關文件的目錄。ROM是固化在ROM(可能是Flash的只讀區)中的相關代碼和頭文件的目錄,在給客戶的發布版中大都只有一些導出函數的頭文件,其中似乎還有一個跳轉表的東西ROMSA_FuncTable。
kal是上面所說的內核抽象層的相關文件的目錄。nvram是存取NV中的內容的相關代碼的目錄。nucleus是nucleus實時操作系統的目錄,在給客戶的發布版中只有頭文件。drv是驅動相關的代碼的目錄。fs是文件系統相關的目錄,好像只支持fat格式的。tools是工程相關工具的目錄,包括MinGW。interface是系統各層的接口的目錄,還包含重要模塊的接口,如bluetooth、WIFI。config是一些系統和任務(task)相關頭文件的目錄,感覺不像是配置相關的目錄。inc是中斷控制和寄存器地址相關頭文件的目錄。
modis是PC模擬版的相關目錄,包括了虛擬的GSM網絡、SIM卡等,以及模擬器需要的字符串、圖片等資源,還有PC模擬版的庫、VC的相關工程文件。
mmi是一個缺省的空的MMI應用的目錄,其中只是創建了一個什么也不干的MMI任務(線程),處理下層發送上來的消息。plutommi是pluto組織(也可能是原本的mmi應用的代號)所寫的整套MMI應用所在的目錄,而實際上也就是我們需要定制和修改的MMI應用。其中的mmi目錄中是pluto原本寫好的mmi應用,mtkapp中是mtk后來所寫的mmi應用,而Customer中是圖片、字符串等資源的定制目錄,大部分只是修改了字符串和圖片、聲音等的項目只要修改這個目錄下的資源即可。
mtk_lib中是已經編譯鏈接好的ARM版的庫。因整個工程過于龐大,若完整的全新構建一次需要很長的時間。為了減少構建的時間,將一些已經完全調試穩定且基本不再改動的庫和MTK不開放源代碼的庫放到這個目錄,這樣每次構建時只需要將這些庫和其他編譯好的庫鏈接起來就可以了。這些庫一般是ARM版的,若有thumb版的,則再增加一個和ARM版相對的thumb版的庫,一般叫第二個庫,如media_sec.lib就是thumb版的多媒體庫。
custom是所有客戶化項目的驅動程序及系統和MMI應用定制相關的文件的目錄。如你的手機主板的RAM、FLASH等存儲器的尺寸和地址空間有改動,MMI應用的特性有不同,藍牙、WAP的配置有變化,或是有項目相關的新應用,其相關文件都是放在這個目錄中和特定項目對應的目錄下,如項目CUST1_6227,則放在CUST1_6227_BB下。要注意的是custom也作為一個模塊存在,這使得其可以通過make目錄中的custom模塊的四個文件進行客戶化的一些定制。
applib、bootloader、init、media、j2me等是這個系統各個層次的相對獨立的模塊各自的目錄,其實drv和fs等目錄也可以看成是相對獨立的模塊,只不過其更重要些而在前面介紹。這些目錄包含了這些模塊的C文件和頭文件。每個目錄(模塊)都在下面的make目錄中有相對應的目錄保存構建時的編譯鏈接配置文件。
make是工程構建過程中最重要的一個目錄了,工程構建用的Makefile和一些中間配置文件將放在這里,Makefile在講解構建過程時再具體介紹。在每個模塊對應的目錄下,都有四個文件控制了編譯鏈接時的過程和配置。分別是:
<module_name>.def文件中是該模塊構建過程中用的條件定義。
<module_name>.inc文件中是該模塊所有用到的頭文件所在目錄的路徑,是相對整個工程根目錄的路徑。
<module_name>.lis文件中列出了該模塊的所有C文件,其路徑也是相對整個工程根目錄的。
<module_name>.pth文件中是該模塊的所有C文件所在目錄的路徑,是相對整個工程根目錄的路徑。
build目錄中保存了構建過程中產生的目標文件和庫文件,及其他一些中間文件。
二、MTK手機軟件系統的構建過程
如前面一節所述,MTK手機軟件系統的構建使用了GNU的make,使得整個工程的構建可以自動進行,且可以靈活控制。整個構建過程由Make.bat、make2.pl、MoDIS.dsw、Gsm2.mak、Option.mak、<customer>_<project>.mak等文件控制。構建PC模擬版是通過msdev和VC的工程文件MoDIS.dsw來完成的。Gsm2.mak是構建ARM版的核心Makefile文件,整個構建過程由其控制,其他是一些啟動、選項配置、子過程的文件。其關系圖如下所示。
在MTK手機軟件系統的根目錄下有一個批處理文件Make.bat,這個批處理文件啟動了整個工程的構建過程。在windows的命令行下,在該系統的根目錄下輸入命令make和相應的參數即可開始工程的構建,該批處理文件的使用方法如下所示。
- Usage:
- make ["customer"|"mt62xx"] "project" "action" ["modules"]
- Description:
- customer = mtk (Default customer)
- = firefly17_demo (FIREFLY17_DEMO project)
- = [mt6217|mt6219|mt6226|mt6227|mt6228|mt6229] (EVB only)
- = ...
- project= l1s (Layer 1 stand-alone)
- = gsm (GSM only)
- = gprs (GPRS only)
- = basic(Basic Framework)
- action = new (codegen, resgen, clean, update) (default)
- = update or u (scan, compile, link)
- = remake or r (compile, link)
- = clean or c (clean)
- = resgen (resgen)
- = c,u (clean then update)
- = c,r (clean then remake)
- = codegen (codegen)
- = viewlog (open edit to view build log)
- = emigen (emigen)
- = emiclean (emiclean)
- module(s) = modules' name(kal, l1, ...)
- => OPTIONAL when action is one of (clean c remake r update u c,r c,u)
- Example:
- make gsm new (MT6205B EVB new)
- make gprs codegen (MT6218B EVB codegen)
- make mt6219 gprs update (MT6219 EVB update)
- make firefly17_demo gprs new
- make milan_demo gprs c,u init custom
- make mt6219 gprs r init custom drv
其中較常用的action有new、update、remake、new_modis這幾個。
new是全新開始構建整個工程的ARM版,包括圖片、聲音、字符串等資源都要重做,依賴的其他動作最多,是最徹底也是耗時最長的一個動作,一般得到一個新的MTK發布版本后要做一次。
update是重新更新整個工程的ARM版,該動作會掃描工程中文件和庫的依賴關系,若依賴關系有變化會建立新的依賴關系,隨后根據新的依賴關系重新編譯鏈接有改動的部分,一般在增加或刪除一些驅動或應用的情況下需要用update。
remake是重新編譯整個工程的ARM版,該動作只是簡單的重新編譯鏈接有改動的部分,不檢查依賴關系,是耗時最短的一個動作,也是最常用的動作。
new_modis是全新構建整個工程的PC模擬版,其調用VC的編譯器和鏈接器得到一個可以在windows上運行的PC模擬版。MMI應用軟件工程師可以在沒有硬件板的情況下在PC上檢查和調試自己寫好的應用。
Make.bat實際上只起引導作用,其只有一行批處理語句perl make2.pl %*,于是運行該批處理文件后控制權轉給了perl腳本make2.pl。在這個perl腳本中解析了用戶輸入的命令行參數,設置變量,準備make時需要的臨時配置文件,隨后根據生成的可運行映像是PC模擬版還是ARM版而分別調用不同的構建過程。
Pc模擬版的構建通過調用如下命令實現。
- system("$msdev MoDIS.dsw /MAKE \"$argu - Win32 $modisDir\"
- /OUT ${MoDISLogDir}\\${argu}.log")
在這里$msdev就是VC的msdev,通過VC的工程文件MoDIS.dsw和后面的參數進行具體的構建過程。熟悉VC工程的朋友應該比較清楚,因此就不再具體解釋了。之后將只以ARM版為主來講解整個工程的構建過程。
ARM版的構建通過調用如下命令實現。
- system("${makeCmd} -f${makeFolder}${myMF} -r -R
- CUSTOMER=$custom PROJECT=$project $action")
在這里${makeCmd}是tools\make.exe,即GNU的make,${makeFolder}${myMF}是make\Gsm2.mak,$action是new、update、remake等。變量CUSTOMER和PROJECT分別是客戶名和項目名,在構建過程中將根據此兩個變量的值選定項目相關的配置文件,從而實現客戶化的定制。通過給make指定ARM版的核心Makefile文件Gsm2.mak,開始了ARM版的構建過程。
Gsm2.mak文件中包含了Option.mak這個配置用的Makefile文件,另外還包含了一些以.tmp和.bld為后綴的由perl腳本 make2.pl生成的臨時配置文件。這些臨時配置文件主要是一些action如clean、remake等所需的變量設置,及客戶化和版本號等的一些信息。Gsm2.mak控制了new、update、remake等動作的過程。具體分別如下所示。
- new : cleanall cmmgen mmi_feature_check asngen codegen asnregen \
- operator_check_lite update
- update : cleanlog cleanbin mcddll_update codegen resgen cksysdrv remake
- remake : cleanlog cleanbin genverno libs $(BIN_FILE) done
上面的構建過程的幾個步驟中,最重要的兩個步驟是libs、$(BIN_FILE) 。libs調用ARM版的編譯器和連接器將各個模塊目錄下的C文件編譯鏈接為獨立的庫。$(BIN_FILE)這個步驟將各個模塊編譯鏈接得到的庫和 mtk_lib目錄下的庫一起鏈接起來得到一個映像文件,然后使用ADS的工具fromelf將映像文件生成以變量BIN_FILE命名的二進制文件,該文件可以下載到硬件板上運行。
libs這個步驟如下所示。
- libs: cleanlib startbuildlibs $(COMPLIBLIST)
libs中真正進行編譯鏈接的步驟是$(COMPLIBLIST),要生成的庫由變量COMPLIBLIST列出,在ARM版中,變量 COMPLIBLIST從變量COMPLIST得到。變量COMPLIST是在Option.mak及其包含的Makefile文件中賦值的。因有很多庫需要編譯鏈接,變量COMPLIBLIST展開后包含多個步驟,而這些步驟都是重復不變的,因此在定義步驟$(COMPLIBLIST)的構建過程時使用%.lib代替。%.lib這個步驟先清除了之前的一些依賴關系文件,將一些變量的設置寫入~compbld.tmp這個臨時文件中,然后給make指定Makefile文件comp.mak,完成庫的編譯和鏈接,如下所示。
- %.lib:
- …
- @if /I %OS% EQU WINDOWS_NT \
- (if /I $(BM_NEW) EQU TRUE \
- (tools\make.exe -fmake\comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log 2>&1)
- \
- else \
- (tools\make.exe -fmake\comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log 2>&1) \
- ) \
- else \
- (if /I $(BM_NEW) EQU TRUE \
- (tools\make.exe -fmake\comp.mak -k -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log) \
- else \
- (tools\make.exe -fmake\comp.mak -r -R $(strip $(CMD_ARGU)) COMPONENT=$* > $(strip $(COMPLOGDIR))\$*.log) \
- )
上面的命令語句中,參數-k是指有錯誤也要繼續編譯,-r和-R是指沒有GNU make的默認規則和變量。COMPONENT=$*把當前要生成的庫賦給變量COMPONENT。要注意%.lib匹配了所有要生成的庫,但這個步驟一次只生成一個模塊的庫,這個步驟對所有匹配到的庫都會執行一次。
comp.mak這個Makefile文件控制了模塊的編譯鏈接過程。在這個文件中,首先將當前模塊要生成的庫(由變量COMPONENT傳入)設置給了變量TARGLIB。之后從<module_name>.lis文件中得到SRC_LIST和CPPSRC_LIST兩個源文件列表,設定要編譯的C文件、C++文件、匯編文件等的列表,和要鏈接的中間目標文件的列表。將<module_name>.inc、<module_name>.def、<module_name>.pth 文件中的頭文件路徑、C文件路徑、編譯鏈接參數等賦值給相應的變量。將平臺相關(如6223、6225)的編譯參數加上,確定使用ARM編譯器還是 thumb編譯器,是否支持ARM指令和thumb指令的interwork模式。最后進入庫的編譯鏈接過程。
庫的編譯鏈接由update_lib步驟完成,這個步驟直接依賴了$(TARGLIB)。目標$(TARGLIB)是由所有按照.c.obj、.s.obj、%.obj: %.cpp等規則編譯得到的中間目標文件鏈接得到的。其主要過程如下所示。
- $(TARGLIB):
- ...
- @if exist $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib \
- (copy /z $(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib $(subst /,\,$(TARGLIB))) & \
- ($(LIB) -r $(TARGLIB) $(COMPOBJS_DIR)/*.obj) \
- else \
- ($(LIB) -create $(TARGLIB) $(COMPOBJS_DIR)/*.obj)
- ...
Option.mak是整個工程構建過程中的總控配置文件,在這個文件中還包含了<customer>_<project>.mak和REL_CR_MMI_<project>.mak這兩個項目相關的配置文件,用戶自定義的配置文件USER_SPECIFIC.mak,另外還包含了一些臨時生成的配置文件。這些配置文件在一起設置了工程構建過程中用到的編譯器、鏈接器,庫和二進制的工具,設置了編譯鏈接時的參數,公共的頭文件路徑,設置了需要包含mtk_lib目錄中的哪些既有的庫,設置了需要生成的庫等一系列相關的設置。這些設置都由一些重要的變量保存,具體在下一節中講解。
#p#
三、MTK手機軟件系統的配置
MTK手機軟件系統的大部分配置都已經確定,基本上不需要再改變,一般是MTK發布新的版本時會作些改變,客戶不大需要關心。最主要的配置文件是Option.mak,而客戶化定制需要需要修改的主要是<costomer>_<project>.mak、REL_CR_MMI_<project>.mak這兩個文件。
Option.mak文件中設置了工程構建時用到的編譯器、鏈接器、庫管理、二進制文件生成等工具的路徑和可執行程序名,設置了基本的編譯鏈接參數,指定CPU類型(ARM7EJ-S),確定最終使用的庫列表(COMPLIST)。
一個項目是由工程中的多個基本庫、第三方庫和由源代碼新編譯鏈接的庫組成的,最終這些庫鏈接到一起得到一個完整的可執行映像文件。由哪些新編譯鏈接的庫來組成一個項目是由四個關鍵的變量決定,其中一個是前面提到的COMPLIST,另外三個分別是CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP、CUS_REL_MTK_COMP。這個幾個變量的關系如下所示。
- # *************************************************************************
- # Custom Release Component Configuration
- # *************************************************************************
- # Be sure the following:
- # 1. CUS_REL_SRC_COMP + CUS_REL_PAR_SRC_COMP =COMPLIST(CUSTOM_RELEASE = True)
- # 2. CUS_REL_SRC_COMP + CUS_REL_PAR_SRC_COMP + CUS_REL_MTK_COMP = COMPLIST(CUSTOM_RELEASE = False)
COMPLIST確定了該項目最終是由哪些庫(組件)組成的。MTK的內部版本構建時,則包括 CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP、 CUS_REL_MTK_COMP這些庫。客戶版本構建時,則只包括 CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP這些庫。手機設計公司構建的版本都是客戶版本,因此只要改變 CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP這兩個變量的值即可以定制自己的項目了。
MTK_LIBS確定了該項目最終包含了哪些MTK提供的基本庫。
COMPOBJS確定了該項目最終包含了哪些第三方提供的不帶源代碼的庫。變量CUS_RES_OBJ_LIST用于把這些第三方庫隨項目發布。
Option.mak和REL_CR_MMI_<project>.mak這兩個文件都有對這兩個變量CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP賦值。但Option.mak文件只是設定了整個工程需要的基本庫,如手寫、圖形解碼等,和特定項目沒有關系。因此客戶要定制自己的項目只需要修改REL_CR_MMI_<project>.mak這個文件對這兩個變量的賦值即可。
<costomer>_<project>.mak文件也有對COMPLIST的賦值,但這只是對MTK的內部版本有用,客戶版本沒有影響。值得注意的是,該項目的絕大部分功能特性(feature)是在這個文件中確定的,如使用的sensor、支持哪些音視頻格式、電話本大小、LCD屏幕大小等。下面是該文件中的部分內容。
- J2ME_SUPPORT = NONE# J2ME support: NONE, MTK_J2ME, J2ME_LIB, \
- MTK_J2MEHI, J2MEHI_LIB, MTK_DUMMYVM
- DRM_SUPPORT = NONE #DRM VENDOR: NONE, MTK, BSCI
- DRM_VERSION = NONE # DRM VERSION: NONE, V01, V02, ALL
- AMRWB_DECODE= TRUE # TRUE/FALSE
- AMRWB_ENCODE= FALSE # TRUE/FALSE
- # MT6219 DSP cannot support AMRWB_ENCODE when GPRS connection
- JPG_DECODE = JPG_HW# NONE, JPG_HW, JPG_SW
- JPG_ENCODE = JPG_HW# NONE, JPG_HW, JPG_SW
- GIF_DECODE = TRUE # TRUE/FALSE
- PNG_DECODE = NONE # NONE, PNG_HW, PNG_SW
- DAF_DECODE = TRUE # TRUE/FALSE
- MJPG_SUPPORT= FALSE # TRUE/FALSE
- MP4_CODEC = TRUE # TRUE/FALSE
- AAC_DECODE = TRUE # TRUE/FALSE
- ISP_SUPPORT = TRUE # TRUE/FALSE
- CMOS_SENSOR = OV7660# OV9640, PAS105, PAS302, NONE, MT9D011, \
- MT9M111, OV9650
四、增加模塊的配置實例
若我們需要加入zlib這么一個模塊(zlib包含了很多程序都用到的壓縮和解壓函數),我們可以按如下步驟進行。
1、把zlib的源代碼包拷貝到你的MTK軟件系統根目錄下,這樣所有的zlib代碼都在zlib目錄或zlib-1.2.3目錄下(用哪個目錄名由你的喜好來確定),在此為簡單起見就放在zlib目錄。
2、在make目錄下新增一個zlib的目錄(最好和根目錄下的目錄名一樣),增加四個文件,分別是zlib.def、zlib.inc、zlib.lis、zlib.pth。zlib.def文件只要加上APCS_INTWORK就可以了,其他三個文件中加上源文件及其目錄、頭文件目錄即可。
3、在REL_CR_MMI_<project>.mak這個文件的合適位置加上如下語句。
- CUS_REL_SRC_COMP += zlib
4、把這個工程remake一下,若沒有錯誤,zlib模塊就成功加上去了。其他模塊就可以調用zlib提供的壓縮和解壓縮函數了。
若我們需要加入一個沒有源代碼的第三方庫,譬如加入wifi,我們可以按如下步驟進行。
1、把wifi的所有第三方庫文件拷貝到一個新建的wifi目錄下。
2、在Option.mak這個文件的合適位置加上如下語句。
- ifeq ($(strip $(WIFI_SUPPORT)),WIFI_LIB)
- COMPOBJS += wifi\sslplus.lib
- CUS_REL_OBJ_LIST += wifi\sslplus.lib
- COMPOBJS += wifi\sb.lib
- CUS_REL_OBJ_LIST += wifi\sb.lib
- endif
原理圖 和PCB板圖和LCD初始化代碼。花了半個小時將初始化代碼寫進程序,一試居然可以工作了,真tm的神了。
然后新建了 XXX_GPRS.mak和Verno_XXX.bld。指定LCD_MOUDLE,CMOS_SENSOR(6219平臺的)NOR_FLASH_TYPE,PHONE_TYPE等。
然后從其他項目中拷貝個image過來,在CustResDefPLUTO.h 指定好image 路徑。這些步驟不到5分鐘。
然后打開原理圖
1、eint_def.c 中對照原理圖設置好中斷,6219中才4個中斷,很快設定好,下面有個數組custom_eint_sw_debounce_time_delay是設置debounce time的。
2、查找LCM背光和keypad背光控制的地方,在custom_equipment.c中的custom_cfg_gpio_set_level函數中設置,一看pwm2和Alter,不用該。
3、鍵盤定義,keypad_def.c中對照原理圖一行一列的填上去。
4、各種gpio口的配置,還是在custom_equipment.c,gpio_map_tbl數組,對照原理圖配置好,主要就是振動啊,LED燈啊什么的,然后要設置聲音,afe.c中,函數
AFEtchExtAmplifier,當中就是把一個gpio口拉高,拉低,注意這個口一定要配置成GPIO模式,并設置為輸出。USB使能和上面一樣,在函數USB_PowerControl中把相應的口拉高拉低。
5、看一下flash,nnd原來是samsung的,得改一改了,這個flash的時序和其他的不一樣,要大一點,根據flash spec和MTK datasheet,在custom_emi.c中修改一下時序,這個工作花了我半個小時,具體設置請參照MTK datasheet中的EMI Control Register for BANK0
6、給nor flash分個區,由于沒有NAND falsh經理想了個辦法,把nor flash分1M出來當U盤,FlashConf.c中的PARTITION_SECTORS設為2048,custom_drv_init函數中寫入USB_Ms_Register_DiskDriver(&USB_NOR_drv);這樣1M的U盤就出來了,其實沒有什么用的基本設置完了,然后就要在MMI_featuresPLUTO.h中設置了,這個是我最喜歡做的事情了,一看要求,需要 英文,簡中,繁中,泰文,sussian文,越南文,阿拉伯文,(md這么多),主菜單需要做成12宮格,開關機mp4,IP撥號等,MTK做的就是好,只要把宏打開就好了,md就是簡單,把客戶發過來的圖片放進去,ok了
make custom=XXX gprs new接著我就找人聊天去了,半個小時后好了,down進去一看,可以了,發給客戶做個demo,客戶說還可以,這做個版本也真tmd容易。接著客戶要提要求了,按ok鍵要直接放MP3啊,加入來電黑名單啊,在電話本中直接發消息啊,這個個東西把宏打開就可以了,由于用的是OV7660的攝像頭,需要30w差值到130w,然后先前把mtk發給我們的差值代碼放進去,mmi上在做個1280X1024的選項,其實就是降低一些設置,純粹是欺騙消費者的,我還看到過最大分辨率是640X480的居然還標著130w,欺騙廣大勞動者不會算術。搞定后new一遍,發給客戶,客戶說,先測一下,過幾天再提些要求,并要求做個64+32M bit的版本,省成本。還要做個130w 差值到200 w camera的版本。去忽悠他的客戶。
總之,現在MTK做濫了,各家都在省成本啊,哈哈。
小結:MTK開發環境搭建全過程學習教程的內容介紹完了,希望通過本文的學習能對你有所幫助!