1. 程式人生 > >Rockchip(瑞芯微)平臺高速上手指南

Rockchip(瑞芯微)平臺高速上手指南

原址

Buildroot開發

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

配置介面如下:

_images/make-menuconfig.png

在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 目錄下生成交叉編譯工具,我們可以用來編譯目標程式。預設配置生成的交叉編譯工具目錄為:

$ 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 <package>將構建並安裝該軟體包及其依賴項。

同時我們還可以通過make <package>-<target>,對軟體包單獨呼叫構建中的某一步驟,如下:

Package-specific:
  <pkg>                  - Build and install <pkg> and all its dependencies
  <pkg>-source           - Only download the source files for <pkg>
  <pkg>-extract          - Extract <pkg> sources
  <pkg>-patch            - Apply patches to <pkg>
  <pkg>-depends          - Build <pkg>'s dependencies
  <pkg>-configure        - Build <pkg> up to the configure step
  <pkg>-build            - Build <pkg> up to the build step
  <pkg>-graph-depends    - Generate a graph of <pkg>'s dependencies
  <pkg>-dirclean         - Remove <pkg> build directory
  <pkg>-reconfigure      - Restart the build from the configure step
  <pkg>-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 <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    printf("hello world\n");
    return 0;
}
  • 編寫Makefile
DEPS =
OBJ = demo.o
CFLAGS =
%.o: %.c $(DEPS)
    $(CC) -c -o [email protected] $< $(CFLAGS)
demo: $(OBJ)
    $(CXX) -o [email protected] $^ $(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等。