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

前言

  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鏡像》。

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