一、实验目的:
1、了解 U-boot 的常用命令
2、了解 Linux 内核的引导
二、实验环境:
1、Ubuntu 12.04 以上发行版
2、U-boot-2010.03
3、FS4412 平台
4、交叉编译器 arm-none-linux-gnueabi-gcc
5、相关工具下载:
https://download.csdn.net/download/wenfei11471/10426168
三、实验步骤:
1、下载 Uboot 源代码(
http://www.denx.de/wiki/U-Boot/
):
2、SD 启动盘制作(另起一栏),本文使用已经制作好的程序 sdfuse_d:
a)将 sdfuse_d 拷贝到 Linux 下
b)将 SD 卡插入电脑并识别
★★★注意★★★
SD 卡用读卡器识别不要插入笔记本自带的卡槽,虚拟机能识别 USB 接口但不能识别内置 SD 读卡器
c)进入 sdfuse_q 执行如下操作
sudo ./mkuboot.sh /dev/sdb
d)在 SD 卡中创建目录 sdupdate 并把 u-boot-fs4412.bin 拷贝进去
3、U-boot 烧写:
a)连接串口和板子,运行串口通信程序 putty
b)关闭开发板电源,将刚才做好的 SD 启动盘插入 SD 卡插槽
c)将拨码开关 SW1 调至(1000)(SD 启动模式)后打开电源:
启动模式详见《FS4412 data sheet》
d)重新打开开发板能够看到如下界面
e)在终端上执行以下代码执行烧写 u-boot-fs4412.bin 到 Flash:
sdfuse flashall
4、通过网络加载内核和文件系统:
a)确保 Linux 上开启 TFTP 服务器
b)拷贝 uImage 和 exynos4412-fs4412.dtb 到 /tftpboot 下
c)拷贝 rootfs.tar.xz 到 /source 下并解压
d)修改虚拟机 nfs 配置文件 /etc/exports,添加内容:
/source/rootfs *(rw,sync,no_subtree_check,no_root_squash)
e)重新驱动 nfs 服务:
sudo /etc/init.d/nfs-kernel-server restart 或
sudo service nfs-kernel-server restart
f)开发板交互模式下设置启动参数:
# setenv serverip 192.168.1.155
/*设置 TFTP 服务器的 IP*/
# setenv ipaddr 192.168.1.5
/*设置开发板的 IP*/
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
/*设置 bootcmd(自启动时首先执行的命令):
1、从 TFTP 服务器上将 uImage 文件加载到内存 41000000 上
2、从 TFTP 服务器上将 exynos4412-fs4412.dtb 文件加载到内存 42000000 上
3、bootm 表示从 41000000 处执行内核,从 42000000 处执行设备树,文件系统暂未指定用 - 表示*/
#setenv bootargs root=/dev/nfs nfsroot=192.168.1.155:/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.5
/*设置 bootargs (传输给内核的参数):
1、用来指定 rootfs 的位置, root=/dev/nfs 表示文件系统是基于 nfs 的文件系统
2、nfsroot 表示 nfs 的文件系统位置
3、console 设置控制台参数
4、init 表示内核启起来后,进入系统中运行的第一个脚本
5、IP 表示系统启动之后开发板网卡的 ip 地址,如果使用基于 nfs 的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了*/
★★★注意★★★
bootargs 还有很多参数可以设置,可自行 baidu 查询
# saveenv
/*保存设置的参数到 Flash/SD 上*/
★★★注意★★★
在 u-boot 里命令默认是有补全功能的,例如:
1、set、sete、seten、setenv 都是表示 setenv 的
2、当补全后有重复命令时会出错,例如直接输入 s
3、命令不存在时也会出错
4、按回车表示执行上次的命令
g)启动开发板看到如下现象表示成功通过网络挂载:
4、 从 EMMC 加载内核和文件系统
a) 拷贝 ramdisk.img 拷贝到虚拟机 /tftpboot 目录下
b) 烧写内核镜像 uImage 到 EMMC 上
# tftp 41000000 uImage
/*从 TFTP 服务器上将 uImage 文件加载到内存 41000000 处*/
★★★注意★★★
为什么是 41000000 地址呢?
从手册中查到处理器支持的外设内存地址是从 40000000 开始的,因此我们地址一定要大于 40000000
# movi write kernel 41000000
/*将内存 41000000 处的文件写到 Flash,并命名为 kernel*/
★★★注意★★★
在将内存中的文件写到 Flash 中时如何判断结束?
每个文件结束都有结束标志 EOF,因此不会拷贝多余的字符
c) 烧写设备树文件 dtb 到 EMMC 上
# tftp 41000000 exynos4412-fs4412.dtb
# movi write dtb 41000000
d)烧写文件系统镜像 ramdisk.img 到 EMMC 上
# tftp 41000000 ramdisk.img
# movi write rootfs 41000000 300000
e) 设置启动参数
# setenv bootcmd movi read kernel 41000000\;movi read dtb 42000000\;movi read rootfs 43000000 300000\;bootm 41000000 43000000 42000000
/*读取 Flash 中的内核文件并加载到内存 41000000 中,读取 Flash 中的设备树文件并加载到内存 42000000 中,读取 Flash 中的根系统文件并加载到内存 43000000 中,同时设定根文件系统大小为 8M*/
# saveenv
f)重新启动开发板, u-boot 自动加载、执行内核
5、 u-boot 其他命令