Buildroot開發
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:
因此,如果我們想重新編譯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等。
-
Linux
+關注
關注
87文章
11325瀏覽量
209953 -
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35475 -
Firefly
+關注
關注
2文章
538瀏覽量
7073 -
RK3308
+關注
關注
1文章
39瀏覽量
1149 -
Buildroot
+關注
關注
1文章
48瀏覽量
1401
發布評論請先 登錄
相關推薦
評論