Buildroot开发 Buildroot开发基础 具体的开发技巧可到Buildroot官网学习。 Buildroot官网:https://buildroot.org/ 查看Buildroot开发手册 Buildroot版本 当前Buildroot版本为"Buildroot-2018.02" Buildroot 配置选择及编译 按照以下步骤配置完后,执行 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 脚本生成固件 make 编译执行过程 执行过程: 下载源码; 配置、编译、安装交叉工具链; 配置、编译、安装选择的包; 按选择的格式生成根文件系统; Buildroot 输出结果保存在 "output" 目录,具体目录由配置文件决定。 例如 ,编译配置"firefly_rk3308_release",输出结果保存在 "buildroot/output/firefly_rk3308_release" 目录。 后续编译可以在"buildroot/output/firefly_rk3308_release" 目录或是工程根 目录下执行(make menuconfig也可以在工程根目录下执行),这个目录底下包括 几个子目录: image/:包含压缩好的根文件系统镜像文件。 build/: 包含所有的源文件,包括 Buildroot 所需主机工具和选择的包,这个目 录包含所有模块源码。 staging/:这个目录类似根文件系统的目录结构,包含编译生成的所有头文件和库 ,以及其他开发文件,不过他们没有裁剪,比较庞大,不适用于目标文件系统。 模块配置 整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译 Linux内核一样。 make menuconfig 配置界面如下: 在Target packages里面添加和裁剪一些工具,按需求定制系统功能,常用到的 libdrm、ssh、vsftpd、wpa_supplicant、pppd等都可在里面配置。 执行以下命令,将会保存当前配置,并自动修改 buildroot/configs/ 目录下的 默认配置文件: make savedefconfig 需要注意的是: 进行编译时,buildroot根据配置,会自动从网络获取相关的软件包,包括一些 第三方库,插件,实用工具等,放在dl/目录。 软件包会解压在output/build/目录下,然后进行编译。 如果要修改软件包的源码,可以通过打补丁的方式进行修改,补丁集中放在 package/目录,buildroot会在解压软件包时为其打上相应的补丁。 Busybox 配置修改 配置命令: make busybox-menuconfig 修改完成后,通过命令保存配置: make busybox-update-config 交叉编译工具 Buildroot 编译完成后,会在指定的输出目录 host 目录下生成交叉编译工具, 我们可以用来编译目标程序。默认配置生成的交叉编译工具目录为: cd buildroot/output/firefly_rk3308_release/host/usr/bin/ 我们可以直接用交叉编译工具编译程序,例如: ./buildroot/output/firefly_rk3308_release/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.in config BR2_PACKAGE_FIREFLYDEMO bool "Simple Firefly Demo" 新建 fireflydemo.mk,填入以下内容,其中源码目录指向 external/fireflydemo/src/ ################################################## ########### # ## 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/ 编写源码 demo.c #include #include int main(int argc, char *argv[]) { printf("hello world\n"); return 0; } 编写Makefile 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 在将新建包加入到 Buildroot 编译系统内; 修改 package/rockchip/Config.in 最后加入下面这行: source "package/rockchip/fireflydemo/Config.in" 配置选择包,make menuconfig 然后选上 fireflydemo 包; 编译: make fireflydemo 打包进文件系统:make 修改源码后重新编译包:make fireflydemo-rebuild fs-overlay 默认编译出来根文件系统,有些配置文件可能不能满足客制化需求,这时候 fs- overlay 就能排上用场,fs-overlay 目录会在编译的最后阶段替换到文件系统 目录,打包进根文件系统。 fs-overlay路径由默认配置文件指定: BR2_ROOTFS_OVERLAY="board/rockchip/rk3308/fs-overlay" Rootfs 切换为 ext2 Rootfs 可配置为可读写 ext2 文件系统,方便系统调试使用。 修改 Kernel 中 bootargs 配置: 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 分区大小足够存放分区镜像。 修改 device\rockchip\rk3308\BoardConfig.mk 中 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 rootfs 分区 ext2 文件系统镜像会自动打包生成,也可以直接在以下路径获取: buildroot/output/firefly_rk3308_release/images/rootfs.ext2 外部存储设备 TF卡设备挂载目录:"/sdcard" U盘设备挂载目录:"/udisk" 支持文件系统格式:ext2,vfat,ntfs等。