添加樹(shù)莓派4B到OHOS3.0編譯框架
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
前言
之前在樹(shù)莓派4b上點(diǎn)亮了OHOS3.0,不過(guò)內(nèi)核是用tftp拉取的,根文件系統(tǒng)掛在了NFS上,拔了網(wǎng)線就無(wú)法啟動(dòng)。當(dāng)然這么操作只是為了方便調(diào)試,而最終需要的是一個(gè)可以燒錄到TF卡上的img鏡像文件。這就需要將所有調(diào)試好的內(nèi)容添加到OHOS3.0的編譯框架,本以為是很簡(jiǎn)單的事情,好家伙,整了這么久,感覺(jué)添加編譯框架比移植本身更復(fù)雜。于是我整理了添加樹(shù)莓派單板到編譯框架的內(nèi)容,希望對(duì)各位有所幫助,為大家避坑。
一、添加編譯配置文件和gn
1.添加RPI4B.json
主要參考 hisilicon build組件倉(cāng),添加一個(gè)products編譯組件,這個(gè)組件是在產(chǎn)品配置文件中指定的。比如:
- productdefine\common\products\RPI4B.json
其他部分參考Hi3516,但是其中2條,指定單板組件路徑,并添加組件。如果刪除這兩條,將不能編譯內(nèi)核,只生成OHOS的文件系統(tǒng)。
- ... ..
- "product_build_path": "device/raspberrypi/build",
- "parts":{
- ... ...
- "raspberrypi_products:raspberrypi_products":{},
- ... ...
- }
2.添加ohos.build
接下來(lái)在device目錄下,新建一個(gè)raspberrypi編譯組件文件夾,并添加 ohos.build 文件。和前面產(chǎn)品配置文件中的設(shè)置對(duì)應(yīng)起來(lái)了。
- device\raspberrypi\build\ohos.build
- {
- "subsystem": "raspberrypi_products",
- "parts": {
- "raspberrypi_products": {
- "module_list": [
- "//device/raspberrypi/build:products_group"
- ]
- }
- }
- }
新建 device\raspberrypi\build\BUILD.gn 當(dāng)然每個(gè)廠家不可能只有1個(gè)板子,如果有其他單板就在這里指定,比如樹(shù)莓派2B、3B等。
- import("//build/ohos.gni")
- device_type = "rpi4b"
- group("products_group") {
- deps += [
- "//device/raspberrypi/rpi4b:rpi4b_group"
- ]
- }
既然前面指定了rpi4b的編譯配置組件,那么就在 device\raspberrypi 新建一個(gè) rpi4b 的目錄,可以參考 hi3516dv300 build組件。
- device\raspberrypi\rpi4b\BUILD.gn
- import("//build/ohos.gni")
- print("rpi4b_group in")
- group("rpi4b_group") {
- deps = [
- "build/rootfs:init_configs",
- "//kernel/linux/build:linux_kernel"
- ]
- }
至此一個(gè)rpi4b build組件就添加到OHOS3.0的編譯框架了,之后相關(guān)內(nèi)容添加到這個(gè)文件夾下就可以了。
二、樹(shù)莓派內(nèi)核相關(guān)
接下來(lái)分析下目前移植了樹(shù)莓派4B的哪些內(nèi)容,如何將這些內(nèi)容編譯進(jìn)OHOS3.0。
1.raspberrypi內(nèi)核補(bǔ)丁文件
關(guān)于補(bǔ)丁可以參考 Patch組件,可以得知內(nèi)核編譯由kernel.mk來(lái)執(zhí)行。
- kernel\linux\build\kernel.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 "build kernel..."
- $(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
所以補(bǔ)丁文件需要放到正確的路徑下,以正確的名字命名就可以patch到內(nèi)核。
hdf.patch補(bǔ)丁文件,現(xiàn)在還沒(méi)有移植HDF相關(guān)內(nèi)容,所以可以先使用Hi3516的rpi4b.patch補(bǔ)丁文件,使用樹(shù)莓派的官方鏡像,https://github.com/raspberrypi/linux
- kernel\linux\patches\linux-5.10\rpi4b_patch\hdf.patch
- kernel\linux\patches\linux-5.10\rpi4b_patch\rpi4b.patch
2.內(nèi)核編譯配置文件
- kernel\linux\config\linux-5.10\arch\arm\configs\rpi4b_standard_defconfig
內(nèi)核配置文件目前已知的需要開(kāi)啟下面內(nèi)容,但是肯定不止這些,以后會(huì)繼續(xù)更新。
- ~/ohos/kernel/linux/config/linux-5.10/arch/arm/configs/rpi4b_standard_defconfig
- #####################################################################################
- > Security options
- > (32768) Low address space for LSM to protect from user allocation
- [*] NSA SELinux Support #(選中)
- [*] NSA SELinux boot parameter #(選中)
- [ ] NSA SELinux runtime disable
- [*] NSA SELinux Development Support
- [*] NSA SELinux AVC Statistics
- (1) NSA SELinux checkreqprot default value #(設(shè)置為1)
- (9) NSA SELinux sidtab hashtable size
- (256) NSA SELinux SID to context string translation cache size
- First legacy 'major LSM' to be initialized (SELinux) ---> #(選中) SELinux
- Ordered list of enabled LSMs #(填入:"lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf")
- #####################################################################################
- > Device Drivers
- > Android
- [*] Android Drivers #(開(kāi)啟)
- [*] Android Binder IPC Driver #(開(kāi)啟)
- #####################################################################################
- > Device Drivers
- > Sound card support
- <*> Advanced Linux Sound Architecture #(選中,直接編進(jìn)內(nèi)核)
- <*> ALSA for SoC audio support #(選中,直接編進(jìn)內(nèi)核)
- > Device Drivers
- > Graphics support
- <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) #(選中,直接編進(jìn)內(nèi)核)
- <*> Broadcom V3D 3.x and newer #(選中,直接編進(jìn)內(nèi)核)
- <*> Broadcom VC4 Graphics #(選中,這個(gè)依賴前面的聲卡設(shè)置,不然是無(wú)法編入內(nèi)核的)
- #####################################################################################
- > Device Drivers
- > Input device support
- > Touchscreens
- <*> Raspberry Pi's firmware base touch screen support #(選中,直接編進(jìn)內(nèi)核)
三、驅(qū)動(dòng)適配
1.顯示配置
Pi4的GPU是VideoCore VI支持OpenGL ES 3.2,而Pi3的GPU是VideoCore IV支持OpenGL ES 2.0。VideoCore IV 驅(qū)動(dòng)程序是 VC4,VideoCore VI 驅(qū)動(dòng)程序的 V3D。內(nèi)核已經(jīng)提供驅(qū)動(dòng),參考rpi4b_standard_defconfig將驅(qū)動(dòng)直接編入到內(nèi)核。
同時(shí)需要在config.txt中開(kāi)啟設(shè)置:
- dtoverlay=vc4-fkms-v3d
OHOS中修改weston的配置文件,指定顯示驅(qū)動(dòng)。
- system\etc\weston.ini
- [output]
- name=card0
2.觸摸配置
具體思路就是先查找設(shè)備號(hào),根據(jù)設(shè)備號(hào)找到驅(qū)動(dòng)程序。
- ls -l /sys/dev/char/|grep input # 查看input下的觸摸設(shè)備的主次設(shè)備號(hào)
- cat /sys/dev/char/13\:64/device/uevent # 然后輸入主次設(shè)備號(hào),查看設(shè)備的驅(qū)動(dòng)程序
- PRODUCT=19/0/0/0
- NAME="raspberrypi-ts"
- PROP=2
- EV=b
- KEY=400 0 0 0 0 0 0 0 0 0 0
- ABS=2608000 3
- MODALIAS=input:b0019v0000p0000e0000-e0,1,3,k14A,ra0,1,2F,35,36,39,mlsfw
前面內(nèi)核配置的時(shí)候rpi4b_standard_defconfig中已經(jīng)將觸摸驅(qū)動(dòng)編入內(nèi)核,所以后面不需要在init加載模塊了,修改下eudev的配置文件即可。
- third_party\eudev\rules.d\touchscreen.rules
- ATTRS{name}=="raspberrypi-ts", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
- ATTRS{name}=="VSoC keyboard", ENV{ID_INPUT}="1", ENV{ID_INPUT_KEYBOARD}="1"
- DRIVERS=="hid-multitouch", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
四、制作鏡像文件
1.修改內(nèi)核編譯腳本
正常情況下內(nèi)核是由uboot進(jìn)行引導(dǎo)的,而且OHOS默認(rèn)生成uImage。但是樹(shù)莓派自帶BootLoader,雖然可以先用樹(shù)莓派自帶的BootLoader啟動(dòng)uboot,再用uboot加載uImage,但是這樣會(huì)比較麻煩,而且會(huì)增加啟動(dòng)時(shí)間。不過(guò)目前 zImage是寫(xiě)死在kernel.mk中的,沒(méi)辦法改下編譯腳本吧。
- kernel\linux\build\kernel.mk 將 uImage 改為 zImage modules dtbs
- $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 zImage
- kernel\linux\build\build_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
- kernel\linux\build\BUILD.gn
- - outputs = [ "$root_build_dir/packages/phone/images/uImage" ]
- + outputs = [ "$root_build_dir/packages/phone/images/zImage" ]
- kernel\linux\build\kernel_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
這里內(nèi)核編譯會(huì)依賴product_path="vendor/product_company/productcompany/product_name"下的hdf.hcs文件,得先新建一個(gè)應(yīng)付下,不然會(huì)報(bào)下面這個(gè)錯(cuò)誤。
- ninja: error: ‘…/…/vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs’, needed by ‘gen/drivers/adapter/uhdf2/hcs/hdf_default.hcb’, missing and no known rule to make it
- 新建:vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs
- root {
- module = "default";
- }
2.制作樹(shù)莓派boot目錄
對(duì)于鏡像燒錄,Hi3516會(huì)將uImage、system.img、vendor.img等鏡像燒寫(xiě)到emmc,但是樹(shù)莓派使用TF卡啟動(dòng),所以需要對(duì)TF卡進(jìn)行分區(qū),然后復(fù)制對(duì)應(yīng)的內(nèi)容到各個(gè)分區(qū)。首先制作樹(shù)莓派boot目錄,這個(gè)用來(lái)目錄存放樹(shù)莓派設(shè)備樹(shù)、config.txt、cmdline.txt、內(nèi)核鏡像等信息。寫(xiě)一個(gè)簡(jiǎn)單的mkboot.py腳本來(lái)實(shí)現(xiàn)這個(gè)功能,位置在碼倉(cāng)rpi4b\device\raspberrypi\images\mkboot.py將會(huì)生成boot.img。
為了方便燒錄,需要將boot.img、system.img、updater.img、vendor.img、userdata.img合并成一個(gè)rpi4b.img。還是寫(xiě)一個(gè)簡(jiǎn)單的腳本來(lái)處理這個(gè)步驟rpi4b\device\raspberrypi\images\mkboot.py。
不過(guò)有個(gè)問(wèn)題,主分區(qū)只支持4個(gè),所以u(píng)pdater.img暫時(shí)先不合并了,這個(gè)問(wèn)題等以后再來(lái)處理。
最后將會(huì)得到一個(gè)rpi4b.img的鏡像文件,將這個(gè)文件燒錄到SD卡就可以了。
Linux:可以使用dd命令
windows:使用Win32 Disk Imager工具燒錄即可。
到這里總算是跑通了一個(gè)完整的添加新單板的流程,只不過(guò)目前只適配了顯示和觸摸。接下來(lái)打算嘗試HDF或者distributed部分。
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:
https://harmonyos.51cto.com/resource/1559
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)