之前在樹莓派 4b 上點亮了 OHOS3.0,不過內核是用 tftp 拉取的,根文件系統掛在了 NFS 上,拔了網線就無法啟動。
當然這么操作只是為了方便調試,而最終需要的是一個可以燒錄到 TF 卡上的 img 鏡像文件。
這就需要將所有調試好的內容添加到 OHOS3.0 的編譯框架,本以為是很簡單的事情,好家伙,整了這么久,感覺添加編譯框架比移植本身更復雜。
于是我整理了添加樹莓派單板到編譯框架的內容,希望對各位有所幫助,為大家避坑。
添加編譯配置文件和 gn
①添加 RPI4B.json
主要參考 hisilicon build 組件倉:
https://gitee.com/openharmony/device_hisilicon_build
添加一個 products 編譯組件,這個組件是在產品配置文件中指定的。比如:
productdefinecommonproductsRPI4B.json其他部分參考 Hi3516,但是其中 2 條,指定單板組件路徑,并添加組件。如果刪除這兩條,將不能編譯內核,只生成 OHOS 的文件系統。
..... "product_build_path":"device/raspberrypi/build", "parts":{ ...... "raspberrypi_products:raspberrypi_products":{}, ...... }
②添加ohos.build
接下來在 device 目錄下,新建一個 raspberrypi 編譯組件文件夾,并添加 ohos.build 文件。和前面產品配置文件中的設置對應起來了。
device aspberrypiuildohos.build:
{ "subsystem":"raspberrypi_products", "parts":{ "raspberrypi_products":{ "module_list":[ "http://device/raspberrypi/build:products_group" ] } } }
新建 device aspberrypiuildBUILD.gn 當然每個廠家不可能只有 1 個板子,如果有其他單板就在這里指定,比如樹莓派 2B、3B 等。
import("http://build/ohos.gni") device_type="rpi4b" group("products_group"){ deps+=[ "http://device/raspberrypi/rpi4b:rpi4b_group" ] }
既然前面指定了 rpi4b 的編譯配置組件,那么就在 device aspberrypi 新建一個 rpi4b 的目錄,可以參考 hi3516dv300 build 組件:
https://gitee.com/openharmony/device_hisilicon_hi3516dv300
device aspberrypi pi4bBUILD.gn:
import("http://build/ohos.gni") print("rpi4b_groupin") group("rpi4b_group"){ deps=[ "build/rootfs:init_configs", "http://kernel/linux/build:linux_kernel" ] }
至此一個 rpi4b build 組件就添加到 OHOS3.0 的編譯框架了,之后相關內容添加到這個文件夾下就可以了。
樹莓派內核相關
接下來分析下目前移植了樹莓派 4B 的哪些內容,如何將這些內容編譯進 OHOS3.0。
①raspberrypi 內核補丁文件
關于補丁可以參考 Patch 組件:
https://gitee.com/openharmony/kernel_linux_patches
可以得知內核編譯由 kernel.mk 來執行。
kernellinuxuildkernel.mk:
DEVICE_PATCH_DIR:=$(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch DEVICE_PATCH_FILE:=$(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch ...... $(KERNEL_IMAGE_FILE): $(hide)echo"buildkernel..." $(hide)rm-rf$(KERNEL_SRC_TMP_PATH);mkdir-p$(KERNEL_SRC_TMP_PATH);cp-arfL$(KERNEL_SRC_PATH)/*$(KERNEL_SRC_TMP_PATH)/ $(hide)cd$(KERNEL_SRC_TMP_PATH)&&patch-p1$(HDF_PATCH_FILE)?&&?patch?-p1?$(DEVICE_PATCH_FILE) ifneq?($(findstring?$(BUILD_TYPE),?small),) ????$(hide)?cd?$(KERNEL_SRC_TMP_PATH)?&&?patch?-p1?$(SMALL_PATCH_FILE) endif
所以補丁文件需要放到正確的路徑下,以正確的名字命名就可以 patch 到內核。
hdf.patch 補丁文件,現在還沒有移植 HDF 相關內容,所以可以先使用 Hi3516 的 rpi4b.patch 補丁文件,使用樹莓派的官方鏡像:
https://github.com/raspberrypi/linux
kernellinuxpatcheslinux-5.10rpi4b_patchhdf.patch kernellinuxpatcheslinux-5.10rpi4b_patchrpi4b.patch
②內核編譯配置文件
kernellinuxconfiglinux-5.10archarmconfigsrpi4b_standard_defconfig
內核配置文件目前已知的需要開啟下面內容,但是肯定不止這些,以后會繼續更新:
~/ohos/kernel/linux/config/linux-5.10/arch/arm/configs/rpi4b_standard_defconfig ##################################################################################### >Securityoptions >(32768)LowaddressspaceforLSMtoprotectfromuserallocation [*]NSASELinuxSupport#(選中) [*]NSASELinuxbootparameter#(選中) []NSASELinuxruntimedisable [*]NSASELinuxDevelopmentSupport [*]NSASELinuxAVCStatistics (1)NSASELinuxcheckreqprotdefaultvalue#(設置為1) (9)NSASELinuxsidtabhashtablesize (256)NSASELinuxSIDtocontextstringtranslationcachesize Firstlegacy'majorLSM'tobeinitialized(SELinux)--->#(選中)SELinux OrderedlistofenabledLSMs#(填入:"lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf") ##################################################################################### >DeviceDrivers >Android [*]AndroidDrivers#(開啟) [*]AndroidBinderIPCDriver#(開啟) ##################################################################################### >DeviceDrivers >Soundcardsupport <*>AdvancedLinuxSoundArchitecture#(選中,直接編進內核) <*>ALSAforSoCaudiosupport#(選中,直接編進內核) >DeviceDrivers >Graphicssupport <*>DirectRenderingManager(XFree864.1.0andhigherDRIsupport)#(選中,直接編進內核) <*>BroadcomV3D3.xandnewer#(選中,直接編進內核) <*>BroadcomVC4Graphics#(選中,這個依賴前面的聲卡設置,不然是無法編入內核的) ##################################################################################### >DeviceDrivers >Inputdevicesupport >Touchscreens <*>RaspberryPi'sfirmwarebasetouchscreensupport#(選中,直接編進內核)
驅動適配
①顯示配置
Pi4 的 GPU 是 VideoCore VI 支持 OpenGL ES 3.2,而 Pi3 的 GPU 是 VideoCore IV 支持 OpenGL ES 2.0。
VideoCore IV 驅動程序是 VC4,VideoCore VI 驅動程序的 V3D。內核已經提供驅動,參考 rpi4b_standard_defconfig 將驅動直接編入到內核。
同時需要在 config.txt 中開啟設置:
dtoverlay=vc4-fkms-v3d
OHOS 中修改 weston 的配置文件,指定顯示驅動。
systemetcweston.ini:
[output] name=card0
②觸摸配置
具體思路就是先查找設備號,根據設備號找到驅動程序。
ls-l/sys/dev/char/|grepinput#查看input下的觸摸設備的主次設備號 cat/sys/dev/char/13:64/device/uevent#然后輸入主次設備號,查看設備的驅動程序 PRODUCT=19/0/0/0 NAME="raspberrypi-ts" PROP=2 EV=b KEY=4000000000000 ABS=26080003 MODALIAS=input:b0019v0000p0000e0000-e0,1,3,k14A,ra0,1,2F,35,36,39,mlsfw
前面內核配置的時候 rpi4b_standard_defconfig 中已經將觸摸驅動編入內核,所以后面不需要在 init 加載模塊了,修改下 eudev 的配置文件即可。
third_partyeudev ules.d ouchscreen.rules:
ATTRS{name}=="raspberrypi-ts",ENV{ID_INPUT}="1",ENV{ID_INPUT_TOUCHSCREEN}="1" ATTRS{name}=="VSoCkeyboard",ENV{ID_INPUT}="1",ENV{ID_INPUT_KEYBOARD}="1" DRIVERS=="hid-multitouch",ENV{ID_INPUT}="1",ENV{ID_INPUT_TOUCHSCREEN}="1"
制作鏡像文件
①修改內核編譯腳本
正常情況下內核是由 uboot 進行引導的,而且 OHOS 默認生成 uImage。
但是樹莓派自帶 BootLoader,雖然可以先用樹莓派自帶的 BootLoader 啟動 uboot,再用 uboot 加載 uImage,但是這樣會比較麻煩,而且會增加啟動時間。不過目前 zImage 是寫死在 kernel.mk 中的,沒辦法改下編譯腳本。
kernellinuxuildkernel.mk 將 uImage 改為 zImage modules dtbs:
$(hide)$(KERNEL_MAKE)-C$(KERNEL_SRC_TMP_PATH)ARCH=$(KERNEL_ARCH)$(KERNEL_CROSS_COMPILE)-j64zImage
kernellinuxuilduild_kernel.sh:
-cp${2}/kernel/src_tmp/${8}/arch/arm/boot/uImage${3}/uImage +cp${2}/kernel/src_tmp/${8}/arch/arm/boot/zImage${3}/zImage
kernellinuxuildBUILD.gn:
-outputs=["$root_build_dir/packages/phone/images/uImage"] +outputs=["$root_build_dir/packages/phone/images/zImage"]
kernellinuxuildkernel_module_build.sh:
-LINUX_KERNEL_UIMAGE_FILE=${LINUX_KERNEL_OUT}/arch/arm/boot/uImage +LINUX_KERNEL_UIMAGE_FILE=${LINUX_KERNEL_OUT}/arch/arm/boot/zImage
這里內核編譯會依賴 product_path="vendor/product_company/product
company/product_name"下的 hdf.hcs 文件,得先新建一個應付下,不然會報下面這個錯誤。
ninja:error:‘…/…/vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs’,neededby‘gen/drivers/adapter/uhdf2/hcs/hdf_default.hcb’,missingandnoknownruletomakeit新建:vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs
root{ module="default"; }
②制作樹莓派 boot 目錄
對于鏡像燒錄,Hi3516 會將 uImage、system.img、vendor.img 等鏡像燒寫到 emmc,但是樹莓派使用 TF 卡啟動,所以需要對 TF 卡進行分區,然后復制對應的內容到各個分區。
首先制作樹莓派 boot 目錄,這個用來目錄存放樹莓派設備樹、config.txt、cmdline.txt、內核鏡像等信息。
寫一個簡單的 mkboot.py 腳本來實現這個功能,位置在碼倉 rpi4bdevice aspberrypiimagesmkboot.py 將會生成 boot.img。
為了方便燒錄,需要將 boot.img、system.img、updater.img、vendor.img、userdata.img 合并成一個 rpi4b.img。
還是寫一個簡單的腳本來處理這個步驟 rpi4bdevice aspberrypiimagesmkboot.py。
不過有個問題,主分區只支持 4 個,所以 updater.img 暫時先不合并了,這個問題等以后再來處理。
最后將會得到一個 rpi4b.img 的鏡像文件,將這個文件燒錄到 SD 卡就可以了。
Linux:可以使用 dd 命令。windows:使用Win32 Disk Imager工具燒錄即可。
到這里總算是跑通了一個完整的添加新單板的流程,只不過目前只適配了顯示和觸摸。接下來打算嘗試 HDF 或者 distributed 部分。
原文標題:添加樹莓派4B到OHOS3.0編譯框架
文章出處:【微信公眾號:HarmonyOS技術社區】歡迎添加關注!文章轉載請注明出處。
-
Linux
+關注
關注
87文章
11123瀏覽量
207919 -
編譯
+關注
關注
0文章
646瀏覽量
32672 -
樹莓派
+關注
關注
116文章
1679瀏覽量
105256
原文標題:添加樹莓派4B到OHOS3.0編譯框架
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論