MTK6577+Android启动----pre-loader
分類:?MTK+Android開發?Android Bootloader2014-07-26 13:46?1478人閱讀?評論(0)?收藏?舉報
MTK6577+Android啟動----pre-loader
?
備注:
?
META mode:Mobile Engineering Test Architecture,移動工程師測試架構
ATE factory mode:automatic test environment,自動測試環境
ISRAM:internal system RAM
?
Bootloader能夠準備一個至關重要的執行環境和引導linux操作系統及Android框架(framework)。
?
bootloader主要包括設置處理器和內存的頻率、調試信息端口、可引導的存儲設備等等。在可執行環境創建好之后,接下來把software裝載到內存并執行。除了裝載software,一個外部工具也能和bootloader握手(handshake),可指示設備進入不同的操作模式,比如USB下載模式和META模式。就算沒有外部工具的握手,通過外部任何組合或是客戶自定義按鍵,bootloader也能夠進入這些模式。
?
因為bootloader的一部分和系統有關,所以MTK為了不同的應用將它分為兩部分的bootloader:
(1)??第1部分bootloader,也就是MTK內部(in-house)的pre-loader,這部分依賴平臺。
(2)??第2部分bootloader,也就是u-boot,這部分依賴操作系統,負責引導linux操作系統和Android框架。
?
?
1.?????Pre-loader源代碼
?
1.1? 源代碼目錄
?
(1)??Pre-loader的代碼在xxx\mediatek\platform\mt6577\preloader
Pre-loader核心和平臺驅動源碼。
?
(2)??xxx\mediatek\custom\<project>\preloader
依賴于平臺自定義文件的部分(platform dependent customization),比如EMI(external memory interface,外部存儲器接口)設置。
?
Inc文件夾:
1)?????cust_bldr.h
pre-loader的一些定制的特征,比如是從SDMMC還是NAND啟動、調試口選擇(UART1或是UART4)和波特率的配置等宏定義。
?
2)?????cust_msdc.h
MSDC的自定義,比如包括MSDC的時鐘頻率、命令鎖存跳變沿(上升沿或是下降沿)、數據鎖存的跳變沿、高速或是全速模式等等。
?
3)?????cust_nand.h
定義了所支持的NAND FLASH信息,比如FLASH ID、多少塊、一塊多少頁等信息,但這些被注釋掉了,主要定義了默認的訪問時間等
?
4)?????cust_rtc.h
RTC年月日的默認設置。
?
5)?????cust_sec_ctl.h
一些安全設置的定義,比如包括了項目名稱(比如cust)、平臺名稱(MT6577)、S-Boot的一些屬性等。
?
6)?????cust_usb.h.h
USB設置的宏定義,包括USB制造商、USB供應商ID(VID)、USB識別碼ID(PID)等。
?
7)?????custom_emi.h
擴展存儲器接口的寄存器和設置的結構體定義。
?
8)?????custom_MemoryDevice.h
定了采用的內存設備類型,比如H9TP32A4GDMCPR。
?
9)?????mt6577_emi.h
mt6577內存的一些函數原型,如:
extern voidmt6516_set_emi (void);
extern voidmt6516_256M_mem_setting (void);
?
10)? mt6577_emi_reg.h
內存控制寄存器的宏定義。
?
11)? mt6577_memory.h
內存的一些設置,比如用于內存測試的大小、E1和E2內存的大小和一些函數原型。
?
12)? mt6577_nfi.h
nfi是Nand Flash Interface的縮寫,和cust_nand.h內容一樣。
?
(3)??xxx\mediatek\source\preloader
開發工具,例如building、trace32 cmm文件等,pre-loader對象和鏡像二進制輸出文件
?
1.2? 編譯命令
Pre-loader單獨的編譯命令:./mk <$PROJECT> n pl
U-Boot單獨的編譯命令:./mk <$PROJECT> n ub
?
2.?????bootloader的工作流程
?
2.1? bootloader正常的啟動流程
先來看啟動流程圖:
圖1
正常啟動的主要工作如下:
(1)??設備上電后,Boot ROM開始運行。
(2)??BootROM初始化軟件堆棧(software stack)、通信端口和可引導存儲設備(比如NAND/EMMC)。
(3)??BootROM從存儲器中加載pre-loader到內部SRAM(ISRAM)中,因為這時候還沒有初始化外部的DRAM。
(4)??BootROM跳轉到pre-loader的入口處并執行。
(5)??Pre-loader初始化DRAM和加載U-Boot到RAM中。
(6)??Pre-loader跳轉到U-Boot中并執行,然后U-Boot做一些初始化,比如顯示的初始化等。
(7)??U-Boot從存儲器中加載引導鏡像(boot image),包括linux內核和ramdisk(Android呢?)
(8)??U-Boot跳轉到linux內核并執行。
?
2.2? bootloader正常的下載流程
先來看正常的下載流程圖:
圖2
正常的下載主要工作如下:
(1)??設備上電后,Boot ROM開始運行。
(2)??BootROM初始化軟件堆棧(software stack)、通信端口和可引導存儲設備(比如NAND/EMMC)。
(3)??BootROM通過UART/USB和flash工具握手。
(4)??BootROM通過UART下載pre-loader鏡像到NAND flash/EMMC中,然后重啟。
(5)??BootROM加載pre-loader到內部SRAM匯總,因為DRAM還沒有初始化。
(6)??BootROM跳轉到pre-loader并執行。
(7)??Pre-loader初始化DRAM和通過USB與flash工具握手。
(8)??Pre-loader通過USB下載其余鏡像文件,比如U-Boot、boot image、recovery image、android system image、user data到NAND FLASH/EMMC中。
?
?
2.3? Bootloader備用的下載流程(emergency download procedure)
(1)??設備上電后,Boot ROM開始運行。
(2)??BootROM初始化軟件堆棧(software stack)、通信端口和可引導存儲設備(比如NAND/EMMC)。
(3)??BootROM在emergency DL按鍵按下后,通過USB和flash工具握手。
(4)??BootROM通過USB把指定的鏡像文件下載到NAND FLASH/EMMC中。
?
?
3.?????pre-loader的功能
pre-loader是MTK內置的loader,它的主要功能如下:
(1)??負責在芯片組平臺(chipset platform)上準備好可執行的環境
(2)??如果外部工具有效,它會試圖通過UART或是USB來和外部工具握手。
(3)??從NAND/EMMC加載U-Boot,并跳轉到U-Boot。
(4)??使用工具握手,設備能夠觸發進入下載模式來下載需要的鏡像,或是進入工廠/測試模式,比如META模式和ATE工廠模式,在這些模式下可以測試模塊,或是通過傳遞引導參數給U-Boot和linux內核來校準設備(device calibration)
?
對于安全的執行環境,安全引導程序會檢查(checking)或是查證(verification),這樣能夠保護我們的芯片被攻擊(hacked)。
?
4.?????Bootloader硬件環境
當設備上電后,bootloaders被加載到不同的內存區域并執行,如下圖所示:
?
圖3
Pre-loader在芯片內部系統(chipset’s internal system)RAM的0Xc2010000位置開始執行,U-Boot在外部RAM的0x01E00000處執行。當bootloaders執行時,初始化多種硬件模塊來創建一個可執行的環境,具體是哪些硬件模塊,下面有詳細的描述。
?
4.1? pre-loaders中涉及的硬件部分
當系統啟動時,芯片組(chipset)內部的可引導ROM開始執行,并從可引導存儲設備(NAND/EMMC等等)上拷貝pre-loader。所以,需要通過初始化一些硬件模塊來為軟件創造必要的可執行環境(essential execution environment),所有這些硬件模塊在接下來描述。
(1)??PLL模塊
1)?????PLL模塊用于調整處理器和外部內存的頻率。
2)?????在PLL模塊初始化后,處理器和外部內存的頻率可由26MHZ/26MHZ增加到1GHZ/192MHZ。
(2)??UART模塊
1)?????UART模塊用于調試或是META模式下的握手。
2)?????默認情況下,UART4初始化波特率為9216000bps和用于調試信息的輸出,UART1初始化為115200bps和作為UART META魔獸端口。但也可以使用UART1作為調試或是UART META端口。
?
(3)??計時器(timer)模塊
這是個基本的模塊,用來計算硬件模塊所需要的延時或是超時時間。
?
(4)??內存模塊
1)?????Pre-loader由boot ROM加載和在芯片組內部的SRAM中執行,因為外部的DRAM還沒有初始化。
2)?????為了準備軟件整個可執行環境,pre-loader采用內置的內存設置來初始化DRAM(DRAM is initialized upon pre-loader built-inmemory settigns)。這樣,U-Boot就能夠被加載到DRAM中并執行。
?
(5)??GPIO模塊
(6)??PMIC模塊
為了提供一些基本的硬件功能,比如控制外設電源,pre-loader初始化上層模塊(upper modules)。
?
(7)??RTC模塊
1)?????當通過power按鍵開機后,pre-loader拉高RTC的PWBB來保持設備一直有電(keep the device alive)和繼續引導U-Boot。
2)?????RTC鬧鐘(alarm)有可能是設備開機的啟動源,對于這種情況,設備部需要按power按鍵就可自動啟動。
?
(8)??USB模塊
當USB線插入時,它初始化來和外部工具通信,比如用于升級系統的下載工具或是META模式觸發器的META工具。
?
(9)??NAND模塊
(10) MSDC模塊
Pre-loader可以從NAND flash或是EMMC中加載U-Boot,這兩者只能選擇其中一種來啟動。
?
?
4.2? ?
?
5.?????Pre-loader的過程(procedure)和流程(flow)
如下圖:
圖4
具體的源代碼后面再分析了。
?
6.?????Pre-loader的接口
?
主要描述pre-loader用到的主要結構體和接口。
?
6.1? 上電情景(power on scenario)
?
當檢測到按下power按鍵或是USB/充電線插入,pre-loader調用rtc_bbpu_power_on()函數來鎖存RTC的PWBB來保持設備的一直供電,這樣就算是松開power按鍵設備也不會關機。
?
此函數在xxx \mediatek\platform\mt6577\preloader\src\drivers\mt6577_rtc.c文件定義。
?
6.2? 下載過程(download procedure)
Pre-loader檢查下面的條件:
(1)??充電器已連接(charger is connected)
(2)??USB已連接
(3)??Flash工具的握手是否通過
如果滿足上面這幾種要求,pre-loader就會開始下載鏡像。
?
接下來介紹下載的鏡像定義,也允許增加我們要下載的鏡像文件,這涉及的數據結構體和函數如下,在xxx\mediatek\platform\mt6577\preloader\src\core\inc中定義:
(1)??下載鏡像類型定義
[cpp]?view plaincopy
(2)??下載鏡像枚舉定義
[cpp]?view plaincopy
?
(3)??下載鏡像的主函數download_handler
Pre-loader接收到從flash工具傳遞進來的“DOWNLOAD”字符串時,download_handler函數開始下載鏡像:
圖5
此函數在xxx\mediatek\platform\mt6577\preloader\src\core\download_legacy.c定義。
總結
以上是生活随笔為你收集整理的MTK6577+Android启动----pre-loader的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络的组成有哪些
- 下一篇: 比较多个CPU