u-boot加载内核并挂载根文件系统(mini2440)

本文主要记录了在mini2440开发板上烧入u-boot,使用u-boot引导内核启动,并通过nfs挂载根文件系统的过程。

以下是关于本文内容的几点说明

  • 本文涉及的uboot、内核和根文件系统均适用了官方光盘文件中提供的镜像,并不涉及编译和移植相关事项。
  • 使用minitool通过usb的方式将uboot烧入板子的Nand Flash,并未使用JLink进行烧写。
  • 宿主机环境为Ubuntu18.04,使用minicom作为串口工具
  • 所有 $ 开头的命令都是在宿主机下执行的。
  • 所有 # 开头的命令都是通过串口在开发板上执行的。
  • 所有 ### 开头的是注释内容。
  • 没有命令提示的部分为命令执行结果。

串口工具配置

我这里使用了minicom作为串口工具。(当然,可以根据自己喜好选用其他同类工具)

安装minicom

1
$ sudo apt install minicom

设置minicom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ minicom -s
+-----[configuration]------+
| Filenames and paths |
| File transfer protocols |
| Serial port setup |
| Modem and dialing |
| Screen and keyboard |
| Save setup as dfl |
| Save setup as.. |
| Exit |
| Exit from Minicom |
+--------------------------+
### 选择第三项 [ Serial port setup ]
+-----------------------------------------------------------------------+
| A - Serial Device : /dev/ttyUSB0 |
| B - Lockfile Location : /var/lock |
| C - Callin Program : |
| D - Callout Program : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Hardware Flow Control : No |
| G - Software Flow Control : No |
| |
| Change which setting? |
+-----------------------------------------------------------------------+
### 输入 A B C ... 修改每个选项,设置为上边的值
### 按 ESC 返回,选择 [ Save setup as dfl ]

测试串口输出

刚买到的板子的Nand Flash中有可以启动的系统,连接好串口线,打开minicom,然后启动开发板,可以在串口输出中看到启动信息,最后进入一个linux命令行,可以执行一些linux命令试一试。

烧入u-boot

使用官方光盘中的minitools工具把u-boot烧写到板子的Nand Flash中。

获取minitools

在光盘文件 FriendlyARM-2440-DVD/linux平台工具/MiniTools-USB下载工具 下可以找到 MiniTools-Linux-20150528.tgz

如果没有找到,可以到 FriendlyARM-2440-DVD/windows平台工具/MiniTools-USB下载工具 下找找看。

如果依然没有找到,可以找某宝客服要,也欢迎在文末评论区留言获取。

将获取到的压缩文件解压到适合的位置,我将所有mini2440板子涉及的东西都放在了 ~/board-workspace/mini2440 目录下。

1
2
3
4
$ pwd
/home/dhd/board-workspace/mini2440/minitools
$ ls
icon.png language-cn.qm MiniTools MiniTools_x64 settings.ini start.sh

配置minitools

运行minitools需要依赖qtwebkit4库,先安装。

1
$ sudo apt install libqtwebkit4

这里有一个 start.sh 脚本文件用于启动,原先的start.sh使用sudo启动MiniTools,在Ubuntu 18.04下会无法正常运行,我把sudo去掉之后运行正常。

1
2
3
4
5
6
7
8
9
$ diff start.sh start_old.sh 
7c7
< ./MiniTools_x64 1>/dev/null 2>/dev/null
---
> sudo ./MiniTools_x64 1>/dev/null 2>/dev/null
12c12
< ./MiniTools 1>/dev/null 2>/dev/null
---
> sudo ./MiniTools 1>/dev/null 2>/dev/null

烧写u-boot

运行minitools,用USB线连接开发板和电脑,从Nor Flash启动开发板,按以下步骤操作

  1. 点击Linux
  2. 选择u-boot镜像,FriendlyARM-2440-DVD/images/u-boot.bin
  3. 点击开始烧写

烧写u-boot

测试u-boot

连好串口线,运行minicom,从Nand Flash启动开发板,在串口终端快速按回车键即可进入u-boot交互模式。如下图所示:

