一、引言
最近在学习Linux,拿到了一块米尔科技的MYD-AM335x开发板。拿到板子按着官方给的手册一步一步搭建开发环境,结果在编译文件系统是一直不通过,困惑了我很久,参考了一个大佬写的教程,初探MYD-AM335x开发板_fisheader的博客-CSDN博客_am335x开发板资料,大家可以先参考大佬的教程。但我在编译的时候还是遇到了一个问题,所以写下这篇文档记录一下,以后遇到同样的问题也可以参考一下。
二、设置开发工具
2.1 安装需要的开发工具
我的ubuntu 版本是ubuntu 16.04 LTS版本。
$ sudo apt-get install build-essential git-core libncurses5-dev u-boot-tools
$ sudo apt-get install flex bison texinfo zip unzip zlib1g-dev gettext
$ sudo apt-get install gperf libsdl-dev libesd0-dev
$ sudo apt-get install g++ xz-utils
$ sudo apt-get install subversion
需要注意的是在64位的系统上,需要安装32位兼容的库。
$sudo apt-get install libc6-i386 lib32stdc++6 lib32z1
2.2 设置交叉编译工具
需要先在自己的目录下创建本地的 WORKDIR 文件夹,将官方给的资料料04-Linux_Source文件夹中的文件全部拷贝到WORKDIR文件夹中。
输入以下指令设置交叉编译工具。
$ cd WORKDIR/Toolchain
$ tar xvf gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf.tar.xz
临时修改环境变量 该设置只对当前终端有效
$ export PATH=$PATH:/home/longge/WORKDIR/Toolchain/gcc-linaro-5.3-2016.02-x86_64_arm-linux -gnueabihf/bin
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
注意在修改PATH时要把路径改为你自己的路径。
永久修改环境变量 对所有用户都有效
如果还不会用vi/vim,可以使用gedit打开文件,一样的效果
vi ~/.profile
在行尾添加:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/longge/WORKDIR/Toolchain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin
然后输入source ~/.profile或重启ubuntu使环境变量生效
测试环境变量是否更新成功
$echo $ARCH
arm
$echo $CROSS_COMPILE
arm-linux-gnueabihf
测试结果如图,说明环境变量更新成功。
交叉编译器的验证:
$ arm-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
……
Thread model: posix
gcc version 5.3.1 20160113 (Linaro GCC 5.3-2016.02)
测试结果如图说明交叉编译器配置成功
三、构建系统
3.1 Bootloader
进入Bootloader目录,解压U-boot源码:
$ cd WORKDIR/Bootloader
$ tar -jxvf myir-u-boot.tar.bz2
$ cd myir-u-boot
不同的开发板对应不同的配置文件,配置文件位于myir-u-boot/configs/目录 我使用的使AM335x开发板,对应的是myd_c335x_defconfig。 编译时可以使用多线程编译,更快。
u-boot的编译过程:
$ make distclean
$ make myd_c335x_defconfig
$ make -j8
编译完成后,在u-boot目录下会生成MLO和u-boot.img文件
3.2 编译Linux内核
进入Kernel目录,解压内核源码:
$ cd WORKDIR/Kernel
$ tar -jxvf myir-kernel.tar.bz2
$ cd myir-kernel
不同的开发板对应不同的配置文件,配置文件位于myir-kernel/arch/arm/configs/目录,这里还是编译myd_c335x_defconfig
编译内核,注意事项
- 需配置环境变量 INSTALL_MOD_PATH
- 内核修改后,内核模块要和内核 zImage 一起编译
$ export INSTALL_MOD_PATH=$HOME/export/rootfsa/
$ make distclean
$ make myd_c335x_defconfig
$ make zImage dtbs -j8
$ make modules -j8
$ make modules_install -j8
建议使用多线程编译,不然要好长时间。编译完成后,会在myir-kernel/arch/arm/boot目录下生成zImage文件,在myir-kernel/arch/arm/boot/dts目录下生成设备树的二进制.dtb文件。
3.3 构建文件系统
使用Buildroot进行文件系统的制作
3.3.1 准备编译buildroot
进入Filesystem目录,解压文件系统压缩包
$ cd WORKDIR/Filesystem/
$ tar -jxvf myir-buildroot.tar.bz2
$ cd myir-buildroot/
$ make myd_c335x_defconfig
打开配置界面
$ make menuconfig
注意:配置界面是在/Filesystem/myir-buildroot/目录下打开的,打开后先不要动,新打开一个终端配置bootloader代码来源和kernel代码来源
配置bootloader代码来源
$ cd WORKDIR/Bootloader/myir-u-boot
$ git init
$ git add . -f
$ git commit -m "Initial Version" -a
配置kernel代码来源
$ cd WORKDIR/Kernel/myir-kernel
$ git init
$ git add . -f
$ git commit -m "Initial Version" -a
输入git init可以查看本地git仓库的路径
配置界面-Kernel将Kernel Version路径替换成本地git仓库的路径
配置界面-Bootloaders将U-boot Version路径替换成本地git仓库的路径
配置界面-Build options将config文件路径替换成本地的路径
完成以后,退出配置界面,提示保存,点击OK
最后编译
$ make -j8
在编译过程中我遇到了一个问题
这是以为iperf-2.0.9 文件的hash值改变了,找到对应的hash文件修改hash值即可
iperf.hash文件在 WORKDIR/Filesystem/myir-buildroot/package/iperf/目录下,需要修改sha1和sha256的值,修改后的值如下
# From https://sourceforge.net/projects/iperf2/files/
sha1 59820895df9106ba189ccfdc5677077535ad50e7 iperf-2.0.9.tar.gz
# Locally computed:
sha256 db02911f35686e808ed247160dfa766e08ae3f59d1e7dcedef0ffb2a6643f0bf iperf-2.0.9.tar.gz
修改后,继续make ,在 WORKDIR/Filesystem/myir-buildroot/output/images 下得到bootloader,kernel,以及各种格式的文件系统镜像。
四、系统更新
使用NAND Flash启动
Nand启动映像的更新需要借助于u-boot来完成。不管NAND Flash是否有数据,都可以利用TF卡启动的u-boot 对NAND Flash更新映像。
TF卡制作
- 用光盘目录03-Tools目录下的HP USB Disk Storage Format Tool 2.0.6工具将TF卡格式化为FAT或FAT32文件系统
- 将光盘目录02-Images\Linux-image目录下的映像文件拷贝到TF卡中
- 将自己的MLO,u-boot.img,zImage,myd_c335x.dtb,rootfs.ubi文件拷贝到TF卡进行替
- 将带有系统映象的TF卡插入开发板,连接对应板子设置启动方式的跳线帽的1-2脚,上电启动,在u-boot 的提示读秒处,按下键盘上任意键进入u-boot
出现MYIR>#表示进入u-boot命令行
U-Boot 2016.05 (Jan 09 2017 - 19:37:43 +0800) Watchdog enabled I2C: ready DRAM: 512 MiB NAND: 512 MiB MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1 *** Warning - bad CRC, using default environment Net: cpsw Press SPACE to abort autoboot in 2 seconds
MYIR>#
进入u-boot命令行后,输入run updatesys
MYIR># run updatesys
switch to partitions #0, OK mmc0 is current device reading MLO 55092 bytes read in 10 ms (5.3 MiB/s) NAND write: device 0 offset 0x0, size 0xd734 55092 bytes written: OK reading myd_c335x.dtb 39229 bytes read in 10 ms (3.7 MiB/s)NAND write: device 0 offset 0x80000, size 0x993d 39229 bytes written: OK reading u-boot.img 321300 bytes read in 34 ms (9 MiB/s) NAND write: device 0 offset 0xc0000, size 0x4e714 321300 bytes written: OK reading zImage 4480016 bytes read in 396 ms (10.8 MiB/s) NAND write: device 0 offset 0x200000, size 0x445c10 4480016 bytes written: OK reading rootfs.ubi 24248320 bytes read in 2111 ms (11 MiB/s) NAND write: device 0 offset 0xa00000, size 0x1720000 24248320 bytes written: OK
MYIR>#
再次出现MYIR>#,断电拔出TF卡,连接对应板子设置启动方式的跳线帽的2-3脚,重新上电,即可从Nand Flash启动,输入账户名root登录