1. 程式人生 > >I.MX6開發板 啟動流程分享 -迅為嵌入式

I.MX6開發板 啟動流程分享 -迅為嵌入式

本篇文章是Nxp官方參考手冊IMX6DQRM中Chapter 8System Boot的翻譯,翻譯中如有理解偏差和用詞不當之處,請網友多多指教。

8.1 總攬 
boot處理過程開始於處理器的上電覆位,這時,硬體復位邏輯強制ARM核心執行晶片內建的ROM Boot程式。Boot ROM 程式碼使用內建的暫存器BOOT_MODE[1:0]狀態–後者取決於eFuses和(或)GPIO設定狀態,來確定啟動流(boot flow)裝置行為。 
Boot的主要特性包含: 
•支援從各種啟動裝置上啟動 
•序列下載支援 
• 裝置配置資料(DCD)和外掛 
• 數字簽名和基於HAB的加密術 
• 從低功耗模式喚醒 
• 喚醒第二個核心(core)

boot ROM支援下面的啟動裝置: 
• NOR Flash 
• NAND Flash 
• OneNAND Flash 
• SD/MMC 
• Serial ATA (SATA) HDD (only i.MX 6Dual/6Quad) 
• Serial (I2C/SPI) NOR Flash and EEPROM

正常操作模式下,Boot ROM 使用BOOT_MODE的狀態和eFUSEs來確定啟動裝置。當為了開發目的時,決定啟動裝置的eFUSEs常常被GPIO 引腳輸入所過載。 
含有新Image的啟動裝置,如SD/MMC Flash。典型的,這個配給程式(前者)被下載到內部RAM中,來允許對啟動裝置的程式設計。這個ROM序列下載器使用non-stream模式序列高速USB 。 
Boot ROM 允許從低功耗和第二個Cortex-A9核心中喚醒。在啟動時,ROM檢查ARM核心 ID和電源Gating狀態暫存器,在低功耗模式喚起時,主核心(ID=0)會跳過從啟動裝置載入Image,跳到儲存到PERSISTENT_ENTRY0暫存器中的地址。在所有的電源模式下喚起時 ,次核心(ID!=0)跳到PERSISTENT_ENTRY<X>中的地址(這裡0<X<4)。 
裝置配置資料(DCD)特性,允許Boot ROM程式碼從駐留在啟動裝置上的外部程式設計核心映象(Image)中獲取SOC配置資料,例如,DCD可以用來對DDR控制器程式設計,來優化啟動執行的設定。DCD只能限定為記憶體區域和外圍地址空間,且這些地址區域是為了啟動(boot)所必須考慮的顧及 。

8.2 啟動模式 
在復位時,晶片會檢查ARM核ID和電源門控制狀態暫存器。正常操作模式下,Boot ROM 使用BOOT_MODE的狀態和eFUSEs來確定啟動裝置。當為了開發目的時,eFUSEs用作確定啟動裝置,或許使用GPIO輸入過載值。 
當被從低功耗啟動模式喚醒時,核心會跳過時鐘設定,Boot ROM 會檢查PERSISTENT_ENTRY0所指向的地址空間的有效性。如果該地址空間有效,就會開始執行PERSISTENT_ENTRY0暫存器中的進入點(Entry Pointer),如果無效,則核心執行系統復位。第二個核心(ID!=0)會重複上面同樣的動作,即檢查PERSISTENT_ENTRY 的指向地址空間的有效性,所不同的是,當該地址空間無效時,會發出喚醒錯誤中斷,並執行等待中斷指令。其他核心的中斷服務程式必須重新配置系統,且復位第二個啟動失敗的核心。 
注意 
使能第二個核心的程式碼不是ROM的一部分,他必須是低階軟體的一部分。

