BeagleBone 刚买没两天,里面配的是AngStorm 系统,也是基于Linux 内核的一种嵌入式发行版本,这里就不展开了,另有文章介绍。这里要说的是BuildRoot ,Why BuildRoot? 吸引我的首先是其对BeagleBone 的原生支持,不需要我另行移植了;其次是其大小,相较于Angstrom 与 Ubuntu 的体积来说,BuildRoot 真是非常袖珍,除去大家都一样的bootloader 与 Kernel 不算,根文件系统只有4MB 左右,还包括了uClibc…… 当然我们可以在编译的时候指定第三方的编译环境,比如Ti SDK 或是 cross-N,libc 也可以使用诸如eglibc 和 标准的glibc,这都不是问题。更详细的介绍参见其官方网站 http://buildroot.uclibc.org/ ,此项目到目前为止还在维护中。
图-1 BuildRoot 组成
下面详细记录一下编译BuildRoot FOR BeagleBone 的过程。
(1) 首先当然是去BuildRoot 官网下载最新版本的BuildRoot 了,这个不细说。
(2) 阅读BuildRoot 介绍文档,总共30来页,认真读,往后会在使用过程中节约不少时间。
(3) 下载BuildRoot 的必备软件,ubuntu 12.04下执行命令“sudo apt-get install git-core bison flex g++ gettext texinfo libncurses5-dev”. 当然了svn 什么的最好也下载下来,因为BuildRoot 会自动下载一些软件源码,git svn 什么的都是必要的;curses 是为了执行make menuconfig 的,要使用xconfig qt 运行时库也是必不可少的。
(4) OK,在BuildRoot 根目录中执行“make *-config”命令,效果是从configs 目录中选取一个默认配置文件对BuildRoot 进行粗配置。这里我们使用“make beaglebone_defconfig”选取针对beaglebone 的配置。其实这一步过后就可以执行“make” 编译整个开发环境与Linux 操作系统与 根文件系统了,但此时我们还可以针对Linux 内核与 根文件系统进行一些配置。我在这里执行“make menuconfig” 添加了GDB-server,配置C 库 对线程和IPv6 的支持。哦,差点忘了说,如果不想生成只读的文件系统的话,要修改图二最后一张图中的选项。
(5) 根据需要使用“make linux-menuconfig | uclibc-menuconfig | busybox-menuconfig”对内核,c库或是busybox 进行配置。
(6) 执行make ,然后喝杯茶,洗个澡,睡一觉,陪女朋友(没女朋友的陪老妈)看场电影(悲惨世界不错),嗯,可能就执行完毕了。此时,可以在output/images 文件夹下看到生成的四个文件,如图-1 所示。
(7) 准备一张MicoSD card,至少将其分两个区(我们使用DOS形式的分区格式,分区为主分区),一个存放bootloader与内核(好吧,内核你也可以存放在第二个分区中,甚至你也可以只要一个分区,这取决于你的人生态度……扯远了),一个存放根文件系统。Linux 中可以使用sfdisk 命令完成。比如使用:
sudo sfdisk -H 255 -S 63 /dev/XXXXXX << EOF 0,9,c,* ,124 EOF
sudo mkfs.vfat /dev/XXXXXX -n boot
这样分区就完成了。
(8) 将第(6)步中生成的文件拷贝到分区中。
# Copy the bootloaders and the Linux kernel cp MLO u-boot.img uImage /media/boot # Copy the root file system (replace sdd2 with the second partition of right # device) sudo dd if=rootfs.ext2 of=/dev/sdd2 bs=128k
注意MLO一定要是boot分区中的第一个文件,其他的拷贝次序没什么大的关系。 还有,这里我们使用dd 直接将根文件系统写入SD card 的分区中,我不太建议这么做…… 好的办法是先使用分区工具将SD 的第二个分区格式化成ext2 格式,而后解压rootfs.ext2,将解压后的文件全部拷入新分区中,OK,大功告成!将SD CARD 插入BeagleBone ,重启开发板!等等,问题来了……
(9) 配置uEnv.txt 文件。OK,我承认是我错误的将uImage 放到第一个分区中才导致uBoot 加载不了kernel 的,但使用uEnv.txt 可是让我们配置自己想要的启动效果,从NFS 启动也未尝不可。先来看看hardcode 的bootcmd 是什么样子的:
if mmc rescan ${mmcdev}; then
echo SD/MMC found on device ${mmcdev};
if run loadbootenv; then
echo Loaded environment from ${bootenv};
run importbootenv;
fi;
if test -n $uenvcmd; then
echo Running uenvcmd ...;
run uenvcmd;
fi;
if run loaduimage; then
run mmcboot;
fi;
fi;
其中bootenv 变量中存储的就是“uEnv.txt”,我们将“uEnv.txt”放在第一个分区中就行了。我们在uEnv.txt 中指定uenvcmd 变量后在稍后就会执行,这里不细说细节,我的uEnv.txt如下:
uenvcmd=if fatload mmc 0 0x80200000 uImage; then run mmcboot; fi;
不知怎么搞的,如果我在uEnv.txt 中覆盖原来已有的变量会导致fatload 执行失败,我这里就直接写fatload 的全部命令了。mmcboot 展开来世这样子的:
#mmcboot
echo Booting from mmc ...; run mmcargs; bootm 0x80200000
#mmcargs
setenv bootargs console=ttyO0,115200n8 root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
嗯,至此BuildRoot 就可以正常启动运行了。至于生成的开发工具,位于“output/host/usr”下,添加一下环境变量就行了。