今天給大家講解 OpenHarmony 編譯部分。
OH 編譯架構适配
特别說明:OH 3.2 beta4 我移植過多款裝置,輸入子系統會開機崩潰,還沒找到具體原因。
移植的時候 OH 3.2 beta5 還沒出來了,是以小米 6 先以樹莓派移植時比較順利的 OH 3.2 beta3 版本進行移植,勇于嘗試的同學可以基于最新的 OH3.2 beta5 版本。
修改編譯架構需要 GN 相關的知識,同時社群也有豐富的文章講解鴻蒙的編譯架構,有疑問時可以先檢視社群文章進行學習。
OH 編譯架構适配新裝置時,在 3.2 版本的前提下,需要新增 3 個檔案夾,以下為我适配小米 6 的目錄:
/device/board/xiaomi/sagit
/device/soc/qualcomm/
/vendor/xiaomi/sagit
基本配置思路是參考官方開發闆,複制 hihope 的 rk3568,替換成自己的,比如小米 6 的代号是 sagit,需要把 rk3568 替換成 sagit。
以下進行簡單舉例,詳細移植方法之前有發過移植适配的文章,可以先看,别的大神也都發過,編譯架構的移植适配套路都差不多,在此不再重複講解,文章中的代碼是 beta1 的,檢視代碼倉時請切換到 beta3 分支。
https://ost.51cto.com/posts/14280
修改配置檔案:config.json;修改 GN 編譯檔案:各級目錄下的 x.gn,x.gni,x.build。
config.json 舉例:
.build 檔案舉例:
.gn 檔案檔案舉例:
定制部分可以先不做,先把編譯需要的檔案補充完整,并修改替換掉必要的部分:
hihope ---> xiaomi
rk3568 ---> sagit(soc目錄下是rk3568 ---> msm8998)
rockchip ---> qualcomm
修改完成之後執行編譯:
./build.sh --product-name sagit --ccache
修改時會不斷有修改漏的或者錯的地方,沒有經驗的話可能會花比較長的時間,新手需要注意,成功的标志是編譯完成并顯示 build successful。
OH 編譯架構定制
①vendor 部分的定制修改
OH 編譯的起點是從 vendor 下的 config.json 開始的,我們首先進行這個配置檔案的修改,首先加密相關的這兩個選項關掉,降低移植難度。
ril 蜂窩網絡相關,xiaomi6 沒有驅動進行使能,去掉,新增 graphic 配置,覆寫掉 rich.json 繼承過來的配置,配置關閉 gpu 渲染。
ab 分區啟動不适配,設定成 false:
config.json 可以在 subsystems 内配置完所有元件,但是那樣元件清單會很長。
不同的裝置配置會有大量重複的配置,是以大部分重複的元件都添加到了 rich.json 這個檔案中,源碼在 productdefine/common/inherit 下,友善開發者繼承引用。
如果開發者需要定制某項元件的屬性,隻要像我一樣在産品的 config.json 中再聲明一遍即可覆寫,其他檔案沒有特别需要定制修改的地方,這裡不再做講解。
②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
https://gitlab.com/msm8998-mainline/linux
根據 pmOS 移植教程我找到了 xiaomi6 的核心編譯配置,可以看到是采用 Linux 6.0 版本。
克隆代碼到 kernel 目錄下:
git clone https://gitlab.com/msm8998-mainline/linux.git -b mainline/6.0 linux-sagit
修改定制自己核心編譯的一些資訊,完整代碼參考樹莓派移植 board 倉。
定制 ramdisk:把上一篇解包得到的固件放到源碼目錄中。
建立 BUILD.gn,每個檔案都寫一個配置:
四個檔案寫完配置之後放到一個分組裡:
對應到上層目錄的 BUILD.gn:
定制分區配置:根據上一篇我們擷取到的分區資訊,修改分區配置,另外 rk3568 的 data 分區采用 f2fs 格式,我們采用 ext4 格式。
是以<mnt_flags and options>和<fs_mgr_flags>采用的是舊的格式,可以參考 fstab.A311D 的配置。
定制 test:這個目錄下是我自己添加的輔助移植測試顯示基本功能的例子,來源自【何小龍】的 drm 系列文章,用于學習 drm 和測試顯示屏驅動,大家感興趣的話可以去看看何小龍的文章。
不懂如何添加到 OH 編譯架構的話可以去我開源的樹莓派 board 倉參考:
https://gitee.com/diemit/device_board_raspberrypi/tree/OpenHarmony-3.2-Beta4/rpi4/test
③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 編譯架構适配說明完畢,執行編譯指令,確定能夠編譯成功!!!