之前在树莓派 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":[ "//device/raspberrypi/build:products_group" ] } } }
新建 device aspberrypiuildBUILD.gn 当然每个厂家不可能只有 1 个板子,如果有其他单板就在这里指定,比如树莓派 2B、3B 等。
import("//build/ohos.gni") device_type="rpi4b" group("products_group"){ deps+=[ "//device/raspberrypi/rpi4b:rpi4b_group" ] }
既然前面指定了 rpi4b 的编译配置组件,那么就在 device aspberrypi 新建一个 rpi4b 的目录,可以参考 hi3516dv300 build 组件:
https://gitee.com/openharmony/device_hisilicon_hi3516dv300
device aspberrypi pi4bBUILD.gn:
import("//build/ohos.gni") print("rpi4b_groupin") group("rpi4b_group"){ deps=[ "build/rootfs:init_configs", "//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文章
11219浏览量
208872 -
编译
+关注
关注
0文章
652浏览量
32800 -
树莓派
+关注
关注
116文章
1697浏览量
105502
原文标题:添加树莓派4B到OHOS3.0编译框架
文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论