测试u-boot

宿主机tftp和nfs服务

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

NFS(Network File System,网络文件系统)是基于UDP/IP协议的应用,最直观的说,它能让你把宿主机上的一个目录作为开发板所使用的文件系统,这样就可以方便地与开发板传输文件。

u-boot 可以通过 tftp 从宿主机上下载 linux 内核镜像并加载内核,通过一些参数设置(下文会详细介绍),可以让内核通过 nfs 挂载根文件系统,这样,就可以方便地测试内核和驱动代码。

tftp

tftp安装与配置

1
2
3
4
5
$ sudo apt install tftpd-hpa
$ sudo vim /etc/default/tftpd-hpa
### 修改配置文件中的 TFTP_DIRECTORY 为适合的目录,根据自己实际情况填写。
TFTP_DIRECTORY="/home/dhd/board-workspace/tftpboot"
$ sudo service tftpd-hpa restart

复制Linux镜像

官方光盘 FriendlyARM-2440-DVD/images/linux/ 目录下有 Linux 内核镜像,直接复制到 tftpboot 目录下。

1
$ cp ~/FriendlyARM-2440-DVD/images/linux/zImage_A70 ~/board-workspace/tftpboot/zImage

nfs

nfs安装与配置

1
2
3
4
5
$ sudo apt install nfs-kernel-server
$ vim /etc/exports
### 添加一行,其中的路径根据自己实际情况填写
/home/dhd/board-workspace/nfs/rootfs *(rw,sync,no_subtree_check)
$ sudo service nfs-kernel-server restart

解压并适当修改根文件系统

u-boot设置

u-boot 的命令行操作方式和 Linux 类似,可以输入各种命令来控制 u-boot, 输入 ?help 可以查看支持的命令。通过修改环境变量,可以在不修改源码的情况下方便的修改 u-boot 运行时的一些数据和特性。

命令

本文主要使用了以下几个 u-boot 命令

printenv

功能:打印所有环境变量
用法:printenv

setenv

功能:设置环境变量
用法:setenv <key> <value>,其中,key是变量名,value是变量值。如果value为空,则表示删除对应的环境变量

saveenv

功能:保存环境变量修改,使用setenv设置环境变量后不会掉电保存,需要保存后才不会丢失。
用法:saveenv

tftpboot

功能:通过tftp下载到内存
用法:tftpboot [memaddr] <filename>,其中,memaddr是内存地址,不填默认0x30008000filename是要下载的文件名。

bootm

功能:从指定内存位置加载内核
用法:bootm [memaddr],其中,memaddr是内存地址,不填默认0x30008000

环境变量

本文主要对以下几个环境变量进行修改

bootdelay

功能:设置uboot启动时等待用户输入的延时。单位是秒。

1
# setenv bootdelay 3

ipaddr serverip gatewayip netmask

功能:设置开发板网络,服务器ip,网关,子网掩码

这里我通过路由器连接了开发板网络,宿主机的ip为192.168.31.2, 开发板ip设置为192.168.31.3, 路由器ip为192.168.31.1.

这些环境变量的设置如下

1
2
3
4
# setenv ipaddr 192.168.31.3
# setenv serverip 192.168.31.2
# setenv gatewayip 192.168.31.1
# setenv netmask 255.255.255.0

设置完成后使用 ping 命令测试网络连通性

bootcmd

功能:设置开发板启动时默认执行的命令

1
# setenv bootcmd 'tftp 0x30008000 zImage; bootm 0x30008000'

bootargs

功能:给内核传递的启动参数

1
2
# setenv rootpath '/home/dhd/nfs/rootfs'
# setenv bootargs 'console=ttySAC0 init=/linuxrc root=nfs nfsroot=${serverip}:${rootpath},nolock,proto=tcp,nfsvers=3 ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}::eth0:off'

重启进入系统

上面的环境变量设置完成后,不要忘了用 saveenv 命令保存,然后重启开发板,不加干预直接进入系统。

结果