萬事開頭難 - 介紹IMX6ULL啟動方式

不同開發(fā)板,啟動方式不一樣,今天我們來介紹imx6ull開發(fā)板的啟動方式,這非常重要。若不了解清楚啟動方式,后面的所有開發(fā)工作便無從談起。
本文摘自100ask_imx6ull 開發(fā)板 配套學(xué)習(xí)手冊-《嵌入式Linux應(yīng)用開發(fā)完全手冊_韋東山全系列視頻文檔全集V2.5》.pdf
1.1 IMX6ULL 啟動方式
參考資料:
開發(fā)板資料網(wǎng)盤?
路徑:
06_Datasheet(數(shù)據(jù)手冊)
-> Core_board->CPU->IMX6ULLRM.pdf”
中《Chapter 8: System Boot》。
網(wǎng)盤地址:
100ASK_IMX6ULL
鏈接:
https://eyun.baidu.com/s/3smDzFAH密碼:LDCn
1.1.1芯片手冊講解
IMX6ULL芯片內(nèi)部有一個boot ROM,上電后boot ROM上的程序就會運行。它會根據(jù)BOOT_MODE[1:0]的值,以及eFUSE或GPIO的值決定后續(xù)的啟動流程。
注:eFUSE即熔絲,只能燒寫一次,一般正式發(fā)布產(chǎn)品時燒寫最終值;平時調(diào)試時通過GPIO來設(shè)置開發(fā)板的啟動方式。
boot ROM上的程序功能強(qiáng)大,可以從USB口或串口下載程序并把它燒寫到Flash等設(shè)備上,也可以從SD卡或EMMC、Flash等設(shè)備上讀出程序、運行程序。
問題來了:
① boot ROM是從USB口下載、運行程序,還是從SD卡等設(shè)備上讀出、運行程序,這由誰決定?
由BOOT_MODE[1:0]的值來決定啟動方式,它們來自于2個引腳BOOT_MODE1、BOOT_MODE0。這2個引腳在上電時是輸入引腳,芯片啟動后采集這2個引腳的值,存入BOOT_MODE寄存器。以后這2個引腳就可以用于其他功能,不會影響到BOOT_MODE寄存器。
BOOT_MODE[1:0]的值確定了4種啟動模式,如下圖:

00模式,
在我們的開發(fā)過程中很少用到,簡單介紹一下:在這種模式下,GPIO的值被忽略。Boot ROM會根據(jù)eFUSE的值來選擇啟動設(shè)備、設(shè)置啟動設(shè)備。但是,對于剛出廠的芯片eFUSE值可能是錯亂的、不適合你的設(shè)備的,怎么辦?eFUSE中有一個值BT_FUSE_SEL,它的出廠值是0,表示eFUSE未被燒寫。
boot ROM程序發(fā)現(xiàn)BT_FUSE_SEL為0時,它會通過USB或串口來下載程序;發(fā)現(xiàn)BT_FUSE_SEL為1時,才會根據(jù)eFUSE的值選擇啟動設(shè)備,讀出、運行該設(shè)備上的程序。
01模式,
boot ROM程序通過USB或串口下載、運行程序,這個模式可以用來燒寫EMMC等設(shè)備。我們的開發(fā)板出廠時,就是通過這個模式下載、燒寫出廠程序的。
10模式,
稱之為內(nèi)部模式,簡單地說就是從SD卡、EMMC等設(shè)備啟動程序。這就引入下面第2個問題。
② 如何選擇啟動設(shè)備?
00模式下是通過eFUSE的值選擇啟動設(shè)備,我們不關(guān)心。
10模式下既可以通過eFUSE的值也可以通過GPIO的值來選擇啟動設(shè)備,但是到底通過誰來決定?eFUSE中有一個值BT_FUSE_SEL,對,又是它。它的初始值為0,表示eFUSE未被燒寫。
在10模式下,當(dāng)BT_FUSE_SEL為0時就會通過GPIO來選擇啟動設(shè)備;當(dāng)BT_FUSE_SEL為1時就會通過eFUSE來選擇啟動設(shè)備。
在開發(fā)階段,我們使用GPIO來選擇設(shè)備,這就引入下面第3個問題。
③ 如何通過eFUSE或GPIO選擇、設(shè)置啟動設(shè)備?
通過eFUSE或GPIO不僅能選擇啟動設(shè)備,還可以設(shè)置啟動設(shè)備。為什么還需要設(shè)置?比如Nand Flash參數(shù)各有不同,有些的頁大小是2048,有些是4096。這些參數(shù)不同,boot ROM程序讀Nand Flash的方法就不同,我們必須把這些參數(shù)告訴boot ROM:通過eFUSE或GPIO來標(biāo)明這些參數(shù)。
首先看看要設(shè)置哪些eFUSE或GPIO來選擇不同的啟動設(shè)備。

從上圖可知,既可以使用eFUSE也可以使用GPIO來選擇啟動設(shè)備,換句話說GPIO可以覆蓋eFUSE的值。
哪些GPIO覆蓋哪些eFUSE?
這可以查看IMX6ULL芯片手冊《Chapter 8: System Boot》里的《GPIO boot overrides》,我們把它摘出來放在1.1.3小節(jié)里。
選擇啟動設(shè)備后,還需要標(biāo)明一些參數(shù)。比如選擇EMMC啟動時,EMMC接在哪一個接口,eSDHC1還是eSDHC2?它的速度如何?比如選擇TF卡啟動時,TF卡接在哪一個接口,eSDHC1還是eSDHC2?它的速度如何?
假設(shè)使用EMMC啟動,或是TF卡啟動,怎么設(shè)置eFUSE或GPIO?這些信息可以查詢IMX6ULL芯片手冊《Chapter 5: ?Fusemap》,摘錄如下。

