天天看點

RK3308(5)---編譯根檔案系統 編譯根檔案系統

編譯根檔案系統

準備工作

開發環境搭建

除了系統要求外,還有其他軟硬方面的要求。

  • 64 位系統
  • 硬碟空間大于 40G,如果您進行多個建構,将需要更大的硬碟空間。

推薦使用Ubuntu 16.04 的系統進行編譯。其他版本沒有具體測試,可能需要對軟體包做相應調整。

軟體包安裝

作業系統安裝好後,且使用者已自行配置好網絡環境,則可繼續如下步驟完成相關軟體包的安裝。

  • apt-get update
$ sudo apt-get update
           
  • 安裝 Kernel 及 U-Boot 編譯需要依賴的軟體包
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl \
zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev \
libxml2-utils xsltproc unzip device-tree-compiler
           
  • 安裝 Buildroot 編譯需要依賴的軟體包
$ sudo apt-get install libfile-which-perl sed make binutils gcc g++ bash \
patch gzip bzip2 perl tar cpio python unzip rsync file bc libmpc3 \
git repo texinfo pkg-config cmake tree
           

若編譯遇到報錯,可以視報錯資訊,安裝對應的軟體包。

交叉編譯工具鍊介紹

鑒于 Rockchip Buildroot SDK 目前隻在 Linux 下編譯,我們也僅提供了 Linux 下的交叉編譯工具鍊。其中 U-Boot 及 Kernel 使用的編譯工具鍊預置目錄在 prebuilt/gcc下,buildroot 使用該開源軟體中編譯出來的工具鍊。

U-Boot 及 Kernel 編譯工具鍊

prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
           

對應版本

gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)
           

Buildroot 編譯工具鍊

buildroot/output/rockchip_rk3308_release/host/bin/aarch64-rockchip-linux-gnu-
           

對應版本

gcc version 6.4.0 (Buildroot 2018.02-rc3-00017-g9c68ede)
           

如果需要其他平台或版本的工具鍊,需自行編譯。

下載下傳 SDK

由于 SDK 比較大,我們提供了一個打包好的.git以供下載下傳:

  • Firefly-RK3308_Linux_SDK

下載下傳完成後先驗證一下 MD5 碼:

$ md5sum Firefly-RK3308_Linux_SDK_git_20181008.7z
3800278cc016d117eec8c0381ba66769  Firefly-RK3308_Linux_SDK_git_20181008.7z
           

确認無誤後,就可以解壓:

$ mkdir -p ~/prj/Firefly-RK3308
$ cd ~/prj/Firefly-RK3308
$ 7zr x Firefly-RK3308_Linux_SDK_git_20181008.7z
$ git reset --hard
           

解壓出來的SDK,已經預設添加遠端倉庫

$ git remote -v
gitlab	https://gitlab.com/TeeFirefly/rk3308-linux.git (fetch)
gitlab	https://gitlab.com/TeeFirefly/rk3308-linux.git (push)
           

以後就可以直接從 gitlab 處更新:

$ git pull gitlab firefly:firefly
           

也可以到 https://gitlab.com/TeeFirefly/rk3308-linux 線上浏覽源碼

SDK 目錄結構

.
├── buildroot
├── build.sh -> device/rockchip/common/build.sh
├── device
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/rk3308/mkfirmware.sh
├── prebuilts
├── rkbin
├── rockdev
├── tools
├── u-boot
└── yocto
           

其中:

  • Buildroot

     目錄存放 buildroot 開源項目代碼,可定制根檔案系統
  • build.sh

     為系統編譯腳本,執行可進行 SDK 的完整編譯
  • device

     目錄存放闆級配置及一些預置檔案,開機腳本等
  • external

     目錄存放 SDK 相關庫及工具源碼
  • kernel

     為核心部分源碼
  • mkfirmware.sh

     腳本可對鏡像檔案進行打包,并統一拷貝至 

    rockdev/

     目錄
  • prebuilts

     目錄存放 U-Boot、Kernel 編譯使用的交叉編譯工具鍊
  • rkbin

     目錄存放 Rockchip 平台一些關鍵性二進制檔案,包括ddr.bin,miniloader.bin,bl31.bin,在 U-Boot 編譯過程中會用到
  • rockdev

     執行 mkfirmware.sh 會把系統編譯的生成的鏡像,統一拷貝至 rockdev/
  • tools

     目錄存放着 Windows 及 Linux 環境下的開發工具、調試工具、量産工具
  • u-boot

     目錄存放着 U-Boot 部分的源碼

編譯 Uboot

編譯 Uboot:

$ cd u-boot/
$ ./make.sh roc-rk3308-cc
           

編譯完,會生成 trust.img、rk3308_loader_xxx.bin、uboot.img 三個鏡像檔案。

編譯 Kernel

編譯 Kernel:

$ cd kernel/
$ make arch=arm64 firefly-rk3308_linux_defconfig
$ make arch=arm64 rk3308-roc-cc-dmic-pdm_emmc.img
           

