RK3568開發(fā)筆記(五):在虛擬機(jī)上使用SDK編譯制作uboot、kernel和ubuntu鏡像
前言
??buildroot雖然靈活,但是基于實(shí)際情況,本身是側(cè)重驅(qū)動(dòng)和應(yīng)用定制開發(fā)的只定制一次文件系統(tǒng)投入有點(diǎn)多,還不如直接ubunt自己交叉編譯依賴庫,做一些庫的移植裁剪。
??于是本篇就使用ubuntu系統(tǒng)了,至于其他庫自己下源碼在宿主機(jī)交叉編譯號(hào)后,再拷貝過去或者直接在板子上編譯也行(只是會(huì)比較慢),但是意義不大,因?yàn)殚_發(fā)過程肯定是用宿主機(jī),不然核心板編譯太慢,在編譯上會(huì)花費(fèi)不少可以省去的時(shí)間。
為什么選擇ubuntu
??核心板方案上已經(jīng)提供適配好的基礎(chǔ)uboot和kernel,這個(gè)時(shí)候不同文件系統(tǒng) uboot和內(nèi)核時(shí)一樣的,做驅(qū)動(dòng)差別也不大,而且筆者做移植交叉編譯應(yīng)用和庫都較多,且不同平臺(tái)都做,直接裁剪移植,所以對(duì)于筆者來說,選擇ubuntu是更好的方式,缺什么下源碼三部曲交叉編譯,而使用buildroot構(gòu)建勢必有點(diǎn)繞遠(yuǎn)路,所以選擇了ubuntu,后續(xù)對(duì)ubuntu進(jìn)行裁剪,如去掉桌面,然后開發(fā)移植庫和應(yīng)用。
RK系列SDK簡要介紹
目錄結(jié)構(gòu)
??一個(gè)通用 Linux SDK (RV系類的sdk沒有對(duì)工程目錄包含有 buildroot、 debian、 app、 kernel、 u-boot、 device、 docs、 external等目錄。
??以下是RK系類的目錄分類:
app:存放上層應(yīng)用 app,主要是 qcamera/qfm/qplayer/settings 等一些應(yīng)用程序。
buildroot:基于 buildroot (2018.02-rc3) 開發(fā)的根文件系統(tǒng)。
debian:基于 debian 10 開發(fā)的根文件系統(tǒng),支持部分芯片。
device/rockchip:存放各芯片板級(jí)配置和 Parameter 文件,以及一些編譯與打包固件的腳本和預(yù)備文件。
docs:存放芯片模塊開發(fā)指導(dǎo)文檔、 平臺(tái)支持列表、 芯片平臺(tái)相關(guān)文檔、 Linux 開發(fā)指南等。
IMAGE:存放每次生成編譯時(shí)間、 XML、 補(bǔ)丁和固件目錄。
external:存放第三方相關(guān)倉庫,包括音頻、 視頻、 網(wǎng)絡(luò)、 recovery 等。
kernel:存放 kernel 4.4 或 4.19 開發(fā)的代碼。
prebuilts:存放交叉編譯工具鏈。
rkbin:存放 Rockchip 相關(guān)的 Binary 和工具。
rockdev:存放編譯輸出固件。
tools:存放 Linux 和 Windows 操作系統(tǒng)環(huán)境下常用工具。
u-boot:存放基于 v2017.09 版本進(jìn)行開發(fā)的 uboot 代碼。
yocto:基于 yocto gatesgarth 3.2 開發(fā)的根文件系統(tǒng),支持部分芯片
??相對(duì)于以上的,對(duì)比下RV1109&RV1126的SDK目錄,如下圖:
??

Ubuntu
??Ubuntu 是一個(gè)流行的 Linux 發(fā)行版, 是基于 Debian 的 unstable 版本加強(qiáng)而來, 以“最好的 Linux 桌面系統(tǒng)” 而聞名, 近些年 Ubuntu 也推出了 Ubuntu Enterprise Linux, 在企業(yè) Linux 應(yīng)用市場占有率也有較大提高。
優(yōu)點(diǎn): 技術(shù)支持較好, 用戶界面友好, 硬件的兼容性好, 采用基于 Deb 的 ATP 包管理系統(tǒng)。
缺點(diǎn): 技術(shù)支持和更新服務(wù)是需要付費(fèi)的, 服務(wù)器軟件生態(tài)系統(tǒng)的規(guī)模和活力方面稍弱 。
??(參考廠家手冊(cè))
源碼準(zhǔn)備
??從開發(fā)版提供的資料中拿到uboot,kernel,rootfs:
uboot:uboot是引導(dǎo)程序,芯片運(yùn)行跑起來,然后引入kernel
kernel:linux的內(nèi)核是加載后將會(huì)移植運(yùn)行在內(nèi)存中的核心
rootfs:這是文件系統(tǒng),文件系統(tǒng)是kernel運(yùn)行時(shí)需要加載一些驅(qū)動(dòng),庫,存儲(chǔ)等相關(guān)的其他一切相關(guān)的東西;
??編譯uboot,kernel,然后制作文件系統(tǒng):
??

??(注意:buildroot也是要下載編譯的,因?yàn)榇虬黸buntu鏡像的時(shí)候需要使用到buildroot里面的腳本環(huán)境,所以此處也要先做buildroot系統(tǒng)再做ubuntu系統(tǒng),具體查看“入坑一”)
??(注意:一定要從購買開發(fā)板或者核心板的廠家獲取,已經(jīng)做好了ddr等外設(shè)的適配,包括開發(fā)板的外設(shè),這是我們后續(xù)學(xué)習(xí)移植的基礎(chǔ),千萬不要想著從零開始做,這個(gè)是不現(xiàn)實(shí)的,目前也沒有人和公司這么做)
??(注意:Ubuntu文件系統(tǒng),是真的文件系統(tǒng),而buildroot文件系統(tǒng)時(shí)buildroot工具構(gòu)建的文件系統(tǒng),Yocto也是;Debian和Ubuntu則是真文件系統(tǒng))
編譯ubuntu
步驟一:安裝buildroot依賴環(huán)境
??虛擬機(jī)安裝編譯buildroot環(huán)境,以下跟來回驗(yàn)證了:
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
??下載解壓,做這個(gè)開發(fā)確實(shí)很需要磁盤大小,而且傳輸也費(fèi)時(shí)間,加上用虛擬機(jī),專門加裝了1024GBSSD作為專門開發(fā)的。
??

