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

21497936發表於2022-11-10

前言

  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/sdktar 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映象》。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2922703/,如需轉載,請註明出處,否則將追究法律責任。

相關文章