編譯 kenrel 的時候可以直接 make dts-name.img(如 rk3308-roc-cc-dmic-pdm_emmc.img),即可生成對應的 resource.img(包含 dtb 資料)。

最終生成的kernel.img和resource.img将會被打包進boot.img,更換核心的時候,隻需燒寫boot.img即可

編譯 Buildroot

編譯 Buildroot,envsetup.sh 是終端環境變量設定腳本:

$ 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 腳本生成固件。

$ ./mkfirmware.sh
           

所有燒寫所需的鏡像都将會拷貝于 rockdev 目錄。

rockdev/
├── boot.img
├── MiniLoaderAll.bin
├── misc.img
├── oem.img
├── parameter.txt
├── recovery.img
├── rootfs.img
├── trust.img
├── uboot.img
└── userdata.img
           

得到了所有鏡像檔案後,為了友善燒寫及量産,通常可手動将這些單獨的鏡像通過腳本打包成為一個統一固件:update.img。打包方法見下文。

全自動編譯腳本

為了提高編譯的效率,降低人工編譯可能出現的誤操作,該 SDK 中內建了全自動化編譯腳本,友善固件編譯、備份。

該全自動化編譯腳本原始檔案存放于:

device/rockchip/common/build.sh
           

在SDK根目錄建立了相應軟連結

build.sh

可通過修改 

device/rockchip/rk3308/BoardConfig.mk

 腳本中的特定變量,以編出對應産品固件

#=========================
# Compile Config
#=========================
# Target arch
ARCH=arm64
# Uboot defconfig
UBOOT_DEFCONFIG=roc-rk3308-cc
# Kernel defconfig
KERNEL_DEFCONFIG=firefly-rk3308_linux_defconfig
# Kernel dts
KERNEL_DTS=rk3308-roc-cc-dmic-pdm_emmc
# Buildroot config
CFG_BUILDROOT=firefly_rk3308_release
# Recovery config
CFG_RECOVERY=firefly_rk3308_recovery
# Pcba config
CFG_PCBA=firefly_rk3308_pcba
# Build jobs
JOBS=12
           

執行自動編譯腳本:

$ ./build.sh
           

該腳本會自動配置環境變量,并自動編譯 U-Boot,編譯 Kernel,編譯Buildroot,編譯 Recovery 繼而生成固件。

子產品編譯

為了友善開發調試,上文說到的“全自動化編譯腳本”,也支援單獨子產品進行編譯,友善子產品調試,可指定并編譯部分子產品。

部分編譯可參見使用說明:

$ ./build.sh -h
====USAGE: build.sh modules====
uboot              -build uboot
kernel             -build kernel
rootfs             -build default rootfs, currently build buildroot as default
buildroot          -build buildroot rootfs
yocto              -build yocto rootfs, currently build ros as default
ros                -build ros rootfs
debian             -build debian rootfs
pcba               -build pcba
recovery           -build recovery
all                -build uboot, kernel, rootfs, recovery image
cleanall           -clean uboot, kernel, rootfs, recovery
firmware           -pack all the image we need to boot up system
updateimg          -pack update image
save               -save images, patches, commands used to debug
default            -build all modules
           

如單獨編譯 kernel,隻需要執行以下指令:

$ ./build.sh kernel
           

統一固件打包工具

固件打包工具可将各零散鏡像檔案,打包成一個完整的 update.img 形式,友善量産燒寫及更新。

Windows 下打包

Windows 系統下,打包工具存放在 

tools\windows\AndroidTool\rockdev

,打包步驟如下:

  1. 打開 rockdev 目錄,編輯 package-file。按照 package-file 進行配置,package-file 裡面配置 img 鏡像放在 Image 目錄底下的,将需要放到 Image 目錄的鏡像拷貝進去即可。且注意配置時,鏡像名字的準确。其中注意bootloader選項,應該根據自己生成的 loader 名稱進行修改。
  2. 編輯 mkupdate.bat。 需要修改 loader 名稱為實際存放的loader 名稱即可。
  3. 點選 mkupdate.bat 運作即可,運作完會在目前目錄生成一個 update.img。

Linux 下打包

打包工具存放在 

SDK/tools/linux/Linux_Pack_Firmware/rockdev/

,打包步驟如下:

  1. 打開 rockdev 目錄,編輯 package-file。 按照 package-file 進行配置,package-file 裡面配置 img 鏡像放在 Image 目錄底下的,将需要放到 Image 目錄的鏡像拷貝進去即可。且注意配置時,鏡像名字的準确。其中注意bootloader選項,應該根據自己生成的 loader 名稱進行修改。
  2. 編輯 mkupdate.sh。 需要修改 loader 名稱為實際存放的loader 名稱即可。
  3. 在 rockdev 目錄下,執行以下指令,運作完會在目前目錄生成一個 update.img。
$ ./mkupdate.sh
           

另外,Linux下,SDK有提供一鍵打包工具,自動生成統一固件 

rockdev/update.img

$ ./build.sh updateimg
           

燒寫鏡像檔案

請參照《更新固件》來燒寫分區映像檔案。

繼續閱讀