01介紹
今天的文章主題是分享與探討關(guān)于Purple Pi OH開發(fā)板Android開發(fā)之搭建編譯環(huán)境及編譯Android固件。
如果你是剛開始接觸嵌入式Linux開發(fā),也許你會(huì)非常疑惑?
為什么同樣是ARM架構(gòu)的芯片,我以前開發(fā)STM32的時(shí)候只需要在Windows里的MDK5點(diǎn)一點(diǎn)就可以了?,F(xiàn)在我想要使用Purple Pi OH開發(fā)板進(jìn)行RK3566芯片開發(fā),反而要使用虛擬機(jī),要使用Linux黑乎乎的終端敲打一長串的命令,要關(guān)注內(nèi)核版本、編譯工具鏈的安裝和配置、開發(fā)環(huán)境是否支持編譯等等!對(duì)比習(xí)慣了Windows開發(fā)的人員一時(shí)之間也是無法快速上手的。
因此在今天的文章中小智會(huì)跟你說為什么同樣是嵌入式開發(fā),我們需要學(xué)習(xí)如此多的知識(shí)和做這么多的準(zhǔn)備。
在Linux虛擬機(jī)環(huán)境中進(jìn)行RK3566開發(fā)有很多原因,這里我只例舉比較重要的幾個(gè)原因:
PC虛擬機(jī)通常具有比嵌入式硬件更強(qiáng)的計(jì)算和內(nèi)存資源,這意味著在虛擬機(jī)上編譯內(nèi)核和程序可以大幅縮短編譯時(shí)間。
使用虛擬機(jī)可以確保開發(fā)環(huán)境的一致性,有助于減少因環(huán)境差異導(dǎo)致的問題,尤其是在團(tuán)隊(duì)成員之間同步工作環(huán)境時(shí)。
通過虛擬機(jī),可以將開發(fā)環(huán)境與主機(jī)系統(tǒng)隔離開來,避免對(duì)主機(jī)系統(tǒng)的潛在影響,如系統(tǒng)崩潰或數(shù)據(jù)丟失等風(fēng)險(xiǎn)。
在開發(fā)過程中,可能需要頻繁地測(cè)試和修改系統(tǒng)配置,這可能會(huì)帶來安全風(fēng)險(xiǎn)。使用虛擬機(jī)可以在一個(gè)封閉的環(huán)境中進(jìn)行這些操作,從而保護(hù)主機(jī)系統(tǒng)不受潛在的惡意軟件或誤操作的影響。
某些開發(fā)工具和編譯器可能只在特定的Linux發(fā)行版上提供最佳支持,使用虛擬機(jī)可以輕松地安裝和運(yùn)行這些工具。
綜上所述,搭建Linux虛擬機(jī)環(huán)境對(duì)于RK3566開發(fā)來說是非常有益的,它不僅能夠提高編譯效率,還能提供一個(gè)安全、一致且易于管理的開發(fā)環(huán)境。
來看我們用到的開發(fā)板長什么樣子
Purple Pi OH開發(fā)板
02固件源碼獲取
2.1源碼下載
當(dāng)我們拿到一塊Linux開發(fā)板時(shí),我們就需要同步進(jìn)行開發(fā)的初期準(zhǔn)備。
首先就是獲取資料,通常包括板子的芯片手冊(cè)、數(shù)據(jù)手冊(cè)、原理圖等。
獲取到資料后第二步就是通過查閱資料了解到源碼的獲取方式,其他的芯片資料可以先不看。因?yàn)橥ǔT创a都非常大,我們需要時(shí)間從網(wǎng)絡(luò)上進(jìn)行獲取。
第三步即開發(fā)環(huán)境搭建,通常我們也是通過官方資料查閱編譯SDK所需要的環(huán)境要求并搭建一個(gè)編譯環(huán)境。
注意:所有的補(bǔ)丁都是基于1.1中的sdk整包生成。
2.2開發(fā)環(huán)境搭建
接下來我們需要使用VMWare或者VirtualBox創(chuàng)建虛擬機(jī),環(huán)境搭建的教程通常在網(wǎng)上搜索即可獲取大量資料。
只要根據(jù)要求配置編譯環(huán)境即可,以下是Android11推薦編譯主機(jī)配置:
1.Ubuntu18.04 操作系統(tǒng)
2.64 位 CPU
3.16GB 物理內(nèi)存+交換內(nèi)存
4.250GB 空閑的磁盤空間
2.3VMWare文件傳輸
在完成源碼獲取和編譯環(huán)境搭建后,我們需要將源碼拖動(dòng)到虛擬機(jī)內(nèi),這就涉及到Windows和Linux虛擬機(jī)之間的傳輸文件方式,通常我們可以通過共享文件夾、FTP或SFTP、網(wǎng)絡(luò)傳輸工具等方式,我通常使用的是共享文件夾方式,其配置簡單且速度快,方便開發(fā)。
它可以直接在Windows資源管理器中訪問,即Linux虛擬機(jī)和Windows共享一塊存儲(chǔ)空間,兩邊都可以直接訪問和操作。過去我總是在Windows下直接通過VScode打開文件夾進(jìn)行編碼,在Linux中進(jìn)入文件夾直接編譯或者復(fù)制出來在其他地方編譯都可。
接下來我將講解如何創(chuàng)建與配置共享文件夾:
1. 首先將VMWare Tools安裝好,安裝詳細(xì)流程可以在網(wǎng)上搜索并學(xué)習(xí)。
2. 點(diǎn)擊【編輯虛擬機(jī)設(shè)置】,選中【選項(xiàng)】即可查看到共享文件夾的設(shè)置,
如下圖所示:
3. 點(diǎn)擊【總是啟用】,彈出下圖中第二步的【添加共享文件夾向?qū)А俊?/p>
在電腦中選擇合適的位置建立共享文件夾。這里我是和虛擬機(jī)位置放在一起的。
如下圖所示:
4. 在設(shè)置好共享文件夾路徑后,點(diǎn)擊下一步時(shí)記得選中啟用此共享。
如下圖所示:
5. 接著我們?cè)陔娔X資源管理器中訪問位置即可查看到,此時(shí)往文件夾拖文件就可以在Linux中的/mnt/hgfs/文件夾下即可實(shí)時(shí)看到,如下圖所示:
03SDK編譯3.1源碼解壓
將源碼傳輸進(jìn)Linux中后,
我們通過如下命令可以將源碼壓縮文件解壓縮至我們想要的路徑:
cat purple_pi_android11.tar.gza* | tar -xz -C target_path
語句意思為在當(dāng)前文件夾下查看全部以
“purple_pi_android11.tar.gza”開頭的文件,
并將其結(jié)果使用tar命令解壓至[ target_path ],target_path即你想要解壓到的文件夾路徑。
效果如下圖所示:
3.2uboot編譯
接著我們進(jìn)入SDK根目錄下的文件夾u-boot執(zhí)行如下命令:
cd u-boot./make.shrk3566
執(zhí)行命令后結(jié)果如下圖所示:
若編譯成功結(jié)果如下圖所示:
3.3kernel編譯
內(nèi)核配置文件路徑:kernel/arch/arm64/configs/rockchip_purple_pi_3566_defconfig設(shè)備樹文件路徑:kernel/arch/arm64/boot/dts/rockchip/
我們提供了兩種顯示屏的適配,分別是:
1. “ido-pi-oh3566-v1.dts”,顯示屏驅(qū)動(dòng)適配HDMI接口;
2. “ido-pi-oh3566-v1-dsi0-mipi.dts”,顯示屏驅(qū)動(dòng)適配MIPI接口;
我們以編譯HDMI屏內(nèi)核為例,編譯命令如下:
cd kernel make ARCH=arm64 rockchip_purple_pi_3566_defconfig rk356x_evb.config android-11.configmakeARCH=arm64ido-pi-oh3566-v1.img-j10
命令解釋:
分別是:
Purple Pi OH默認(rèn)的配置文件,包含了該開發(fā)板的默認(rèn)設(shè)置和選項(xiàng);
Rockchip RK356x的配置文件,包含了針對(duì)該板的特定設(shè)置和選項(xiàng);
Android 11版本的配置文件,包含了針對(duì)Android 11操作系統(tǒng)的特定設(shè)置和選項(xiàng)。
特別注意:
部分開發(fā)者遇到編譯失敗時(shí),可能是虛擬機(jī)的內(nèi)存分配不夠,此時(shí)我們可以嘗試調(diào)小并行任務(wù)數(shù)編譯,例如 -j10調(diào)整為 –j4 或 –j1。
如果編譯提示選擇io_domain電壓,vccio4和vccio5選擇1.8v,其它選擇3.3v。
以上方式編譯完成后,kernel目錄生成的boot.img文件不能直接燒錄。
需要使用build.sh -K 命令來編譯kernel,編譯后燒寫rockdev/Image-rk3566_r/boot.img。
單獨(dú)編譯kernel生成可直接燒錄的boot.img。
此處的編譯方法的前提已存在rockdev/Image-rk3566_r/boot.img文件(即Android代碼已經(jīng)完全編譯過一次或者執(zhí)行過build.sh -K)。
編譯的原理為在kernel目錄下將編譯生成的 kernel.img 和 resource.img 替換到舊的 boot.img 中,命令如下:
cd kernel make ARCH=arm64 rockchip_purple_pi_3566_defconfig rk356x_evb.config android-11.configmakeARCH=arm64BOOT_IMG=../rockdev/Image-rk3566_r/boot.imgido-pi-oh3566-v1.img-j10
使用此方法編譯出kernel/boot.img文件可以直接用于燒錄至boot分區(qū),kernel編譯結(jié)果如下圖所示:
3.4Android編譯及固件生成步驟
使用如下命令編譯
source build/envsetup.shlunch rk3566_r-userdebugmake-j10
編譯過程如下圖所示:
Android編譯成功結(jié)果如下圖所示:
需要編譯內(nèi)核選擇的屏幕修改Android主顯和系統(tǒng)方向時(shí)可以修改如下參數(shù):
1)HDMI: A)device/rockchip/rk356x/rk3566_r/rk3566_r.mk PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=HDMI-A-1B)device/rockchip/rk356x/BoardConfig.mk SF_PRIMARY_DISPLAY_ORIENTATION := 0
2)MIPI: A)device/rockchip/rk356x/rk3566_r/rk3566_r.mk PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI B)device/rockchip/rk356x/BoardConfig.mk SF_PRIMARY_DISPLAY_ORIENTATION := 270
3.5固件打包
編譯完成后,執(zhí)行 SDK 根目錄下的 mkimage.sh 腳本生成固件,所有燒寫所需的各分區(qū)鏡像將都
rockdev/Image-rk3566_r/目錄下,
命令如下:
./mkimage.sh
結(jié)果如下:
將所有分區(qū)鏡像合并成單個(gè)的鏡像,命令如下:
cd RKTools/linux/Linux_Pack_Firmware/rockdev/./mkupdate_rk356x.sh
結(jié)果如下:
執(zhí)行mkupdate_rk356x.sh 命令后
會(huì)將各分區(qū)鏡像合并成一個(gè)update.img 的鏡像文件,如下圖所示:
當(dāng)我們做到這一步時(shí),我們的固件編譯就完成啦!
由于固件編譯本身就是一個(gè)非常復(fù)雜和繁瑣的活,因此本篇內(nèi)容的篇幅較長,非常感謝有耐心看到這里的小伙伴!
-
Android
+關(guān)注
關(guān)注
12文章
3917瀏覽量
127036 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4895瀏覽量
97055 -
Purple
+關(guān)注
關(guān)注
0文章
8瀏覽量
232
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論