9.2、系統移植 -- BootLoader

爲什麼需要bootloader 實現雙系統 刷機 配置CPU 升級操作系統 U盤系統

bootloader 目的,加載OS 是一類 軟件的統稱
設備: bootloader os fs
你可以把bootloader當成 一個 單任務的 單片機程序
啓動CPU --> 硬件初始化 --> [交互模式] --> 加載OS
過程:
彙編[開機啓動 -->核心硬件初始化(串口 flash RAM CPU) --> 設置堆棧]
C[ 大部分硬件初始化(網卡,SD卡 USB…)–>交互模式–>加載OS ]

不同的板子 不同的芯片 代碼都不一樣,所以 需要對每款板子都要定製 bootloader

bootloader種類

系統 BootLoader 界面 功能 大小 領域比例
PC bios/UEFI UI界面 鼠標鍵盤支持 支持顯示屏網卡 功能強大 300MB
安卓 recovery UI界面 功能簡單 5M 99%
嵌入式 u-boot 字符界面/命令行 功能基本夠用 200KB 嵌入式90%

如何使用u-boot
1、命令:
printenv 查看環境變量

setenv 環境變量名 值 :##setenv bootdelay 5
如果環境變量名字不存在,則創建該 環境變量
如果值爲空,那麼 則刪除該環境變量

saveenv 將你修改的環境變量保存到flash中.

tftp 下載地址 文件名 前提是 ipaddr serverip 都要制定好
bootm: bootm os地址 dtb地址 fs地址
go : 地址,運行程序
ping ip地址:

2、環境變量: printenv 查看環境變量
baudrate=115200 波特率

bootargs=root=/dev/nfs nfsroot=192.168.3.193:/home/lsf/src/rootfs rw console=ttySAC2,115200 init=linuxrc ip=192.168.3.244  

bootcmd=tftp 41000000 uImage; tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000  
 
bootdelay=5    進入交互模式的延時    
ethact=dm9000    
ethaddr=11:22:33:44:55:66  01:34:23:39:11:24    
fileaddr=41000000    
filesize=26D213    

ipaddr=192.168.3.244    ip地址,板子的ip地址    netmask=255.255.255.0    子網掩碼,板子的    
serverip=192.168.3.193    服務器的ip地址  [   tftp       ]    

stderr=serial            
stdin=serial    
stdout=serial    
Environment size: 452/16380 bytes 

u-boot如何啓動操作系統
1、告訴u-boot如何去啓動,你在哪裏告訴u-boot如何啓動呢??? bootcmd環境變量裏面

set bootcmd    tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;  bootm 41000000   -   42000000    

2、uboot 每次啓動, 如果沒有進入交互模式, 會 按照bootcmd裏面的指示,去 加載系統.

3、如何告訴內核,文件系統在哪裏

set bootargs  root=/dev/nfs nfsroot=192.168.2.29:/rootfs rw console=ttySAC2,115200 init=linuxrc ip=192.168.2.234
   
root=/dev/nfs:  告訴內核文件系統的類型,  是=nfs    
nfsroot=192.168.2.165:/home/lsf/src/rootfs rw 
console=ttySAC2,115200        波特率
ip=192.168.3.244    指定內核起來之後,使用的ip地址

u-boot源碼
從FAE哪裏獲取. 頂層目錄: 在該目錄下可以看到 uboot所有的源碼 後續的編譯 查找 都是從該目錄開始.
平臺相關: 不同的芯片 不同的板子 他們的初始化代碼 配置文件 都不一樣.

arch /cpu 平臺: 裏面 存放不同的 cpu的 初始化 代碼
board: 存放不同板子的代碼. 每個板子 都有一個自己的 目錄源碼

配置 可以控制整個u-boot源碼的編譯過程 ########通過修改配置文件,可以控制u-boot##########

存放在 include/configs/板子名字.h
裏面都是一堆的宏定義/宏參數: 這些宏定義 決定了 u–booot源碼的編譯動作

平臺無關: 一些命令 網絡協議 環境邊境 工作環境,不隨着 芯片 板子的不同而不同,

編譯
1、配置,告訴u-boot你想編譯 哪一個板子的

make   板子名字_config     ARCH=arm    CROSS_COMPILE=arm-none-linux-gnueabi-                     

默認x86 默認gcc

2、編譯

make   ARCH=arm    CROSS_COMPILE=arm-none-linux-gnueabi-  

結果,在頂層目錄生成 u-boot.bin bin:binary 二進制,可以直接燒寫到flash中去執行的.

3.清空

make distclean

認識u-boot源碼
彙編: 開機啓動 初始化核心硬件 自拷貝 設置堆棧
C: 大部分硬件初始化 [交互模式] 加載os

讀代碼,目的: 移植做準備,你需要關注 board 配置目錄.

第一段代碼: arch/arm/cpu/armv7/start.S b reset

b reset: 初始化 CPU, 切換到svc,關閉中斷
–>bl cpu_init_cp15 初始化RAM相關的: 關閉緩存 關閉MMU
–>bl cpu_init_crit --> b lowlevel_init 實現在板子裏面 在 board/samsung/origen/lowlevel_init.S 描述了 板子的相關 模塊初始化,這裏面的代碼,你是可以改的.
–>b _main @@arch/arm/lib/crt0.S
1)初始化棧 ,爲C做準備
2)b board_init_f @@arch/arm/lib/board.c 執行大部分硬件初始化 ,會調用 我們板子的 代碼實現的函數 board/samsung/origen/origen.c
3)回到彙編, 執行 自拷貝, 將後續的代碼全部拷貝到 RAM中,然後跳轉到 RAM去執行.
4) ldr pc,=board_init_r @@arch/arm/lib/board.c for(;;) { main_loop(); //進入交互模式 + 加載OS }

u-boot 簡單的移植
u-boot移植,相對 還是簡單. 因爲大部分外設不需要 關心, 重點需要 關注核心板上的
改動的地方: fs4412 <— origen
板子代碼: board 每一個板子都不一樣,所以每個板子都需要有自己目錄
配置部門: include/configs 每個板子配置都不一樣,所以每個板子都要有自己配置文件

1、 拷貝板子 相關代碼

cp  board/samsung/origen    board/samsung/fs4412  -a    
mv  board/samsung/fs4412/origen.c   board/samsung/fs4412/fs4412.c         修改   board/samsung/fs4412/Makefile, 將 origen.o 替換爲 fs4412.o

2、 配置文件

 cp  include/configs/origen.h    include/configs/fs4412.h    

3、修改boards.cfg 裏面記錄了 某個板子的 詳細信息,包括 cpu 公司 配置文件 …
每次 make xxx_config ,都會去查找 boards.cfg ,找到該板子xxx的詳細信息
模擬origen, 增加一行 fs4412 arm armv7 fs4412 samsung exynos
4、編譯

make fs4412_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-        
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章