天天看點

mtk手機線刷

mtk手機線刷

mtk手機刷機一般都是使用smart phone flash tool, 以我的mt6582為例,其刷機的界面如下圖1所示

mtk手機線刷

圖1 MT6582刷機界面:

刷機流程如下圖2所示:

圖2 線刷鏡像下載下傳過程:

mtk手機線刷

線刷流程

1、裝置上電後,最先運作的就是BootROM的代碼(BootROM是固化在手機内部晶片中的(應該是一個NOR Flash晶片), 其代碼是無法通過刷機寫進去的,是再出廠的時候就寫好的,這一塊的代碼也沒有在mtk的源碼目錄中出現,目前手中也沒有BootROM的鏡像。),BootROM首先初始化軟體堆棧(software stack),通信端口和可引導儲存設備(如NAND/EMMC) (圖2步驟1)。

2、BootROM通過UART/USB可flash tool實作握手(這時候flash tool的download按鈕應該已經處于按下狀态了),并通過UART/USB下載下傳DA代理(圖2步驟2,3),DA就是Download-Agent,在圖1中第一欄可以看到,這個DA是可以在刷機的時候指定的。在刷機時候,界面下方紅色的進度條代表正在收入DA,如圖: 

mtk手機線刷

3、BootROM跳轉到DA執行(圖2步驟4)。

4、DA将其他檔案下載下傳到NAND/EMMC中(圖2步驟5-10),其中下載下傳preloader的時候是紫色的進度條,下載下傳其他檔案的時候是黃色進度條,如圖: 

mtk手機線刷
mtk手機線刷

scatter中各個檔案的作用

mtk刷機的時候需要指定一個scatter.txt檔案,這個檔案記錄的是後續的檔案分别複制到NADA/EMMC的什麼位置,下面是從scatter.txt中摘抄的一部分。

- partition_index: SYS0

  //顯示的分區名

  partition_name: PRELOADER

  //檔案名

  file_name: preloader.bin

  is_download: true

  type: SV5_BL_BIN

  //在NADA/EMMC中的下載下傳位址

  linear_start_addr: 0x0

  physical_start_addr: 0x0

  //這個檔案的大小

  partition_size: 0xc00000

  region: EMMC_BOOT_1

  storage: HW_STORAGE_EMMC

  boundary_check: true

  is_reserved: false

  operation_type: BOOTLOADERS

  reserve: 0x00

  - partition_index: SYS10

  partition_name: RECOVERY

  file_name: recovery.img

  is_download: true

  type: NORMAL_ROM

  //在NADA/EMMC中的下載下傳位址

  linear_start_addr: 0x3380000

  physical_start_addr: 0x2780000

  //檔案大小

  partition_size: 0xa00000

  region: EMMC_USER

  storage: HW_STORAGE_EMMC

  boundary_check: true

  is_reserved: false

  operation_type: UPDATE

  reserve: 0x00

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

在圖2中可以看到,scatter檔案一共指定要下載下傳12個分區,這些分區的作用如下:

PRELOADER: 核心在啟動前的那一段平台相關的初始化代碼,統稱為bootloader,在mtk平台,PRELOADER和lk分别是bootloader的兩部分,前一部分的PRELOADER主要是平台相關代碼,後一部分LK主要是銜接作業系統的代碼。

MBR/EBR1/EBR2: 可能是分區相關資訊,還不确定???

UBOOT: 就是前面說的lk,botloader的第二部分代碼,這裡可以選擇進入recovery模式,還是正常啟動核心。

BOOTIMG: BOOTIMG是一個鏡像,這個鏡像是由一個目錄打包而成的,這個目錄中包含兩個檔案: 

一個是zImage,就是的核心鏡像,這個鏡像是未解壓的,其核心的功能就是decompress_kernel,将真正的核心Image解壓到記憶體的某個位置,然後跳轉執行。在boot.img中搜尋gzip的檔案頭(我這裡zImage和ramdisk是通過gzip壓縮的),第一個搜到的就是壓縮後的Image,如圖,這個位置屬于zImage的區域,往前找找就可以找到zImage的代碼頭部了。 

mtk手機線刷

另一個是ramdisk.img,這貨又是個鏡像,在系統啟動的時候,這個ramdisk.img會被解壓到記憶體,作為系統的根目錄檔案系統(可參考initrd實作)。在boot.img中搜尋gzip檔案頭,第二個搜尋到的就是ramdisk.img了,如圖。 

mtk手機線刷

RECLVERY: 是recovery模式的核心。

SEC_RO: 不知道是啥????

LOGO: 這貨應該是開機畫面

ANDROID: 是system.img

CACHE: 是cache.img

USRDATA: 是userdata.img 這裡後續補充???????

mtk手機啟動

mtk手機啟動的總體流程如圖3: 

mtk手機線刷

BootROM啟動[3]: 

BootROM是固化在晶片中的(應該是一個NOR Flash晶片), 其代碼是無法通過刷機寫進去的,應該是出廠的時候就寫好的,這一塊的代碼,也沒有在mtk的源碼目錄中出現。

裝置上電後,最先運作的就是BootROM的代碼(圖3,步驟1)。

BootROM初始化軟體堆棧(software stack),通信端口和可引導儲存設備(如NAND/EMMC)(圖3,步驟2)。

BootROM從存儲器中(上面初始化的NAND/EMMC中)加載preloader到内部SRAM/ISRAM(高速緩存)中,此時DRAM(記憶體)還未初始化(在我這裡preloader.bin大小114KB), 就是刷機圖中的第一行”PRELOADER”哪一行。(圖3,步驟3)

BOOTROM跳轉到preloader入口處執行。(圖3,步驟4)

preloader: 

preloader初始化DRAM和加載U-Boot(lk)到DRAM中。(圖3,步驟5)

preloader跳轉到U-Boot執行。(圖3,步驟6)

U-Boot: 

U-Boot從NADA/EMMC中加載kernel(Boot image,包括zImage和ramdisk)。(圖3,步驟7,8)

U-Boot跳轉到zImage的入口執行,這裡就可以算是linux kernel正式的入口了(此時還沒執行decompress_kernel)。(圖3,步驟9)

參考資料

[1].http://blog.csdn.net/loongembedded/article/details/38143289 

[2].http://blog.csdn.net/mcgrady_tracy/article/details/39340209 

[3].http://blog.csdn.net/loongembedded/article/details/38143289 

[4].http://yangguangwei1987.lofter.com/ 

[5].http://bbs.pediy.com/showthread.php?p=1390180 

[6].http://www.cnblogs.com/chyl411/p/3573047.html 

[7].http://blog.csdn.net/loongembedded/article/details/42808055

原文:https://blog.csdn.net/lidan113lidan/article/details/50127325