零、說明
本文主要以友善之臂的tiny210板子作說明,使用的是s5pv210核心。
主要集中于以下幾個問題:
* 支持哪些存儲介質?
* 上電之后的啟動流程?分成了幾個階段?具體負責什么功能?
* 各個階段使用的存儲介質是什么?原因?
* 各個階段的運行地址是什么?
* 鏡像存放可能存放在幾種存儲介質中,如何判斷要從哪種存儲介質中獲取鏡像?(也就是啟動模式)
本文只介紹non secure boot的情況。也就是說不是在secure環境下,無需做簽名處理。
一、和啟動相關的硬件介紹
1、可運行存儲介質
要先理解一點,運行介質都會在CPU的地址空間上,占用地址空間的一部分。CPU可以根據尋址地址從運行介質從讀取一條指令或者一條數據,而并不是說直接在運行介質上執行。
IROM
ROM(Read Only Memory),唯讀記憶體。ROM數據不能隨意更新,但是在任何時候都可以讀取。主要用于存放一些固定的不需要修改的代碼或者數據。掉電之后,數據還可以保存。
IROM則是指集成于芯片內部的ROM.SRAM
SRAM(Static Random Access Memory),即靜態隨機存取存儲器。它是一種具有靜止存取功能的內存,不需要刷新電路即能保存它內部存儲的數據。優點,速度快,不必配合內存刷新電路,可提高整體的工作效率。初始化簡單。
缺點,集成度低,掉電不能保存數據,功耗較大,相同的容量體積較大,而且價格較高,少量用于關鍵性系統以提高效率。
SDRAM
由General SDRAM and Controller進行控制。
SDRAM(Synchronous Dynamic Random Access Memory),同步動態隨機存儲器,同步是指內存工作需要同步時鐘,內部的命令的發送與數據的傳輸都以它為基準;動態是指存儲陣列需要不斷的刷新來保證數據不丟失;隨機是指數據不是線性依次存儲,而是自由指定地址進行數據讀寫。相對于SRAM來說,體積較小且價格偏移。
三者差異簡單歸納如下表:
可運行存儲介質 | 掉電數據保存情況 | 數據修改 | 訪問速度 | 動態刷新電路 | 價格 |
---|---|---|---|---|---|
ROM | 掉電數據保存 | 不易修改 | 最慢 | 不需要 | 最便宜 |
SRAM | 掉電數據丟失 | 可以修改 | 最快 | 不需要 | 最貴 |
SDRAM | 掉電數據丟失 | 可以修改 | 快 | 需要 | 便宜 |
補充說明
綜上,因為BL0是上電啟動代碼,固定不變的,所以將其固化在IROM中運行。
因為SRAM是集成在平臺內部,BL0階段之后可以直接使用,但是size比較小。
而SDRAM需要根據外圍DDR進行初始化,BL0之后還無法使用,需要在BL1中進行初始化之后才能使用。
故BL1放在SRAM中運行,BL2放在SDRAM中運行。
后續會繼續說明。
2、存儲介質
SD/MMC/eMMC
nand flash / nor flash / OneNand flash
eSSD
3、tiny210運行介質和存儲介質說明
首先看一下對應s5pv210平臺和存儲相關的硬件支持
64KB的IROM
94KB的內部SRAM
通用SDRAM控制器,用于控制SDRAM
需要外部實現SDRAM.4/8位高速SD/MMC控制器,用于控制4-bit SD / 4-bit MMC / 4 or 8-bit eMMC
需要外部實現SD/MMC/eMMCNand Flash控制器,用于控制nand flash
需要外部實現nand flashOneNand控制器,用于控制OneNand flash。
需要外部實現OneNand flasheSSD控制器,用于控制eSSD
需要外部實現eSSDUART/USB控制器
在s5pv210的基礎上,對應tiny210板子上有如下外圍硬件:
* 512MB的DDR支持
* 1GB的nand flash支持(K9K8G08U0B)
* SD card接口支持,可以直接支持SD card
綜上,tiny210板子上有如下存儲介質:
64KB的IROM
94KB的內部SRAM
512MB的DDR
512MB的nand flash支持
SD card(自己插了一個4GB的SD卡)
二、s5pv210 上電啟動的幾個階段
注意:以下介紹的啟動流程和官方給的啟動流程《S5PV210-iROM-ApplicationNote-Preliminary》有所差異,是實際上我在項目中使用的啟動流程,也是比較通用的啟動流程。
和官方文檔中比較大的差異在于,BL2在下面介紹是放在SDRAM中運行,而官方文檔《S5PV210-iROM-ApplicationNote-Preliminary》中則是放在IRAM中運行,因為編出來的uboot過大,超過了限制,所以官方文檔是不可行的。
1、BL0
運行在IROM上!!!
加載說明
上電后啟動的第一個階段。其代碼固化在s5pv210的IROM中,也就是出廠后已經完成,無法進行修改。上電后CPU會直接從IROM上的BL0的代碼上開始執行。主要工作有:
初始化系統時鐘、特殊設備的控制器、啟動設備、看門狗、堆棧、SRAM等等
驗證BL1鏡像
從存儲介質上(比如SDeMMCnand flash)或者通過USB加載BL1鏡像到對應內部SRAM上
跳轉到BL1鏡像所在的地址上
2、BL1
運行在內部SRAM上!!!
加載說明
上電后啟動的第二個階段。BL0階段會將其鏡像或者代碼從存儲介質上(比如SDeMMCnand flash)上加載到內部SRAM上.主要工作有:
初始化部分時鐘(和SDRAM相關)
初始化DDR(外部SDRAM)
從存儲介質上(比如SDeMMCnand flash)將BL2鏡像加載到SDRAM上
驗證BL2鏡像的合法性
跳轉到BL2鏡像所在的地址上
3、BL2
運行在外部SDRAM上!!!
加載說明
上電后啟動的第三個階段,BL1階段會將其鏡像或者代碼從存儲介質上(比如SDeMMCnand flash)上加載到外部SDRAM上.主要功能
BL2就是指傳統意義上的bootloader,也就是我們這里的uboot的主體,負責flash操作、uboot命令操作等等,并且最終目標是加載OS和啟動OS,如linux。關于uboot的實現,會在后面具體分析,這里不詳細說明。
上電到BL2的流程圖如下(略過BL2的流程部分)
上電,直接執行BL0BL0(IROM)BL0(IROM):初始化系列操作BL0(IROM):加載BL1鏡像到SRAM上BL0(IROM):跳轉到BL1的地址上BL1(SRAM)BL1(SRAM):初始化SDRAMBL1(SRAM):加載BL2鏡像到SDRAM上BL1(SRAM):跳轉到BL2的地址上BL2(SDRAM)jump into OS
三、各個階段在地址空間上的運行位置
1、s5pv210地址空間
參考《S5PV210_UM_REV1.1》 2.1 MEMORY ADDRESS MAP
s5pv210整體地址空間映射表如下:
起始地址 | 結束地址 | 長度 | 映射區域描述 |
---|---|---|---|
0x0000_0000 | 0x1FFF_FFFF | 512MB | Boot area(取決于啟動模式) |
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
0x4000_0000 | 0x7FFF_FFFF | 1024MB | DRAM 1 |
0x8000_0000 | 0x87FF_FFFF | 128MB | SROM Bank 0 |
0x8800_0000 | 0x8FFF_FFFF | 128MB | SROM Bank 1 |
0x9000_0000 | 0x97FF_FFFF | 128MB | SROM Bank 2 |
0x9800_0000 | 0x9FFF_FFFF | 128MB | SROM Bank 3 |
0xA000_0000 | 0xA7FF_FFFF | 128MB | SROM Bank 4 |
0xA800_0000 | 0xAFFF_FFFF | 128MB | SROM Bank 5 |
0xB000_0000 | 0xBFFF_FFFF | 256MB | OneNAND/NAND Controller and SFR |
0xC000_0000 | 0xCFFF_FFFF | 256MB | MP3_SRAM output buffer |
0xD000_0000 | 0xD000_FFFF | 64KB | IROM |
0xD001_0000 | 0xD001_FFFF | 64KB | Reserved |
0xD002_0000 | 0xD003_7FFF | 96KB | IRAM |
0xD800_0000 | 0xDFFF_FFFF | 128MB | DMZ ROM |
0xE000_0000 | 0xFFFF_FFFF | 512MB | SFR region |
重點關注如下幾個地址空間:
起始地址 | 結束地址 | 長度 | 映射區域描述 |
---|---|---|---|
0x0000_0000 | 0x1FFF_FFFF | 512MB | Boot area(取決于啟動模式) |
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
0x4000_0000 | 0x7FFF_FFFF | 1024MB | DRAM 1 |
0xD000_0000 | 0xD000_FFFF | 64KB | IROM |
0xD002_0000 | 0xD003_7FFF | 96KB | IRAM |
2、BL0的運行地址
通過文檔《S5PV210-iROM-ApplicationNote-Preliminary》位于如下區域
起始地址 | 結束地址 | 長度 | 映射區域描述 |
---|---|---|---|
0x0000_0000 | 0x0000_FFFF | 64KB | Internal ROM |
s5pv210上電之后,CPU會直接從0x0地址取指令,也就是直接執行BL0。
3、BL1的運行地址
上述已經說明BL1在IRAM中運行,IRAM空間如下:
起始地址 | 結束地址 | 長度 | 映射區域描述 |
---|---|---|---|
0xD002_0000 | 0xD003_7FFF | 96KB | IRAM |
但是并不是說整個IRAM都是給BL1使用的。
BL1使用的部分如下:
起始地址 | 結束地址 | 長度 | 映射區域描述 |
---|---|---|---|
0xD002_0000 | 0xD003_5400 | - | BL1代碼空間 |
BL1鏡像最大為16KB。
這里有一個注意事項:
BL1是加載在0xD002_0000的位置上(不包括USB啟動的方法),并不是說BL1就是從0xD002_0000開始運行的。0xD002_0000開始的16B是用于作為BL1的header。BL1代碼的實際運行地址是0xD002_0010
這部分header是用來給BL0驗證BL1的鏡像的有效性使用的。16B的header格式如下:
地址 | 數據 |
---|---|
0xD002_0000 | BL1鏡像包括header的長度 |
0xD002_0004 | 保留,設置為0 |
0xD002_0008 | BL1鏡像除去header的校驗和 |
0xD002_000c | 保留,設置為0 |
當從存儲介質上加載BL1鏡像的時候(非UART/USB模式),需要校驗這個header和BL1的鏡像是否匹配,后續啟動模式中會繼續說明。
4、BL2的運行地址
上述已經知道BL2在SDRAM的地址空間中運行,SDRAM空間如下:
起始地址 | 結束地址 | 長度 | 映射區域描述 |
---|---|---|---|
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
0x4000_0000 | 0x7FFF_FFFF | 1024MB | DRAM 1 |
tiny210的ddr是512M并且使用的是DRAM0的地址空間,故BL2的運行空間是
起始地址 | 結束地址 | 長度 | 映射區域描述 |
---|---|---|---|
0x2000_0000 | 0x3FFF_FFFF | 512MB | DRAM 0 |
但是在實際使用中,我把uboot加載到了ddr上0x23E0_0000(具體參考CONFIG_SYS_TEXT_BASE的定義)的地址上。
===========================================
綜上所述,各個階段的運行地址如下:
階段 | 運行地址 |
---|---|
BL0 | 0x0000_0000(固定) |
BL1 | 0xD002_0010(固定) |
BL2 | 0x3000_0000(可在代碼中進行修改) |
四、啟動模式(如何將對應BL1加載到對應RAM上面)
在上述中,我們知道BL0負責將BL1的鏡像加載到對應的地址上。
那么,有一個問題,BL1的鏡像可能存放在SD卡,eMMC,Nand flash等存儲介質上,也有可能是直接通過USB上寫入到對應RAM的地址上。那么,BL0如何判斷要從哪里去加載BL1的鏡像呢,這就取決于啟動模式了。
1、s5pv210支持的啟動模式
OneNand Boot模式
在這種模式下,BL0會從OneNAND的page0開始加載,先加載16B的header到0xD002_0000,通過header中的size判斷需要讀取多少page,然后再加載剩余的page到0xD002_0010上。
最后計算除header外的數據的校驗和,和header中的校驗和比較,一旦匹配,則跳轉到0xD002_0010。
因此,當我們選擇這種方式的時候,需要給BL1的鏡像加上16B的header,然后以OneNand page0位置開始存放整個鏡像。Nand Boot (with H/W 8/16-Bit ECC)
在這種模式下,BL0會從NAND的page0開始加載,先加載16B的header到0xD002_0000,通過header中的size判斷需要讀取多少page,然后再加載剩余的page到0xD002_0010上。
最后計算除header外的數據的校驗和,和header中的校驗和比較,一旦匹配,則跳轉到0xD002_0010。
因此,當我們選擇這種方式的時候,需要給BL1的鏡像加上16B的header,然后以Nand page0位置開始存放整個鏡像。SD / MMC Boot
在這種模式下,BL0會跳過SD的block0,從SD的block1加載,先加載block1到0xD002_0000,通過header中的size判斷需要讀取多少block,然后再加載剩余的block。
最后計算除header外的數據的校驗和,和header中的校驗和比較,一旦匹配,則跳轉到0xD002_0010。
因此,當我們選擇這種方式的時候,需要給BL1的鏡像加上16B的header,然后以block1位置開始存放整個鏡像。eSSD Boot
在這種模式下,BL0會跳過eSSD的block0,從eSSD的block1加載,先加載block1到0xD002_0000,通過header中的size判斷需要讀取多少block,然后再加載剩余的block。
最后計算除header外的數據的校驗和,和header中的校驗和比較,一旦匹配,則跳轉到0xD002_0010。
因此,當我們選擇這種方式的時候,需要給BL1的鏡像加上16B的header,然后以block1位置開始存放整個鏡像。eMMC Boot
在這種模式下,BL0會從eMMC的block0加載,先加載block0到0xD002_0000,通過header中的size判斷需要讀取多少block,然后再加載剩余的block。
最后計算除header外的數據的校驗和,和header中的校驗和比較,一旦匹配,則跳轉到0xD002_0010。
因此,當我們選擇這種方式的時候,需要給BL1的鏡像加上16B的header,然后以block0位置開始存放整個鏡像。UART Boot
在這種模式下,BL0會檢測串口數據,并且將其復制到0xD002_0000開始的位置。在PC側通過DWN軟件將鏡像通過串口進行寫入。
因為這種模式下不需要驗證header,一旦下載完成之后,會直接跳轉到0xD002_0000進入BL1。USB Boot
在這種模式下,BL0會檢測USB數據,并且將其復制到0xD002_0000開始的位置。在PC側通過DWN軟件將鏡像通過USB進行寫入。
因為這種模式下不需要驗證header,一旦下載完成之后,會直接跳轉到0xD002_0000進入BL1。
幾個模式的差異如下表格
模式 | 硬件支持 | BL1鏡像存放起始位置 | BL1鏡像是否需要header | 加載位置 | 跳轉位置 |
---|---|---|---|---|---|
OneNand Boot | OneNand flash | page0 | 是 | 0xD002_0000 | 0xD002_0010 |
Nand Boot | Nand flash | page0 | 是 | 0xD002_0000 | 0xD002_0010 |
SD / MMC Boot | SD / MMC | block1 | 是 | 0xD002_0000 | 0xD002_0010 |
eSSD Boot | eSSD | block1 | 是 | 0xD002_0000 | 0xD002_0010 |
eMMC Boot | eMMC | block0 | 是 | 0xD002_0000 | 0xD002_0010 |
UART Boot | UART | 無 | 否 | 0xD002_0000 | 0xD002_0000 |
USB Boot | USB | 無 | 否 | 0xD002_0000 | 0xD002_0000 |
2、s5pv210選擇啟動模式的方法
s5pv210通過OM[5:0]這6個引腳的組合來選擇對應的啟動模式。
具體查看《S5PV210-iROM-ApplicationNote-Preliminary》表格Table4. iROM OM pin description
以下舉幾個常見的例子
啟動方式 | OM5 | OM4 | OM3 | OM2 | OM1 | OM0 |
---|---|---|---|---|---|---|
SD BOOT | 0 | 0 | 1 | 1 | 0 | 0 |
Nand 2KB 5cycle (Nand 8bit ECC) | 0 | 0 | 0 | 0 | 1 | 0 |
Nand 4KB 5cycle (Nand 8bit ECC) | 0 | 0 | 0 | 1 | 0 | 0 |
Nand 4KB 5cycle (default)(Nand 16bit ECC) | 0 | 0 | 0 | 1 | 1 | 0 |
優先檢測UARTUSB模式 | 1 | - | - | - | - | - |
注意,當OM5用于決定是否先進入UARTUSB模式。如果OM5為0,則直接進入OM[4:0]對應的模式中。
如果OM5為1,則先判斷串口是否有響應(因此要進入該模式需要現在DNW軟件上打開對應UART下載功能),有響應則進入UART模式,否則,超時,檢測是否進入USB模式。
然后判斷USB是否有相應(因此要進入該模式需要現在DNW軟件上打開對應USB下載功能),有響應則進入USB模式,否則,超時,跳轉到OM[4:0]對應的模式中。
3、tiny210支持的啟動模式
通過tiny210的原理圖《Tiny210-1305-Schematic》上看OM5OM4OM0均被拉低為0.而OM[3:1]則有撥碼開關S2和反相器來控制其組合。
最終得到tiny210只支持如下兩種啟動方式
啟動方式 | OM5 | OM4 | OM3 | OM2 | OM1 | OM0 |
---|---|---|---|---|---|---|
SD BOOT | 0 | 0 | 1 | 1 | 0 | 0 |
Nand 4KB 5cycle (default)(Nand 16bit ECC) | 0 | 0 | 0 | 1 | 1 | 0 |
上一篇:S5PV210 | 根文件系統文件詳情
下一篇:kernel 2.6.35.7向S5PV210移植
推薦閱讀最新更新時間:2025-04-23 15:31



