更多内容请访问:与华为共建的鸿蒙技术社区官方https://harmonyos.51cto.com前言之前在树莓派4b上开启了OHOS3.0,但是内核是tftp拉取的,根文件系统挂在NFS上,拔掉网线后无法启动。当然,这个操作只是为了方便调试,最终需要的是一个可以烧录到TF卡上的img镜像文件。这就需要将调试的内容全部加入到OHOS3.0的编译框架中。我以为这是一件很简单的事情。好家伙,这么久了,感觉加上编译框架比自己移植还复杂。所以整理了下树莓派单板加入编译框架的内容,希望能对大家有所帮助,也能为大家避坑。1.增加编译配置文件和gn1.添加RPI4B.json主要是指海思构建组件仓库,添加一个产品编译组件,在产品配置文件中指定。例如:productdefine\common\products\RPI4B.json的其他部分参考了Hi3516,但其中有两处指定了单板元件路径和添加元件。如果删除这两项,则无法编译内核,只会生成OHOS的文件系统。....."product_build_path":"device/raspberrypi/build","parts":{..."raspberrypi_products:raspberrypi_products":{},...}2.添加ohos.build接下来,在device目录下,创建raspberrypi编译组件文件夹,添加ohos.build文件。对应上一个产品配置文件中的设置。device\raspberrypi\build\ohos.build{"subsystem":"raspberrypi_products","parts":{"raspberrypi_products":{"module_list":["//device/raspberrypi/build:products_group"]}}}新设备\raspberrypi\build\BUILD.gn当然不可能每个厂家都只有一块板子。如果还有其他的板子,在这里指定,比如RaspberryPi2B、3B等import("//build/ohos.gni")device_type="rpi4b"group("products_group"){deps+=["//device/raspberrypi/rpi4b:rpi4b_group"]}由于前面指定了rpi4b的编译配置组件,那么在device\raspberrypi中创建一个rpi4b目录,可以参考hi3516dv300构建组件。设备\raspberrypi\rpi4b\BUILD.gnimport("//build/ohos.gni")print("rpi4b_groupin")group("rpi4b_group"){deps=["build/rootfs:init_configs","//kernel/linux/build:linux_kernel"]}至此,在OHOS3.0的编译框架中添加了一个rpi4b构建组件,然后在该文件夹中添加相关内容即可。2、树莓派内核相关接下来分析一下树莓派4B移植了哪些内容,以及如何将这些内容编译到OHOS3.0中。1、树莓派内核补丁文件可以参考Patch组件打补丁,可以知道内核编译是由kernel.mk执行的。kernel\linux\build\kernel.mkDEVICE_PATCH_DIR:=$(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patchDEVICE_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)&&补丁-p1<$(SMALL_PATCH_FILE)endif所以补丁文件需要放在正确的路径下,正确的名字才能打到内核中。hdf.patch补丁文件,HDF相关内容暂未移植,可以先使用Hi3516的rpi4b.patch补丁文件,使用树莓派官方镜像,https://github.com/raspberrypi/linuxkernel\linux\patches\linux-5.10\rpi4b_patch\hdf.patchkernel\linux\patches\linux-5.10\rpi4b_patch\rpi4b.patch2。内核编译配置文件kernel\linux\config\linux-5.10\arch\arm\configs\rpi4b_standard_defconfig内核配置文件目前知道的需要打开下面的内容,但是肯定不止这些,以后还会继续以后更新。~/ohos/kernel/linux/config/linux-5.10/arch/arm/configs/rpi4b_standard_defconfig#####################################################################################>安全选项>(32768)LowaddressspaceforLSMtoprotectfromuserallocation[*]NSASELinuxSupport#(选中)[*]NSASELinuxbootparameter#(选中)[]NSASELinuxruntimedisable[*]NSASELinuxDevelopmentSupport[*]NSASELinuxAVCStatistics(1)NSASELinuxcheckreqprotdefaultvalue#(拟1)(9)NSASELinuxsidtabhashtablesize(256)NSASELinuxSIDtocontextstringtranslationcachesizeFirstlegacy'majorLSM'tobeinitialized(SELinux)--->#(选中)SELinuxOrderedlistofenabledLSMs#(填入:"lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf")###################################################################################>DeviceDrivers>Android[*]AndroidDrivers#(启动)[*]AndroidBinderIPCDriver#(启动)#####################################################################################>DeviceDrivers>Soundcardsupport<*>AdvancedLinuxSoundArchitecture#(选中,直接编译进内核)<*>ALSAforSoCaudiosupport#(选中,直接编译进内核)>DeviceDrivers>Graphicssupport<*>DirectRenderingManager(XFree864.1.0andhigherDRIsupport)#(选中,直接编译进内核Kernel)<*>BroadcomV3D3.xandnewer#(选中,直接编译进内核)<*>BroadcomVC4Graphics#(选中,这个要看之前的声卡设置,否则无法编译进内核)#######################################################################################>设备驱动程序>输入设备支持>触摸屏<*>RaspberryPi'sfirmwarebasetouchscreensupport#(选中,直接编译进内核)三、驱动适配配置1、Pi4的GPU为支持OpenGLES3.2的VideoCoreVI,Pi3的GPU为支持OpenGLES2.0的VideoCoreIV。VideoCoreIV的驱动是VC4,VideoCoreVI的驱动是V3D。内核已经提供了驱动,参考rpi4b_standard_defconfig将驱动直接编译进内核。同时需要打开config.txt中设置:dtoverlay=vc4-fkms-v3dOHOS修改weston配置文件,指定显示驱动。系统\etc\weston.ini[输出]名称=card02。touchconfiguration的具体思路是先找到设备号,根据设备号找到驱动。ls-l/sys/dev/char/|grepinput#在inputcat/sys/dev/char/13\:64/device/uevent下查看触摸设备的主副设备号#然后输入主副设备查看设备驱动程序的数字PROP=19/0/0/0NAME="raspberrypi-ts"PROP=2EV=bKEY=4000000000000ABS=26080003MODALIAS=input:b0019v0000p0000e0000-e0,1,3,k14A,ra0,1,2F,35,36,39.mlsfw前面配置内核的时候,在rpi4b_standard_defconfig里已经把touch驱动编译进内核了,所以后面不用在init里加载模块,修改eudev的配置文件即可。third_party\eudev\rules.d\touchscreen.rulesATTRS{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"4.创建图像文件1.修改内核编译脚本通常情况下,内核由uboot引导,OHOS默认生成uImage。但是树莓派自带BootLoader,虽然可以先用树莓派自带的BootLoader启动uboot,再用uboot加载uImage,但是这样会比较麻烦,会增加启动时间。但是目前zImage是硬编码在kernel.mk中的,所以没办法改编译脚本。kernel\linux\build\kernel.mk将uImage更改为zImagemodulesdtbs$(hide)$(KERNEL_MAKE)-C$(KERNEL_SRC_TMP_PATH)ARCH=$(KERNEL_ARCH)$(KERNEL_CROSS_COMPILE)-j64zImagekernel\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}/zImagekernel\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/bootany/zImage这里的内核编译会依赖product_path="vendor/product_company/product_name下的hdf.hcs文件”,必须先新建一个来处理,否则会报如下错误。忍者:错误:'.../.../vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcs','gen/drivers/adapter/uhdf2/hcs/hdf_default.hcb'需要,丢失且未知新建规则:vendor/raspberrypi/RPI4B/hdf_config/uhdf/hdf.hcsroot{module="default";}2.创建树莓派启动目录镜像烧录,Hi3516会烧录uImage,system.img,vendor。img等图片转emmc,但是树莓派是用TF卡启动的,所以需要对TF卡进行分区,然后将相应的内容复制到各个分区中。首先创建树莓派启动目录,用于存放树莓派设备树、config.txt、cmdline.txt、内核镜像等信息。写一个简单的mkboot.py脚本来实现这个功能,位于代码仓库rpi4b\device\raspberrypi\images\mkboot.py会生成boot.img。为了方便烧录,需要将boot.img、system.img、updater.img、vendor.img、userdata.img合并为一个rpi4b.img。或者写一个简单的脚本来处理这一步rpi4b\device\raspberrypi\images\mkboot.py。但是有个问题,主分区只支持4个,所以updater.img暂时不会合并,这个问题以后再处理。最后,你会得到一个rpi4b.img镜像文件,将这个文件烧录到SD卡即可。Linux:您可以使用dd命令。Windows:使用Win32DiskImager工具进行刻录。至此终于跑完了一个完整的加板子的过程,但是目前只适配了显示和触摸。接下来,我打算试试HDF或者分布式部分。文章相关附件可点击下方链接下载原文:https://harmonyos.51cto.com/resource/1559更多信息请访问:与华为官方共建的鸿蒙技术社区https:///和声。51cto.com
