RK3568開發筆記(四):在虛擬機上使用SDK編譯製作uboot、kernel和buildroot鏡像

前言

  上一篇搭建好了ubuntu宿主機開發環境,本篇的目標系統主要是開發linux+qt,所以需要刷上billdroot+Qt創建的系統,爲了更好的熟悉原理和整個開發過程,選擇從零開始搭建rk3568的sdk開發環境。

 

RK系列SDK簡要介紹

目錄結構

  一個通用 Linux SDK (RV系類的sdk沒有對工程目錄包含有 buildroot、 debian、 app、 kernel、 u-boot、 device、 docs、 external等目錄。
  以下是RK系類的目錄分類:

  • app:存放上層應用 app,主要是 qcamera/qfm/qplayer/settings 等一些應用程序。
  • buildroot:基於 buildroot (2018.02-rc3) 開發的根文件系統。
  • debian:基於 debian 10 開發的根文件系統,支持部分芯片。
  • device/rockchip:存放各芯片板級配置和 Parameter 文件,以及一些編譯與打包固件的腳本和預備文件。
  • docs:存放芯片模塊開發指導文檔、 平臺支持列表、 芯片平臺相關文檔、 Linux 開發指南等。
  • IMAGE:存放每次生成編譯時間、 XML、 補丁和固件目錄。
  • external:存放第三方相關倉庫,包括音頻、 視頻、 網絡、 recovery 等。
  • kernel:存放 kernel 4.4 或 4.19 開發的代碼。
  • prebuilts:存放交叉編譯工具鏈。
  • rkbin:存放 Rockchip 相關的 Binary 和工具。
  • rockdev:存放編譯輸出固件。
  • tools:存放 Linux 和 Windows 操作系統環境下常用工具。
  • u-boot:存放基於 v2017.09 版本進行開發的 uboot 代碼。
  • yocto:基於 yocto gatesgarth 3.2 開發的根文件系統,支持部分芯片

  相對於以上的,對比下RV1109&RV1126的SDK目錄,如下圖:
  在這裏插入圖片描述

buildroot

  Linux SDK中 buildroot的 版本是 Buildroot-2018.02,其包含了基於 Linux 系統開發
  用到的各種系統源碼,驅動,工具,應用軟件包。
  在這裏插入圖片描述

  buildroot 優勢:

  • 通過源碼構建, 有很大的靈活性
  • 方便的交叉編譯環境, 可以進行快速構建
  • 方便各系統組件配置及定製開發
 

源碼準備

  從開發版提供的資料中拿到uboot,kernel,rootfs:

  • uboot:uboot是引導程序,芯片運行跑起來,然後引入kernel
  • kernel:linux的內核是加載後將會移植運行在內存中的核心
  • rootfs:這是文件系統,文件系統是kernel運行時需要加載一些驅動,庫,存儲等相關的其他一切相關的東西;
     &emsp編譯uboot,kernel,然後製作文件系統:
      在這裏插入圖片描述

  (注意:一定要從購買開發板或者核心板的廠家獲取,已經做好了ddr等外設的適配,包括開發板的外設,這是我們後續學習移植的基礎,千萬不要想着從零開始做,這個是不現實的,目前也沒有人和公司這麼做)
  (注意:buildroot文件系統,並不是真的文件系統,是buildroot工具構建的文件系統,Yocto也是,Debian和Ubuntu則是真文件系統)

 

編譯buildroot

步驟一:安裝buildroot依賴環境

  虛擬機安裝編譯buildroot環境,以下跟來回驗證了:

sudo apt-get install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop \
git-core curl u-boot-tools mtd-utils android-tools-fsutils openjdk-8-jdk device-tree-compiler \
gdisk m4 libz-dev git gnupg flex bison gperf libsdl1.2-dev libesd-java libwxgtk3.0-dev \
squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool \
libxml2 libxml2-utils xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev \
lib32ncurses5-dev lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip \
zip liblz4-tool repo git ssh make gcc libssl-dev liblz4-tool vim expect \
g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \
unzip device-tree-compiler python-pip libncurses5-dev rsync subversion \
sed make binutils  build-essential  gcc  g++  wget python libncurses5 bzr cvs git mercurial \
patch gzip bzip2 perl tar cpio unzip rsync file bc wget qemu-user-static live-build -y \
python3.8 python3.8-dev

  在這裏插入圖片描述

步驟二:下載解壓buildroot、uboot-kernel 傳輸到目標系統

  windows上先解壓,得到完整文件:
  在這裏插入圖片描述

  在這裏插入圖片描述

  然後傳送到ubuntu上(使用samba服務,不清楚的參考上一篇安裝samba服務)。
  在這裏插入圖片描述

  在這裏插入圖片描述

  虛擬機上:
  在這裏插入圖片描述

步驟三:移動解壓uboot-kernel

  注意:文件較大,不建議copy,一是會增加虛擬機所佔存儲,二是複製的時間很久。

mv buildroot_20220510.tar.gz uboot_kernel_20220512.tar.gz ~/work/

  在這裏插入圖片描述

  先解壓uboot_kernel:

tar xvf uboot_kernel_20220512.tar.gz

   在這裏插入圖片描述

  這是個挺漫長的時間,花費大致5分鐘。

步驟四:使用buildroot系統

  注意:rk3568支撐多個系統,按照SDK文檔指定系統是相似的操作。
  我們使用buildroot文件系統,將buildroot_20220510.tar.gz拷貝到rk356x文件夾:

cd ~/work
mv buildroot_20220510.tar.gz rk356x_linux

  在這裏插入圖片描述
  然後解壓:

tar xvf buildroot_20220510.tar.gz

  差不多也是五分鐘。

步驟五:查看編譯命令

  在這裏插入圖片描述

  編譯uboot,編譯內核,編譯文件系統(buildroot)
  在這裏插入圖片描述

步驟六:適配屏幕

  屏幕,筆者使用的是廠家提供的lvds10.1寸屏幕,已經做好了驅動在sdk中,但是需要配置設備樹:

cd ~/work/rk356x_linux/

  我們此時做個額外學習,先不配置hdmi和vga,這樣hdmi和vga就不能顯示,後續等我們驗證hdmi不能顯示後,再重新配置 該文件,進行顯示:
  在這裏插入圖片描述

步驟七:編譯整體

  由於uboot,kernel是沒有爭議的,但是文件系統是由好幾個參數,所以要根據開發文檔來,有個環境變量RK_ROOTFS_SYSTEM,他是什麼則是什麼系統,由此可見,他實際上是build編譯文件系統的參數:
  在這裏插入圖片描述

  然後開始編譯:

./build.sh all

  在這裏插入圖片描述

  查看“入坑二”,最終,使用sdk定義的路徑是可以通過的:
  在這裏插入圖片描述

 

入坑

入坑一:編譯所有,定位到是文件系統失敗

問題

./build.sh all

  在這裏插入圖片描述

  編譯錯誤:
  在這裏插入圖片描述

解決

  依次編譯,開始哪裏有錯誤:

./build.sh uboot

  在這裏插入圖片描述

./build.sh kernel

  內核報的警告,但是依然過了:
  在這裏插入圖片描述

./build.sh buildroot

  在這裏插入圖片描述
  仔細看信息,找到問題依次解決:
  在這裏插入圖片描述
  過程中,還有其他的錯誤,…其實就是環境缺少一些依賴,文檔前面已經補上全部的依賴環境了。
  特別注意,解決後要./build.sh cleanall清理後再編譯。
  最終依賴環境是:

sudo apt-get install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop \
git-core curl u-boot-tools mtd-utils android-tools-fsutils openjdk-8-jdk device-tree-compiler \
gdisk m4 libz-dev git gnupg flex bison gperf libsdl1.2-dev libesd-java libwxgtk3.0-dev \
squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool \
libxml2 libxml2-utils xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev \
lib32ncurses5-dev lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip \
zip liblz4-tool repo git ssh make gcc libssl-dev liblz4-tool vim expect \
g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \
unzip device-tree-compiler python-pip libncurses5-dev rsync subversion \
sed make binutils  build-essential  gcc  g++  wget python libncurses5 bzr cvs git mercurial \
patch gzip bzip2 perl tar cpio unzip rsync file bc wget qemu-user-static live-build -y \
python3.8 python3.8-dev

入坑二:編譯buildroot失敗

問題

  編譯buildroot出現編譯庫錯誤。

原因

  新版本的buildroot添加了很多庫,這些庫跟/home/toppet/Linux的路徑相關,配置的時候寫成了絕對路徑,所以編譯buildroot無法通過。

解決

  方案商技術支持說一定要使用文檔說的路徑纔可以通過,重新全部來一遍後,確實可以過,如下圖:
  在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章