做RK3588嵌入式開發(fā)的同學(xué),大概率都遇到過“編譯成功卻啟動失敗”的糟心場景——明明按官方流程單獨(dú)編譯了boot.img,燒錄后設(shè)備卻卡在開機(jī)logo,或者直接進(jìn)入不了系統(tǒng),查日志、換編譯器、核對指令都沒用,最后發(fā)現(xiàn)竟是一個容易被忽略的GPU配置在“搞鬼”!
今天就把這個踩坑經(jīng)歷完整分享出來,幫大家少走彎路~
一、問題復(fù)現(xiàn):看似無懈可擊的編譯流程,卻栽了跟頭
我的開發(fā)環(huán)境是RK3588 EVB7開發(fā)板,SDK內(nèi)核版本為Linux 5.10,按照常規(guī)單獨(dú)編譯boot.img的步驟操作:
cd$sdk/kernel/exportCROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-make ARCH=arm64 rockchip_linux_defconfig rockchip_rt.configmake ARCH=arm64 rk3588-evb7-v11-linux.img -j8
編譯過程一路綠燈,沒有任何報錯,生成的rk3588-evb7-v11-linux.img(包含boot.img)也正常。用RKDevTool燒錄后,設(shè)備上電:屏幕亮了logo,隨后就一直卡住,串口日志停留在“GPU initialization failed”,系統(tǒng)無法進(jìn)入用戶空間。
一開始懷疑是編譯器版本不匹配、defconfig配置錯誤,或者內(nèi)核與開發(fā)板型號不兼容,反復(fù)核對了交叉編譯器路徑、開發(fā)板型號參數(shù),甚至重新同步了SDK,問題依然存在。
二、排查關(guān)鍵:從“GPU初始化失敗”鎖定核心原因
既然日志明確指向“GPU初始化”,就順著這個方向深挖。RK3588集成的是Mali-G610 GPU,而Mali GPU的驅(qū)動初始化依賴內(nèi)核配置中的關(guān)鍵選項。
通過make ARCH=arm64 menuconfig打開內(nèi)核配置界面,在“Device Drivers → Graphics support → MaliBifrost seriessupport”路徑下發(fā)現(xiàn):Enable Mali CSF based GPU suppor選項默認(rèn)是關(guān)閉的(設(shè)為n)。
這就是問題的根源!之前我們分析過,CONFIG_MALI_CSF_SUPPORT是啟用Mali CSF(圖形計算子系統(tǒng))架構(gòu)的核心配置,而RK3588的Mali-G610 GPU原生適配CSF架構(gòu)——如果關(guān)閉這個配置,Mali驅(qū)動無法識別GPU硬件,會導(dǎo)致GPU初始化失敗。
更關(guān)鍵的是,RK3588的系統(tǒng)啟動流程中,GPU是核心依賴模塊:無論是Android的GUI顯示,還是Linux的桌面環(huán)境,甚至是部分底層服務(wù),都需要GPU完成圖形渲染或資源調(diào)度。GPU初始化失敗會直接阻斷啟動流程,導(dǎo)致系統(tǒng)卡在開機(jī)階段。
三、解決方法:只需一步,啟用CONFIG_MALI_CSF_SUPPORT
找到問題后,解決起來就很簡單了,核心就是開啟CONFIG_MALI_CSF_SUPPORT配置:
1.進(jìn)入內(nèi)核配置界面:

