萬事開頭難!一文詳解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
鏈接:
1.1.1芯片手冊講解
IMX6ULL芯片內(nèi)部有一個(gè)boot ROM,上電后boot ROM上的程序就會運(yùn)行。它會根據(jù)BOOT_MODE[1:0]的值,以及eFUSE或GPIO的值決定后續(xù)的啟動流程。
注:eFUSE即熔絲,只能燒寫一次,一般正式發(fā)布產(chǎn)品時(shí)燒寫最終值;平時(shí)調(diào)試時(shí)通過GPIO來設(shè)置開發(fā)板的啟動方式。
boot ROM上的程序功能強(qiáng)大,可以從USB口或串口下載程序并把它燒寫到Flash等設(shè)備上,也可以從SD卡或EMMC、Flash等設(shè)備上讀出程序、運(yùn)行程序。
問題來了:
① boot ROM是從USB口下載、運(yùn)行程序,還是從SD卡等設(shè)備上讀出、運(yùn)行程序,這由誰決定?
由BOOT_MODE[1:0]的值來決定啟動方式,它們來自于2個(gè)引腳BOOT_MODE1、BOOT_MODE0。這2個(gè)引腳在上電時(shí)是輸入引腳,芯片啟動后采集這2個(gè)引腳的值,存入BOOT_MODE寄存器。以后這2個(gè)引腳就可以用于其他功能,不會影響到BOOT_MODE寄存器。
BOOT_MODE[1:0]的值確定了4種啟動模式,如下圖:
BOOT_MODE
在100ASK_IMX6ULL中,這2個(gè)引腳對應(yīng)的原理圖如下:
原理圖
00模式,?在我們的開發(fā)過程中很少用到,簡單介紹一下:在這種模式下,GPIO的值被忽略。Boot ROM會根據(jù)eFUSE的值來選擇啟動設(shè)備、設(shè)置啟動設(shè)備。但是,對于剛出廠的芯片eFUSE值可能是錯(cuò)亂的、不適合你的設(shè)備的,怎么辦?eFUSE中有一個(gè)值BT_FUSE_SEL,它的出廠值是0,表示eFUSE未被燒寫。
boot ROM程序發(fā)現(xiàn)BT_FUSE_SEL為0時(shí),它會通過USB或串口來下載程序;發(fā)現(xiàn)BT_FUSE_SEL為1時(shí),才會根據(jù)eFUSE的值選擇啟動設(shè)備,讀出、運(yùn)行該設(shè)備上的程序。
01模式,boot ROM程序通過USB或串口下載、運(yùn)行程序,這個(gè)模式可以用來燒寫EMMC等設(shè)備。我們的開發(fā)板出廠時(shí),就是通過這個(gè)模式下載、燒寫出廠程序的。
10模式,稱之為內(nèi)部模式,簡單地說就是從SD卡、EMMC等設(shè)備啟動程序。這就引入下面第2個(gè)問題。
② 如何選擇啟動設(shè)備?
00模式下是通過eFUSE的值選擇啟動設(shè)備,我們不關(guān)心。
10模式下既可以通過eFUSE的值也可以通過GPIO的值來選擇啟動設(shè)備,但是到底通過誰來決定?eFUSE中有一個(gè)值BT_FUSE_SEL,對,又是它。它的初始值為0,表示eFUSE未被燒寫。
在10模式下,當(dāng)BT_FUSE_SEL為0時(shí)就會通過GPIO來選擇啟動設(shè)備;當(dāng)BT_FUSE_SEL為1時(shí)就會通過eFUSE來選擇啟動設(shè)備。
在開發(fā)階段,我們使用GPIO來選擇設(shè)備,這就引入下面第3個(gè)問題。
③ 如何通過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è)備。
BOOT_CFG1設(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啟動時(shí),EMMC接在哪一個(gè)接口,eSDHC1還是eSDHC2?它的速度如何?比如選擇TF卡啟動時(shí),TF卡接在哪一個(gè)接口,eSDHC1還是eSDHC2?它的速度如何?
假設(shè)使用EMMC啟動,或是TF卡啟動,怎么設(shè)置eFUSE或GPIO?這些信息可以查詢IMX6ULL芯片手冊《Chapter 5: ?Fusemap》,摘錄如下。
Fusemap
當(dāng)BOOT_MODE設(shè)置為0b00時(shí),通過eFUSE選擇啟動設(shè)備,通過eFUSE獲得設(shè)備的參數(shù)。
當(dāng)BOOT_MODE設(shè)置為0b10時(shí),通過eFUSE或GPIO來選擇啟動設(shè)備,獲得設(shè)備的參數(shù);使用eFUSE還是GPIO由eFUSE中的BT_FUSE_SEL決定,它默認(rèn)是0,表示使用GPIO。
以BOOT_MODE為0b10為例,解析一下上圖。要設(shè)置為SD卡、TF卡啟動,有2個(gè)設(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個(gè)引腳設(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有兩個(gè)SD卡、TF卡接口,使用哪一個(gè)接口?請看下表:
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è)置這些引腳
BOOT_CFG
通過eFUSE或GPIO,還可以標(biāo)明啟動設(shè)備的更多參數(shù),具體細(xì)節(jié)可以參考芯片手冊《Chapter 5: ?Fusemap》,作為硬件開發(fā)人員需要去細(xì)細(xì)研究;作為軟件開發(fā)人員,實(shí)際上只需要看開發(fā)板手冊知道怎么設(shè)置啟動開關(guān)即可。
1.1.2 IMX6ULL啟動方式選擇
100ASK_IMX6ULL開發(fā)板上的紅色撥碼開關(guān)用來設(shè)置啟動方式、選擇啟動設(shè)備,支持這3種方式:EMMC啟動、SD卡啟動、USB燒寫。
板子背后畫有一個(gè)表格,表示這3種方式如何設(shè)置。
表格如下:
表格
拔碼開關(guān)中的SW3、SW4用來設(shè)置BOOT_MODE,ON表示0,OFF表示1。
所以當(dāng)SW3、SW4設(shè)置為ON、OFF時(shí),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時(shí)選擇SD/TF卡啟動,LCD1_DATA07~05為0b011時(shí)選擇EMMC啟動。
這兩種啟動設(shè)備對應(yīng)的LCD1_DATA07~06的值相同,都是0b01,這在核心板上已經(jīng)通過電阻設(shè)置好,我們只需要在撥碼開關(guān)上設(shè)置SW1(對應(yīng)LCD1_DATA05)就可以。
IMX6ULL上有2個(gè)EMMC Flash接口,也復(fù)用為2個(gè)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啟動時(shí),不能插上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é)
整篇讀下來,概念有點(diǎn)多,你可能會感覺有點(diǎn)抽象,其實(shí)現(xiàn)在不理解啟動方式原理沒關(guān)系,現(xiàn)在只要記住《3種啟動方式的設(shè)置示意圖》即可,清楚怎么撥碼對應(yīng)什么啟動方式,原理留到后期再研究也行。
精品推薦
文中提到的100ask_imx6ull,是用來學(xué)習(xí)嵌入式Linux的不錯(cuò)選擇,0利潤,外設(shè)豐富,一千多頁文檔,一百多講視頻,開源共享,如有興趣,可以手淘掃碼了解開發(fā)板的更多參數(shù):
推薦閱讀:?
【課程更新】更新8節(jié)輸入系統(tǒng)應(yīng)用編程?
韋東山《電子發(fā)燒友 x B站》直播公開課回放?
STM32MP157 A7開發(fā)手冊和M4 開發(fā)手冊齊發(fā)布
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!