??然后傳送到ubuntu上,使用samba服務(wù),參考博文《linux實(shí)用技巧:ubuntu18.04安裝samba服務(wù)器實(shí)現(xiàn)局域網(wǎng)文件共享》
步驟三:移動(dòng)解壓uboot-kernel
??

tar xvf uboot_kernel_20220512.tar.gz
??

??(疑問:只用了3分鐘,因?yàn)橹笆窍到y(tǒng)ssd,這次是專門配的1024ssd單獨(dú)盤么?)
??

步驟四:使用ubuntu系統(tǒng)
??注意:rk3568支撐多個(gè)系統(tǒng),按照SDK文檔指定系統(tǒng)是相似的操作。
??我們使用ubuntu文件系統(tǒng),將ubuntu_20220511.tar.gz直接解壓到rk356x_linux的文件夾:
cd ~/work/sdktar xvf buildroot_20220510.tar.gz -Ca rk356x_linux/
??

??很快,如下圖:
??

步驟五:查看編譯命令單獨(dú)編譯uboot,kernel和ubuntu
???

??編譯uboot:
??

??編譯kernel:
??

??編譯文件系統(tǒng)ubuntu,這里要先選擇廠商的配置:
./build.sh BoardConfig-rk3568-evb1-ddr4-v10.mk
./build.sh ubuntu
???

??然后錯(cuò)誤:
??

??具體查看“入坑一”,這里可以看出方案上先基于buildroot做的,然后再buildroot下去做其他的打包。
??編譯好buildroot后,繼續(xù)使用ubuntu
./build.sh ubuntu
??

??

??至此,ubuntu的固件編譯完成,但是我們沒有適配屏幕的。
步驟六:適配屏幕
??屏幕,筆者使用的是廠家提供的lvds10.1寸屏幕,已經(jīng)做好了驅(qū)動(dòng)在sdk中,但是需要配置設(shè)備樹:
cd /home/topeet/Linux/rk356x_linux/
gedit kernel/arch/arm64/boot/dts/rockchip/topeet_screen_choose.dtsi
??

??知識(shí)點(diǎn):適配屏幕是修改了內(nèi)核的設(shè)備樹,而沒有修改文件系統(tǒng)。
??

步驟七:編譯整體
??由于uboot,kernel是沒有爭議的,但是文件系統(tǒng)是由好幾個(gè)參數(shù),所以要根據(jù)開發(fā)文檔來,有個(gè)環(huán)境變量RK_ROOTFS_SYSTEM,他是什么則是什么系統(tǒng),由此可見,他實(shí)際上是build編譯文件系統(tǒng)的參數(shù):
??編譯:
export RK_ROOTFS_SYSTEM=ubuntu
./build.sh all
??

??

??5分鐘編完。
步驟八:打包mkfirmware.sh
./mkfirmware.sh
??

??

入坑
入坑一:編譯ubuntu鏡像打包錯(cuò)誤
問題
??找不到buildroot下的一個(gè)腳本。
??

原因
??

??要先編譯buildroot
解決
??先走buildroot編譯流程,再走編譯ubuntu流程
??

??具體的編譯buildroot問題,需要看《RK3568開發(fā)筆記(四):在虛擬機(jī)上使用SDK編譯制作uboot、kernel和buildroot鏡像》。