arm內部有rom,該rom有代碼,上面駐留著系統真正啟動的代碼,和uboot沒有關係。
通過該段代碼根據不同的啟動模式進行不同的啟動方式:
如果是nand會自動讀取uboot前4k的代碼到片內sdram執行,該代碼要完成cpu的初始化和ram初始化(初始化ram為外圍的)等。
——————————————————————————
i.mx51沒有nand但有SD卡,但都是作為存放裝置!
——————————————————————————
一直困惑自己的是,一直以為uboot的前4k是拷貝到外圍ram執行的,但片外的ram需要前4k去初始化這樣造成了死結
拿Freescale的imx51為例 片內ROM 36k 片內RAM128k
iMX51啟動機制如下(在實際開發中不會涉及到該內容寫下這些只是讓你更好的瞭解系統的啟動過程,系統的啟動過程不單單只有uboot這一塊在uboot之前還做了很多的工作):
imx51在系統重啟時,會採樣啟動模式的GPIO管腳(BOOT_MODE[1:0]),採樣所得到的值儲存在SBMR寄存器中(System Reset Controller Boot Mode Register)。imx51支援的啟動模式包括:內部啟動模式(通過啟動模式的GPIO管腳判斷啟動外設)、測試模式、下載模式(通過USB/UART下載代碼)、內部啟動模式(通過啟動模式fuse位判斷啟動外設)。
| BOOT_MODE[1:0] |
啟動模式類型 |
啟動模式細節 |
| 00 |
內部啟動模式 (通過啟動模式GPIO管腳判斷啟動外設) |
iMX51執行晶片內部的啟動代碼,可以從以下裝置啟動
- Nor Flash(通過WEIM)
- OneNAND
- SPI(Serial Flash CS#1)/I2C eeprom
- NAND Flash, MLC/SLC 0.5K/2k/4kB page ECC
- SD/MMC(支援大容量)/MoviNAND(通過MMC介面)
|
| 01 |
測試模式 |
|
| 10 |
內部啟動模式 (通過啟動模式fuse位判斷啟動外設) |
與00模式相同,只是不通過啟動模式GPIO管腳來判斷啟動外設,而是通過iMX51的內部fuse位,這些fuse位可以一次性寫入。 |
| 00 |
USB/UART下載啟動模式 |
下載並執行代碼,可以通過以下介面 l USB(全速) l UART |
imx51在系統重啟時,會讀取GPIO_BT_SEL的內部fuse位:
a)如果GPIO_BT_SEL=1(被燒寫過),在晶片內部啟動代碼會通過讀取內部fuse位來判斷外設相關性。
b)如果GPIO_BT_SEL=0,imx51會在啟動時採樣外設相關特性的GPIO管腳,並儲存在SBMR寄存器中。晶片內部啟動代碼會通過讀取該寄存器判斷外設相關性。所以,晶片內部fuse位與啟動相關GPIO管腳是一一對應的。
IMX51內部啟動代碼
imx51內部有一段ROMcode,在內部啟動模式下,系統啟動時,會執行這段代碼,這段代碼會初始化最基本的硬體,然後判斷系統的外部存放裝置資訊(通過讀取SBMR寄存器)。然後系統會初始化相應的外設,並將外設中的第一部分代碼拷貝到晶片內部RAM中,並跳轉到其頭地址並執行。
通過這種方式,imx51可以支援從多種外設啟動,從而增加啟動靈活性,imx51 ROMcode流程如下
我們是按照從SD卡
1) 通過採樣SBMR寄存器讀取fuse位或者採用啟動模式的管腳 <——Reset
2)通過BOOT_MODE[1:0]來判斷是否是那種啟動模式
為了保持穩定性BOOT_MODE[1:0]=10,內部啟動模式(通過啟動模式fuse位判斷啟動外設),將外部資訊燒寫到晶片內部fuse中,這樣系統將從內部fuse中讀取相關外設資訊。
3)因為是從SD卡啟動所以 boot memo ctrol SD/MMC/MoviNAND?
BT_MEM_CTL = 外設介面擴充存放裝置
‘00’=SD/MMC HDD
4)配置SD/MMC的控制器 eSDHC1 Controller
5)basic config and obtain base addr of boot device
基本的配置和擷取啟動硬體的基地址
6)執行鏡像
講這些的作用:imx51的Romcode固化在晶片內部,不能修改,以上分析Romcode主要可以協助大家理解以下幾點:
1)imx51最初是如何啟動的
2)在bootloader開始執行前,系統處於何種狀態,由以上分析可見
a)imx51已經初始化了硬體部分,包括部分時鐘,內部匯流排以及外部存放裝置的控制器,以及外部存放裝置本身
b)bootloader的頭2k已經被拷貝到imx51內部的RAM了,除開1k的MBR頭,以及flash檔案頭,剩下的部分就是可執行代碼。由此可知剩下部分已經不能放下整個bootloader了,所以必須把bootloader分成兩個部分:XLDR和Eboot本身。
c)可以利用DCD段來初始化某些寄存器,例如AndroidBSP利用它來初始化系統DDR2控制器。