Boot Mode
I.MX6ULL使用BOOT_MODE[1:0]兩個(gè)寄存器來確定通電或者復(fù)位時(shí)的啟動(dòng)方式,下面這個(gè)表格列舉了具體的四種啟動(dòng)方式:

Boot From Fuses: 從熔絲引導(dǎo)啟動(dòng),這個(gè)啟動(dòng)與Internal Boot模式很像,但這種方式對(duì)于GPIO配置的啟動(dòng)參數(shù)無效,需要使用eFuses專用的配置進(jìn)行引導(dǎo)。它的配置只能修改一次,后面就不能再修改了,所以這種方式基本不用。
Serial Downloader: 通過USB或者UART下載一個(gè)鏡像引導(dǎo)程序到內(nèi)部的RAM中啟動(dòng)。
Internal Boot: 從內(nèi)部boot code啟動(dòng)。boot code是固定在SOC上面的一段代碼,boot code還會(huì)對(duì)硬件進(jìn)行初始化(如果初始化系統(tǒng)時(shí)鐘頻率)。根據(jù)BOOT_CFG的配置選擇從啟動(dòng)設(shè)備進(jìn)行啟動(dòng),跳轉(zhuǎn)到指定的鏡像文件地址開始執(zhí)行。如果在啟動(dòng)過程中遇到了錯(cuò)誤,則會(huì)從Serial Downloader進(jìn)行啟動(dòng)。
開發(fā)板開關(guān)電路圖分析
下面這張圖展示了開發(fā)板上面連接的具體引腳
以BOOT_MODE0為例,管腳芯片內(nèi)部接了一個(gè)100K的下拉電阻,默認(rèn)狀態(tài)是低電平(值0),當(dāng)把開關(guān)撥到ON后電源接通,引腳通過一個(gè)10K的電阻接到了一個(gè)3.3V的電源,通過計(jì)算可得到引腳上分到了3V的電壓為高電平,則引用值是1。
Internal Boot 配置
I.MX6ULL提供BOOT_MODE[1:0]與其它的24根LCD引腳共通組成了復(fù)雜的啟動(dòng)配置選項(xiàng),但是在使用時(shí)能用到的只有其中少部分,其它大部分都是默認(rèn)下拉接地(即值是0)不需要額外配置,如下圖:
其中BT_CFG4全部下拉接地了,這一組就忽略它。下面這張圖給出了BT_CFG1與BT_CFG2的配置與其功能:
BT_CFG2[4:3]: I.MX6ULL支持兩個(gè)SD/eMMC,00是SD1/eMMC1,01是SD2/eMMC2。10與11是保留未使用,可見實(shí)際起作用的是BT_CFG2[3]這個(gè)引用的值決定了從哪一張SD卡啟動(dòng)。BT_CFG2[3]對(duì)應(yīng)了I.MX6ULL手冊(cè)中的LCD_DATA11引用。I.MX6ULL開發(fā)板上面0用于外接SDK卡,1用于板載的eMMC。
BOOT_CFG1[3]: 當(dāng)從 SD/EMMC 啟動(dòng)的時(shí)候設(shè)置啟動(dòng)速度,當(dāng)從 NAND 啟動(dòng)的話設(shè)置 NAND 數(shù)量。
BOOT_CFG1[7:4]的配置如下圖:
圖中某些位是用x來表示的,即這個(gè)位不管是0還是1都是同等的啟動(dòng)效果。
更完整的詳解表格如下圖:
實(shí)例啟動(dòng)配置表:
| 啟動(dòng)方式 | BOOT_MODE0 | BOOT_MODE1 | BOOT_CFG2[3] | BOOT_CFG1[3] | BOOT_CFG1[7:4] |
|---|---|---|---|---|---|
| USB | 0 | 1 | 0 | 0 | 0000 |
| SD | 1 | 0 | 0 | 0 | 010x |
| eMMC | 1 | 0 | 1 | 0 | 011x |
| NAND | 1 | 0 | 0 | 0 | 100x |
通過以上的配置可將指定具體的啟動(dòng)設(shè)備,如果了啟動(dòng)設(shè)備之后,boot code會(huì)從指定設(shè)備中讀取鏡像文件來執(zhí)行。
鏡像文件分析
I.MX6ULL使用的是小端模式,手冊(cè)中使用大端模式的地方會(huì)特意說明。
通過對(duì)LED驅(qū)動(dòng)實(shí)現(xiàn)最終燒寫的load.mix文件得到如下圖表:
IVT(Image Vector Table)
上面這個(gè)表格詳細(xì)的描述了IVT+BOOT DATA+DCD在不同啟動(dòng)設(shè)備中的固定位置(相對(duì)設(shè)備起始地址的偏移量)以及從起始地址開始可用的初始化加載范圍,SD/eMMC啟動(dòng)模式偏移量為1KB,整個(gè)初始化加載范圍是4KB,則IVT+BOOT DATA+DCD可使用的范圍是3KB。