cd$sdk/kernel/make ARCH=arm64 menuconfig
1.導(dǎo)航到GPU配置路徑:
Device Drivers → Graphics support → MaliBifrost seriessupport→Enable Mali CSF based GPU support
2.找到“Enable Mali CSF based GPU support”,按Y鍵啟用(選項前會出現(xiàn)“*”),確保配置為CONFIG_MALI_CSF_SUPPORT=y。
3.保存配置并退出(按ESC鍵,選擇Save,確認(rèn)保存路徑)。
4.另一個方法就是直接在配置文件里面添加
5.重新編譯boot.img:
make ARCH=arm64 rk3588-evb7-v11-linux.img -j8
1.重新燒錄生成的鏡像文件,設(shè)備上電后順利進(jìn)入系統(tǒng),串口日志顯示“Mali CSF initialized successfully”,GPU功能正常啟用。
四、原理補(bǔ)充:為什么這個配置不能少?
可能有同學(xué)會問:我只是單獨(dú)編譯boot.img,又不做圖形開發(fā),為什么必須啟用GPU配置?
這里再劃重點(diǎn):
1.硬件兼容性強(qiáng)制要求:RK3588的Mali-G610 GPU的硬件設(shè)計、寄存器邏輯都基于CSF架構(gòu),關(guān)閉CONFIG_MALI_CSF_SUPPORT后,驅(qū)動無法識別GPU,會觸發(fā)初始化失敗。
2.系統(tǒng)啟動的核心依賴:RK3588的啟動流程中,GPU不僅負(fù)責(zé)圖形渲染,還會參與部分系統(tǒng)資源調(diào)度(如內(nèi)存訪問、模塊協(xié)同),GPU初始化失敗會直接阻斷啟動鏈路。
3.驅(qū)動生態(tài)的必然要求:RK3588 SDK配套的Mali驅(qū)動(無論是ARM閉源驅(qū)動還是社區(qū)開源驅(qū)動)都默認(rèn)依賴CSF架構(gòu),關(guān)閉該配置會導(dǎo)致驅(qū)動加載失敗。
簡單說:對RK3588而言,CONFIG_MALI_CSF_SUPPORT不是“可選配置”,而是“系統(tǒng)正常啟動的必要配置”,哪怕你用不到GPU的圖形功能,也必須啟用。
五、避坑總結(jié):單獨(dú)編譯boot.img的3個關(guān)鍵注意點(diǎn)
1.單獨(dú)編譯boot.img時,不要只核對交叉編譯器和defconfig,一定要檢查GPU相關(guān)配置,尤其是CONFIG_MALI_CSF_SUPPORT必須設(shè)為y。
2.若遇到“啟動卡logo”“初始化失敗”類問題,優(yōu)先查看串口日志,重點(diǎn)關(guān)注GPU、DDR、CPU等核心模塊的初始化狀態(tài)。
3.編譯前建議通過make ARCH=arm64 savedefconfig備份當(dāng)前配置,避免后續(xù)修改配置后無法回滾。
嵌入式開發(fā)就是這樣,很多看似“無關(guān)緊要”的配置,實(shí)則是系統(tǒng)正常運(yùn)行的關(guān)鍵。希望這篇踩坑實(shí)錄能幫大家避開這個坑,讓RK3588的編譯啟動一路順暢~
如果還有其他編譯啟動相關(guān)的問題,歡迎在評論區(qū)交流!
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20442瀏覽量
333961 -
gpu
+關(guān)注
關(guān)注
28文章
5194瀏覽量
135422 -
編譯
+關(guān)注
關(guān)注
0文章
694瀏覽量
35155
發(fā)布評論請先 登錄
RK3588 EVB開發(fā)板原理圖講解【八】 RK3588 power Tree
基于 RK3588 debian 搭建 RK3588 Kernel 編譯環(huán)境
介紹一種RK3588 Android SDK編譯方法的使用
RK3588 SDK編譯與固件燒寫步驟
RK3588 Android無法編譯Package模塊是怎么回事
RK3588單獨(dú)編譯kernel的方式
RK3588 Android 12.0 SDK編譯步驟分享
怎樣去解決RK3588編譯kernel的問題呢
iTOP3588開發(fā)板編譯Android內(nèi)核方法一
RK3588開發(fā)板Linux源碼包編譯Ubuntu
【飛凌RK3588開發(fā)板試用】源碼編譯
iTOP-RK3588開發(fā)板單獨(dú)編譯Android固件-打包update.img
RK3588 SDK入門之編譯使用篇
調(diào)試RK3588必看!這個臨時設(shè)備樹文件,藏著你要的所有配置答案
踩坑實(shí)錄:RK3588單獨(dú)編譯boot.img無法啟動?這個GPU配置才是關(guān)鍵!
評論