# OpenHarmonyDevice **Repository Path**: shalan0627/openharmonydevice ## Basic Information - **Project Name**: OpenHarmonyDevice - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 27 - **Created**: 2022-02-27 - **Last Updated**: 2022-02-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

Rockchip芯片单板适配OpenHarmony的方法

# 1 整体思路 OpenHarmony是一个上层用户操作系统,在设计上希望兼容不同的底层系统。针对于L2的Linux标准设备,OpenHarmony对Linux、Uboot等底层系统没有太多的依赖,并且在驱动方面,HDF也兼容Linux标准驱动。 所以,底层系统基本上可以直接使用芯片厂家或者oem厂家原有的,上层系统使用OpenHarmony编译出来的。 整体思路上,可以采用分区image拼接的方式来移植适配: - 底层系统,即内核及之前的image:uboot、boot(含dtb 、kenel、驱动)等,使用芯片厂家或者oem厂家原有的; - 上层系统,即内核之上的image:rootfs、vendor(或者叫oem)、userdata,使用OpenHarmony的。 如果单板SDK的编译工具链和OpenHarmony的编译工具链是兼容的,底层系统的boot(含dtb 、kenel、驱动)部分,用单板SDK编译出来的image就可以。 如果不是兼容的,底层系统的boot部分需要用OpenHarmony的编译工具链重新编译出image。可以参考https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/porting/porting-linux-kernel.md # 2 版本选择 ## 1.1 OpenHarmony版本选择 建议选择比较新比较稳定的版本,暂不选择开发分支master,当前选择的是OpenHarmony-v3.1-Beta,该版本上已经有Rockchip芯片的产品"润和DAYU200",所以移植起来更加简单。 ## 1.2 SDK版本选择 建议选择纯净的Linux SDK。 基于RK芯片的一些单板支持多种操作系统,比如Android、Ubuntu、Buildroot(纯Linux),对应有不同的SDK,建议选择纯Linux的SDK,不要用Android和Ubuntu的,一是因为Android和Ubuntu对内核机制有修改,增加了移植的难度和工作量,比如Android的AVB、动态分区等机制都影响我们移植;二是目前RK主要芯片的纯Linux SDK的编译工具链和OpenHarmony的工具链是兼容的。 # 3 适配方法 以Firefly的RK系列为例,适配方法如下步骤。 本方法发布前已测试以下Firefly产品,验证OpenHarmony系统都可以正确起来、亮屏显示Launcher。 - ROC-RK3568-PC,芯片为RK3568 - AIO-3568J,芯片为RK3568 ## 步骤1 准备基础环境 选择使用纯Linux SDK的Buildroot固件,从Firefly官网下载对应产品的Buildroot固件进行烧录。 例如, ROC-RK3568-PC的下载链接:https://www.t-firefly.com/doc/download/107.html ROC-RK3568-PC的烧录方法:https://wiki.t-firefly.com/zh_CN/ROC-RK3568-PC/03-upgrade_firmware.html ![](res/burn-update-package.png) ## 步骤2 修改内核 OpenHarmony需要使用IPC binder通信,纯净Linux SDK中没有开启,需要开启IPC binder后重新编译内核。 需要获取到源码后,修改内核配置打开CONFIG_ANDROID_BINDER_IPC宏,重新编译内核。 比如,Firefly系列的操作方法: 首先,在Firefly官网下载对应产品的Linux_SDK源码包,并按照官网指导配置好编译环境后,修改 kernel/arch/arm64/configs/firefly_linux_defconfig文件,增加CONFIG_ANDROID_BINDER_IPC=y 然后,编译内核./build.sh kernel,拿到boot.img。 最后,使用按分区烧录的方式,单独烧录编译后的boot.img。烧录成功单板起来后,确保单板基本功能仍然正常,确保有/sys/module/binder/目录。 ```shell # ls /sys/module/binder/ -l total 0 drwxr-xr-x 2 root root 0 2022-01-25 07:20 parameters --w------- 1 root root 4096 2022-01-25 07:18 uevent # ``` 烧录时的分区表文件parameter.txt,可以从步骤2下载的源码中拿到,也可以从步骤1中的Buildroot固件解包拿到。解包的方法,可以参考https://blog.csdn.net/Neutionwei/article/details/121886647 ## 步骤3 编译OH的Image 需要有OpenHarmony-v3.1-Beta标准系统的image,下载OpenHarmony-v3.1-Beta的代码,编译hihope rk3568产品。 代码下载路径:https://gitee.com/openharmony/docs/blob/master/zh-cn/release-notes/OpenHarmony-v3.1-beta.md 编译方法:编译润和DAYU200产品,详细编译指导见https://gitee.com/openharmony/device_hihope ~~~shell bash build/prebuilts_download.sh ./build.sh --product-name rk3568 --ccache ~~~ 编译后,拿到system.img,vendor.img,userdata.img ## 步骤4 调整分区表 因OH的image较大,需要调整分区表。 在分区表文件parameter.txt中修改CMDLINE的内容,根据vendor.img、system.img和userdata.img的大小,调整oem、rootfs、userdata的分区大小,并相应调整后续分区的位置。 比如,Firefly ROC-RK3568-PC产品调整后的分区表。 ~~~c mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00020000@0x00028000(recovery),0x00010000@0x00048000(backup),0x00150000@0x00058000(oem),0x30ce00@0x001A8000(rootfs),-@0x4B4e00(userdata:grow) ~~~ ## 步骤5 烧录修改后分区表和image 使用升级工具,先导入步骤4修改的分区表文件parameter.txt(右键-->导入配置-->选择文件类型为txt),然后选择各文件进行烧录。 - Parameter,选择步骤4修改后分区表文件parameter.txt - oem,选择步骤3编译的vendor.img - rootfs,选择步骤3编译的system.img - userdata,选择把步骤3编译的userdata.img ![](res/burn-images.png) 这一步完成后,rk3568系列产品,OpenHarmony已经可以起来了,HDMI屏幕可以显示OpenHarmony的桌面。 ## 步骤6 修改挂载路径 ### 挂载路径说明 不同产品的分区挂载路径不一样,在分区挂载时,需要指定自己产品实际的分区挂载路径。 我们使用的是OpenHarmony hihope rk3568编译出的image,这些image中的分区挂载路径配置是hihope rk3568的,需要修改成自己产品的实际分区挂载路径。 对于OpenHarmony上的hihope rk3568,有两个文件指定了挂载路径,需要修改这两个文件。 第一个文件是/system/etc/init.without_two_stages.cfg(这是在单板上的路径),打包在system.img中,代码文件路径是device/hihope/rk3568/build/rootfs/init.without_two_stages.cfg ```shell "mount ext4 /dev/block/platform/fe310000.sdhci/by-name/vendor /vendor wait rdonly barrier=1", "mount ext4 /dev/block/platform/fe310000.sdhci/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc" ``` 说明:没开启ramdisk的产品使用/system/etc/init.without_two_stages.cfg,开启ramdisk的产品使用/system/etc/init.cfg。目前测试的几个Firefly产品没有开启ramdisk,如果你不清楚是否开启了ramdisk,建议这两个cfg文件都修改。 第二个文件/vendor/etc/fstab.rk3568(这是在单板上的路径),打包在vendor.img中,代码文件路径是./device/hihope/rk3568/build/rootfs/fstab.rk3568。 ```shell # fstab file. # /dev/block/platform/fe310000.sdhci/by-name/system /usr ext4 ro,barrier=1 wait,required /dev/block/platform/fe310000.sdhci/by-name/vendor /vendor ext4 ro,barrier=1 wait,required /dev/block/platform/fe310000.sdhci/by-name/userdata /data ext4 nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600 ``` ### 修改方法 先查看分区挂载路径,不同产品的分区路径的前缀,可以用如下命令查看。查到的前缀加上分区名称,就是完整的挂载路径。 ```shell # find /dev/ -name "by-name" /dev/block/platform/fe310000.sdhci/by-name ``` 然后修改配置文件。可以在代码中修改后再编译,也可以把busybox打包到system image中通过vi修改,还可以直接基于image文件修改,方法如下。 1. 在Linux服务器上,拿到vendor.img和system.img 2. 新建空文件夹,比如temp 3. 将system.img mount到temp目录 4. 修改temp/system/etc/init.without_two_stages.cfg文件中的挂载路径,并保存。不同产品怎么修改列在后面。 5. umout temp 6. 将vendor.img mount到temp目录 7. 修改temp/etc/fstab.rk3568文件中的挂载路径,并保存。不同产品怎么修改列在后面。 8. umout temp 执行命令可参考: ```shell tanpengju@OpenHarmony:~/firefly/hihope$ ls system.img userdata.img vendor.img tanpengju@OpenHarmony:~/firefly/hihope$ mkdir temp tanpengju@OpenHarmony:~/firefly/hihope$ sudo mount system.img temp tanpengju@OpenHarmony:~/firefly/hihope$ ls temp bin config data dev etc init lib lost+found proc sys system updater vendor tanpengju@OpenHarmony:~/firefly/hihope$ sudo vi temp/system/etc/init.without_two_stages.cfg tanpengju@OpenHarmony:~/firefly/hihope$ sudo umount temp tanpengju@OpenHarmony:~/firefly/hihope$ ls temp/ tanpengju@OpenHarmony:~/firefly/hihope$ sudo mount vendor.img temp tanpengju@OpenHarmony:~/firefly/hihope$ ls temp/ etc lost+found tanpengju@OpenHarmony:~/firefly/hihope$ sudo vi temp/etc/fstab.rk3568 tanpengju@OpenHarmony:~/firefly/hihope$ sudo umount temp ``` 完成修改后,烧录修改后的system.img和vendor.img。 烧录后在单板串口通过mount命令查看分区挂载情况,确认oem、userdata分区成功挂载到/vendor和/data目录。 ### 不同产品修改点 Firefly ROC-RK3568-PC和Firefly AIO-3568J ,主要修改了分区名称。 ```shell # /system/etc/init.without_two_stages.cfg文件 "mount ext4 /dev/block/platform/fe310000.sdhci/by-name/oem /vendor wait rdonly barrier=1", "mount ext4 /dev/block/platform/fe310000.sdhci/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc" ``` ```shell # /vendor/etc/fstab.rk3568文件 # fstab file. # /dev/block/platform/fe310000.sdhci/by-name/rootfs /usr ext4 ro,barrier=1 wait,required /dev/block/platform/fe310000.sdhci/by-name/oem /vendor ext4 ro,barrier=1 wait,required /dev/block/platform/fe310000.sdhci/by-name/userdata /data ext4 nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600 ``` Firefly AIO-3399J ,主要修改分区路径和名称。 ```shell # /system/etc/init.without_two_stages.cfg文件 "mount ext4 /dev/block/platform/fe330000.sdhci/by-name/oem /vendor wait rdonly barrier=1", "mount ext4 /dev/block/platform/fe330000.sdhci/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc" ``` ```shell # /vendor/etc/fstab.rk3568文件 # fstab file. # /dev/block/platform/fe330000.sdhci/by-name/rootfs /usr ext4 ro,barrier=1 wait,required /dev/block/platform/fe330000.sdhci/by-name/oem /vendor ext4 ro,barrier=1 wait,required /dev/block/platform/fe330000.sdhci/by-name/userdata /data ext4 nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600 ``` # 4 适配效果 Firefly ROC-RK3568-PC: ![](res/Firefly-ROC-RK3568-PC-with-OpenHarmony.jpg) Firefly AIO-3568J : ![](res/Firefly-AIO-3568J-with-OpenHarmony.jpg) 测试这几款产品的屏幕显示正常,USB接口触屏触摸可用但不稳定。