第一節–環境配置
用到的資源
u-boot-2013.01.tar 提取碼:4doo
linux-3.14.tar 提取碼:w83e
rootfs.tar.xz提取碼:ho18
系統移植的要點:
- 搭建交叉開發環境
- bootloader 移植
- kernel 移植
- 根檔案系統 制作
一:嵌入式架構
app
作業系統 (系統移植)
驅動 (驅動開發)
硬體 (headwear)
嵌入式:冷冰冰的機器(硬體)注入靈魂(軟體)
二:環境搭建
1.環境搭建
嵌入式需要嵌入式開發環境, 交叉編譯
1)交叉編譯工具的安裝 gcc-4.6.4/bin
2)tftp的安裝和使用 客戶機<---->伺服器
安裝:sudo apt-get install tftpd-hpa tftp-hpa
配置檔案-作用: sudo vi /etc/default/tftpd-hpa
重新開機 sudo service tftpd-hpa restart
3)nfs伺服器的使用 共享-[闆子/主機|用戶端/伺服器
nfs: fs,filesystem 檔案系統 nfs:網絡檔案系統
安裝: sudo apt-get install nfs-kernel-server
配置: sudo vim /etc/exports
重新開機 sudo /etc/init.d/nfs-kernel-server restart
(or)sudo service nfs-kernel-server restart
2.三大件的移植:
pc: bios ->windows ->檔案系統 filesystem:fs
andriod: recovery ->andriod ->fs
嵌入式: u-boot ->linux ->fs
三大件: bootloader os ->fs
1):為什麼要系統移植?怎樣獲得三大件(借用其他闆子)?
判斷兩塊闆子相同:
i CPU相同
ii RAM flash 盡可能的相同
iii 外設最好相同
2):
1、交叉編譯工具 arm-none-linux-gnueabi-gcc
2、tftp nfs 檔案系統
第二節–bootloader
一、bootloader:
為什麼需要bootloader:
可以 修複/重裝/雙系統 更新系統核心功能
bootloader -----> 硬體啟動的引導程式
系統移植 首先移植的就是bootloader
bootloader操作模式
1自啟動模式
2互動模式
bootloader基本功能
初始化硬體--->自搬移--->執行使用者指令--->加載核心
詳細加載運作作業系統過程:
####開機啟動--->執行硬體初始化動作--->進入互動模式/自動模式--->加載os
組成: 彙編 [開機啟動 核心硬體初始化(cpu 存儲 cache 序列槽等) 設定堆棧,跳轉到C]+ ==>
C[大部分硬體初始化 互動模型/自動模式 加載os]
第一階段
初始化基本硬體(CPU DDR 序列槽 關看門狗)
自搬移
清BSS段和堆棧(bss段:存一些未初始化的變量 或者 全局變量)
第二階段
初始化本階段的硬體(flash 網口)
讀取環境變量
如果是自啟動模式 直接加載核心
如果是互動模式 接收使用者指令
二、嵌入式bootloader
嵌入式bootloader: (u-boot 200KB)
u-boot : universal bootloader,通用的 bootloader
既可以跑在PC上,也可以跑在其他的闆子上,一般跑在arm ppc 上.
三、u-boot如何使用-----
1、環境變量:
FS4412 # printenv
baudrate=115200 波特率:可以通過修改這個環境變量配置u-boot波特率
解釋:
bootargs: 你告訴核心, 在核心啟動過程中的一些參數, 核心再啟動過程中,會讀取該變量,并執行相應動作
root=/dev/nfs nfsroot=192.168.1.166:/home/lsf/src/rootfs rw
console=ttySAC2,115200 告訴核心你起來之後,使用序列槽2列印,波特率115200
ip=192.168.1.123
如何修改:set bootargs root=/dev/nfs nfsroot=192.168.1.167:/home/lsf/src/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.249
解釋:
u-boot如何自己知道加載哪一個os,如何加載os: 需要你告訴他如何去加載os
tftp 41000000 uImage; 從tftp伺服器下載下傳檔案uImage(os 核心)到RAM 41000000位址
tftp 42000000 exynos4412-fs4412.dtb; 從tftp伺服器下載下傳檔案exynos4412-fs4412.dtb 下載下傳到RAM42000000位址
bootm 41000000 - 42000000
uboot進入自動模式,會依次執行裡面的每一條指令 作用:你告訴u-boot如何去加載正确的作業系統
如何修改:
set bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
bootdelay=1 ##進入互動模式的等待時間1秒
ethact=dm9000
ethaddr=11:22:33:44:55:66
fileaddr 41000000
filesize 2CAFC0
ipaddr=192.168.1.123 ####開發闆的ip位址
netmask 255.255.255.0
serverip 192.168.1.166 ####設定tftp伺服器的 ip位址
stderr=serial
stdin=serial
stdout=serial
Environment size: 586/16380 bytes
------------
關鍵字解釋
1、指令:
printenv 列印環境變量
setenv 設定環境變量
saveenv 儲存環境變量
####在設定環境變量時,需要進行删除,setenv 環境變量名稱 空格; saveenv
2、
ipaddr 闆端ip位址
serverip 伺服器端ip位址(虛拟機位址)
ethaddr MAC位址 (一般不用它)
###在使用tftp指令之前 需要開啟tftpd-hpa這個服務
3、
tftp 41000000 uImage //該指令會從serverip指定的主機,通過tftp協定,下載下傳uImage檔案,到RAM 41000000位址中
bootm :是go的更新版,主要用于執行核心
bootm 核心位址 檔案系統位址 裝置樹位址
第三節-- u-boot的移植:
一、u-boot移植思想
1.架構選擇 單闆确定
arm exynos fs4412 參考 origen
2.交叉編譯
uboot源碼目錄
交叉編譯工具鍊
Makefile
ARCH = arm
CROSS_COMPILE = arm-none-linux-gnueabi-
3.boot的編譯步驟
make xx_config
make
make distclean
二、u-boot的移植:
工作量小 簡單, 因為u-boot目的是引導作業系統, 隻要 核心闆起來了,就可以加載os. 外設基本上不用關心.
fs4412 => origen
源碼: 頂層目錄,u-boot一級目錄,在該目錄下執行編譯 等操作.
- 平台相關的
移植工作需要關注的内容 arch /arm/cpu/xxxx 不同的cpu初始化代碼不一樣 cpu原廠提供 ##board /samsung/origen 不同的闆子初始化代碼也是不一樣的 開發者關注 ##include/configs /origen.h 不同的闆子配置檔案也是有差異的 開發者關注 origen.h用于控制整個u-boot的編譯動作
- 平台無關的
比如 ping setenv 等指令,不同的平台 都擁有該功能 網絡協定
u-boot的編譯:
注意,一定要在頂層目錄下編譯 且配置交叉編譯環境
1.配置 告訴u-boot,你要編譯哪一個闆子的
make origen_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
2.編譯 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
3.結果 在頂層目錄下生成 u-boot.bin,可以燒寫到 flash中去的
4.清空 make distclean
u-boot的燒寫:在u-boot啟動之前,cpu會啟動自己的自啟程式,自啟程式比較強大(啟動序列槽、網卡、sd)
各個廠商的u-boot自啟程式不一樣的。
第四節–核心、裝置樹移植
###核心/kernel### uImage-核心的鏡像-2M
一、核心編譯:
1.配置核心 告訴核心你要編譯哪一個闆子的核心
cp arch/arm/configs/exynos_defconfig .config
修改配置 make menuconfig ARCH=arm 通過圖形化界面 配置, 結果會寫回到.config
2.編譯核心
make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4
前提是:sudo cp u-boot/tools/mkimage /bin/
3.結果: arch/arm/boot
Image 5419020-5.2M 正宗的二進制核心鏡像,可以直接燒寫flash運作
zImage 2763176-2.7MB zipImage Image經過壓縮之後的鏡像,運作之前需要解壓
uImage 2763240-2.7M u-boot專用的zImage, u-boot對zImage進行加工,添加64B的頭,生成uImage
4.清空 make distclean ARCH=arm
#### but: fs4412使用origen核心,發現啟動一半就死了 因為硬體差異 此時:
1.通過make mennuconfig 配置核心,将我們需要的功能天添加進去核心. dm9000的實驗[知名 廠商 知名的裝置]
2.如果一個##驅動###沒有內建在核心中呢???? [你寫的驅動 一些小廠商的驅動 ....]
你可以修改核心,将你的驅動加入核心.就可以通過menuconfig來配置和使用.
Kconfig 決定如何在menuconfig顯示的 修改.config配置檔案
menuconfig如何實作界面,會讀取各個目錄下的Kconfig來決定如何顯示
二、裝置樹編譯:
1、建立fs4412的裝置樹檔案
路徑 cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-fs4412.dts
2、修改Makfile編譯自己的裝置樹:
vim arch/arm/boot/dts/Makefile 加入:exynos4412-fs4412.dtb \
3、裝置樹檔案修改:
vim arch/arm/boot/dts/exynos4412-fs4412.dts
4、編譯裝置樹
make dtbs ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
5、修改核心檔案drivers/clk/clk.c
修改
static bool clk_ignore_unused;
為
static bool clk_ignore_unused = true;
三、配置核心:
cp arch/arm/configs/exynos_defconfig .config 需要先編譯裝置樹
make menuconfig ARCH=arm
make menuconfig ARCH=arm 修改核心
make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 編譯核心
make dtbs ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 編譯裝置樹
四、裝置樹講解
#include "exynos4412.dtsi" //裝置樹頭檔案 有很多的裝置樹頭檔案
例如:
srom-[email protected]5000000 { //bank1 實體裝置 描述 CS0為40000000
compatible = "simple-bus"; //對象的名字
#address-cells = <1>; //該對象/裝置使用到的 寄存器
#size-cells = <1>;
reg = <0x5000000 0x1000000>;
ranges;
[email protected]5000000 {
compatible = "davicom,dm9000";
reg = <0x5000000 0x2 0x5000004 0x2>;
interrupt-parent = <&gpx0>; //描述該硬體使用的是哪一個中斷控制器上的中斷 描述了該對象/硬體 使用到的中斷資訊
interrupts = <6 4>; //描述 該中斷控制器上的 具體哪一個中斷
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
//status = "okay"/"disable" ; 表示 啟動 / (根目錄)
};
};