Boot Mode
I.MX6ULL
使用BOOT_MODE[1:0]
兩個寄存器來確定通電或者復位時的啟動方式,下面這個表格列舉了具體的四種啟動方式:
Boot From Fuses
: 從熔絲引導啟動,這個啟動與Internal Boot
模式很像,但這種方式對于GPIO
配置的啟動參數無效,需要使用eFuses
專用的配置進行引導。它的配置只能修改一次,后面就不能再修改了,所以這種方式基本不用。
Serial Downloader
: 通過USB
或者UART
下載一個鏡像引導程序到內部的RAM中啟動。
Internal Boot
: 從內部boot code
啟動。boot code
是固定在SOC
上面的一段代碼,boot code
還會對硬件進行初始化(如果初始化系統時鐘頻率)。根據BOOT_CFG
的配置選擇從啟動設備進行啟動,跳轉到指定的鏡像文件地址開始執行。如果在啟動過程中遇到了錯誤,則會從Serial Downloader
進行啟動。
開發板開關電路圖分析
下面這張圖展示了開發板上面連接的具體引腳以BOOT_MODE0為例,管腳芯片內部接了一個100K的下拉電阻,默認狀態是低電平(值0),當把開關撥到ON后電源接通,引腳通過一個10K的電阻接到了一個3.3V的電源,通過計算可得到引腳上分到了3V的電壓為高電平,則引用值是1。
Internal Boot 配置
I.MX6ULL
提供BOOT_MODE[1:0]
與其它的24根LCD
引腳共通組成了復雜的啟動配置選項,但是在使用時能用到的只有其中少部分,其它大部分都是默認下拉接地(即值是0)不需要額外配置,如下圖:其中BT_CFG4全部下拉接地了,這一組就忽略它。下面這張圖給出了BT_CFG1
與BT_CFG2
的配置與其功能:
BT_CFG2[4:3]
: I.MX6ULL
支持兩個SD/eMMC,00是SD1/eMMC1,01是SD2/eMMC2。10與11是保留未使用,可見實際起作用的是BT_CFG2[3]
這個引用的值決定了從哪一張SD卡啟動。BT_CFG2[3]
對應了I.MX6ULL
手冊中的LCD_DATA11
引用。I.MX6ULL
開發板上面0用于外接SDK卡,1用于板載的eMMC。
BOOT_CFG1[3]
: 當從 SD/EMMC 啟動的時候設置啟動速度,當從 NAND 啟動的話設置 NAND 數量。
BOOT_CFG1[7:4]
的配置如下圖:圖中某些位是用x來表示的,即這個位不管是0還是1都是同等的啟動效果。
更完整的詳解表格如下圖:
實例啟動配置表:
啟動方式 | 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 |
通過以上的配置可將指定具體的啟動設備,如果了啟動設備之后,boot code
會從指定設備中讀取鏡像文件來執行。
鏡像文件分析
I.MX6ULL
使用的是小端模式,手冊中使用大端模式的地方會特意說明。
通過對LED驅動實現最終燒寫的load.mix文件得到如下圖表:
IVT(Image Vector Table)
上面這個表格詳細的描述了IVT
+BOOT DATA
+DCD
在不同啟動設備中的固定位置(相對設備起始地址的偏移量)以及從起始地址開始可用的初始化加載范圍,SD/eMMC
啟動模式偏移量為1KB,整個初始化加載范圍是4KB,則IVT
+BOOT DATA
+DCD
可使用的范圍是3KB。
header
: 描述了整個IVT
Tag | Length | Version |
---|---|---|
0xD1 | 0x0020(32) | 0x40 |
entry
: 0x87800000,bin文件第一條指令地址,這個地址是在DDR
中的地址。boot data
: 0x877FF420,相對于IVT
的起始地址: 0x877FF400偏移了32個字節。dcd
: 0x877FF42C,即dcd的數據在DDR
中的地址。entry
的地址是0x87800000,那可以計算(減去3KB: 0xC00)得到IVT
的起始地址是: 0x877FF400。dcd
的起始地址相對于IVT
起始地址偏移了44個字節(ivt+boot data結構,即: 0x2C),IVT
的地址加上0x2C得到dcd
的地址是: 0x877FF42C。
BOOT DATA
start
: 描述了整個load.mix(燒寫到SD卡中的文件)的起始地址(在DDR中),包括了偏移的1KB,entry
地址(鏈接起始地址)為:0x87800000 - 0x1000(4KB) = 0x877FF000。length
: 描述了整個load.mix的大小,在燒寫的時候寫入的是0x00200000,即2MB大小,整個鏡像文件的大小不能超過2MB。plugin
: 0x00000000,沒有插件設置成0
DCD(Device Configuration Data)
DCD
數據的作用則是在boot code
啟動加載的時候對三件設備進行配置以及檢查,通過配置寄存器的寫入數據可快速高效的實現寄存器或者DDR的初始化。
header
: 頭部結構描述了整個DCD
的長度
Tag | Length | Version |
---|---|---|
0xD2 | 0x01E8(488) | 0x40 |
Write Data Command
: 對指定寄存器進行數據寫入操作 每一個Command的都有一個頭部,描述了這個Command需要執行的指令長度,Parameter
的第0、1、2三位描述了指定目標的長度,0x04(100)表示指令目標(指令對應的Value)的長度是4字節。Length描述了整個Command有484個字節的指令數量,包含了頭信息,那實際操作的指令是: (484 - 4) / 8 = 60,即當前Command有60條寫寄存器數據的操作指令。
Tag | Length | Parameter |
---|---|---|
0xCC | 0x01E4(484) | 0x04 |
除了Write Data Command
還有Check data command
、NOP command
以及Unlock command
指令塊。
boot code
根據啟動設備的不同從固定的地址開始加載鏡像文件之后并對鏡像文件進行解析,通過IVT
中的地址將數據拷貝到DDR
中指定的地址,讀取DCD
初始化硬件(比如DDR)之后,開始執行bin文件0x87800000的第一條指令。這樣就實現了從SD/eMMC/NAND
等設備的啟動了。
-
寄存器
+關注
關注
31文章
5317瀏覽量
120006 -
啟動
+關注
關注
0文章
27瀏覽量
13891 -
復位
+關注
關注
0文章
171瀏覽量
24198
發布評論請先 登錄
相關推薦
評論