【实验目的】
掌握 uboot 的使用方法,能够使用 uboot 安装和加载内核
【实验环境】
- ubuntu 14.04 发行版
- FS4412 实验平台
【注意事项】
- 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行,以“#”开头的命令表
示在开发板下执行
【实验步骤】
一、通过 tftp 加载内核和根文件系统
-
将资料中“Linux 内核镜像”目录下的“uImage”和“exynos4412-fs4412.dtb”拷贝到ubuntu 中 tftp 工作目录下
将资料中“根文件系统镜像”目录下的“ramdisk”也拷贝到 ubuntu 中 tftp 工作目录下
修改这些文件的权限$ sudo chmod 777 /tftpboot/*
-
重启 tftp 服务器
$ sudo service tftpd-hpa restart
-
连接开发板与电脑,在 uboot 交互模式下,设置 uboot 的启动参数
# setenv ipaddr ...
# setenv serverip xxx.xxx.xxx.xxx
# setenv bootcmd tftp 0x41000000 uImage;tftp 0x42000000 exynos4412-fs4412.dtb;tftp 0x43000000 ramdisk.img;bootm 0x41000000 0x43000000 0x42000000
# setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs/ rw console=ttySAC2,115200 init=/linuxrc ip=...
注 1:xxx.xxx.xxx.xxx 为 ubuntu 主机的 ip,..***.***为开发板的 ip,必须和 ubuntu主机的 ip 在同一个网段(根据自己电脑情况进行设置)
注 2 :以上设置手动输入,命令粘贴可能会有中文符号
设置完成后保存这些参数
# saveenv
- 检查网络设置是否正确,使用网线连接开发板与电脑,然后给开发板重新上电,上电之后观察 uboot 是否能通过 tftp 加载和启动内核,启动时是否能挂载根文件系统(ext2),启动完成后在终端上输入 linux 下的 shell 命令测试是否正常
二、通过 EMMC 加载内核和根文件系统
通过上述方式我们虽然可以加载 Linux 内核和根文件系统并正常运行,但上述方式我们是把
内核镜像. 设备树. 根文件系统镜像都放到了 tftp 服务器上,然后开发板上电之后再通过
tftp 去下载这些文件到开发板的内存中运行;但在实际做一个产品的时候我们不可能每次开
机都通过网络去服务器上下载这些镜像,所以以下步骤我们就将这些镜像安装到开发板上
的 EMMC 中,然后从 EMMC 启动内核
-
给开发板重新上电,在 uboot 交互模式下,去下载并安装这些镜像
下载内核镜像到内存中# tftp 0x41000000 uImage
将内核镜像写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x800 0x2000
显示如下信息表示安装成功
下载设备树到内存中
# tftp 0x41000000 exynos4412-fs4412.dtb
将设备树写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x2800 0x800
显示如下信息表示安装成功
下载根文件系统镜像到内存中
# tftp 0x41000000 ramdisk.img
将根文件系统镜像写入到 EMMC 中指定的扇区
# mmc write 0 0x41000000 0x3000 0x2000
显示如下信息表示安装成功
-
因为要从 EMMC 驱动,所以还要修改 uboot 的启动参数
# setenv bootcmd mmc read 0 0x41000000 0x800 0x2000\;mmc read 0 0x42000000 0x2800 0x800\;mmc read 0 0x43000000 0x3000 0x2000\;bootm 0x41000000 0x43000000 0x42000000
若设置无法保存可尝试如下格式
# setenv bootcmd 'mmc read 0 0x41000000 0x800 0x2000;mmc read 0 0x42000000 0x2800 0x800;mmc read 0 0x43000000 0x3000 0x2000;bootm 0x41000000 0x43000000 0x42000000'
设置完成后保存这些参数
# saveenv
- 给开发板重新上电,上电之后观察内核是否能通过 EMMC 加载和启动内核,启动完成后是否能挂载根文件系统(ext2),在终端上输入 linux 下的 shell 命令测试是否正常
三、通过 tftp 加载内核通过 nfs 挂载根文件系统
在后续的课程中我们会经常修改内核和设备数的源码,也会经常向根文件系统中添加一些
驱动或应用程序,这样每次修改之后我们都要重新将内核或根文件系统安装到 EMMC 中,
步骤会比较繁琐,开发效率也比较低,所以在开发阶段我们经常使用的方式是通过 tftp 加载内核和设备树再通过 nfs 挂载根文件系统(后续在项目当中都是使用这种方式),这样步骤简单,效率也比较高,待产品定型之后在安装到 EMMC 中
- 将资料中“根文件系统镜像”目录下的“rootfs.tar”拷贝到 ubuntu 中 nfs 工作目录下
解压跟文件系统到 nfs 工作目录
$ sudo tar xvf rootfs.tar.xz
解压完成后删除原有压缩包
$ sudo rm rootfs.tar.xz
-
修改 uboot 的启动参数
# setenv bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb\;bootm 0x41000000 - 0x42000000
设置完成后保存这些参数
# saveenv
-
重启 nfs 服务器
$ sudo service nfs-kernel-server restart
-
给开发板重新上电,上电之后观察内核是否能通过 tftp 加载和启动内核,启动完成后是否能挂载根文件系统(nfs),在终端上输入 linux 下的 shell 命令测试是否正常,若启动正常我们向 nfs 的工作目录中添加了新的文件之后可以在开发板直接看到
四、将 uboot 安装到 EMMC
以上的几种方式中我们既可以通过网络启动内核也可以将内核安装到 EMMC 中从本地启动,但是对于 uboot 我们一直使用的是从 SD 卡启动,所以我们也可以将 uboot 安装到 EMMC 中然后从 EMMC 启动 uboot,这样就可以不使用 SD 卡了
-
将资料中“u-boot 镜像”目录下的“u-boot-fs4412.bin”拷贝到 ubuntu 中 tftp 工作目录
-
给开发板重新上电,在 uboot 交互模式下,去下载并安装 uboot
# tftp 0x41000000 u-boot-fs4412.bin
将内核镜像安装到 EMMC 中指定的扇区
# emmc open 0
# mmc write 0 0x41000000 0x0 0x800
# emmc close 0
emmc 命令打开引导分区,这样就可以在EMMC中写入u-boot引导程序了,注意写入完毕要关闭引导分区
fs4412开发板SD卡启动方式是从第一块内存开始搬移运行程序,EMMC启动方式是从第0块内存开始搬移运行程序
显示如下信息表示安装成功
-
关闭开发板电源,调整拨码开关位置为 EMMC 启动
-
给开发板重新上电,观察 uboot 是否能正常启动
因为启动的是 EMMC 中的 uboot 所以环境变量还需要重新设置
uboot内核启动命令
bootm
启动指定内存地址上的Linux内核并为内核传递参数
bootm kernel-addr ramdisk-addr dtb-addr
注:
kernel-addr: 内核的下载地址
ramdisk-addr: 根文件系统的下载地址
dtb-addr: 设备树的下载地址
若不使用相应的地址,对应的位置写“-”
eg:
bootm 0x41000000 - 0x42000000
uboot自启动参数环境变量
bootargs
eg:
setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
注:
root 根文件系统类型(nfs)
nfsroot 网络文件系统路径(xxx.xxx.xxx.xxx:/opt/4412/rootfs) (自己服务器ip地址,nfs目录)
rw 操作网络文件系统的权限(rw)
console 控制台(使用串口2,波特率115200)
init init进程的位置(/linuxrc)
ip linux启动后自身的IP(***.***.***.***)uboot中的ipaddr地址
0x42000000 - 0x41000000 = 1000000字节(十进制:16777216)
16777216 / 1024字节 = 16384K
16384K / 1024K = 16M