一、基本开发环境
交叉编译工具链版本为4.5.1
u-boot为友善之臂提供:https://github.com/friendlyarm/uboot_tiny4412
linux内核版本为3.5,友善之臂提供
busybox版本为1.17.2,去官网下载
linux下的dnw工具:https://download.csdn.net/download/tech_pro/10405993
PC机版本为:Ubuntu12.04 64bit
二、编译u-boot和生成BL2的工具
2.1 编译u-boot
cd uboot_tiny4412/
make tiny4412_config
make
2.2 编译生成BL2的工具
cd sd_fuse
make
或
make -C sd_fuse
三、编译内核
tar xzf linux-3.5-20150929.tgz
cd linux-3.5/
cp tiny4412_linux_defconfig .config
make menuconfig:去掉 Support TrustZone-enabled Trusted Execution Environment
make zImage
四、制作根文件系统
4.1 根文件系统构建
4.1.1 编译、安装busybox
tar xzf busybox-1.17.2-20101120.tgz
make menuconfig :添加交叉编译选项(arm-linux-)
make
make CONFIG_PREFIX=/work/nfs_root/francis_linux_fs install
4.1.2 安装lib库
通过在工具链的安装目录中执行:find -name *lib* 命令找到库的目录,本人使用的工具链的目录是:
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/lib
将工具链中lib库拷贝到自己的根文件系统中:
mkdir lib
mkdir usr/lib
cd /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib
cp *so* /work/nfs_root/francis_linux_fs/usr/lib -d
cd /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/lib
cp *so* /work/nfs_root/francis_linux_fs/lib -d
4.1.3 构建etc目录
a、创建inittab文件,填入如下内容:
1 # /etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::ctrlaltdel:/sbin/reboot
5 ::shutdown:/bin/umount -a -r
b、在etc目录下创建init.d目录,并在init.d目录下创建一个rcS脚本文件,文件内容如下:
1 #!/bin/sh
2 mount -a
3 mkdir /dev/pts
4 mount -t devpts devpts /dev/pts
5 echo /sbin/mdev > /proc/sys/kernel/hotplug
6 mdev -s并给这个文件加上可执行权限:chmod +x rcS
c、在etc目录下创建fstab文件, 填入如下内容:
1 # device mount-point type options dump fsck order
2 proc /proc proc defaults 0 0
3 tmpfs /tmp tmpfs defaults 0 0
4 sysfs /sys sysfs defaults 0 0
5 tmpfs /dev tmpfs defaults 0 0
4.1.4 构建dev目录,在这个目录下添加两个设备文件:console和null,执行如下命令
sudo mknod console c 5 1
sudo mknod null c 1 3
4.1.5 构建其他目录
mkdir proc sys tmp mnt root
4.2 根文件系统镜像文件制作
dd if=/dev/zero of=francis_linux_fs_64M.img bs=1M count=64
sudo losetup /dev/loop0 francis_linux_fs_64M.img
sudo mkfs.ext4 /dev/loop0
cd /work/nfs_root/francis_linux_fs/
sudo mount /dev/loop0 /mnt
sudo cp * -rfd /mnt
sudo umount /mnt
sudo losetup -d /dev/loop0
五、烧写u-boot
为了将u-boot烧写到emmc中,有两个准备工作要做:烧写u-boot到SD卡中和对emmc进行格式化并分区。
5.1 烧写u-boot到SD卡中
首先将SD卡通过读卡器插入电脑,让linux主机可以识别它,可以通过ls -l /dev/sd*命令来查看具体的SD卡所对应的块设备名称,本主机识别的SD卡的设备名为/dev/sdc;然后在u-boot的根目录中执行以下命令来烧写u-boot到SD卡中:
cd sd_fuse/tiny4412
sudo ./sd_fusing.sh /dev/sdc
5.2 对emmc进行分区和格式化
fdisk -c 1 320 2057 520
fatformat mmc 1:1
ext3format mmc 1:2
ext3format mmc 1:3
ext3format mmc 1:4
5.3 从SD卡启动u-boot并通过dnw工具来下载u-boot到emmc中
5.3.1 安装dnw工具在linux主机上
tar xzf dnw-linux.tar.gz
cd dnw-linux/
make
cd src/driver/
sudo insmod secbulk.ko:如果不配置linux,则每次重启linux时都需要加载这个驱动
cd ../dnw/
sudo cp dnw /usr/local/bin
5.3.2 通过dnw把u-boot下载到emmc中
首先需要制作bl2.bin这个文件,进入u-boot根目录下的sd_fuse目录,执行如下命令:
./mkbl2 ../u-boot.bin bl2.bin 14336 然后将u-boot下载到emmc中,执行如下命令:
Board: emmc open 1
Board: dnw
PC : sudo dnw sd_fuse/tiny4412/E4412_N.bl1.bin
Board: mmc write 1 0xc0000000 0 0x10
Board: dnw
PC : sudo dnw sd_fuse/bl2.bin
Board: mmc write 1 0xc0000000 0x10 0x1C
Board: dnw
PC : sudo dnw u-boot.bin
Board: mmc write 1 0xc0000000 0x30 0x21D
Board: dnw
PC : sudo dnw sd_fuse/tiny4412/E4412_tzsw.bin
Board: mmc write 1 0xc0000000 0x2c0 0xB8
Board: emmc close 1
六、通过fastboot烧写内核和根文件系统
将开发板设置为emmc启动,在u-boot命令行模式下让开发板执行:fastboot
在PC机上(装有fastboot命令,这个可以百度搜索)执行下面命令下载内核和根文件系统镜像:
fastboot flash kernel zImage
fastboot flash fat francis_linux_fs_64M.img
fastboot reboot
在u-boot下设置一下启动参数:
set bootargs "root=/dev/mmcblk0p1 rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc ctp=2 lcd=S70"
set bootcmd "movi read kernel 0 0x40008000; bootm 0x40008000"
save
最后在u-boot命令行模式下输入boot命令直接启动linux系统或者重启来启动linux系统。
七、开发板挂接NFS文件系统
首先要确保linux主机安装有NFS服务,并且在配置文件中将自己制作的根文件系统目录添加进去,在u-boot的启动参数中要设置一下参数(IP地址和服务器IP地址要根据实际情况来设置,保证它们在同一个网段):
set ipaddr 10.66.13.11
set gatewayip 10.66.13.1
set serverip 10.66.13.60
set bootargs "root=/dev/nfs nfsroot=10.66.13.77:/work/nfs_root/francis_linux_fs ip=10.66.13.11 console=ttySAC0,115200 lcd=S70 ctp=2"
save 这样就可以使用NFS服务从linux主机上来挂载文件系统了。