8.2.1 啟動模式引腳配置 
裝置有四種啟動模式(其中一種為FSL的保留模式)。啟動模式的選擇基於儲存在暫存器BOOT_MODE中的二進位制值。BOOT_MODE是在POR_B的上升沿對BOOT_MODE0和BOOT_MODE1輸入 引腳的取樣值,一旦此輸入被取樣,它們其後的狀態就不再影響BOOT_MODE內部暫存器的內容。內部BOOT_MODE暫存器的狀態或許讀自SOC的啟動模式暫存器(SRC_SBMR2)的BMOD[1:0] 域。可用的啟動模式有:從Fuses啟動,通過USB的序列啟動,內部啟動。 
見下面的配置表:

BOOT_MODE[1:0] Boot Type
00 Boot From Fuses
01 Serial Downloader
10 Internal Boot
11 Reserved

8.2.3 Fuses啟動模式 (BOOT_MODE[1:0] = 00b) 
當BOOT_MODE[1:0]暫存器為00b是,選擇為從Fuses模式下啟動。該模式和內部啟動模式很相似,只是有一點不同:在此模式下,GPIO啟動過載引腳會被忽略。啟動ROM程式碼只使用啟動eFuse配置,此模式也支援使用HAB的安全啟動。如果配置為從Fuses啟動,啟動流(boot flow)會受BT_FUSE_SEL eFUSE的值控制。如果BT_FUSE_SEL = 0,表明這個啟動裝置(如Flash,SD/MMC)還沒有被程式設計,啟動流(boot flow)會直接跳到序列下載器。如果BT_FUSE_SEL = 1,就允許正常的啟動流(boot flow),ROM會嘗試從選擇的啟動裝置來啟動。當板子第一次被使用,預設的eFuses或許在硬體平臺中沒有被正確的配置,在此情況下,Boot ROM程式碼會嘗試從不存在的裝置上啟動,這或許會在一些Pads上產生電器/邏輯損壞。使用從Fuses模式啟動能解決這個問題。 
(這裡強調第一次使用我們的新板子時,最好將跳線跳到Fuses模式,因為之前該CPU的BT_FUSE_SEL沒有被燒錄,所以這時BT_FUSE_SEL = 0,強制從序列下載器執行)

設定BT_FUSE_SEL=0將強制ROM 程式碼直接跳到序列下載器(serial downloader)。這允許一個載入器(bootloader)被下載,然後配給啟動裝置程式設計的Image,燒寫BT_FUSE_SEL,以及配置其他啟動eFUSEs。當復位後,Boot ROM程式碼判斷BT_FUSE_SEL已被燒寫(BT_FUSE_SEL=1),ROM程式碼就會依據新的eFuses配置執行內部啟動(即以下過程和內部啟動模式BT_FUSE_SEL=1 時相同)。這允許使用者配置可生產裝置的OOT_MODE[1:0]=00b,然後通過同樣的裝置燒寫fuses(通過強制進入序列下載器),無須改變BOOT_MODE[1:0]的值和BOOT_MODE 引腳的上下拉。 
(這段原英文描述也比較模糊,翻譯的比較生硬,理解的應該不是很到位,應該有些偏差。) 
注:我們設想這樣一種情況,CPU模組和含有BOOT_MODE[1:0]跳線的模組相分離。

8.2.4 序列下載器 
此序列下載器提供了一個通過USB序列連線進行程式設計Image的方法。在此模式下,如果在eFues中的WDOG_ENABLE位為1,ROM程式設計WDOG1為90秒溢位,且不停地輪詢(poll)USB連線。如果找不到活動的USB OTG1且看門狗到期(溢位),ARM核會復位。 
注: 
被下載的image(如uboot)必須繼續服務看門狗始終,以避免復位的發生。