當(dāng)BOOT_MODE設(shè)置為0b00時,通過eFUSE選擇啟動設(shè)備,通過eFUSE獲得設(shè)備的參數(shù)。
當(dāng)BOOT_MODE設(shè)置為0b10時,通過eFUSE或GPIO來選擇啟動設(shè)備,獲得設(shè)備的參數(shù);使用eFUSE還是GPIO由eFUSE中的BT_FUSE_SEL決定,它默認(rèn)是0,表示使用GPIO。
以BOOT_MODE為0b10為例,解析一下上圖。要設(shè)置為SD卡、TF卡啟動,有2個設(shè)置方法:
a. 設(shè)置eFUSE的BOOT_CFG1[7:5]為0b010,
或 b. 查看《3.1.3 GPIO boot overrides》確定BOOT_CFG1[7:5]對應(yīng)的GPIO為LCD1_DATA07~05,把這3個引腳設(shè)置為0b010。
根據(jù)SD卡、TF卡的性能,可以設(shè)置eFUSE或GPIO來表示它能否提供更高的速度:
a. 設(shè)置eFUSE的BOOT_CFG1[4:0],
或 b. 查看《3.1.3 GPIO boot overrides》確定BOOT_CFG1[4:0]對應(yīng)的GPIO為LCD1_DATA04~00,設(shè)置這些引腳。
IMX6ULL有兩個SD卡、TF卡接口,使用哪一個接口?請看下表:
a. 設(shè)置eFUSE的BOOT_CFG2[4:3]可以確定使用eSDHC1或eSDHC2,
或 b. 查看《3.1.3 GPIO boot overrides》確定BOOT_CFG2[4:3]對應(yīng)的GPIO為LCD1_DATA12~11,設(shè)置這些引腳

通過eFUSE或GPIO,還可以標(biāo)明啟動設(shè)備的更多參數(shù),具體細(xì)節(jié)可以參考芯片手冊《Chapter 5: ?Fusemap》,作為硬件開發(fā)人員需要去細(xì)細(xì)研究;作為軟件開發(fā)人員,實際上只需要看開發(fā)板手冊知道怎么設(shè)置啟動開關(guān)即可。
1.1.2 IMX6ULL啟動方式選擇
100ASK_IMX6ULL開發(fā)板上的紅色撥碼開關(guān)用來設(shè)置啟動方式、選擇啟動設(shè)備,支持這3種方式:EMMC啟動、SD卡啟動、USB燒寫。
板子背后畫有一個表格,表示這3種方式如何設(shè)置。
表格如下:

拔碼開關(guān)中的SW3、SW4用來設(shè)置BOOT_MODE,ON表示0,OFF表示1。
所以當(dāng)SW3、SW4設(shè)置為ON、OFF時,BOOT_MODE為0b10,將會使用SD卡、TF卡、EMMC等設(shè)備啟動。
剛出廠的開發(fā)板中BT_FUSE_SEL默認(rèn)為0,表示使用GPIO來設(shè)置參數(shù)。即使用LCD1_DATA07~05來選擇啟動設(shè)備。
100ASK_IMX6ULL開發(fā)板只支持SD/TF卡、EMMC啟動,LCD1_DATA07~05為0b010時選擇SD/TF卡啟動,LCD1_DATA07~05為0b011時選擇EMMC啟動。
這兩種啟動設(shè)備對應(yīng)的LCD1_DATA07~06的值相同,都是0b01,這在核心板上已經(jīng)通過電阻設(shè)置好,我們只需要在撥碼開關(guān)上設(shè)置SW1(對應(yīng)LCD1_DATA05)就可以。
IMX6ULL上有2個EMMC Flash接口,也復(fù)用為2個SD/TF卡接口,通過LCD1_DATA12~11來選擇接口。
0b00對應(yīng)eSDHC1接口,0b01對應(yīng)eSDHC2接口。LCD1_DATA12的值在核心板上已經(jīng)通過電阻設(shè)置好。
LCD1_DATA11的值通過撥碼開關(guān)SW2來設(shè)置:ON表示0,對應(yīng)eSDHC1接口,100ASK_IMX6ULL的TF卡接口使用了eSDHC1接口;OFF表示1,對應(yīng)eSDHC2接口,100ASK_IMX6ULL的EMMC接口使用了eSDHC2接口。
這3種啟動方式的設(shè)置示意圖如下:

要注意的是,設(shè)置為USB啟動時,不能插上SD卡、TF卡。剛出廠的板子在EMMC上燒寫了系統(tǒng),你可以設(shè)置為EMMC啟動方式。
1.1.3 GPIO boot overrides
IMX6ULL中既可以通過eFUSE也可以通過GPIO來選擇、設(shè)置啟動設(shè)備,在手冊里大部分場合只列出了eFUSE,對應(yīng)的GPIO需要查表:IMX6ULL芯片手冊《Chapter 8: System Boot》里的《GPIO boot overrides》。
我們把它摘錄出來。

總結(jié)
整篇讀下來,概念有點多,你可能會感覺有點抽象,其實現(xiàn)在不理解啟動方式原理沒關(guān)系,現(xiàn)在只要記住《3種啟動方式的設(shè)置示意圖》即可,清楚怎么撥碼對應(yīng)什么啟動方式,原理留到后期再研究也行。
精品推薦
文中提到的100ask_imx6ull,是用來學(xué)習(xí)嵌入式Linux的不錯選擇,0利潤,外設(shè)豐富,一千多頁文檔,一百多講視頻,開源共享,如有興趣,可以手淘掃碼了解開發(fā)板的更多參數(shù)。