buildroot - TreeNewbeer/Coonix GitHub Wiki
准备工作
首先需要把buildroot源码 clone 回来,在这里buildroot版本选择的是 2020.02.x 。
git clone -b 2020.02.x --depth=1 https://github.com/buildroot/buildroot.git
然后建立建立以下目录
cd /path/to/buildroot
mkdir -p board/nuvoton/rootfs/etc/init.d/
cd board/nuvoton/rootfs/etc/init.d/
然后在该目录中新建 S10mdev 文件,文件内容如下:
#!/bin/sh
#
# Start mdev....
#
case "$1" in
start)
echo "Starting mdev..."
echo /sbin/mdev >/proc/sys/kernel/hotplug
mount -t ramfs mdev /dev
mkdir -p /dev/pts
mkdir -p /dev/shm
/sbin/mdev -s
;;
stop)
;;
restart|reload)
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
给 S10mdev 加上执行权限
chmod +x S10mdev
然后回到 board/nuvoton 目录,新建 install_rootfs.sh 文件,文件内容如下:
#!/bin/sh
cp -a board/nuvoton/rootfs/etc/init.d/S10mdev output/target/etc/init.d/
给 install_rootfs.sh 文件加上执行权限
chmod +x install_rootfs.sh
buildroot 设置
首先进入 menuconfig 界面,在终端中输入
make menuconfig
-
Target options
- Target Architecture -> (X) ARM (little endian)
- Enable VFP extension support
-
Toolchain
- Kernel Headers -> Custom Git repository
- URL of custom repository -> https://gitee.com/OpenNuvoton/NUC980-linux-4.4.y.git
- Custom repository version -> master
- Custom kernel headers series -> 4.4.x
- Enable WCHAR support
- Enable toolchain locale/i18n support
- Enable stack protection support
- Build cross gdb for the host
-
System Configuration
- Root password -> 填写root密码
- Run a getty (login prompt) after boot
- TTY Port -> ttyS0
- Custom scripts to run before creating filesystem images -> board/nuvoton/install_rootfs.sh
-
Kernel
- Linux Kernel
- Kernel version -> Custom Git repository
- URL of custom repository -> https://gitee.com/OpenNuvoton/NUC980-linux-4.4.y.git
- Custom repository version -> master
- Defconfig name -> nuc980_eth2uart
- Kernel binary format -> uImage
-
Target Packages
- Networking applications -> dhcpcd
-
Filesystem images
- initial RAM filesystem linked into linux kernel
- yaffs2 root filesystem
-
Bootloaders
- U-Boot
- U-Boot Version -> Custom Git repository
- URL of custom repository -> https://gitee.com/OpenNuvoton/NUC970_U-Boot_v2016.11.git
- Custom repository version -> master
- Board defconfig -> nuc980_iot
- Install U-Boot SPL binary image
然后保存设置开始编译
buildroot 编译
由于buildroot需要下载许多软件包,所以最好提前开好代理。不开也没关系,就是慢一点。在终端中输入
make -j xx
开始编译。 xx一般和CPU逻辑核心数相同。在clone linux-kernel 的时候,buildroot会拉取所有文件,其实buildroot只需要源代码并不需要git log之类的东西,所以可以用以下操作手动帮buildroot下载 linux-kernel。
cd path/to/buildroot/dl/linux/
rm -rf git
git clone --depth=1 https://gitee.com/OpenNuvoton/NUC980-linux-4.4.y.git git
uboot 也要这样操作一番,不然会出现一个404错误,不知道是不是 URL for custom repository 没填对。
cd path/to/buildroot/dl/uboot/
rm -rf git
git clone --depth=1 https://gitee.com/OpenNuvoton/NUC970_U-Boot_v2016.11.git
用 gcc 4.9 版本以上编译新唐提供的uboot会出现以下错误:
board/nuvoton/nuc980/spinand_boot.c:112:83: 错误:macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
这个宏的意思是每次重新编译生成二进制文件时,__DATE__ 这个宏的值都会改变,即使源文件没有任何变化。在此将引起这个错误的这两个宏去掉,文件位于
/path/to/buildroot/output/build/uboot-master/board/nuvoton/nuc980/spinand_boot.c
然后按如下修改
@@ -109,7 +109,7 @@
void board_init_f(unsigned long bootflag)
__attribute__((noreturn)) void (*uboot)(void);
nuc980_serial_init();
- printf("\n SPL load main U-Boot from SPI NAND Flash! (%s %s)\n",__DATE__,__TIME__);
+ printf("\n SPL load main U-Boot from SPI NAND Flash!\n");
if (maxchips < 1)
maxchips = 1;
编译linux-kernel 的时候会遇到一个这样的错误
./scripts/gen_initramfs_list.sh: Cannot open '../rootfs'
需要手动建立一下这样文件夹
cd /path/to/buildroot/output/build/linux-master/
mkdir -p ../rootfs
还会遇到一个这样的错误
cp: 无法创建普通文件'../image/980image': 没有那个文件或目录
也需要手动建立一下这个文件夹
cd /path/to/buildroot/output/build/linux-master/
mkdir -p ../image
最后编译生成的 uboot,kernel 和 rootfs 位于
/path/to/buildroot/output/images/
文件夹中。