RK3568源碼編譯與交叉編譯環(huán)境搭建

1 C/C++交叉編譯環(huán)境配置
如果只是使用C/C++代碼,進(jìn)行代碼的交叉編譯時(shí)可用使用如下方法,該配置方式簡單便捷。
1.1 下載aarch64類型的gcc
在Linaro 官網(wǎng)中下載GCC 交叉編譯工具鏈,RK3568為Cortex-A55內(nèi)核64位的開發(fā)板,需要使用aarch64-linux-gnu。
地址:https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/

我下載的是這個(gè):gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz。
然后解壓:
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar
解壓結(jié)果如下:

解壓完成之后,可以在其下的bin目錄中看到aarch64編譯器:

使用這里的gcc或g++,就能交叉編譯C或C++程序了。
1.2 交叉編譯C/C++程序測(cè)試
寫一個(gè)helloword的c++測(cè)試程序main.cpp:
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
然后使用如下指令進(jìn)行編譯:
export PATH=/home/xxpcb/myTest/OK3568/gcc_aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
aarch64-linux-gnu-g++ main.cpp -o main
第一句是臨時(shí)添加環(huán)境變量,當(dāng)然也可以添加到.bashrc中實(shí)現(xiàn)永久添加,由于每種板子用到的編譯工具鏈不太一樣,我一般都使用這種臨時(shí)添加的方式。
第二句是使用aarch64-linux-gnu-g++來編譯C++程序,編譯結(jié)果如下,可用使用file指令查看編譯出的程序的文件類型:

可以看到,編譯出的文件是ELF 64-bit LSB的可執(zhí)行文件,ARM aarch64架構(gòu)的。
然后將程序放到OK3568板子中運(yùn)行,這里使用ADB拷貝程序。

可以看到上面右圖中在OK3568板子中成功運(yùn)行了hello word程序。
1.3 關(guān)于板子的WIFI自動(dòng)配網(wǎng)
給板子傳輸文件時(shí),需要先連上網(wǎng)絡(luò),上篇介紹過,OK3568板子使用一個(gè)腳本來進(jìn)行WIFI配網(wǎng),但每次開機(jī)后都需要再配置??梢詫憘€(gè)腳本加入到開機(jī)自啟動(dòng)程序中。
例如,在/etc/init.d目錄下,添加一個(gè)S99myinit文件,寫入如下內(nèi)容即可實(shí)現(xiàn)開機(jī)自動(dòng)連網(wǎng):
#!/bin/sh
fltest_wifi.sh -i mlan0 -s "wifi_name" -p wifi_password
注意要替換為自己的WIFI名和密碼,并且要給這個(gè)文件可執(zhí)行權(quán)限。
2 RK3568 Linux源碼編譯
剛才介紹了只進(jìn)行C/C++程序開發(fā)時(shí)進(jìn)行交叉編譯環(huán)境配置的方法。
如何還要進(jìn)行Qt開發(fā),可以通過編譯RK3568 Linux源碼的方式,得到Qt的交叉編譯工具鏈。
飛凌開發(fā)手冊(cè)中建議使用資料中提供的虛擬機(jī)環(huán)境進(jìn)行源碼編譯,由于我這里已經(jīng)安裝過了VirtualBox虛擬機(jī)和Ubuntu18系統(tǒng),那就在自己的開發(fā)環(huán)境中進(jìn)行RK3568的開發(fā)吧。
2.1 基礎(chǔ)環(huán)境配置
在進(jìn)行RK3568的源碼編譯之前,需要先進(jìn)行對(duì)自己的虛擬機(jī)進(jìn)行一些依賴包的安裝,如下。
首先是安裝一些必要的庫:
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libncurses* ? ?
sudo apt-get install lzop
sudo apt-get install net-tools ?
然后還有安裝一些編譯OK3568 Linux源碼所需的庫
sudo apt-get update
sudo apt-get install openssh-server vim git fakeroot
sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool 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
此外,為了便于Qt開發(fā),可選擇安裝Linux版的Qt Creator到自己的虛擬機(jī)中,安裝過程也比較簡單,并且我之前已經(jīng)安裝過了,這里就不過多介紹了。當(dāng)然,不安裝Qt Creator也是可以進(jìn)行Qt程序的編譯的,只要有Qt交叉編譯環(huán)境即可。
2.2 準(zhǔn)備RK3568源碼
K3568源碼在飛凌提供的板子資料中。

復(fù)制RK3568源碼到Ubuntu虛擬機(jī)中,準(zhǔn)備編譯:
cat OK3568-linux-source.tar.bz2.a* > OK3568-linux-source.tar.bz2
tar -xvf OK3568-linux-source.tar.bz2
第一句是把.aa和.ab兩個(gè)壓縮包合并為一個(gè)壓縮包,有個(gè)兩個(gè)文件都差不多4G大小,這個(gè)合并的過程需要一點(diǎn)時(shí)間(大概2、3分鐘左右),并且合并過程沒有信息打印,命令行為不可輸入狀態(tài),等變?yōu)榭奢斎霠顟B(tài),即合并完成,并且在虛擬機(jī)上可看到合并后的壓縮包。
第二句是把合并后的壓縮包進(jìn)行解壓,這個(gè)解壓過程也要一點(diǎn)時(shí)間(大概20分鐘左右),解壓過程會(huì)有信息打印。

解壓完成后,可以看到OK3568-Linux的源碼文件夾:

