S5PV210啟動過程詳解


1.常用的器件及特性
  • 內存
    • SRAM:靜態內存 特點就是容量小、價格高,優點是不需要軟件初始化直接上電就能用
    • DRAM:動態內存 特點就是容量大、價格低,缺點就是上電后不能直接使用,需要軟件初始化后才可以使用。
    • 單片機中:內存需求量小,而且希望開發盡量簡單,適合全部用SRAM
    • 嵌入式系統:內存需求量大,而且沒有NorFlash等可啟動介質
    • PC機: 內存需求量大,而且軟件復雜,不在乎DRAM的初始化開銷,適合全部用DRAM
  • 外存
    • NorFlash:特點是容量小,價格高,優點是可以和CPU直接總線式相連,CPU上電后可以直接讀取,所以一般用作啟動介質。
    • NandFlash(跟硬盤一樣):特點是容量大,價格低,缺點是不能總線式訪問,也就是說不能上電CPU直接讀取,需要CPU先運行一些初始化軟件,然后通過時序接口讀寫。
2.各類計算機的啟動方式
  • PC:很小容量的BIOS(NorFlash)+ 很大容量的硬盤(類似於NandFlash)+ 大容量的DRAM
  • 單片機: 很小容量的NorFlash + 很小容量的SRAM
  • 嵌入式:因為NorFlash很貴,所以現在很多嵌入式系統傾向於不用NorFlash,直接使用外接的大容量Nand + 外接大容量DRAM + SoC內置SRAM
  • S5PV210啟動方式:外接的大容量Nand + 外接大容量DRAM + SoC內置SRAM+SoC內置iROM
3.S5PV210的啟動步驟

 

在這張圖中可以看出S5PV210的啟動可大致分為五個步驟

  • 1、iROM階段(BL0)
  • 2、BL1階段
  • 3、BL2階段
  • 4、拷貝OS到SDRAM
  • 5、啟動OS
    samsung在S5PV210內部的IROM中固化了一段代碼,用於初始化時鍾,識別用戶選擇的啟動模式,並從相應的地方拷貝boot-loader第一階段代碼到SRAM中運行。此外samsung在S5PV210內部也集成了96KB的內部SRAM,由於SRAM不需要初始化,上電就能使用,因此可當作DRAM初始化之前的代碼運行空間。
4.iROM完成的工作

  • 1、關閉看門狗;
  • 2、初始化icache;
  • 3、初始化棧;
  • 4、初始化堆;
  • 5、初始化塊設備拷貝函數;
  • 6、初始化PLL,設置系統時鍾;
  • 7、拷貝BL1到內部的SRAM區域;
  • 8、檢查BL1的校驗和;
  • 9、檢查是否是安全啟動模式;
  • 10、跳轉到BL1的起始代碼處。

5.匯編啟動代碼
#define WTCON        0xE2700000
#define SVC_STACK    0xD0037D80

// 把_start鏈接屬性改為外部,這樣其他文件就可以看見_start了
.global _start                    
_start:
    // 第1步:關看門狗(向WTCON的bit5寫入0即可),不是所有的BL0都關看門狗
    ldr r0, =WTCON
    ldr r1, =0x0
    str r1, [r0]

    // 第2步:設置SVC棧 默認使用滿減棧
    ldr sp, =SVC_STACK

    // 第3步:開/關icache
    mrc p15,0,r0,c1,c0,0;            // 讀出cp15的c1到r0中
    //bic r0, r0, #(1<<12)            // bit12 置0  關icache
    orr r0, r0, #(1<<12)            // bit12 置1  開icache
    mcr p15,0,r0,c1,c0,0;

    // 第4步:調用入口函數
    bl entry

 

6.鏈接腳本
  • 什么是鏈接地址
    鏈接地址是由程序員預知的或希望的程序執行地址,在編譯鏈接的過程中,通過Makefile中-Ttext xxx或者在鏈接腳本中指定的。
  • 什么是運行地址
    是程序執行,代碼所處的實際位置地址。
  • 鏈接腳本究竟要做什么?
    鏈接腳本其實是個規則文件,他是程序員用來指揮鏈接器工作的。
    鏈接器會參考鏈接腳本,並且使用其中規定的規則來處理.o文件中那些段,將其鏈接成一個可執行程序。
    鏈接腳本的關鍵內容有2部分:段名 + 地址(作為鏈接地址的內存地址)
    鏈接腳本的內容:

    • SECTIONS {} 是整個鏈接腳本的全部
    • . 點號在鏈接腳本中代表當前位置。
    • =等號代表賦值,要用分號結尾

link.lds

SECTIONS
{
    . = 0xd0020010;

    .text : {
        start.o
        * (.text)
    }

    .data : {
        * (.data)
    }

    .bss : {
        * (.bss)
    }

}
7.Makefile
NAME=led
BIN=$(NAME).bin
ELF=$(NAME).elf
OBJ=start.o led.o

CC=arm-linux-gcc
LD=arm-linux-ld
CFLAGS=-march=armv5te -nostdlib
LDFLAGS=-nostartfiles -nostdlib
OBJCOPY=arm-linux-objcopy

bin:elf
    $(OBJCOPY) -O binary $(ELF) $(BIN)
    cp $(BIN) ~/shared/image/
elf:$(OBJ)
    $(LD) -T link.lds $(LDFLAGS) $(OBJ) -o $(ELF)
%.o:%.c
    $(CC) $(CFLAGS) -c $< -o $@
clean:
    rm -f $(OBJ) $(ELF) $(BIN)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM