MTK開發(fā)環(huán)境搭建全過程學(xué)習(xí)教程
MTK開發(fā)環(huán)境搭建全過程學(xué)習(xí)教程是本文要介紹的內(nèi)容,主要是來了解MTK的開發(fā)環(huán)境的搭建,很詳細(xì)的講解了開發(fā)環(huán)境的過程,來看詳細(xì)內(nèi)容。
一、開發(fā)環(huán)境設(shè)立
以下表述中提到的相關(guān)壓縮包或安裝文件到華禹ftp服務(wù)器下載,部分文件要到群共享里面下,那里是最新的。
華禹ftp服務(wù)器:IP:220.113.15.15,帳號(hào)為study-bbs.com,密碼為study-bbs0304
P1300的QQ群號(hào): 15762255
P1300_Build_Guide.rar來自ftp服務(wù)器,“華禹\MTK相關(guān)部分”目錄下
手機(jī)開發(fā)板C語言開發(fā)視頻.rar來自ftp服務(wù)器,“華禹\MTK相關(guān)部分”目錄下
huayu109_ads1.2.rar來自ftp服務(wù)器,“華禹\旋風(fēng)001手機(jī)模塊\1.工具類”目錄下
huayu102_ADS12_Patch_Windows.rar同上
huayu106_perlzip.rar同上
huayu108_SourceInsight3.5.rar同上
huayu101_p1300軟件使用工具及開發(fā)指南.rar同上
huayu201_P1300_V1.7_Release.rar文件來自群共享
huayu203_P1300_V1.7_Release_patch.rar文件來自群共享
FlashTool_v3.0844.00.rar文件來自群共享
1、開發(fā)主機(jī)要求及所需工具:
操作系統(tǒng):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,從串口輸出調(diào)試信息,只做普通UI應(yīng)用的話,大致不會(huì)用到,用PC仿真工具就好了
燒錄工具:FlashTool_UI v3.1.05 或 FlashTool_v3.0844.00
其他:PL2303_Driver_XP2K v204102,這是下載線用到的USB串口驅(qū)動(dòng),以前機(jī)器上裝過PL2303驅(qū)動(dòng)的就不必再裝了
二、開發(fā)環(huán)境建立過程:
新建一個(gè)目錄,英文的好了,否則有些工具不認(rèn)識(shí)中文路徑,這里以E:\MTK_P1300為例說明,下面我用文字和圖片簡(jiǎn)單說明下安裝過程,更詳細(xì)的安裝過程可以看壓縮文件“手機(jī)開發(fā)板C語言開發(fā)視頻.rar”中的Flash文件“P1300_Build_Env.swf”。
(1)安裝ADS1.2
解壓文件huayu109_ads1.2.rar到某個(gè)目錄,比如說解壓到“E:\MTK_P1300”,解壓完后運(yùn)行“E:\MTK_P1300\ADS1.2\Setup.exe”,一路按下一步,最后安裝License時(shí)選定文件“E:\MTK_P1300\ADS1.2\CRACK\ license.dat”,然后接著一路下一步直到安裝完。安裝完后刪掉目錄“E:\MTK_P1300\ADS1.2\”,節(jié)省磁盤空間。
(2)安裝ADS補(bǔ)丁
運(yùn)行huayu102_ADS12_Patch_Windows.rar壓縮文件中的ADS_Patch_Window.exe,這是個(gè)自解壓的壓縮文件,選Unzip解壓到上一步ADS的安裝目錄(缺省是C:\Program Files\ARM\ADSv1_2),解壓過程中如果問到是否覆蓋,全部選覆蓋好了。
(3)安裝腳本解釋器Perl
直接運(yùn)行壓縮包huayu106_perlzip.rar里面擴(kuò)展名為msi的安裝文件,缺省安裝就好,一路Next,呵呵。
上述幾步完成后,編譯環(huán)境基本建立,此時(shí)可以開一個(gè)dos窗(開始菜單->運(yùn)行->輸入cmd->確定)看一下,安裝正常應(yīng)該能順利執(zhí)行以下命令,如下圖:
注意看版本號(hào),應(yīng)該是ADS1.2 [Build 842],不是的話可能沒打補(bǔ)丁,或補(bǔ)丁打的位置不對(duì),請(qǐng)看第2步ADS補(bǔ)丁部分的說明并重新打一次,直到版本號(hào)對(duì)為止,哈哈。
這是perl解釋器的運(yùn)行畫面。
注1:上述安裝過程會(huì)自動(dòng)創(chuàng)建編譯環(huán)境所需的環(huán)境變量,如果發(fā)現(xiàn)編譯不正常了,可能是安裝了其他編譯工具導(dǎo)致沖突,這時(shí)建議查看下系統(tǒng)環(huán)境變量,把Perl和ADS的安裝目錄調(diào)到最前面,同時(shí)從path中去掉可能會(huì)產(chǎn)生沖突的編譯工具鏈的路徑(例如winavr),如下圖所示(我是安裝到D盤滴,缺省是C盤,不過我C盤幾乎被我塞滿了):
如果嫌改path麻煩(因?yàn)橐玫狡渌幾g工具鏈的時(shí)候還得改回去),還有一種辦法,就是改make.bat批處理,具體見注4中相關(guān)說明。
注2: 如果安裝ADS時(shí),改變了默認(rèn)安裝路徑,需要修改源碼中的設(shè)置,源碼目錄樹解壓過程見模擬器編譯環(huán)節(jié)相關(guān)介紹。
- 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)代碼編輯環(huán)境
運(yùn)行壓縮文件huayu108_Source Insight3.5.rar中的安裝文件安裝即可。至于編輯器,這個(gè)看個(gè)人喜好了,不過Source Inside看代碼蠻方便的。
(5)PC機(jī)模擬器
模擬器MTK PC Simulator是用來在PC上仿真調(diào)試用的,要安裝VC6 SP6(同時(shí)要安裝Uuicode 靜態(tài)和動(dòng)態(tài)庫,沒有裝Unicode庫的可以用“huayu103_MTK模擬器DLL補(bǔ)丁.zip”中的庫,拷到系統(tǒng)目錄“%windir%\system32”下即可)。我機(jī)器上的VC是有裝Unicode庫的,沒裝過Unicode庫的如果在模擬器編譯或運(yùn)行中出現(xiàn)問題,建議重裝下VC6,安裝時(shí)勾選Unicode庫,并打上相關(guān)補(bǔ)丁到SP6。
模擬器能模擬真機(jī)的大部分行為,這樣能給調(diào)試帶來很大便利,不需要每次改動(dòng)都要燒錄。
模擬器要從源碼編譯,解壓壓縮包“huayu201_P1300_V1.7_Release.rar”里面的文件“HUAYU_P1300_V1.7_Release.rar”到目錄“E:\MTK_P1300”,此時(shí)會(huì)出現(xiàn)目錄“E:\MTK_P1300\P1300_V1.7_Release”,這就是P1300的代碼目錄樹了;接著打上最新的補(bǔ)丁,解壓壓縮包“huayu203_P1300_V1.7_Release_patch.rar”里面的壓縮文件“HUAYU_P1300_V1.7_Release_patch.rar”到目錄
“E:\MTK_P1300\P1300_V1.7_Release”,解壓時(shí)選擇全覆蓋以替換被修改過的文件,打補(bǔ)丁之前對(duì)目錄樹里面的文件進(jìn)行修改過的,需要手動(dòng)再加上去。
編譯PC仿真器之前需要先把剛才上面得到的目錄樹build一次,開一個(gè)dos窗,盤符和目錄轉(zhuǎn)到代碼目錄樹對(duì)應(yīng)的盤符和目錄,例如:
- E:
- cd E:\MTK_P1300\P1300_V1.7_Release\
- make new
注3:第一次make的時(shí)候要用“make new”,make new的時(shí)間比較長(zhǎng)(慢的機(jī)器搞不好要2小時(shí)以上),編譯過程中間會(huì)出現(xiàn)一些文件找不到的信息,只要編譯過程沒意外終止,那些信息可以忽略。編譯日志文件位置: build\NEOTEL25_06B\log\,要查看編譯過程有啥問題就看這個(gè)目錄下的文件了;生成的bin文件位置: build\NEOTEL25_06B\*.bin,下載燒錄就是燒bin文件。
這里順帶介紹下build的命令格式:
make new 清除后重新編譯整個(gè)項(xiàng)目
make resgen 重新生成資源
make remake重新編譯鏈接項(xiàng)目
make viewlog xxx 查看模塊xxx的編譯日志
make查看可以用make選項(xiàng)幫助信息
注4:如果機(jī)器上裝了其他gcc編譯工具鏈(比如winavr之類)的話可能要手動(dòng)改下Path,否則編譯會(huì)出錯(cuò),修改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
注意,上面的路徑是我機(jī)器上的,不是缺省安裝路徑,要根據(jù)自己的實(shí)際安裝路徑做修改。
下面開始編譯PC仿真器了,用VC6打開工程文件“E:\MTK_P1300\P1300_V1.7_Release\plutommi\mmi\ PC_Simulator.dsw”,然后開始編譯,編譯時(shí)間比較長(zhǎng),具體看機(jī)器配置了,這時(shí)又可以干點(diǎn)別的啥了,呵呵。
因?yàn)榉抡嫫鞴こ躺婕拔募^多,編譯費(fèi)時(shí),建議編譯過程中電腦上少開窗口,特別是網(wǎng)絡(luò)類的,如QQ,有時(shí)會(huì)發(fā)現(xiàn)開QQ后,編譯過程中VC會(huì)掛死,呵呵。有可能是開QQ后防火墻過濾網(wǎng)絡(luò)數(shù)據(jù)占用較多系統(tǒng)資源,如果發(fā)現(xiàn)VC編譯特別慢或干脆掛死,可以重啟動(dòng)一下電腦,只開必要的窗口,然后開始編譯。
如果編譯過程中發(fā)現(xiàn)怪異的問題,如:
- incomingstringiddef.h(120) : error C2059: syntax error : 'constant'
- 或者
- error C2065: 'STR_CM_REDIAL' : undeclared identifier
- 之類
這個(gè)時(shí)侯你可能需要看一下你VC相關(guān)路徑的設(shè)置順序,如下圖:
把VC原本的頭文件路徑調(diào)整到最前面,我剛開始編譯的時(shí)候SDK的頭文件在前面,編譯總是通不過,改一下就好了,庫也一樣都調(diào)整下比較保險(xiǎn),呵呵。
(6)Tracer跟蹤工具
解壓文件P1300_Build_Guide.rar到E:\MTK_P1300,然后在文件管理器進(jìn)入目錄“E:\MTK_P1300\P1300_Build_Guide”,接著解壓Catcher_L1_v3.10.01.zip到當(dāng)前目錄下的Catcher_L1_v3.10.01子目錄,進(jìn)入子目錄Catcher_L1_v3.10.01,發(fā)送一個(gè)Catcher.exe的快捷方式到桌面。
在需要用到TRACE的時(shí)候,在代碼中使用函數(shù)
void kal_prompt_trace(module_type mod_id, const kal_char *fmt,...); 打印需要查看的信息,使用Catcher跟蹤查看。
這個(gè)有點(diǎn)類似Linux的Kernel Debug工具,具體使用方法見文檔《cather使用手冊(cè).doc》,這個(gè)文檔可在壓縮包“huayu101_p1300軟件使用工具及開發(fā)指南.rar”里面找到。
(7)燒錄工具
解壓文件“E:\MTK_P1300\P1300_Build_Guide\ FlashTool_UI_exe_v3.1.05.zip”到當(dāng)前目錄,然后進(jìn)入目錄“E:\MTK_P1300\P1300_Build_Guide\FlashTool_v3.1.05”,發(fā)送一個(gè)Flash_tool.exe的快捷方式到桌面好了。
還有個(gè)下載工具FlashTool_v3.0844.00.rar,也是不用安裝,解壓后直接用的,據(jù)說燒錄速度比上面那個(gè)快。
具體使用方法見文檔《flash_tool_MT平臺(tái)使用教程.doc》,這個(gè)文檔可在壓縮包“huayu101_p1300軟件使用工具及開發(fā)指南.rar”里面找到。
(8)USB串口下載線驅(qū)動(dòng)
運(yùn)行壓縮文件
- “E:\MTK_P1300\P1300_Build_Guide\ PL2303_Driver_XP2K_v204102.zip”
里面的可執(zhí)行文件進(jìn)行安裝,一路下一步,這里不再贅述。
nucleus實(shí)時(shí)操作系統(tǒng)MTK手機(jī)軟件系統(tǒng)工程和配置簡(jiǎn)介
MTK使用了nucleus實(shí)時(shí)操作系統(tǒng),在其上做了個(gè)內(nèi)核抽象層的封裝,以適應(yīng)多種實(shí)時(shí)操作系統(tǒng),如oscar、ThreadX、nucleus。整個(gè)軟件系統(tǒng)包括nucleus操作系統(tǒng)、平臺(tái)設(shè)備驅(qū)動(dòng)、協(xié)議棧、文件系統(tǒng)、WGUI、MMI、J2ME等。在這里MMI部分幾乎包括了操作系統(tǒng)內(nèi)核、協(xié)議棧、文件系統(tǒng)之上的所有部分,其中WGUI也在其中。
MTK的PC模擬版使用VC的編譯器和鏈接器生成,ARM版使用ADS1.2的編譯器和鏈接器生成。因?yàn)镸TK的整個(gè)軟件系統(tǒng)是一個(gè)很龐大而且復(fù)雜的工程,并且要支持多個(gè)MTK的產(chǎn)品系列和多家客戶的客戶化支持,使用集成開發(fā)環(huán)境(IDE)已經(jīng)無法勝任,而且很難做到整個(gè)工程的自動(dòng)構(gòu)建和資源、代碼的生成。所以MTK的軟件系統(tǒng)使用了windows下的GNU開發(fā)工具鏈(MinGW)來進(jìn)行工程的管理、配置和構(gòu)建,MTK將MinGW放到了第三方工具中。
另外還使用了perl腳本來解析用戶輸入的命令行參數(shù),因此第三方工具中還包含了ActivePerl(windows下的perl解釋器)。不過,整個(gè)軟件系統(tǒng)并沒有使用MinGW的全部工具,好象只使用了make這個(gè)工具,由幾個(gè)Makefile控制了構(gòu)建的過程,在編譯和鏈接時(shí)根據(jù)最終生成PC模擬版還是ARM版而分別調(diào)用VC的編譯器和鏈接器或ADS1.2的編譯器和鏈接器。
#p#
接下來我們從具體的工程實(shí)踐來看MTK的手機(jī)軟件系統(tǒng)。
一、MTK手機(jī)軟件系統(tǒng)的目錄結(jié)構(gòu)簡(jiǎn)介
MTK手機(jī)軟件系統(tǒng)的主要目錄如下所示,因整個(gè)工程的目錄樹非常龐大,為簡(jiǎn)單起見和減小篇幅,去除了在工程結(jié)構(gòu)中相對(duì)不重要的目錄。
- |-- 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是開發(fā)時(shí)下載二進(jìn)制映像和資源等的相關(guān)文件的目錄。ROM是固化在ROM(可能是Flash的只讀區(qū))中的相關(guān)代碼和頭文件的目錄,在給客戶的發(fā)布版中大都只有一些導(dǎo)出函數(shù)的頭文件,其中似乎還有一個(gè)跳轉(zhuǎn)表的東西ROMSA_FuncTable。
kal是上面所說的內(nèi)核抽象層的相關(guān)文件的目錄。nvram是存取NV中的內(nèi)容的相關(guān)代碼的目錄。nucleus是nucleus實(shí)時(shí)操作系統(tǒng)的目錄,在給客戶的發(fā)布版中只有頭文件。drv是驅(qū)動(dòng)相關(guān)的代碼的目錄。fs是文件系統(tǒng)相關(guān)的目錄,好像只支持fat格式的。tools是工程相關(guān)工具的目錄,包括MinGW。interface是系統(tǒng)各層的接口的目錄,還包含重要模塊的接口,如bluetooth、WIFI。config是一些系統(tǒng)和任務(wù)(task)相關(guān)頭文件的目錄,感覺不像是配置相關(guān)的目錄。inc是中斷控制和寄存器地址相關(guān)頭文件的目錄。
modis是PC模擬版的相關(guān)目錄,包括了虛擬的GSM網(wǎng)絡(luò)、SIM卡等,以及模擬器需要的字符串、圖片等資源,還有PC模擬版的庫、VC的相關(guān)工程文件。
mmi是一個(gè)缺省的空的MMI應(yīng)用的目錄,其中只是創(chuàng)建了一個(gè)什么也不干的MMI任務(wù)(線程),處理下層發(fā)送上來的消息。plutommi是pluto組織(也可能是原本的mmi應(yīng)用的代號(hào))所寫的整套MMI應(yīng)用所在的目錄,而實(shí)際上也就是我們需要定制和修改的MMI應(yīng)用。其中的mmi目錄中是pluto原本寫好的mmi應(yīng)用,mtkapp中是mtk后來所寫的mmi應(yīng)用,而Customer中是圖片、字符串等資源的定制目錄,大部分只是修改了字符串和圖片、聲音等的項(xiàng)目只要修改這個(gè)目錄下的資源即可。
mtk_lib中是已經(jīng)編譯鏈接好的ARM版的庫。因整個(gè)工程過于龐大,若完整的全新構(gòu)建一次需要很長(zhǎng)的時(shí)間。為了減少構(gòu)建的時(shí)間,將一些已經(jīng)完全調(diào)試穩(wěn)定且基本不再改動(dòng)的庫和MTK不開放源代碼的庫放到這個(gè)目錄,這樣每次構(gòu)建時(shí)只需要將這些庫和其他編譯好的庫鏈接起來就可以了。這些庫一般是ARM版的,若有thumb版的,則再增加一個(gè)和ARM版相對(duì)的thumb版的庫,一般叫第二個(gè)庫,如media_sec.lib就是thumb版的多媒體庫。
custom是所有客戶化項(xiàng)目的驅(qū)動(dòng)程序及系統(tǒng)和MMI應(yīng)用定制相關(guān)的文件的目錄。如你的手機(jī)主板的RAM、FLASH等存儲(chǔ)器的尺寸和地址空間有改動(dòng),MMI應(yīng)用的特性有不同,藍(lán)牙、WAP的配置有變化,或是有項(xiàng)目相關(guān)的新應(yīng)用,其相關(guān)文件都是放在這個(gè)目錄中和特定項(xiàng)目對(duì)應(yīng)的目錄下,如項(xiàng)目CUST1_6227,則放在CUST1_6227_BB下。要注意的是custom也作為一個(gè)模塊存在,這使得其可以通過make目錄中的custom模塊的四個(gè)文件進(jìn)行客戶化的一些定制。
applib、bootloader、init、media、j2me等是這個(gè)系統(tǒng)各個(gè)層次的相對(duì)獨(dú)立的模塊各自的目錄,其實(shí)drv和fs等目錄也可以看成是相對(duì)獨(dú)立的模塊,只不過其更重要些而在前面介紹。這些目錄包含了這些模塊的C文件和頭文件。每個(gè)目錄(模塊)都在下面的make目錄中有相對(duì)應(yīng)的目錄保存構(gòu)建時(shí)的編譯鏈接配置文件。
make是工程構(gòu)建過程中最重要的一個(gè)目錄了,工程構(gòu)建用的Makefile和一些中間配置文件將放在這里,Makefile在講解構(gòu)建過程時(shí)再具體介紹。在每個(gè)模塊對(duì)應(yīng)的目錄下,都有四個(gè)文件控制了編譯鏈接時(shí)的過程和配置。分別是:
<module_name>.def文件中是該模塊構(gòu)建過程中用的條件定義。
<module_name>.inc文件中是該模塊所有用到的頭文件所在目錄的路徑,是相對(duì)整個(gè)工程根目錄的路徑。
<module_name>.lis文件中列出了該模塊的所有C文件,其路徑也是相對(duì)整個(gè)工程根目錄的。
<module_name>.pth文件中是該模塊的所有C文件所在目錄的路徑,是相對(duì)整個(gè)工程根目錄的路徑。
build目錄中保存了構(gòu)建過程中產(chǎn)生的目標(biāo)文件和庫文件,及其他一些中間文件。
二、MTK手機(jī)軟件系統(tǒng)的構(gòu)建過程
如前面一節(jié)所述,MTK手機(jī)軟件系統(tǒng)的構(gòu)建使用了GNU的make,使得整個(gè)工程的構(gòu)建可以自動(dòng)進(jìn)行,且可以靈活控制。整個(gè)構(gòu)建過程由Make.bat、make2.pl、MoDIS.dsw、Gsm2.mak、Option.mak、<customer>_<project>.mak等文件控制。構(gòu)建PC模擬版是通過msdev和VC的工程文件MoDIS.dsw來完成的。Gsm2.mak是構(gòu)建ARM版的核心Makefile文件,整個(gè)構(gòu)建過程由其控制,其他是一些啟動(dòng)、選項(xiàng)配置、子過程的文件。其關(guān)系圖如下所示。
在MTK手機(jī)軟件系統(tǒng)的根目錄下有一個(gè)批處理文件Make.bat,這個(gè)批處理文件啟動(dòng)了整個(gè)工程的構(gòu)建過程。在windows的命令行下,在該系統(tǒng)的根目錄下輸入命令make和相應(yīng)的參數(shù)即可開始工程的構(gòu)建,該批處理文件的使用方法如下所示。
- 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這幾個(gè)。
new是全新開始構(gòu)建整個(gè)工程的ARM版,包括圖片、聲音、字符串等資源都要重做,依賴的其他動(dòng)作最多,是最徹底也是耗時(shí)最長(zhǎng)的一個(gè)動(dòng)作,一般得到一個(gè)新的MTK發(fā)布版本后要做一次。
update是重新更新整個(gè)工程的ARM版,該動(dòng)作會(huì)掃描工程中文件和庫的依賴關(guān)系,若依賴關(guān)系有變化會(huì)建立新的依賴關(guān)系,隨后根據(jù)新的依賴關(guān)系重新編譯鏈接有改動(dòng)的部分,一般在增加或刪除一些驅(qū)動(dòng)或應(yīng)用的情況下需要用update。
remake是重新編譯整個(gè)工程的ARM版,該動(dòng)作只是簡(jiǎn)單的重新編譯鏈接有改動(dòng)的部分,不檢查依賴關(guān)系,是耗時(shí)最短的一個(gè)動(dòng)作,也是最常用的動(dòng)作。
new_modis是全新構(gòu)建整個(gè)工程的PC模擬版,其調(diào)用VC的編譯器和鏈接器得到一個(gè)可以在windows上運(yùn)行的PC模擬版。MMI應(yīng)用軟件工程師可以在沒有硬件板的情況下在PC上檢查和調(diào)試自己寫好的應(yīng)用。
Make.bat實(shí)際上只起引導(dǎo)作用,其只有一行批處理語句perl make2.pl %*,于是運(yùn)行該批處理文件后控制權(quán)轉(zhuǎn)給了perl腳本make2.pl。在這個(gè)perl腳本中解析了用戶輸入的命令行參數(shù),設(shè)置變量,準(zhǔn)備make時(shí)需要的臨時(shí)配置文件,隨后根據(jù)生成的可運(yùn)行映像是PC模擬版還是ARM版而分別調(diào)用不同的構(gòu)建過程。
Pc模擬版的構(gòu)建通過調(diào)用如下命令實(shí)現(xiàn)。
- system("$msdev MoDIS.dsw /MAKE \"$argu - Win32 $modisDir\"
- /OUT ${MoDISLogDir}\\${argu}.log")
在這里$msdev就是VC的msdev,通過VC的工程文件MoDIS.dsw和后面的參數(shù)進(jìn)行具體的構(gòu)建過程。熟悉VC工程的朋友應(yīng)該比較清楚,因此就不再具體解釋了。之后將只以ARM版為主來講解整個(gè)工程的構(gòu)建過程。
ARM版的構(gòu)建通過調(diào)用如下命令實(shí)現(xiàn)。
- 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分別是客戶名和項(xiàng)目名,在構(gòu)建過程中將根據(jù)此兩個(gè)變量的值選定項(xiàng)目相關(guān)的配置文件,從而實(shí)現(xiàn)客戶化的定制。通過給make指定ARM版的核心Makefile文件Gsm2.mak,開始了ARM版的構(gòu)建過程。
Gsm2.mak文件中包含了Option.mak這個(gè)配置用的Makefile文件,另外還包含了一些以.tmp和.bld為后綴的由perl腳本 make2.pl生成的臨時(shí)配置文件。這些臨時(shí)配置文件主要是一些action如clean、remake等所需的變量設(shè)置,及客戶化和版本號(hào)等的一些信息。Gsm2.mak控制了new、update、remake等動(dòng)作的過程。具體分別如下所示。
- 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
上面的構(gòu)建過程的幾個(gè)步驟中,最重要的兩個(gè)步驟是libs、$(BIN_FILE) 。libs調(diào)用ARM版的編譯器和連接器將各個(gè)模塊目錄下的C文件編譯鏈接為獨(dú)立的庫。$(BIN_FILE)這個(gè)步驟將各個(gè)模塊編譯鏈接得到的庫和 mtk_lib目錄下的庫一起鏈接起來得到一個(gè)映像文件,然后使用ADS的工具fromelf將映像文件生成以變量BIN_FILE命名的二進(jìn)制文件,該文件可以下載到硬件板上運(yùn)行。
libs這個(gè)步驟如下所示。
- libs: cleanlib startbuildlibs $(COMPLIBLIST)
libs中真正進(jìn)行編譯鏈接的步驟是$(COMPLIBLIST),要生成的庫由變量COMPLIBLIST列出,在ARM版中,變量 COMPLIBLIST從變量COMPLIST得到。變量COMPLIST是在Option.mak及其包含的Makefile文件中賦值的。因有很多庫需要編譯鏈接,變量COMPLIBLIST展開后包含多個(gè)步驟,而這些步驟都是重復(fù)不變的,因此在定義步驟$(COMPLIBLIST)的構(gòu)建過程時(shí)使用%.lib代替。%.lib這個(gè)步驟先清除了之前的一些依賴關(guān)系文件,將一些變量的設(shè)置寫入~compbld.tmp這個(gè)臨時(shí)文件中,然后給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) \
- )
上面的命令語句中,參數(shù)-k是指有錯(cuò)誤也要繼續(xù)編譯,-r和-R是指沒有GNU make的默認(rèn)規(guī)則和變量。COMPONENT=$*把當(dāng)前要生成的庫賦給變量COMPONENT。要注意%.lib匹配了所有要生成的庫,但這個(gè)步驟一次只生成一個(gè)模塊的庫,這個(gè)步驟對(duì)所有匹配到的庫都會(huì)執(zhí)行一次。
comp.mak這個(gè)Makefile文件控制了模塊的編譯鏈接過程。在這個(gè)文件中,首先將當(dāng)前模塊要生成的庫(由變量COMPONENT傳入)設(shè)置給了變量TARGLIB。之后從<module_name>.lis文件中得到SRC_LIST和CPPSRC_LIST兩個(gè)源文件列表,設(shè)定要編譯的C文件、C++文件、匯編文件等的列表,和要鏈接的中間目標(biāo)文件的列表。將<module_name>.inc、<module_name>.def、<module_name>.pth 文件中的頭文件路徑、C文件路徑、編譯鏈接參數(shù)等賦值給相應(yīng)的變量。將平臺(tái)相關(guān)(如6223、6225)的編譯參數(shù)加上,確定使用ARM編譯器還是 thumb編譯器,是否支持ARM指令和thumb指令的interwork模式。最后進(jìn)入庫的編譯鏈接過程。
庫的編譯鏈接由update_lib步驟完成,這個(gè)步驟直接依賴了$(TARGLIB)。目標(biāo)$(TARGLIB)是由所有按照.c.obj、.s.obj、%.obj: %.cpp等規(guī)則編譯得到的中間目標(biāo)文件鏈接得到的。其主要過程如下所示。
- $(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是整個(gè)工程構(gòu)建過程中的總控配置文件,在這個(gè)文件中還包含了<customer>_<project>.mak和REL_CR_MMI_<project>.mak這兩個(gè)項(xiàng)目相關(guān)的配置文件,用戶自定義的配置文件USER_SPECIFIC.mak,另外還包含了一些臨時(shí)生成的配置文件。這些配置文件在一起設(shè)置了工程構(gòu)建過程中用到的編譯器、鏈接器,庫和二進(jìn)制的工具,設(shè)置了編譯鏈接時(shí)的參數(shù),公共的頭文件路徑,設(shè)置了需要包含mtk_lib目錄中的哪些既有的庫,設(shè)置了需要生成的庫等一系列相關(guān)的設(shè)置。這些設(shè)置都由一些重要的變量保存,具體在下一節(jié)中講解。
#p#
三、MTK手機(jī)軟件系統(tǒng)的配置
MTK手機(jī)軟件系統(tǒng)的大部分配置都已經(jīng)確定,基本上不需要再改變,一般是MTK發(fā)布新的版本時(shí)會(huì)作些改變,客戶不大需要關(guān)心。最主要的配置文件是Option.mak,而客戶化定制需要需要修改的主要是<costomer>_<project>.mak、REL_CR_MMI_<project>.mak這兩個(gè)文件。
Option.mak文件中設(shè)置了工程構(gòu)建時(shí)用到的編譯器、鏈接器、庫管理、二進(jìn)制文件生成等工具的路徑和可執(zhí)行程序名,設(shè)置了基本的編譯鏈接參數(shù),指定CPU類型(ARM7EJ-S),確定最終使用的庫列表(COMPLIST)。
一個(gè)項(xiàng)目是由工程中的多個(gè)基本庫、第三方庫和由源代碼新編譯鏈接的庫組成的,最終這些庫鏈接到一起得到一個(gè)完整的可執(zhí)行映像文件。由哪些新編譯鏈接的庫來組成一個(gè)項(xiàng)目是由四個(gè)關(guān)鍵的變量決定,其中一個(gè)是前面提到的COMPLIST,另外三個(gè)分別是CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP、CUS_REL_MTK_COMP。這個(gè)幾個(gè)變量的關(guān)系如下所示。
- # *************************************************************************
- # 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確定了該項(xiàng)目最終是由哪些庫(組件)組成的。MTK的內(nèi)部版本構(gòu)建時(shí),則包括 CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP、 CUS_REL_MTK_COMP這些庫??蛻舭姹緲?gòu)建時(shí),則只包括 CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP這些庫。手機(jī)設(shè)計(jì)公司構(gòu)建的版本都是客戶版本,因此只要改變 CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP這兩個(gè)變量的值即可以定制自己的項(xiàng)目了。
MTK_LIBS確定了該項(xiàng)目最終包含了哪些MTK提供的基本庫。
COMPOBJS確定了該項(xiàng)目最終包含了哪些第三方提供的不帶源代碼的庫。變量CUS_RES_OBJ_LIST用于把這些第三方庫隨項(xiàng)目發(fā)布。
Option.mak和REL_CR_MMI_<project>.mak這兩個(gè)文件都有對(duì)這兩個(gè)變量CUS_REL_SRC_COMP、 CUS_REL_PAR_SRC_COMP賦值。但Option.mak文件只是設(shè)定了整個(gè)工程需要的基本庫,如手寫、圖形解碼等,和特定項(xiàng)目沒有關(guān)系。因此客戶要定制自己的項(xiàng)目只需要修改REL_CR_MMI_<project>.mak這個(gè)文件對(duì)這兩個(gè)變量的賦值即可。
<costomer>_<project>.mak文件也有對(duì)COMPLIST的賦值,但這只是對(duì)MTK的內(nèi)部版本有用,客戶版本沒有影響。值得注意的是,該項(xiàng)目的絕大部分功能特性(feature)是在這個(gè)文件中確定的,如使用的sensor、支持哪些音視頻格式、電話本大小、LCD屏幕大小等。下面是該文件中的部分內(nèi)容。
- 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
四、增加模塊的配置實(shí)例
若我們需要加入zlib這么一個(gè)模塊(zlib包含了很多程序都用到的壓縮和解壓函數(shù)),我們可以按如下步驟進(jìn)行。
1、把zlib的源代碼包拷貝到你的MTK軟件系統(tǒng)根目錄下,這樣所有的zlib代碼都在zlib目錄或zlib-1.2.3目錄下(用哪個(gè)目錄名由你的喜好來確定),在此為簡(jiǎn)單起見就放在zlib目錄。
2、在make目錄下新增一個(gè)zlib的目錄(最好和根目錄下的目錄名一樣),增加四個(gè)文件,分別是zlib.def、zlib.inc、zlib.lis、zlib.pth。zlib.def文件只要加上APCS_INTWORK就可以了,其他三個(gè)文件中加上源文件及其目錄、頭文件目錄即可。
3、在REL_CR_MMI_<project>.mak這個(gè)文件的合適位置加上如下語句。
- CUS_REL_SRC_COMP += zlib
4、把這個(gè)工程remake一下,若沒有錯(cuò)誤,zlib模塊就成功加上去了。其他模塊就可以調(diào)用zlib提供的壓縮和解壓縮函數(shù)了。
若我們需要加入一個(gè)沒有源代碼的第三方庫,譬如加入wifi,我們可以按如下步驟進(jìn)行。
1、把wifi的所有第三方庫文件拷貝到一個(gè)新建的wifi目錄下。
2、在Option.mak這個(gè)文件的合適位置加上如下語句。
- 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初始化代碼。花了半個(gè)小時(shí)將初始化代碼寫進(jìn)程序,一試居然可以工作了,真tm的神了。
然后新建了 XXX_GPRS.mak和Verno_XXX.bld。指定LCD_MOUDLE,CMOS_SENSOR(6219平臺(tái)的)NOR_FLASH_TYPE,PHONE_TYPE等。
然后從其他項(xiàng)目中拷貝個(gè)image過來,在CustResDefPLUTO.h 指定好image 路徑。這些步驟不到5分鐘。
然后打開原理圖
1、eint_def.c 中對(duì)照原理圖設(shè)置好中斷,6219中才4個(gè)中斷,很快設(shè)定好,下面有個(gè)數(shù)組custom_eint_sw_debounce_time_delay是設(shè)置debounce time的。
2、查找LCM背光和keypad背光控制的地方,在custom_equipment.c中的custom_cfg_gpio_set_level函數(shù)中設(shè)置,一看pwm2和Alter,不用該。
3、鍵盤定義,keypad_def.c中對(duì)照原理圖一行一列的填上去。
4、各種gpio口的配置,還是在custom_equipment.c,gpio_map_tbl數(shù)組,對(duì)照原理圖配置好,主要就是振動(dòng)啊,LED燈啊什么的,然后要設(shè)置聲音,afe.c中,函數(shù)
AFEtchExtAmplifier,當(dāng)中就是把一個(gè)gpio口拉高,拉低,注意這個(gè)口一定要配置成GPIO模式,并設(shè)置為輸出。USB使能和上面一樣,在函數(shù)USB_PowerControl中把相應(yīng)的口拉高拉低。
5、看一下flash,nnd原來是samsung的,得改一改了,這個(gè)flash的時(shí)序和其他的不一樣,要大一點(diǎn),根據(jù)flash spec和MTK datasheet,在custom_emi.c中修改一下時(shí)序,這個(gè)工作花了我半個(gè)小時(shí),具體設(shè)置請(qǐng)參照MTK datasheet中的EMI Control Register for BANK0
6、給nor flash分個(gè)區(qū),由于沒有NAND falsh經(jīng)理想了個(gè)辦法,把nor flash分1M出來當(dāng)U盤,F(xiàn)lashConf.c中的PARTITION_SECTORS設(shè)為2048,custom_drv_init函數(shù)中寫入U(xiǎn)SB_Ms_Register_DiskDriver(&USB_NOR_drv);這樣1M的U盤就出來了,其實(shí)沒有什么用的基本設(shè)置完了,然后就要在MMI_featuresPLUTO.h中設(shè)置了,這個(gè)是我最喜歡做的事情了,一看要求,需要 英文,簡(jiǎn)中,繁中,泰文,sussian文,越南文,阿拉伯文,(md這么多),主菜單需要做成12宮格,開關(guān)機(jī)mp4,IP撥號(hào)等,MTK做的就是好,只要把宏打開就好了,md就是簡(jiǎn)單,把客戶發(fā)過來的圖片放進(jìn)去,ok了
make custom=XXX gprs new接著我就找人聊天去了,半個(gè)小時(shí)后好了,down進(jìn)去一看,可以了,發(fā)給客戶做個(gè)demo,客戶說還可以,這做個(gè)版本也真tmd容易。接著客戶要提要求了,按ok鍵要直接放MP3啊,加入來電黑名單啊,在電話本中直接發(fā)消息啊,這個(gè)個(gè)東西把宏打開就可以了,由于用的是OV7660的攝像頭,需要30w差值到130w,然后先前把mtk發(fā)給我們的差值代碼放進(jìn)去,mmi上在做個(gè)1280X1024的選項(xiàng),其實(shí)就是降低一些設(shè)置,純粹是欺騙消費(fèi)者的,我還看到過最大分辨率是640X480的居然還標(biāo)著130w,欺騙廣大勞動(dòng)者不會(huì)算術(shù)。搞定后new一遍,發(fā)給客戶,客戶說,先測(cè)一下,過幾天再提些要求,并要求做個(gè)64+32M bit的版本,省成本。還要做個(gè)130w 差值到200 w camera的版本。去忽悠他的客戶。
總之,現(xiàn)在MTK做濫了,各家都在省成本啊,哈哈。
小結(jié):MTK開發(fā)環(huán)境搭建全過程學(xué)習(xí)教程的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!