OpenHarmony富設備移植指南(三)—OH編譯框架適配與定制
1、OH編譯框架適配
特別說明:
OH3.2 beta4我移植過多款設備,輸入子系統會開機崩潰,還沒找到具體原因,移植的時候OH3.2 beta5還沒出來了,所以小米6先以樹莓派移植時比較順利的OH3.2 beta3版本進行移植,勇于嘗試的同學可以基于最新的OH3.2 beta5版本。
修改編譯框架需要GN相關的知識,同時社區也有豐富的文章講解鴻蒙的編譯框架,有疑問時可以先查看社區文章進行學習。
OH編譯框架適配新設備時,在3.2版本的前提下,需要新增3個文件夾,以下為我適配小米6的目錄
基本配置思路是參考官方開發板,復制hihope的rk3568,替換成自己的,比如小米6的代號是sagit,需要把rk3568替換成sagit。以下進行簡單舉例,詳細移植方法之前有發過移植適配的文章,可以先看,別的大神也都發過,編譯框架的移植適配套路都差不多,在此不再重復講解,文章中的代碼是beta1的,查看代碼倉時請切換到beta3分支。
修改配置文件:config.json
修改GN編譯文件:各級目錄下的x.gn,x.gni,x.build
config.json舉例:
.build文件舉例:
.gn文件文件舉例:
定制部分可以先不做,先把編譯需要的文件補充完整,并修改替換掉必要的部分。
修改完成之后執行編譯。
修改時會不斷有修改漏的或者錯的地方,沒有經驗的話可能會花比較長的時間,新手需要注意,成功的標志是編譯完成并顯示build successful。
2、OH編譯框架定制
(1)vendor部分的定制修改
OH編譯的起點是從vendor下的config.json開始的,我們首先進行這個配置文件的修改,首先加密相關的這兩個選項關掉,降低移植難度。
ril蜂窩網絡相關,xiaomi6沒有驅動進行使能,去掉,新增graphic配置,覆蓋掉rich.json繼承過來的配置,配置關閉gpu渲染。
ab分區啟動不適配,設置成false。
config.json可以在subsystems內配置完所有組件,但是那樣組件列表會很長,不同的設備配置會有大量重復的配置,所以大部分重復的組件都添加到了rich.json這個文件中,源碼在productdefine/common/inherit下,方便開發者繼承引用,如果開發者需要定制某項組件的屬性,只要像我一樣在產品的config.json中再聲明一遍即可覆蓋,其他文件沒有特別需要定制修改的地方,這里不再做講解。
(2)board部分的定制修改
在board中,我刪掉了bootanimation,updater,定制了kernel,增加了frimware,test。
刪掉bootanimation是因為這個是廠商根據OH動畫生成工具生成的動畫,我不需要定制開機畫面所以去掉了bootanimation,updater也是一樣,我不需要更新分區,所以不需要配置也刪掉了。
我也定制了kernel的編譯方式,因為OH官方的編譯方式是從board倉中統一轉到kernel/linux/build下,調用里面的編譯腳本,采用官方OH內核+soc廠商patch+config的形式進行編譯,我是采用第三方內核的方式進行移植,所以不適用官方的編譯方式,需要自己定制編譯腳本。
增加frimware是為了在ramdisk中添加驅動固件,test是自己找的一些測試例子,用來輔助移植。
定制kernel編譯方式
官方的編譯方式可以概括為:
- 復制kernel源碼到out/KERNEL_OBJ/kernel/src_tmp目錄下。
- 打上hdf.patch(使內核支持hdf驅動框架)。
- 打上soc.patch(使內核支持對應的芯片平臺)。
- 復制config(復制對應芯片平臺的內核配置到out下的kernel目錄)。
- 編譯內核,設備樹。
我是參考了官方的build方式,精簡不用的判斷,定制了自己的編譯方式,概括為:
- 復制我定制的kernel源碼到out/KERNEL_OBJ/kernel/src_tmp目錄下。
- 打上hdf.patch(使內核支持hdf驅動框架)。
- 復制config(修改復制為放置在我board倉下的config)。
- 編譯內核,設備樹。
內核源碼我是采用了pmOS的msm8998的主線代碼:
???Qualcomm Snapdragon 835 Mainline / Linux · GitLab??
根據pmOS移植教程我找到了xiaomi6的內核編譯配置,可以看到是采用Linux 6.0版本。
克隆代碼到kernel目錄下:
修改定制自己內核編譯的一些信息,完整代碼參考樹莓派移植board倉。
定制ramdisk
把上一篇解包得到的固件放到源碼目錄中。
新建BUILD.gn,每個文件都寫一個配置。
四個文件寫完配置之后放到一個分組里。
對應到上層目錄的BUILD.gn。
定制分區配置
根據上一篇我們獲取到的分區信息,修改分區配置,另外rk3568的data分區采用f2fs格式,我們采用ext4格式,所以和采用的是舊的格式,可以參考fstab.A311D的配置。
定制test
這個目錄下是我自己添加的輔助移植測試顯示基本功能的例子,來源自csdn【何小龍】的drm系列文章,用于學習drm和測試顯示屏驅動,大家感興趣的話可以去看看何小龍的文章,不懂如何添加到OH編譯框架的話可以去我開源的樹莓派board倉參考:
??rpi4/test · Diemit/device_board_raspberrypi - 碼云 - 開源中國 (?gitee.com??)?
(3)soc部分的定制修改
soc目錄是為了適配各種硬件的比如顯示,GPU,WIFI等待,這里我只定制了display,目標不要太大,使用cpu渲染適配display就可以顯示開機了。
display源碼是采用OH官方的示例,源代碼在。
直接復制到qualcomm/msm8998/hardware下并改名成display。
修改drm_display.cpp文件
修改drm驅動名稱為【msm】
驅動名新手可能怎么找可能會比較懵,可以進入內核源碼目錄下的driver/gpu/drm/對應的gpu,找到有xxxdrv.c的文件,找到drm_driver結構體,找到name屬性。
樹莓派的gpu是vc4。
高通的是msm。
修改drm_allocator.cpp文件
注釋掉海思的私有函數,我們不需要,順便刪掉hisilicon_drm.h的引用和hisilicon_drm.h文件。
添加display_gfx.c文件
內部不用實現,這部分是2d圖形加速適配的,先不適配。
修改BUILD.gn文件
修改基本原則是把def去掉,include改為自己的目錄。
display_device需要部分修改適配,根據樹莓派移植經驗。
添加display_gfx的動態庫編譯配置。
display這部分的移植都可以參照我之前移植樹莓派的教程,源碼也開源的,這里只是部分講解,完整代碼請去代碼倉查看
至此OH編譯框架適配說明完畢,執行編譯命令,確保能夠編譯成功!