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