header: 描述了整個(gè)IVT
| Tag | Length | Version |
|---|---|---|
| 0xD1 | 0x0020(32) | 0x40 |
entry: 0x87800000,bin文件第一條指令地址,這個(gè)地址是在DDR中的地址。boot data: 0x877FF420,相對(duì)于IVT的起始地址: 0x877FF400偏移了32個(gè)字節(jié)。dcd: 0x877FF42C,即dcd的數(shù)據(jù)在DDR中的地址。entry的地址是0x87800000,那可以計(jì)算(減去3KB: 0xC00)得到IVT的起始地址是: 0x877FF400。dcd的起始地址相對(duì)于IVT起始地址偏移了44個(gè)字節(jié)(ivt+boot data結(jié)構(gòu),即: 0x2C),IVT的地址加上0x2C得到dcd的地址是: 0x877FF42C。
BOOT DATA
start: 描述了整個(gè)load.mix(燒寫到SD卡中的文件)的起始地址(在DDR中),包括了偏移的1KB,entry地址(鏈接起始地址)為:0x87800000 - 0x1000(4KB) = 0x877FF000。length: 描述了整個(gè)load.mix的大小,在燒寫的時(shí)候?qū)懭氲氖?x00200000,即2MB大小,整個(gè)鏡像文件的大小不能超過2MB。plugin: 0x00000000,沒有插件設(shè)置成0
DCD(Device Configuration Data)
DCD數(shù)據(jù)的作用則是在boot code啟動(dòng)加載的時(shí)候?qū)θO(shè)備進(jìn)行配置以及檢查,通過配置寄存器的寫入數(shù)據(jù)可快速高效的實(shí)現(xiàn)寄存器或者DDR的初始化。
header: 頭部結(jié)構(gòu)描述了整個(gè)DCD的長(zhǎng)度
| Tag | Length | Version |
|---|---|---|
| 0xD2 | 0x01E8(488) | 0x40 |
Write Data Command: 對(duì)指定寄存器進(jìn)行數(shù)據(jù)寫入操作 每一個(gè)Command的都有一個(gè)頭部,描述了這個(gè)Command需要執(zhí)行的指令長(zhǎng)度,Parameter的第0、1、2三位描述了指定目標(biāo)的長(zhǎng)度,0x04(100)表示指令目標(biāo)(指令對(duì)應(yīng)的Value)的長(zhǎng)度是4字節(jié)。Length描述了整個(gè)Command有484個(gè)字節(jié)的指令數(shù)量,包含了頭信息,那實(shí)際操作的指令是: (484 - 4) / 8 = 60,即當(dāng)前Command有60條寫寄存器數(shù)據(jù)的操作指令。
| Tag | Length | Parameter |
|---|---|---|
| 0xCC | 0x01E4(484) | 0x04 |
除了Write Data Command還有Check data command、NOP command以及Unlock command指令塊。
boot code根據(jù)啟動(dòng)設(shè)備的不同從固定的地址開始加載鏡像文件之后并對(duì)鏡像文件進(jìn)行解析,通過IVT中的地址將數(shù)據(jù)拷貝到DDR中指定的地址,讀取DCD初始化硬件(比如DDR)之后,開始執(zhí)行bin文件0x87800000的第一條指令。這樣就實(shí)現(xiàn)了從SD/eMMC/NAND等設(shè)備的啟動(dòng)了。
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
130016 -
啟動(dòng)
+關(guān)注
關(guān)注
0文章
27瀏覽量
14280 -
復(fù)位
+關(guān)注
關(guān)注
0文章
179瀏覽量
25051
發(fā)布評(píng)論請(qǐng)先 登錄
u-boot啟動(dòng)流程分析
U-BOOT的啟動(dòng)流程分享
基于S3C44B0的U-Boot啟動(dòng)分析和移植實(shí)現(xiàn)
U-Boot的啟動(dòng)及移植分析
Porting U-Boot to the Control
適于OMAP的多級(jí)啟動(dòng)Boot Loader
STM32F09x不使用BOOT腳實(shí)現(xiàn)System Bootlo
Linux0.11-引導(dǎo)啟動(dòng)程序(boot)
HAB boot的啟動(dòng)流程與實(shí)現(xiàn)步驟
聊一聊汽車控制器的啟動(dòng)——BOOT
Spring Boot啟動(dòng) Eureka流程
Spring Boot的啟動(dòng)原理
安全啟動(dòng)Secure Boot流程
System Boot啟動(dòng)的分析
評(píng)論