1. 前言
限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。
2. 背景
本文基于几年前开发Marvell A38x系列SoC的笔记整理,或有错漏之处,请读者仔细分辨。
3. 编译和下载
3.1 交叉编译环境搭建
(1) 在PC或虚拟机中安装 ubuntu 14.04 lts server版本
(2) 在ubuntu系统下解压交叉编译器工具包 armv7-marvell-linux-gnueabi-hard-4.6.4_64K_i686_20150204.tar.bz2
(3) 拷贝envsetup.sh 脚本到ubuntu系统
至此,交叉编译工具链已就绪。
3.2 编译
在第一次编译 u-boot, linux, busybox, mkyaffs2image
等之前,先编辑 envsetup.sh 脚本,将变量
CROSS_COMPILE
CROSS_COMPILE_BH
修改为步骤 3.1 中
armv7-marvell-linux-gnueabi-hard-4.6.4_64K_i686_20150204.tar.bz2
解压后bin目录的路径。每次编译前,启动 shell 命令行,运行命令:
. envsetup.sh
导入编译环境变量。
3.2.1 编译 u-boot
(1) 解压包 u-boot-2013.01-2015_T1.0-20170721.tar.bz2
到 ubuntu 系统;
(2) 启动shell命令行,切换到解压后的代码目录,运行命令 ./mkuboot.sh
,然后会出现如下提示:
请根据目标板的情况输入1-6
中的一个数字。各选项的含义可参照下面的解释。如选项 1
:
1. nand-boot, ddr x 2(512MiB), rootfs=ramdisk
代表的含义是:
. 从NAND FLASH设备启动
. 2颗DDR,512MiB容量
. 内核根文件系统类型为ramdisk
其它选项的含义依此类推。
(3) 编译完成后会生成如下文件名按如下格式组织的 u-boot 程序
u-boot-a38x-ddrxDDR_NUM-ROOT_FS_TYPE-BOOT_DEVICE.bin
其中:
. DDR_NUM: 2, 4
. ROOT_FS_TYPE: ramdisk, yaffs2
. BOOT_DEVICE: nand, mmc
如在运行编译命令 mkuboot.sh
选择选项 1
是会生成如下2个bin文件
其中 u-boot-a38x-ddrx2-ramdisk-nand.bin
是最终要下载到目标板的程序。至此,u-boot 编译完毕。此处我们对编译脚本 build.pl
进行了修改,所以和原始厂家SDK的显示菜单不尽相同。
3.2.2 编译 Linux 内核
(1) 解压包文件 linux-3.10.70-2015_T1.1-20170721.tar.bz2
到 ubuntu 系统;
(2) 启动shell命令行,切换到解压后的代码目录,运行命令序列
make mrproper
make mvebu_lsp_defconfig
./mkkernel.sh
(3) 编译完成后在 output
目录下会生成两个文件
其中zImage
是kernel镜像,armada-385-customer0.dtb
为dts生成的dtb文件。
当前kernel对应的dts文件为arch/arm/boot/dts/armada-385-customer0.dts
,在使用ramdisk
和yaffs2格式根文件系统
时要对启动参数bootcmd
作细微调整。
如果是ramdisk作为根文件系统:
如果是yaffs2作为根文件系统:
至此,linux 内核编译完成。
3.2.3 编译busybox + yaffs工具 + 制作根文件系统
3.2.3.1 编译 busybox
(1) 解压包文件 busybox-1.23.2-ramdisk+yaffs2-20170717.tar.bz2
到 ubuntu 系统;
(2) 启动 shell 命令行,切换到解压后的代码目录,运行命令序列
make
make install
(3) 编译后产生的文件在 _install
目录下,它们将作为根文件系统的一部分,包含 init脚本
和 init
等重要程序。
3.2.3.2 编译yaffs/yaffs2根文件系统打包工具
(1) 解压包文件 yaffs2-20170717.tar.bz2
到 ubuntu 系统;
(2) 启动 shell 命令行,切换到解压后的代码目录 yaffs2/utils/
,运行命令
make
(3) 编译后可看到目录下生成了mkyaffsimage
和 mkyaffs2image
2个工具。
注:如果是制作ramdisk
根文件系统,可忽略上面3个步骤。
3.2.3.3 制作根文件系统
(1) 启动 shell 命令行,切换到busybox
源码根目录,运行命令
./mkramdisk.sh
制作ramdisk格式根文件系统,运行后在当前目录下生成文件 ramdisk.img
。
(2) 运行命令
./mkyaffs2.sh
制作yaffs2格式根文件系统,运行后在当前目录下生成文件rootfs.yaffs2
。
3.3 下载
3.3.1 搭建tftp下载服务器
3.3.1.1 Windows系统环境
运行 并参照下图做出配置
下载文件路径
是你要下载的文件目录,里面存放要下载到目标的程序如u-boot,kernel,dtb,rootfs
等;另外,本机IP地址
就是你运行tftp32.exe
程序机器的ip地址。
3.3.1.2 Linux系统环境
tftp服务器搭建在网上有很多教材可以参考,在此不作赘述。
3.3.2 Windows下载文件(u-boot,kernel,dtb,rootfs)演示
要下载到目标板的程序包含4部分:
u-boot
kernel
dtb
rootfs
(1) 如下图连接开发板
(2) 在Windows启动tftp服务器程序并做好配置,如下图所示
(3) 启动串口工具如SecureCRT
等,并连接配置好串口设备,波特率设置为115200
(4) 连通目标板电源,同时快速敲击键盘任意键,以停止u-boot auto-boot模式
在看到 Marvell>>
的提示符表示操作成功,否则请重新上电,直到看到类似上面图片所示画面为止。
(5) 配置u-boot tftp下载相关环境变量(非常重要)。首先请确保目标板能连接到tftp服务器,运行下列命令检查u-boot默认网络配置:如果serverip
和你tftp服务器的ip
不同,请用命令
setenv serverip xx.xx.xx.xx
将u-boot环境变量设置成你的tftp服务器ip
。另外,ipaddr,netmask
也要根据实际的网络情况配置成合适的值。总之,一定要确保tftp服务器和目标板能够正常通信
。
(6) 通过tftp下载程序。下载命令根据启动方式不同而有所不同:
#
# 如果从NAND启动时,下载命令序列如下:
#
# 下载u-boot
tftp 2000000 <u-boot-file-name>
nand erase 0 <u-boot-file-size>
nand write.e 2000000 0 <u-boot-file-size>
reset
# 下载kernel
tftp 2000000 <kernel-image-file-name>
nand erase 200000 <kernel-image-file-size>
nand write.e 2000000 200000 <kernel-image-file-size>
# 下载kernel dtb
tftp 2000000 <dtb-file-name>
nand erase 800000 <dtb-file-size>
nand write.e 2000000 800000 <dtb-file-size>
# 下载rootfs
tftp 2000000 <rootfs-image-file-name>
nand erase A00000 <rootfs-image-file-size>
nand write.e 2000000 A00000 <rootfs-image-file-size>
上面所有指定文件大小XXX-file-size
的地方都是以字节为单位
,指定的字节数可以大于或者等于实际的文件字节数,且所有的数字都是十六进制
的。
#
# 如果从eMMC启动时,下载命令序列如下:
#
# 下载u-boot
tftp 2000000 <u-boot-file-name>
mmc write 0x2000000 0x0 <sectors-number-of-u-boot-file>
# 下载kernel
tftp 2000000 <kernel-image-file-name>
mmc write 0x2000000 0x1000 <sectors-number-of-kernel-image-file>
# 下载kernel dtb
tftp 2000000 <dtb-file-name>
mmc write 0x2000000 0x4000 <sectors-number-of-dtb-file>
# 下载rootfs
tftp 2000000 <rootfs-image-file-name>
mmc write 0x2000000 0x5000 <sectors-number-of-rootfs-image-file>
上面所有指定文件大小的sectors-number-of-XXX
都是以sector
为单位,文件大小字节数换算成sector的公式如下:
sectors-number-of-file = bytes-of-file / 512
如果相除的结果有余数,要把相除再加1,也就是把文件大小向上对齐到512个字节
。同样,指定的sector数可以大于等于文件的实际sector。
上面给出的一般格式,下面给出2个具体的例子。如
# 从NAND启动、DDR x 4、yaffs2根文件系统,下载命令序列如下:
tftp 2000000 u-boot-a38x-ddrx4-yaffs2-nand.bin
nand erase 0 200000;nand write.e 2000000 0 200000
reset
tftp 2000000 zImage
nand erase 200000 600000
nand write.e 2000000 200000 600000
tftp 2000000 armada-385-customer0.dtb
nand erase 800000 200000
nand write.e 2000000 800000 200000
tftp 2000000 rootfs.yaffs2
nand erase A00000 2184000
nand write.yaffs2 2000000 A00000 2184000
reset
# 从eMMC启动、DDR x 2、ramdisk根文件系统
tftp 2000000 u-boot-a38x-ddrx2-ramdisk-mmc.bin
mmc write 0x2000000 0x0 0x1000
reset
tftp 2000000 zImage;mmc write 0x2000000 0x1000 0x3000
tftp 2000000 armada-385-customer0.dtb
mmc write 0x2000000 0x4000 0x1000
tftp 2000000 ramdisk;mmc write 0x2000000 0x5000 0x2000
reset
最后的reset
命令是下载完成后重启系统并运行。
注意到多条u-boot命令
是可以通过;分隔
的形式一次性输入格式如下:
uboot-cmd-1[;uboot-cmd-2[;...]]