迅爲i.MX6ULL開發板啓動方式和鏡像文件格式

i.MX6ULL 啓動方式 啓動方式
I.MX6ULL 支持多種啓動方式,可以從 EMMC、SD 卡、NAND FLASH、USB、QSPI 等設備啓動。通過查看《IMX6ULL 參考手冊.pdf》手冊的第 8 章 System Boot,可我們可以瞭解到 i.MX6ULL 在上電以後,芯片 ROM裏面固化的程序會根據 BOOT_MODE[1:0]寄存器的值來選擇啓動方式。
BOOT_MODE[1:0]寄存器的值有兩種方式可以修改:一種是採用 eFuses(熔絲)的方式;另一種是是通過設置 BOOT_MODE[1:0]對應的 GPIO 的狀態。我們在平常使用的時候基本都是採用設置 BOOT_MODE[1:0]對應的 GPIO 狀態來選擇啓動方式的。
BOOT_MODE[1:0]對應的 GPIO 引腳是 BOOT_MODE1 和 BOOT_MODE0,如下圖所示:
BOOT_MODE1 和 BOOT_MODE0 這兩個引腳在芯片內部默認有 100K 的下拉,所以這兩個引腳在懸空狀態下默認是低電平(0)。我們把這兩個引腳引到了底板上,並連接到了撥碼開關上,撥碼開關對應的另一端通過 10K 電阻接到了 3.3V 電源上,這樣我們可以通過撥碼開關來設置這兩個 IO 的狀態了(高電平或低電平)。如下圖所示:
從上面的截圖我們,可以看到如果我們要設置 BOOT1 和 BOOT0 爲高電平我們需要將對應的撥碼開關設置到“ON”位置,這樣就通過 10K 電阻上拉到 3.3V,芯片內部有 100K 的下拉,所以此時這兩個 IO 的電平是:100/(10+100)*3.3V=3V,屬於高電平。
從參考手冊我們看到 BOOT_MODE[1:0]兩個 IO 可以設置四種狀態,對應着四種啓動方式,如下圖所示:
從上圖可以看到 BOOT_MODE[1:0]:設置爲 00 的時候從 Fuses 啓動,設置爲 01 的時候串行下載,設置爲 10 的時候內部 Boot 模式,設置爲 11 作爲保留使用。我們用到的是“串行下載”和“內部 Boot”模式這兩種。
首先我們來看下“串行下載”,它是指可以通過 USB 接口(板子的 OTG1 接口)將代碼下載到板子上然後運行。通過此方式我們可以實現開發板鏡像的燒寫(我們將在後面章節介紹具體的燒寫方法)。
然後我們看下“內部 Boot 模式”,它是指在此種模式下,芯片會執行內部 ROM 裏面固化的 boot 程序。這段程序會進行硬件的初始化,然後從 Boot 設備(EMMC、SD 卡、NAND FLASH)中讀取出鏡像到內存中。如果在“內部 Boot 模式”運行過程中發生錯誤,則會進入“串行下載模式”。
當 BOOT_MODE 設置爲“內部 Boot 模式”後,i.MX6ULL 可以從 SPI,EIM,NOR,SD,MMC,QSPI 等設備啓動,同時也可以配置相應的參數(例如 SD 的總線寬度,速度等等)。啓動設備和對應的參數我們可以使用 eFUSEs 的方式設置,也可以通過 GPIO 來配置(我們主要使用 GPIO 的方式)。下面我們來看一下如何通過 GPIO 設置啓動設備。
從參考手冊我們可以看到啓動設備主要通過三組 IO 來設置,他們分別是 BOOT_CFG1[7:0],
BOOT_CFG2[7:0],BOOT_CFG4[7:0]這三組 IO。如下圖所示:
從上圖我們可以看到這三組決定啓動設備的 IO 正好用到的 RGB 的 24 根數據 IO,在 i.MX6ULL 芯片剛開始上電的時候這 24 個 IO 先作爲“選擇啓動設備”的功能來使用,在 ROM 中的固化程序把啓動鏡像從啓動設備加載到內存,並開始從啓動鏡像(Uboot)開始運行的時候,這 24 個 IO 就可以當做 RGB 來使用了。
現在我們來總結一下,i.MX6ULL 啓動流程:首先根據 BOOT_MODE 的兩個 IO(BOOT_MODE1,BOOT_MODE0)先確定啓動方式,如果是串行下載模式,就會進入 USB 啓動模式。如果是“內部 Boot”啓動方式,然後就根據 BOOT_CFG1,BOOT_CFG2,BOOT_CFG4 這三組 IO 的配置來決定從哪種設備啓動(讀取啓動鏡像到內存,並開始啓動)。
接下來我們看下 BOOT_CFG1,BOOT_CFG2,BOOT_CFG4 這三組 IO 是怎麼配置啓動方式的,在我們的底板原理圖上有如下圖表:
上圖中最左側一列是支持的啓動設備,後面的每一列分別對應 BOOT_CFG 的 IO,我們可以看到決定啓動方式的是由 BOOT_CFG1 和 BOOT_CFG2 這兩組 IO 決定。打擊愛也許覺得這麼多 IO 需要配置,操作起來太麻煩了,實際上這些 IO 中大部分都是默認下拉的,需要配置的只有 6 個,從我們的原理圖可以看到(因爲我們用了一個 8 位的撥碼開關,其中有兩位是 BOOT_MOD 的),如下圖所示:
從上面的原理圖我們可以看到 8 位的撥碼開關一端上拉到 3.3V,另一端分別接到了 BOOT_MODE1,BOOT_MODE0,BOOTCFG2[3],BOOTCFG1[3],BOOTCFG1[4],BOOTCFG1[5],BOOTCFG1[6],BOOTCFG1[7]。所以我們設置啓動方式,只需要修改這 8 位(有兩位是 BOOT_MODE)IO 的狀態,我們看下負責啓動方式的這 6 個 IO 的含義,如下表所示:
根據上面的表格,我們設置開發板分別從串行下載,EMMC,SD 卡,NAND FLASH 啓動的時候,可以按照下面的表格設置,如下表:
下面是 i.MX6ULL 終結者底板上的撥碼開關書屋圖片,如下圖所示:
上圖中的 8 位撥碼,撥到上面“ON”位置就是 1,撥到下面就是“0”,8 位撥碼按照表 2.1 中的設置就可以按照對應的方式啓動
5.2 鏡像格式 鏡像格式
I.MX6ULL 的鏡像文件由下面幾部分組成:
1.Image vector table 簡稱 IVT。
2.Boot data,啓動數據。
3.Device configuration data,簡稱 DCD,主要是芯片的配置信息
4.用戶代碼生成的執行文件。比如 uboot 等。
所以 i.MX6ULL 的鏡像組成爲:IVT+Boot Data+DCD+用戶程序。
我們首先看下 IVT 部分:它裏面包含了程序的入口點,一個指向設備配置數據(DCD)的指針,以及其他在啓動過徵中程被 ROM 固化程序用到的指針。IVT 被存儲在啓動設備固定的位置(但是不同的啓動設備保存的位置可能會不一樣)。IVT 在鏡像文件的最前面,下圖是不同啓動設備,IVT 所在的位置偏移(相對於設備首地址):
這裏我們以 EMMC 爲例,從上表可以看出他的偏移是 1Kbyte(1024 字節),假設 EMMC 的每個扇區是 512字節,那麼我們的 IVT 要從第三個扇區開始保存。我們從《IMX6ULL 參考手冊.pdf》的 8.7.1.1 章節可以看到IVT 的數據格式如下圖所示:
其中的 Tag 是一個字節設置爲 0xD1,length 是 2 個字節,按照大端模式存儲,表示 IVT 的長度,對後一個Version 是版本信息,佔用一個字節,通常爲 0x40 或 0x41。由於《IMX6ULL 參考手冊.pdf》文檔只有 header的描述其它幾個字節的描述沒有涉及。我們可以打開編譯生成的Uboot鏡像uboot.imx查看下它裏面的內容。
接下來是 Boot data,它的數據格式如下所示:
從上圖可以看出 Boot data 一共是三個字段,每個字段 32 位。
然後是 DCD,DCD 緊跟在 Boot Data 後面,IVT 裏面也定義了 DCD 的位置。DCD 主要是初始化片內的寄存器。
DCD 的數據格式如下圖所示:
第一個是 Header 包頭信息,他是一個 32 位的包頭,具體定義如下所示:
Tag 佔一個字節,被設置爲 0xD2;Length 佔兩個字節,按照大端模式存儲,表示 DCD 的區域大小(包含包頭的長度),Version 佔一個字節,設置爲 0x40 或 0x41。
Header 後面的是 CMD 配置寄存器的字節,每個 CMD 的結構如下圖所示:
CMD 域的第一個是 Tag,佔一個字節,設置爲 0xcc;然後是 Lehgth 佔兩個字節,按照大端模式存儲,表示該 CMD 的長度(包含 CMD 的包頭),Parameter 佔一個字節,這個字的每個爲含義如下圖所示:
上圖中的 bytes 表示目標位置寬度,單位爲 byte,可以設置爲 1,2,4 字節。Flags 是命令控制標誌位。
然後 CMD 域後面的是 Address 和 Value/Mask。這兩個分別是要初始化的寄存器地址,設置的值。
緊接着 DCD 的就是我們的程序生成的.bin 文件。至此關於 i.MX6ULL 鏡像的組成格式我們就分析完成了。只是看上面的介紹大家也許感覺到會很枯燥,接下來我們結合 uboot.imx 鏡像,來一起看看這些數據的組織格式。我們使用 winhex 軟件(在光盤資料的“i.MX6UL 終結者光盤資料\02_開發所需軟件”目錄下面)打開光盤資料的“i.MX6UL 終結者光盤資料\06_開發板系統鏡像\uboot\emmc\u-boot.imx”文件,如下圖所示:
從上圖可以看出是按照小端方式顯示的,我們首先把前面 44 個字節按照 4 個字節一組的方式組合在一起就
是:0x402000D1,0x87800000,0x00000000,0x877FF42C,0x877FF420,0x877FF400,0x00000000,0x00000000。
這 8 組數據是 IVT 的數據,我們整理成下表:
然後是 Boot Data 域,我們把接下來的 12 個字節按照 4 個字節一組的方式組合在一起就是 0x877FF000,
0x0007E000,0x00000000。我們整理成下表所示:

 

從上面的表格我們可以看到 DCD 主要做了下面的配置:
1. 使能所有外設的時鐘。
2. 配置 DDR3 所用的所有 IO。
3. 配置 MMDC 控制器,初始化 DDR3。
關於 i.MX6ULL 的啓動流程和啓動鏡像文件格式我們就介紹到這裏。通過本章的講解我們可以掌握 i.MX6ULL的啓動設置了。我們編譯出的二進制.bin 文件,不能直接燒寫到 EMMC 中,需要在它前面加上 IVT,Boot Data和 DCD 這三部分的數據域。我們之中燒寫到 EMMC 的鏡像文件時:IVT+Boot Data+CDC+用戶的.bin 文件。
更多內容關注公衆號:迅爲電子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章