原址
具体的开发技巧可到Buildroot官网学习。
当前Buildroot版本为Buildroot-2018.02
按照以下步骤配置完后,执行 make 即可。
$ source buildroot/build/envsetup.sh
You're building on Linux
Lunch menu...pick a combo:
1. firefly_rk3308_release
2. firefly_rk3308_recovery
3. firefly_rk3308_pcba
Which would you like? [1] 1
===========================================
如选择 firefly_rk3308_release,输入对应序号 1
$ make
完成编译后执行 SDK 根目录下的 mkfirmware.sh 脚本生成固件
执行过程:
Buildroot 输出结果保存在 output
目录,具体目录由配置文件决定。 例如,编译配置firefly_rk3308_release
,输出结果保存在buildroot/output/firefly_rk3308_release
目录。
后续编译可以在buildroot/output/firefly_rk3308_release
目录或是工程根目录下执行(make menuconfig也可以在工程根目录下执行),这个目录底下包括几个子目录:
整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样。
$ make menuconfig
配置界面如下:
在Target packages里面添加和裁剪一些工具,按需求定制系统功能,常用到的libdrm、ssh、vsftpd、wpa_supplicant、pppd等都可在里面配置。
执行以下命令,将会保存当前配置,并自动修改 buildroot/configs/ 目录下的默认配置文件:
$ make savedefconfig
需要注意的是:
配置命令:
$ make busybox-menuconfig
修改完成后,通过命令保存配置:
$ make busybox-update-config
Buildroot 编译完成后,会在指定的输出目录 host 目录下生成交叉编译工具,我们可以用来编译目标程序。默认配置生成的交叉编译工具目录为:
$ buildroot/output/rockchip_rk3308_release/host/usr/bin/output/host/usr/bin/
我们可以直接用交叉编译工具编译程序,例如:
$ ./buildroot/output/rockchip_rk3308_release/host/usr/bin/output/host/usr/bin/aarch64-rockchip-linux-gnu-gcc main.c -o test
浮点支持(以下配置打开 neon 支持),RK3308 支持 crc/crypto/fp/simd 这几个 feature,配置如下:
CFLAGS += -mcpu=cortex-a35+crc+crypto
在开发过程中,针对output/build/某个模块源码进行了修改,需要单独重新编译该模块软件包。
Buildroot在编译某个包的时候,会将编译的过程,通过一些标志文件记录下来,保存在对应的软件包源码的目录里,这些标志文件分别有:
.stamp_configured
.stamp_downloaded
.stamp_extracted
.stamp_patched
.stamp_staging_installed
.stamp_target_installed
这些标识文件主要控制这个软件包的下载,解压,打包,配置,编译,安装等。具体详细说明可参考:
docs/manual/rebuilding-packages.txt
也可以直接看mk文件,了解原理:
package/pkg-generic.mk
要想重新执行哪一个步骤,相应的就要删掉其对应的标志文件。假如你想重新编译某软件包源码,只需删掉该目录下的.stamp_built和.stamp_target_installed,然后再编译整个Buildroot就可以了。
Buildroot有更快捷的实现方法。
make show-targets
显示出本次配置所要编译所有的目标,即packages。make
将构建并安装该软件包及其依赖项。同时我们还可以通过make
,对软件包单独调用构建中的某一步骤,如下:
Package-specific:
- Build and install and all its dependencies
-source - Only download the source files for
-extract - Extract sources
-patch - Apply patches to
-depends - Build 's dependencies
-configure - Build up to the configure step
-build - Build up to the build step
-graph-depends - Generate a graph of 's dependencies
-dirclean - Remove build directory
-reconfigure - Restart the build from the configure step
-rebuild - Restart the build from the build step
因此,如果我们想重新编译xxx模块软件包,执行make xxx-rebuild
即可。
关于make的更多用法,可通过make help
获得。
以上介绍都是在 Buildroot 已有源码包的情况下,我们去选择打开编译即可,如果 Buildroot没有或者我们自己写的应用该如何集成到 Buildroot ?
Buildroot 支持多种模块编译方式,包括 generic-package、cmake-package、autotools-package 等,我们以 generic-package 举例说明。
例子:buildroot/package/rockchip/fireflydemo
buildroot/package/rockchip/fireflydemo/
config BR2_PACKAGE_FIREFLYDEMO
bool "Simple Firefly Demo"
##################################################
###########
#
## fireflydemo
#
###################################################
###########
ifeq ($(BR2_PACKAGE_FIREFLYDEMO), y)
FIREFLYDEMO_VERSION:=1.0.0
FIREFLYDEMO_SITE=$(TOPDIR)/../external/fireflydemo/src
FIREFLYDEMO_SITE_METHOD=local
define FIREFLYDEMO_BUILD_CMDS
$(TARGET_MAKE_ENV) $(MAKE) CC=$(TARGET_CC) CXX=$(TARGET_CXX) -C $(@D)
endef
define FIREFLYDEMO_CLEAN_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) clean
endef
define FIREFLYDEMO_INSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install
endef
define FIREFLYDEMO_UNINSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) uninstall
endef
$(eval $(generic-package))
endif
external/fireflydemo/src/
#include
#include
int main(int argc, char *argv[])
{
printf("hello world\n");
return 0;
}
DEPS =
OBJ = demo.o
CFLAGS =
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
demo: $(OBJ)
$(CXX) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f *.o *~ demo
.PHONY: install
install:
cp -f demo $(TARGET_DIR)/usr/bin/
.PHONY: uninstall
uninstall:
rm -f $(TARGET_DIR)/usr/bin/demo
source "package/rockchip/fireflydemo/Config.in"
默认编译出来根文件系统,有些配置文件可能不能满足客制化需求,这时候 fs-overlay 就能排上用场,fs-overlay 目录会在编译的最后阶段替换到文件系统目录,打包进根文件系统。 fs-overlay路径由默认配置文件指定:
BR2_ROOTFS_OVERLAY="board/rockchip/rk3308/fs-overlay"
Rootfs 可配置为可读写 ext2 文件系统,方便系统调试使用。
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3308-firefly.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3308-firefly.dtsi
index acd0dab..939db3c 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3308-firefly.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3308-firefly.dtsi
@@ -11,7 +11,7 @@
compatible = "firefly,rk3308-firefly", "firefly,rk3308";
chosen {
- bootargs = "earlycon=uart8250,mmio32,0xff0c0000 swiotlb=1 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=squashfs rootwait";
+ bootargs = "earlycon=uart8250,mmio32,0xff0c0000 swiotlb=1 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext2 rootwait";
};
adc-keys {
device/rockchip/rk3308/rockimg/
对应的 parameter 文件,确保 rootfs 分区大小足够存放分区镜像。diff --git a/device/rockchip/rk3308/BoardConfig.mk b/device/rockchip/rk3308/BoardConfig.mk
index abb9e96..97662b3 100755
--- a/device/rockchip/rk3308/BoardConfig.mk
+++ b/device/rockchip/rk3308/BoardConfig.mk
@@ -28,7 +28,7 @@ TARGET_PRODUCT=rk3308
# Set rootfs type, see buildroot.
# ext4 squashfs
-ROOTFS_TYPE=squashfs
+ROOTFS_TYPE=ext2
# Set data partition type.
# ext2 squashfs
buildroot/output/firefly_rk3308_release/images/rootfs.ext2
TF卡设备挂载目录:/sdcard
U盘设备挂载目录:/udisk
支持文件系统格式:ext2,vfat,ntfs等。