天天看點

鴻蒙富裝置移植指南:編譯架構适配

作者:51CTO

今天給大家講解 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 編譯架構适配說明完畢,執行編譯指令,確定能夠編譯成功!!!