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