1、要用到的
GCC编译器的环境: gcc4.6.4
Ubuntu版本:ubuntu14.04 或ubuntu16.04
Uboot版本:uboot2013.01
内核版本:Kernel-3.14.0
nfs:NFS(网络文件系统)为开发板和linux主机之间的通讯
tftp:tftp服务器用来实现开发板和linux主机之间文件的下载和上传
硬件平台:Cortex-A9(fs4412)、ZigBee,STM32,电脑主机(x86 x64)
软件环境:Keil、Ubuntu、 代码管理工具、超级终端、(Putty、xshell) SecureCRT、Git、 Source Insight 4.0
2、交叉编译环境搭建
64位系统的安装需要先安装如下两个包:
/bash/… path/arm-none-linux-gnueabi-gcc not fount
sudo apt-get install lib32z1 lib32ncurses5
2.1、解压工具链
下载地址 http://gcc.gnu.org/
cd ~
mkdir toolchain
cd toolchain
将下载的交叉编译工具/gcc-4.6.4.tar.xz拷贝到toolchain目录下并解压
$ tar xvf gcc-4.6.4.tar.xz
2.2、添加环境变量
修改文件/etc/bash.bashrc
sudo vim /etc/bash.bashrc
export PATH=$PATH:/home/wxx/SecurityMonitor/toolchain/gcc-4.6.4/bin
重启配置文件
source /etc/bash.bashrc
2.3、查看环境变量
wxx@wxx:~/SecurityMonitor$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/wxx/SecurityMonitor/toolchain/gcc-4.6.4/bin/
2.4、测试
$ arm-none-linux-gnueabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-none-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/home/wxx/Linux_4412/toolchain/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper
Target: arm-arm1176jzfssf-linux-gnueabi
Configured with: /work/builddir/src/gcc-4.6.4/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-arm1176jzfssf-linux-gnueabi --prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4 --with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --with-pkgversion='crosstool-NG hg+default-2685dfa9de14 - tc0002' --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --without-long-double-128 --disable-nls --disable-multilib --with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 - tc0002)
3、tftp环境搭建
用途: uImage (内核)、 exynos4412-fs4412.dtb(设备树)文件都可以通过tftp从Ubuntu所在的tftp服务器端来加载
板子 : 客户端
Ubuntu : 服务器端 C-S
3.1、安装tftp服务器
首先检查tftp服务器是否存在: dpkg -s tftpd-hpa
若未安装:sudo apt-get install tftpd-hpa tftp-hpa
通过安装时的打印信息,来确定在etc目录下的配置文件
3.2、配置文件修改
sudo vi /etc/default/tftpd-hpa
#/etc/default/tftpd-hpa
#用户名
TFTP_USERNAME="tftp"
#你的tftp服务器所在的路径
TFTP_DIRECTORY="/home/linux/tftpboot"
#tftp服务器的网关和端口号
TFTP_ADDRESS="0.0.0.0:69"
#tftp 文件服务器的可供选择的权限, get file\ put file \ list file
TFTP_OPTIONS="-l -c -s"
3.3、创建tftp服务器所在的路径
mkdir /home/linux/tftpboot -p //和配置文件的名字和路径必须保持一致
chmod 777 tftpboot //修改tftp服务器文件夹的权限
3.3、重启tftp服务器
~$ sudo service tftpd-hpa restart
tftpd-hpa stop/waiting
tftpd-hpa start/running, process 6439
板子启动加载内核的时候经常遇到TTTTTTT… 可能原因有
- 网络不通
- ping不通,网络配置有关
- tftp服务器没有启动
3.4、本地回环测试
tftp 127.0.0.1
tftp>get main.c //下载文件从tftpboot目录下 (保证tftpboot目录下有你要下载的文件)
tftp>put while.c //上传文件到tftpboot目录下 (保证当前目录有你要上传的文件)
tftp>q //退出
查看当前文件目录,可以看到从tftpboot目录下载的main.c文件,打开tftpboot目录,可以看到while.c文件
3.5、常见问题
1. tftp>get file
Transfertimed out.
原因: tftpd服务没有启动,重启tftp服务器:sudo service tftpd-hpa restart
2.tftp>get file
Errorcode 2: Only absolute filenames allowed
原因:在/etc/xinetd.d/tftpd中设置的server_args为/etc/default/tftpd-hpa
3. tftp>put file
Errorcode 1: File not found
原因:当前目录下指定的文件file不存在;或tftpd启动参数中没有指定-c选项,允许上传文件
4、nfs环境搭建
用途:通过nfs挂载根文件系统,/nfsroot=… 内核起来的时候,在最后会加载文件系统,(根据你的参数去加载文件系统)
4.1、安装
sudo apt-get update //更新一下源
sudo apt-get -f install //更新一下依赖
sudo apt-get install nfs-kernel-server //如果不存在,就在线下载并安装
4.2、修改配置文件
mkdir ~/source
cp rootfs.tar.gz .
tar xvf rootfs.tar.gz //解压
//当前目录下的文件
linux@ubuntu:~/source$ ls
rootfs rootfs.tar.xz
//修改配置
sudo vim /etc/exports
添加如下内容:
/home/linux/source/rootfs *(rw,sync,no_subtree_check,no_root_squash)
路径==>nfs路径===>nfs又是什么? 一个路径*四个参数
其中:
/home/linux/source/rootfs:共享的目录;
*:不限定客户端;
rw:共享目录可读可写;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
no_root_squash:来访的root用户保持root帐号权限;
4.3、重启nfs服务器
sudo /etc/init.d/nfs-kernel-server restart
5、uboot引导盘制作
目标:能引导加载内核
烧写工具默认从 0 扇区开始烧写,这里我们自己在 uboot 之前放一个 512 字节的空镜像
-
将资料中“u-boot 镜像”中的 u-boot-fs4412.bin 拷贝到 ubuntu 的家目录下
-
在终端输入如下命令,制作一个 512 字节的空镜像
$ sudo dd if=/dev/zero of=zero.bin count=1
显示如下信息,则表示制作成功
-
执行如下命令,将 uboot 追加到 zero.bin 之后生成 win-u-boot-fs4412.bin
$ cat zero.bin u-boot-fs4412.bin > win-u-boot-fs4412.bin
-
再执行如下命令,制作一个 1M 的空镜像(用于擦除 SD 卡中原有的数据)
$ sudo dd if=/dev/zero of=clear.bin count=2048
-
把生成的 win-u-boot-fs4412.bin 和 clear.bin 拷贝到 windows 下
-
将 SD 卡插入到电脑上(卡槽/USB 读卡器均可),使其在 windows 下识别(若不识别,可能是已经在 ubuntu 中识别了,在可移动设备中将其断开即可)
-
使用“Win32DiskImager”进行镜像文件的烧写
-
在弹出的界面中先选择要烧写的镜像文件(clear.bin),然后选择要烧写的设备(SD 卡)最后单击“Write”进行烧写
-
在弹出的对话框中单击“Yes”
-
在弹出的对话框中单击“OK”完成烧写
因为 clear.bin 为空镜像,所以写入后 SD 卡中的前 2048 个扇区中的数据被擦除 -
再选择 uboot 镜像完(win-u-boot-fs4412.bin),然后单击“Write”进行烧写
-
在弹出的对话框中单击“Yes”
-
在弹出的对话框中单击“OK”完成烧写
-
将 SD 卡插入开发板的卡槽,调整拨码开关为 SD 卡启动,查看 uboot 是否能正常启动
注:uboot 正常启动后 LED2 灯会点亮且终端上也会打印 uboot 相关的信
6.SecureCRT串口配置
配置Port端口(COM3)要与计算机中设备管理的端口号一致
配置适合的波特率Baud rate一般设置为115200,配置成功点击connect
7、uboot环境变量设置
7.1、板子上电
Checking Boot Mode ... EMMC4.41
Net: dm9000
Hit any key to stop autoboot: 0
FS4412 # (能进入到这里)
7.2、uboot环境变量设置
输入printenv
set serverip 192.168.1.200
set ipaddr 192.168.1.100
set gatewayip 192.168.1.1
setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000
setenv bootargs root=/dev/nfs nfsroot=192.168.1.200:/home/fengjunhui/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.100
(C --- S ) Client Server
setenv bootargs(传递给内核的启动参数) root=/dev/nfs(根文件挂载方式)192.168.1.200:/home/fengjunhui/source/rootfs rw console(制定打印信息的终端)=ttySAC2,115200(内核向串口输入信息)init=/linuxrc(指定内核运行第一个程序(缺省则从/sbin/init启动)) ip=192.168.1.100(指定本机ip) (超级终端显示如下图)
saveenv(保存到emmc中)一定要保存呐!!!
查看环境变量信息:
FS4412 # pri
gatewayip=192.168.1.1
baudrate=115200
bootargs=root=/dev/nfs nfsroot=192.168.1.200:/home/fengjunhui/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.100
bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000
bootdelay=3
ethact=dm9000
ethaddr=11:22:33:44:55:66
gatewayip=192.168.1.1
ipaddr=192.168.1.100
netmask=255.255.255.0
serverip=192.168.1.200
stderr=serial
stdin=serial
stdout=serial
Environment size: 474/16380 bytes
测试引导镜像启动:
fengjunhui@ubuntu:~/tftpboot$ ls
examples.desktop exynos4412-fs4412.dtb uImage (保证无误)
FS4412 # boot
dm9000 i/o: 0x5000000, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 11:22:33:44:55:66
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.200; our IP address is 192.168.1.100
Filename 'uImage'.
Load address: 0x41000000
Loading: T #################################################################
380.9 KiB/s
done
Bytes transferred = 3705424 (388a50 hex)
.......
VFS: Mounted root (nfs filesystem) on device 0:10.
[ 3.550000] devtmpfs: mounted
[ 3.550000] Freeing unused kernel memory: 240K (c0677000 - c06b3000)
[root@farsight ]# ok,成功进入文件系统。
好,到这里咱们基本的环境配置就OK了。