2.3 編譯RK3568源碼
在編譯之前,需要確保自己的虛擬機(jī)有足夠的磁盤空間和內(nèi)存空間,我的虛擬機(jī)配置如下,我的筆記本一共12G內(nèi)存,我給了虛擬機(jī)10G。

注意上圖中的硬盤空間,只是這個(gè)虛擬機(jī)的最大空間,需要在ubuntu中使用df指令確認(rèn)下實(shí)際的大小,如果不夠大,可以使用GParted等軟件調(diào)整自己的虛擬機(jī)硬盤空間。
如下圖所示,我的ubuntu的硬盤現(xiàn)在總共是276G,這個(gè)截圖是我編譯完源碼后截的圖,感覺整個(gè)編譯源碼操作,耗費(fèi)了有幾十個(gè)G的空間,現(xiàn)在還剩余80G的空間可用。

2.3.1全編譯測(cè)試
進(jìn)入到剛才解壓后的RK3568源碼目錄,通過運(yùn)行.build.sh腳本即可編譯,在編譯之前,可以先來看下腳本中的內(nèi)容:
這邊編譯腳本比較長,截取部分圖如下:

執(zhí)行腳本后,會(huì)先先出現(xiàn)一個(gè)選項(xiàng)需要選擇,如圖,選擇1,即使用ok3568的配置。

編譯一段時(shí)間后(大概10分鐘)會(huì)彈出下圖界面,需要選擇,提取圖中信息
VCCIO4 和 VCCIO6 選擇 1800000
其余的選擇 3300000,
使用上下方向按鍵選擇選項(xiàng),按回車確認(rèn)選擇即可。

編譯的過程中,會(huì)十分耗費(fèi)內(nèi)存資源,我的電腦顯示在編譯過程中,內(nèi)存基本占滿了,再使用其它軟件都會(huì)特別的卡,所以在編譯的時(shí)候,就不用進(jìn)行其它操作了,讓它獨(dú)自編譯好了。

整個(gè)編譯時(shí)間較長,我的電腦用了7、8個(gè)小時(shí)才編譯完,從凌晨編譯到天亮,還好沒報(bào)錯(cuò)。編譯成功后的截圖如下,注意大片的紅色部分不是錯(cuò)誤信息,只是在提醒電源域的配置是否正確。

編譯成功后,會(huì)在IMAGE文件夾下生成對(duì)應(yīng)編譯工程結(jié)果文件,這些文件中,update.img為打包好用于OTG或TF卡全燒寫使用,其它的編譯文件用于分步燒寫時(shí)使用。

我編譯RK3568源碼,只是為了得到Qt的交叉編譯環(huán)境,就先不進(jìn)行鏡像的燒寫了,因?yàn)榘遄又心J(rèn)已經(jīng)燒寫好了,以后有時(shí)間再研究固件的燒寫,目前打算先進(jìn)行Qt程序的開發(fā)。
2.3.2 內(nèi)核單獨(dú)編譯測(cè)試
整個(gè)編譯程序,十分的耗時(shí),有時(shí)如果只是修改了內(nèi)核代碼,可以單獨(dú)編譯內(nèi)核,編譯方法是,在執(zhí)行腳本時(shí),指定一個(gè)kernel參數(shù)即可
./build.sh kernel
3 Qt程序交叉編譯測(cè)試
3.1 Qt程序交叉編譯
RK3568 Linux源碼編譯完成后,可以到output目錄下的bin目錄中查看編譯出的交叉編譯工具,對(duì)應(yīng)Qt開發(fā),需要注意是qmake這個(gè)工具,bin目錄中的所有編譯工具如下:

使用資料中的Qt程序進(jìn)行交叉編譯測(cè)試,我使用的是qcamera這里例程,將程序源碼復(fù)制到Ubuntu中,然后使用如下指令進(jìn)行Qt程序的交叉編譯:
export PATH=/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/bin:$PATH
/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/bin/qmake
make
第一句是臨時(shí)添加環(huán)境變量
第二句是使用RK3568源碼編譯結(jié)果中的qmak來生成Makefile
第三句是使用make來編譯
編譯結(jié)果如下,同樣可以使用fie指令來確認(rèn)編譯出的可執(zhí)行文件的文件類型。

可以看到,編譯出的fltest_qt_qcamera文件也是ELF 64-bit LSB的可執(zhí)行文件,ARM aarch64架構(gòu)的。
3.2 Qt程序在板子中運(yùn)行測(cè)試
同樣使用ADB的方式,將可執(zhí)行程序拷貝到板子中,然后運(yùn)行,運(yùn)行結(jié)果如下,注意我在qt程序中稍微修改了一下,給Exit字符串加了一個(gè)中括號(hào),以確認(rèn)板子中運(yùn)行的就是我自己編譯出的Qt程序。

至此,Qt的交叉編譯環(huán)境已驗(yàn)證可正常使用。
4 總結(jié)
本篇進(jìn)行了飛凌OK3568-C板子的軟件開發(fā)環(huán)境的搭建,主要是交叉編譯工具鏈的搭建,并且介紹了僅使用C/C++開發(fā)和使用Qt開發(fā)時(shí)兩種交叉編譯環(huán)境配置方式,前者下載一個(gè)編譯工具即可,后者需要將RK3568 Linux的源碼進(jìn)行整個(gè)編譯,來獲取Qt的交叉編譯工具。