第一节–环境配置
用到的资源 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 init
=/linuxrc ip
=192.168.1.123
解释:
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
bootcmd
=tftp
41000000 uImage
;tftp
42000000 exynos4412
-fs4412
.dtb
;bootm
41000000 - 42000000
解释:
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
-cs1@
5000000 {
compatible
= "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg
= <0x5000000 0x1000000>;
ranges
;
ethernet@
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
];
};
};