rbl(arm rom boot loader)在晶片出廠的時候就已經燒寫到rom裡了,這不需要大家關心,上電後,rbl會自動從emifa em_cs2 memory space (0x0200 0000). 執行指令,這個位址就是nand flash 或nor flash的片選起始位址。當你的系統設定為nand boot的時候,ubl(user boot loader)是必不可少的,否則rbl不能直接把uboot給boot起來,因為rbl隻支援14k nand flash 的boot程式,而uboot編譯出來後的bin檔案一般都大于80k,特别是版本越高,uboot的代碼越大,是以這時候就需要寫一個ubl。ubl 從nand flash 讀取uboot,然後把uboot copy 到ddr2(ram)的相關位址上,然後把uboot 給boot 起來。根據ti davin rbl的規定,不同型号的nand flash,ubl儲存的位址是不同的,512位元組page 的nand(即small page),儲存的位址是:0x00004000(16k,32頁);2048位元組page的nand (即large page)儲存的位址是:0x20000(128k,64頁)。
一、dm6446的啟動模式
系統加電或複位後,cpu都要從某個預定的位址上取得指令,執行bootloader程式。dm6446處理器arm端(arm-side)提供兩種啟動模式:
從異步的外部存儲器接口aemif(asynchronous external memory interface)/nor flash引導啟動
從arm内部rom(airom,arm inner rom)引導啟動
這兩者由boot selection(btsel[1:0])引腳的設定狀态決定。如下:
btsel[1:0]=01時,系統加電或複位後arm處理器從aemif或nor flash的零位址(0x02000000)執行引導啟動代碼,這些代碼是由使用者生成并燒寫的,即從外部存儲器啟動
btsel[1:0]≠01時,系統加電或複位後,arm處理器從airom的位址(0x00004000)執行rbl(rom boot loader),即從片内rom的rbl開始運作
而rbl程式根據btsel[1:0]狀态(btsel[0-3]管腳的電平)來區分不同引導啟動模式:
btsel[1:0]=00,nand flash引導啟動模式:發送控制資訊到ubl(user boot loader),并從flash中拷貝ubl到arm的内部ram(airam),并轉到ubl執行
btsel[1:0]=11,uart引導啟動模式:通過uart下載下傳序列槽ubl并發送控制資訊到使用者軟體
btsel[1:0]=10,保留未用
是以,dm6446在上電或複位後,存在四種啟動方式。如下圖。
dm6446引導啟動流程
二、airom啟動模式
airom啟動模式受兩個限制:1)、airam的空間隻有16kb;2)、nand flash不支援xip(execute-in-place,片内執行)技術。是以,airom啟動模式可以劃分為三個階段:
▲ stage1:加電或複位後,執行rbl。rbl是ti内嵌的程式,其内部實作不向使用者公開;但提供了一個程式設計接口,以便設計人員據此編寫ubl代碼。
▲ stage2:将ubl拷貝到airam中并執行。ubl被燒寫在nand flash的從block1開始的5個存儲塊上,是以ubl的尺寸小于airam的空間大小,即14k。
▲ stage3:u-boot。它被燒寫在nand flash中的ubl後,由ubl讀到ddr2中執行。
nand flash啟動階段劃分
注:虛線部分為nand引導啟動核心
三、ubl
ubl對上與rbl互動,對下要加載運作u-boot,再由u-boot加載uimage到ddr2中運作,最後将控制權交給作業系統。是以,ubl的重要性不言而喻。
ubl首先完成系統時鐘、ddr頻率以及運作環境的初始化,然後複制u-boot到ddr,并轉到start_armboot。
具體設定如下:
◎ 設定引導配置寄存器bootcfg,使btsel[1:0]=00,即選擇nand flash引導啟動模式;并根據外部nand flash型号設定em_width位。在rbl從nand讀資料時要根據bootcfg的第5位(em_width)的值來判斷總線寬度和存取資料的大小,em_width=0,資料寬度為8位(bit);em_width=1,資料寬度為16位。
◎ 定義nand ubl描述符,包括魔術數、ubl入口點位址、頁面數、起始塊号、起始頁号等。rbl首先要讀取nand flash的裝置id以及裝置存取資訊(即塊和頁的大小、ubl辨別符等,儲存在裝置資訊表中),然後從nand裝置cis/idi block之後(block1)的第0頁開始讀取有效的ubl描述符。如果沒有找到與預設ubl辨別相比對的ubl,就搜尋下一個塊,最多連續搜尋5個塊,以避免nand裝置開始連續的幾個塊存在壞塊的情況(一般不會出現。nand flash在出廠前會保證第一塊和第二塊是好的);如果還是沒有适合的ubl,則切換到uart啟動模式。
◎ 當rbl找到一個有效的ubl時,首先讀取并處理ubl描述符,rbl根據描述符資訊來決定是否開啟emif(external memory interface)或i-cache(instruction-cache)、是否采用dma等操作。一旦具備了ubl運作條件,rbl就把ubl拷貝到airam中,并跳轉到起始入口位址0x00000020處運作ubl。
◎ ubl将為u-boot建立運作環境。其主要流程如下:
△ dm644xinit,初始化硬體平台:屏蔽所有中斷,電源/休眠管理控制器複位
△ uartinit,序列槽初始化設定
△ pll1init,系統鎖相環pll1設定
△ pll2initddr,鎖相環pll2設定
△ ddr2init,ddr2初始化
△ aemifinit,aemif接口初始化
△ ivtinit,中斷向量表初始化
△ nand_init,nand初始化,在讀bootcfg時,如果btsel[1:0]=00就調用
△ nand_copy,拷貝u-boot代碼到ddr2中
△ 拷貝成功,根據nand_boot::entrypoint跳轉到u-boot入口的運作