RK3568開發筆記(五):在虛擬機器器上使用SDK編譯製作uboot、kernel和ubuntu映象

2022-11-10 12:00:29

前言

  buildroot雖然靈活,但是基於實際情況,本身是側重驅動和應用客製化開發的只客製化一次檔案系統投入有點多,還不如直接ubunt自己交叉編譯依賴庫,做一些庫的移植裁剪。
  於是本篇就使用ubuntu系統了,至於其他庫自己下原始碼在宿主機交叉編譯號後,再拷貝過去或者直接在板子上編譯也行(只是會比較慢),但是意義不大,因為開發過程肯定是用宿主機,不然核心板編譯太慢,在編譯上會花費不少可以省去的時間。

 

為什麼選擇ubuntu

  核心板方案上已經提供適配好的基礎uboot和kernel,這個時候不同檔案系統 uboot和核心時一樣的,做驅動差別也不大,而且筆者做移植交叉編譯應用和庫都較多,且不同平臺都做,直接裁剪移植,所以對於筆者來說,選擇ubuntu是更好的方式,缺什麼下原始碼三部曲交叉編譯,而使用buildroot構建勢必有點繞遠路,所以選擇了ubuntu,後續對ubuntu進行裁剪,如去掉桌面,然後開發移植庫和應用。

 

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目錄,如下圖:
      在這裡插入圖片描述

Ubuntu

  Ubuntu 是一個流行的 Linux 發行版, 是基於 Debian 的 unstable 版本加強而來, 以「最好的 Linux 桌面系統」 而聞名, 近些年 Ubuntu 也推出了 Ubuntu Enterprise Linux, 在企業 Linux 應用市場佔有率也有較大提高。

  • 優點: 技術支援較好, 使用者介面友好, 硬體的相容性好, 採用基於 Deb 的 ATP 包管理系統。
  • 缺點: 技術支援和更新服務是需要付費的, 伺服器軟體生態系統的規模和活力方面稍弱 。
      (參考廠家手冊)
 

原始碼準備

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

  • uboot:uboot是載入程式,晶片執行跑起來,然後引入kernel
  • kernel:linux的核心是載入後將會移植執行在記憶體中的核心
  • rootfs:這是檔案系統,檔案系統是kernel執行時需要載入一些驅動,庫,儲存等相關的其他一切相關的東西;
      編譯uboot,kernel,然後製作檔案系統:
      在這裡插入圖片描述
      (注意:buildroot也是要下載編譯的,因為打包ubuntu映象的時候需要使用到buildroot裡面的指令碼環境,所以此處也要先做buildroot系統再做ubuntu系統,具體檢視「入坑一」)
      (注意:一定要從購買開發板或者核心板的廠家獲取,已經做好了ddr等外設的適配,包括開發板的外設,這是我們後續學習移植的基礎,千萬不要想著從零開始做,這個是不現實的,目前也沒有人和公司這麼做)
      (注意:Ubuntu檔案系統,是真的檔案系統,而buildroot檔案系統時buildroot工具構建的檔案系統,Yocto也是;Debian和Ubuntu則是真檔案系統)
 

編譯ubuntu

步驟一:安裝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

  在這裡插入圖片描述

步驟二:下載解壓uboot-kernel,ubuntu

  下載解壓,做這個開發確實很需要磁碟大小,而且傳輸也費時間,加上用虛擬機器器,專門加裝了1024GBSSD作為專門開發的。
  在這裡插入圖片描述
  然後傳送到ubuntu上,使用samba服務,參考博文《linux實用技巧:ubuntu18.04安裝samba伺服器實現區域網檔案共用》

步驟三:移動解壓uboot-kernel

  在這裡插入圖片描述

tar xvf uboot_kernel_20220512.tar.gz

  在這裡插入圖片描述
  (疑問:只用了3分鐘,因為之前是系統ssd,這次是專門配的1024ssd單獨盤麼?)
  在這裡插入圖片描述

步驟四:使用ubuntu系統

  注意:rk3568支撐多個系統,按照SDK檔案指定系統是相似的操作。
  我們使用ubuntu檔案系統,將ubuntu_20220511.tar.gz直接解壓到rk356x_linux的資料夾:

cd ~/work/sdk
tar xvf buildroot_20220510.tar.gz -Ca rk356x_linux/

  在這裡插入圖片描述
  很快,如下圖:
  在這裡插入圖片描述

步驟五:檢視編譯命令單獨編譯uboot,kernel和ubuntu

   在這裡插入圖片描述
  編譯uboot:
  在這裡插入圖片描述
  編譯kernel:
  在這裡插入圖片描述
  編譯檔案系統ubuntu,這裡要先選擇廠商的設定:

./build.sh BoardConfig-rk3568-evb1-ddr4-v10.mk
./build.sh ubuntu

   在這裡插入圖片描述

  然後錯誤:
  在這裡插入圖片描述

  具體檢視「入坑一」,這裡可以看出方案上先基於buildroot做的,然後再buildroot下去做其他的打包。
  編譯好buildroot後,繼續使用ubuntu

./build.sh ubuntu

  在這裡插入圖片描述
  在這裡插入圖片描述
  至此,ubuntu的韌體編譯完成,但是我們沒有適配螢幕的。

步驟六:適配螢幕

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

cd /home/topeet/Linux/rk356x_linux/
gedit kernel/arch/arm64/boot/dts/rockchip/topeet_screen_choose.dtsi

  在這裡插入圖片描述

  知識點:適配螢幕是修改了核心的裝置樹,而沒有修改檔案系統。
  在這裡插入圖片描述

步驟七:編譯整體

  由於uboot,kernel是沒有爭議的,但是檔案系統是由好幾個引數,所以要根據開發檔案來,有個環境變數RK_ROOTFS_SYSTEM,他是什麼則是什麼系統,由此可見,他實際上是build編譯檔案系統的引數:
  編譯:

export RK_ROOTFS_SYSTEM=ubuntu
./build.sh all

  在這裡插入圖片描述
  在這裡插入圖片描述
  5分鐘編完。

步驟八:打包mkfirmware.sh

./mkfirmware.sh

  在這裡插入圖片描述
  在這裡插入圖片描述

 

入坑

入坑一:編譯ubuntu映象打包錯誤

問題

  找不到buildroot下的一個指令碼。
  在這裡插入圖片描述

原因

  在這裡插入圖片描述

  要先編譯buildroot

解決

  先走buildroot編譯流程,再走編譯ubuntu流程
  在這裡插入圖片描述
  具體的編譯buildroot問題,需要看《RK3568開發筆記(四):在虛擬機器器上使用SDK編譯製作uboot、kernel和buildroot映象》。