1. resetlinux
中斷向量表函數
2. 進入resetoop
(1) 設置svc32 模式內存
(2) flash I/D cachesflash
(3)disable MMU 和 cacheit
(4)2440 沒有onenand 編譯
(5)bl lowlevel_init 變量
接 (5)軟件
1.初始化時鐘配置
2. 初始化UART,串口
3.nandflash 簡單初始化
4. 判斷當前uboot 是否運行在內存中,若是不是則進行內存初始化
返回 (5)後面
跳過宏定義
從NandFlash 中拷貝bootloader到內存中
設置堆棧,爲C語言作準備
清除BSS段
uboot 配置編譯:
make smdk2440 config
make
arm-linux-objdump -D -S uboot.bin 30000000
./dnw uboot.bin 30000000
souceinsight 高亮 shift + F8
第二部分從startarmboot開始
作兩件事情:
1.硬件初始化
2.軟件初始化,初始化一些環境變量
(1)初始化串口
(2)LCD 初始化
(3)初始化 網卡
(4)初始化LED
(5)main loop 最後執行用戶輸入命令
1.經過uboot 下面的 Makefile 找到對應的芯片的配置
2. 在 board/samsung/xxx 找到 連接器腳本 u-boot.lds
能夠看到代碼段的入口文件 Start.o --》 Strat.S
3. Start.S 文件在 cpu/xxxx 裏面
4. 分析第一階段(BL1)的bootloader 代碼
5.有一箇中斷向量表,向量表最前面是 reset
6. 分析 reset 的內容
(1) svc
(2) I/D cache
(3) 關閉 MMU
(4)外側基地址初始化 (6410獨有)
(5)OneNand
(6) bl lowlevel_init (lowlevel_init.S 單獨文件)
board/samsung/xxx
點亮LED,
disable watchdog 關閉全部中斷 (爲何2440 沒有作呢?2440 在 時鐘初始化函數裏面作了)
返回
(7) copy from nand
(8)堆棧初始化
(9)清除bss段
進入第二階段 BL2
210 分析過程
svc
跳轉到 xxx
關閉L1
disable MMU 和cache
low level init
檢查 reset狀態
IO引腳初始化(恢復IO引腳爲默認值)
disable watchdog
SRam SRom 初始化
時鐘初始化 內存初始化
串口初始化
取消存儲保護區
簡單初始化NandFlash
disable ADB
返回
設置堆棧
判斷當前是否在內存運行
判斷從哪一種flash啓動的
進入 board_init_f_nand 函數
跳轉 到內存裏執行 BL2
BL2 在鏈接器腳本里面, u-boot.lds
arch/arm/cpu/armv7