OHOS LTS 3.0移植到RaspberryPi 4B 原创 精华
1. 简介
《沉浸式剖析OpenHarmony源代码》一书没有涉及系统移植方面的内容,因此在交了书稿到出版社之后,我就开始考虑系统移植方面的事情。在了解一些情况后综合考量,我决定尝试一下在Raspberry Pi 4B上移植OHOS,因为已经有成功的先例了,一来可行性没问题,二来可以少走很多弯路。
本次移植参考了社区大佬 亮子力的“harmony-raspberry: 移植鸿蒙Harmony到树莓派 (gitee.com)” 和 hazhuzhu哈猪猪 的“#星光计划2.0# OpenHarmony3.0的树莓派4B移植-学习记录-开源基础软件社区-51CTO.COM” 。二位的成功移植案例,给了我不少启发,虽然在实际移植过程中,我也经历了一些他们没遇到过的问题,但最终都比较顺利地解决掉了。
下面是我将OHOS LTS3.0系统移植到 Raspberry Pi 4B 开发板上所做的一些事情,感兴趣的小伙伴可以参考下面的步骤进行操作,应该也能比较顺利地完成初步的移植工作。
视频链接:https://ost.51cto.com/show/13949
本次移植的相关代码见码云仓库:
已确认可运行的烧录镜像见百度网盘:
链接内OhosLts30Pi4b目录下的文件列表:
2. OHOS LTS3.0
创建 LTS30 目录,在该目录内下载 OHOS LTS3.0 源代码:
3. 产品配置部分
3.1 rpi4b.json 设备部分
//productdefine/common/device/目录下,拷贝“hi3516dv300.json”,并重命名为“rpi4b.json”,并修改相关字段:
3.2 rpi4b.json 产品部分
//productdefine/common/products/目录下,拷贝“Hi3516DV300.json”,并重命名为 “rpi4b.json”,并修改相关字段:
可以对部件列表进行一下裁剪,把不相关部分部件去掉,但要注意可能会因为依赖关系的原因导致编译异常。
4. vendor部分
创建//vendor/raspberrypi/rpi4b/目录,整体拷贝//vendor/hisilicon/Hi3516DV300/目录下的 hdf_config 目录到 //vendor/raspberrypi/rpi4b/ 目录下,修改 hdf_config/khdf/hdf.hcs 文件为:
本例是有移植HDF的,不过在8.3的内核配置中,把“CONFIG_DRIVERS_HDF_TEST”注释掉了,因此这里需要增加一个Makefile去直接编译 hdf_config/khdf/hdf.hcs, 而不去编译 hdf_config/khdf/hdf_test/hdf.hcs。
以后再根据Raspberry Pi 4B的硬件实情来修改hdf_config的其他部分。
5. device部分
增加//device/raspberrypi/目录下的内容,见本仓库//device/raspberrypi/目录下的文件修改和同目录下的README.md文档
6. init_lite部分
修改//base/startup/init_lite/services/BUILD.gn 文件,增加下面一句:
//base/startup/init_lite/services/etc/目录下增加 “rpi4b_init_cfg/”目录,将同目录系的init.cfg文件拷贝进去,并做修改。
7. drivers部分
把//drivers/peripheral/camera/hal/adapter/chipset/gni/ 目录下的camera.rpi3.gni拷贝一份,并重命名为camera.rpi4b.gni,内容不需要修改。
8. kernel部分
8.1 //kernel/linux/ 内核代码部分
Linux内核,不用OHOS自带的 linux-5.10 源代码,而是用RaspberryPi官方的5.10版本源代码,这样可以免去内核部分的移植工作。
在 //kernel/linux/ 目录下创建 “linux-5.10-rpi4b” 目录,把RaspberryPi官方的5.10分支内核源代码,下载到该目录下:
如果无法通过github下载,那就在gitee上搜索同版本的镜像代码下载回来使用也可以。
8.2 //kernel/linux/build/ 编译脚本部分
OHOS内核默认编译生成 uImage,rpi4b 需要修改编译生成 zImage。
BUILD.gn 文件内:
增加下面两处对(device_name == “rpi4b”)的判断和修改,可以让rpi4b产品选用 8.1 中下载的“linux-5.10-rpi4b”内核源代码去生成zImage镜像文件。
build_kernel.sh 文件内:
kernel_module_build.sh 文件内:
kernel.mk 文件内:
从上到下的修改(请搜索关键字“rpi4b”):
- 增加编译modules的安装路径:
- 修改内核源代码路径:
- 修改编译内核的工具链
OHOS默认使用 arm-linux-gnueabi 编译工具来编译Linux内核,用这个编译rpi4b使用的内核也可以。
但建议用RaspberryPi官方推荐的 arm-linux-gnueabihf 编译工具来编译内核(32位系统)。
请先执行 “sudo apt install crossbuild-essential-armhf ” 将编译工具安装到默认的 /usr/bin/ 目录下,然后修改编译工具链:
- 修改编译目标:
- 修改make命令的编译目标、安装modules到INSTALL_MOD_PATH指定的位置:
8.3 //kernel/linux/config/ 编译配置部分
将上述文件拷贝并改名到:
在该文件内增加Android Binder、OHOS HDF、Security部分的配置,详细配置的开关,见本仓库上述路径下的文件,这些配置可根据实际情况微调。
另外,为避免OHOS HDF的USB部分编译失败,需将 rpi4b_standard_defconfig 文件内的:
修改为:
将该模块直接编译进内核。
其他默认编译成模块的部分如:
等,可先保持不动,我们会在”5.device部分“的“init.rpi4b.cfg”文件中加载相应的模块起来运行即可。
或者在这里将相应的CONFIG_XXX配置成“=y”,直接将其编译进内核,则在”5.device部分“ 的 “init.rpi4b.cfg” 文件中就不需要 insmod 了。
8.4 //kernel/linux/patches/ 编译补丁部分
//kernel/linux/patches/linux-5.10/rpi4b_patch/目录下两个patch文件。
hdf.patch 文件拷贝自 …/hi3516dv300_patch/hdf.patch,完全不用修改。
rpi4b.patch 文件原本应该是OHOS移植到rpi4b平台上所需要的大量适配代码的patch,但因为目前使用的kernel 代码是RaspberryPi官方的内核,已经包含所有的适配代码了,因此rpi4b.patch可以留空,这里是直接拷贝 hi3516dv300_small.patch,并做简单处理:
9. third_party部分
9.1 eudev
//third_party/eudev/rules.d/touchscreen.rules 文件的修改。
Raspberry Pi 4B的触碰显示屏,有多个硬件方案,不同方案需要加载不同的驱动程序。
对于我的Raspberry Pi 4B开发板,在Raspberry Pi 4B上运行官方系统时,通过查看触屏的设备信息和驱动程序(驱动程序用于insmod,或者在编译内核时直接编译进去),看到有"vc4"和"generic ft5x06 (79)"两个,把它们都加进rules文件中去。这一步需要请小伙伴们根据自己的触屏设备的实际信息修改和添加:
9.2 weston.ini
//third_party/weston/weston.ini 文件的修改。
在我的环境下,不改这个文件,显示屏也会有正常显示,但是触屏的触碰输入功能会失效,必须要在此文件末尾增加如下修改,触碰输入功能才会正常。
注意:如果Raspberry Pi 4B不带(或不接)触屏,则要把HDMI设备接到HDMI0端口上,再把上面的name字段设置为“HDMI-A-1”即可。如果HDMI设备接到HDMI1端口上,则只会在开机阶段显示终端上的log,weston运行起来之后会无输出了。
10. build 部分
10.1 打包modules到system.img
修改 //build/ohos/images/build_image.py 脚本:
在 _prepare_root 函数末尾增加这几句话,把modules部分拷贝到system对应目录下,一并生成到system.img 镜像内,并生成 /lib 到 /system/lib 的软链接。【Hi3516DV300项目会因为不存在modules_src目录而不会跑拷贝的步骤】
修改 //build/ohos/images/mkimage/dac.txt 文件,增加两句:
为了让system.img、vendor.img、userdata.img镜像不至于太大,修改 //build/ohos/images/mkimage/ 目录下的:
system_image_conf.txt 文件【本文件实际可不改】:
vendor_image_conf.txt 文件大小不改。
userdata_image_conf.txt 文件【本文件实际可不改】:
10.2 编译rpi4b产品
代码根目录下执行:
即可开始编译rpi4b产品。
11. 生成分离的烧录镜像
编译成功,生成的镜像有:zImage、system.img、vendor.img、userdata.img 这四个用于本项目的烧录,updater.img 镜像可先不管。
根据8.2的编译内核的脚本的更改,zImage、dtb、overlays、modules会被拷贝到images目录下。
根据10.1的打包镜像脚本的更改,modules会被拷贝到…/system/lib/modules/目录下,一并打包进system.img 里。
如果你已有烧录了Raspberry Pi官方系统的SD卡,可以保持上面的/boot分区不动,把这里的zImage拷贝进去,在config.txt文件中修改启动的内核为:kernel=zImage。
再在Linux下用fdisk命令,删除/rootfs分区,并重新建立三个主分区,分区大小建议大于 10.1 中修改的各分区镜像大小即可。再用dd命令分别将 system.img、vendor.img、userdata.img 三个镜像烧录到SD卡的mmcblk0p2、mmcblk0p3、mmcblk0p4 分区即可。
注意分区的烧录位置,system.img一定要烧录到mmcblk0p2分区,因为在/boot分区的cmdline.txt中指定了root分区的位置为 /dev/mmcblk0p2。
vendor.img和userdata.img两个镜像分别烧录到mmcblk0p3、mmcblk0p4分区。在 /system/etc/init.cfg 中有:
会把它们分别挂载到/vendor和/data下。
12. 生成合并的ohos_rpi4b.img烧录镜像
如果想要生成合并的系统镜像,可以参考并使用亮子力的脚本,见仓库:harmony-raspberry: 移植鸿蒙Harmony到树莓派 (gitee.com) 内的使用说明。
本地步骤如下:
12.1 整体拷贝烧录官方rpi4b系统的SD卡的boot分区内容到://device/raspberrypi/rpi4b/build/boot/ 目录下。
12.2 根据实际情况修改 cmdline.txt 中的root字段:
12.3 修改 config.txt 文件,将启动的内核镜像修改为 zImage:
12.4 创建 //device/raspberrypi/mkimg/目录,把亮子力的仓库中的:
https://gitee.com/liangzili/harmony-raspberry/blob/master/rpi4b/device/raspberrypi/images/
目录下的脚本拷贝到此目录下(实际只需要mkboot.py 和 mergeImg.sh)。
在项目代码根目录下执行mkboot.py脚本命令,以生成 boot.img 镜像:
在项目代码根目录下执行mergeImg.sh脚本命令,以生成 ohos_rpi4b.img 镜像:
将 ohos_rpi4b.img 拷贝到Windows系统硬盘下,通过RaspberryPi官方的Imager烧录工具将其烧录到SD卡即可。
以后再修改代码和编译OHOS后:
-
如只涉及内核的修改(不涉及modules的动态加载),可直接将新生成的zImage文件拷贝并替换SD卡内的boot分区中的zImage文件(或相关文件)即可。
-
如只涉及system分区内容的相关修改(包括涉及modules的动态加载),可直接在Linux命令行下,使用 “dd” 命令单独烧录system.img镜像到SD卡的 /dev/mmcblk0p2 分区即可,不需要重新打包成ohos_rpi4b.img 和重新烧录全部分区了。
-
默认的vendor分区和userdata分区,目前没有什么重要内容需要在rpi4b开发板上用到,但这两个分区会默认挂载到根目录下,暂没必要重复烧录。
大佬这移植太6了。
yyds
现在已经有不少成功的移植案例了,移植难度降低了不少。
这需要感谢最早移植OHOS到RPI上的几位大佬,早早探明了一些大坑。
这个3.0是标准系统还是小型系统
感谢梁老师分享
标准系统
博主接下来会做HDF驱动的适配吗?
赞,刚好手头上有可用的树莓派4b
4b上设置应用点进去会一直闪退,这个问题有啥解决方法没
确实会闪退,我之前没注意到。
我先看看能不能找到原因。
不过把3.0移植到rpi4b上,只是一个初期尝试,
把3.1 release或者 master分支上,移植到rpi4b上,价值更大一些。
这个工作量应该会比较大,不过可以尝试一下简单功能模块的适配。
到时候有成果了我再发出来。
期待,顺便求大佬出一期 4b移植ohos 3.0后,如何实现4b安装 ohos hap包的视频,我周末试了一下,在路由器上没找到4b连上网络,用的网线连接的