54
技術社區[雲棲]
DM6446的Bootloader
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入口的運行
最後更新:2017-04-03 16:48:39