8.2.5 內部啟動模式 (BOOT_MODE[1:0] = 0b10) 
BOOT_MODE[1:0]暫存器的值為0b10時,選擇為內部啟動模式。在此模式下,處理器繼續執行內部的啟動程式碼。啟動程式碼執行硬體初始化,從選擇的啟動裝置中載入程式映象,使用HAB執行映象有效性檢查,然後跳到程式映象地址處。如果在內部啟動中出項任何錯誤,啟動程式碼就會跳到序列下載器。在三種模式下,安全啟動都可使用HAB。當使用內部啟動模式時,啟動流(boot flow)被eFuse配置和GPIO過載fuse的兩者結合所控制。啟動選擇FUSE(BT_FUSE_SEL)決定ROM使用GPIO或eFuses來獲取各種配置引數(見下面的注)。 
如果BT_FUSE_SEL = 1,所有的啟動選項被eFuses配置所控制 
如果BT_FUSE_SEL = 0,特定的啟動配置引數或許使用GPIO Pins,而不是eFuses。fuses會被表 8-2的GPIO所列值來覆蓋。表8-3提供了GPIO 引腳的細節。

注: 
注意不是所有的fuses配置都可被GPIO所能過載。比如BT_FUSE_SEL只是eFuses的值,另外重要的值還包括WDOG_ENABLE、DIR_BT_DIS 、SEC_CONFIG[1](見表等5-4),均不能被GPIO過載。GPIO過載的只是BOOT_CFG1-4相關的啟動配置。使用GPIO過載的模式被用於開發,因為這些GPIO pads在部署產品 時會被留作他用。fsl建議在部署產品時啟動配置由是eFuses的配置來確定,開發產品時,保留此GPIO過載模式,僅僅用於測試。

8.2.6 啟動安全設定 
內部啟動使用三種安全配置的其中之一: 
1.封閉模式:此等級用於交付產品。所有的HAB功能都會被執行,安全硬體會被初始化(安全控制,SNVS,進入安全狀態),DCD如果存在會被處理,程式映象執行時會被HAB優先驗證,所有檢測到的錯誤會被計入日誌,啟動流會被中斷,進入序列下載器。 
在此等級下,除非目標執行映象已被認證,程式的執行是不能離開內部ROM。 
2.開放模式:此等級用於非安全產品,或安全產品的開發階段。所有的HAB功能都會像封閉模式一樣被執行,安全硬體會被初始化(除非SNVS不在非安全狀態),DCD如果存在會被處理,程式映象執行時會被HAB優先驗證,所有檢測到的錯誤會被計入日誌,但啟動流會不受影響,即使有錯誤發生它也會繼續執行(which continues as if the errors did not occur 繼續執行就像沒有錯誤發生一樣),這種配置對安全產品的開發是有用的,因為程式映象會一直執行即使認證資料錯誤或不正確,錯誤日誌會被檢查以便檢查認證失敗原因。 
注意:如果DIR_BT_DIS eFuse沒有被燒寫,認證就會被旁路,這時系統是不安全的。


shipping secure products. 這裡shipping的含義是“交付的,離岸的”,譯為“交付的安全產品“。


總結: 
內部啟動模式一般只用於產品的開發階段,因為此模式要佔用大量的GPIO資源,而這些GPIO是EIM中關鍵的資料和地址控制線。在Fuses啟動模式下,一旦這些eFuses被燒錄,均不能被重擦修改,顯而易見的是後者不利於開發中的摸索嘗試(一旦出現錯誤,我們甚至要考慮更換CPU)。在開發階段,我們使用跳線來配置efuses,然後我們除錯測試,直至其穩定後,在最終的產品中,使用和跳線配置相對的eFuses值來燒錄fuse,最終可將這些GPIO上的跳線去除,而用於一般用途。 
如果BT_FUSE_SEL = 0: 
當啟動模式配置為內部啟動時,fuses的啟動配置會被GPIO的過載所決定;當為Fuses模式時,強制進入序列下載器。 
如果BT_FUSE_SEL = 1: 
啟動模式無論為內部啟動和Fuses模式,fuses的啟動配置均會由eFuses配置來決定,只是ROM code繼續執行,如果eFuses決定的啟動裝置(或出現其他錯誤,如安全認證錯誤)不存在或出現錯誤時,也會進入序列下載模式。 
efuses是內部OTP Flash的Fuses配置值。注意efuses和fuses的含義區別。 

I.MX6啟動總流程圖: