[文章]RK3399/3568 适配OpenHarmony 3.1 Beta的方法

阅读量0
2
6
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/do ... ing-linux-kernel.md

2、版本选择
2.1 OpenHarmony版本选择
建议选择比较新比较稳定的版本,暂不选择开发分支master,当前选择的是OpenHarmony-v3.1-Beta,该版本上已经有Rockchip芯片的产品"润和DAYU200",所以移植起来更加简单。

2.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
  • AIO-3399J,芯片为rk3399

3.1 步骤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 ... grade_firmware.html
                        

3.2 步骤2:修改编译内核
OpenHarmony需要使用IPC binder通信,纯净Linux SDK中没有开启,需要开启IPC binder后重新编译内核。

需要获取到源码后,修改内核配置打开CONFIG_ANDROID_BINDER_IPC宏,重新编译内核。

比如,Firefly系列的操作方法:
首先,在Firefly官网下载对应产品的Linux_SDK源码包,注意Kernel需要选择4.19版本。

然后,修改产品对应的config文件,增加 CONFIG_ANDROID_BINDER_IPC=y。比如:在 kernel/arch/arm64/configs/firefly_linux_defconfig 增加CONFIG_ANDROID_BINDER_IPC=y。

然后,按照官网指导配置好编译环境,编译内核./build.sh kernel,拿到boot.img。

最后,使用按分区烧录的方式,单独烧录编译后的boot.img。烧录成功单板起来后,确保单板基本功能仍然正常,确保有/sys/module/binder/目录。
  1.     # ls /sys/module/binder/ -l
  2.     total 0
  3.     drwxr-xr-x 2 root root    0 2022-01-25 07:20 parameters
  4.     --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.3 步骤3:修改编译OH
需要有OpenHarmony-v3.1-Beta标准系统的image,下载OpenHarmony-v3.1-Beta的代码,编译hihope rk3568产品。
3.3.1 环境搭建
说明: 以上安装命令适用于Ubuntu18.04,其他版本请根据安装包名称采用对应的安装命令。
  1. $ sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby git-lfs openjdk-8-jdk
复制代码
3.3.2 代码下载
  1.     $ mkdir OpenHarmony-3.1
  2.     $ cd OpenHarmony-3.1
  3.     $ repo init --repo-url=https://gitlab.com/firefly-linux/git-repo -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v3.1-Beta --no-clone-bundle
  4.     $ .repo/repo/repo sync -c
  5.     $.repo/repo/repo forall -c 'git lfs pull'
复制代码
3.3.3 代码修改(rk3399需要处理,rk3568跳过这一节)
rk3399需要删除zpos相关代码,下面列出的代码需要删除。rk3568不需要这个代码修改。
  1.     // 代码路径:./device/hihope/hardware/display/src/display_device/drm_plane.cpp
  2.     // 所在函数:int32_t DrmPlane::Init(DrmDevice &drmDevice)
  3.     // 删除如下代码:
  4.         ret = drmDevice.GetPlaneProperty(*this, PROP_ZPOS_ID, prop);
  5.         DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id"));
  6.     ​
  7.     // 代码路径:./device/hihope/hardware/display/src/display_device/hdi_drm_composition.cpp
  8.     // 所在函数:int32_t HdiDrmComposition::ApplyPlane(HdiDrmLayer &layer,
  9.     //                                       HdiLayer &hlayer,
  10.     //                                       DrmPlane &drmPlane,
  11.     //                                       drmModeAtomicReqPtr pset)
  12.     // 删除如下代码:
  13.         ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropZposId(), layer.GetZorder());
  14.         DISPLAY_LOGI("set the fb planeid %{public}d, GetPropZposId %{public}d, zpos %{public}d", drmPlane.GetId(), drmPlane.GetPropZposId(), layer.GetZorder());
  15.         DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the zpos fialed errno : %{public}d", errno));
复制代码

3.3.4 编译
  1.     $ bash build/prebuilts_download.sh
  2.     $ ./build.sh --product-name rk3568 --ccache
复制代码
如果编译成功,会打印类似log如下
  1.     post_process

  2.     =====build rk3568 successful.

  3.     2021-09-13 09:22:28
复制代码
而且在 out/rk3568/packages/phone/images 可以拿到system.img,vendor.img,userdata.img

3.4 步骤4:调整分区表
因OH的image较大,需要调整分区表。

在分区表文件parameter.txt中修改CMDLINE的内容,根据vendor.img、system.img和userdata.img的大小,调整oem、rootfs、userdata的分区大小,并相应调整后续分区的位置。

比如,Firefly ROC-RK3568-PC产品调整后的分区表。
  1. 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)
复制代码
3.5 步骤5:烧录修改后分区表和image
使用升级工具,先导入步骤4修改的分区表文件parameter.txt(右键-->导入配置-->选择文件类型为txt),然后选择各文件进行烧录。
  • Parameter,选择步骤4修改后分区表文件parameter.txt
  • oem,选择步骤3编译的vendor.img
  • rootfs,选择步骤3编译的system.img
  • userdata,选择把步骤3编译的userdata.img


这一步完成后,rk3568系列产品,OpenHarmony已经可以起来了,HDMI屏幕可以显示OpenHarmony的桌面。

3.6 步骤6:修改挂载路径挂载路径说明
3.6.1 挂载路径
不同产品的分区挂载路径不一样,在分区挂载时,需要指定自己产品实际的分区挂载路径。

我们使用的是OpenHarmony hihope rk3568编译出的image,这些image中的分区挂载路径配置是hihope rk3568的,需要修改成自己产品的实际分区挂载路径。

对于OpenHarmony上的hihope rk3568,有两个文件指定了挂载路径,需要修改这两个文件。

1)第一个文件是/system/etc/init.without_two_stages.cfg(这是在单板上的路径),打包在system.img中,代码文件路径是 device/hihope/rk3568/build/rootfs/init.without_two_stages.cfg
  1.     "mount ext4 /dev/block/platform/fe310000.sdhci/by-name/vendor /vendor wait rdonly barrier=1",
  2.     "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文件都修改。

(2)第二个文件/vendor/etc/fstab.rk3568(这是在单板上的路径),打包在vendor.img中,
代码文件路径是 device/hihope/rk3568/build/rootfs/fstab.rk3568
  1.     # fstab file.
  2.     # <src>    <mnt_point>    <type>    <mnt_flags and options>    <fs_mgr_flags>
  3.     /dev/block/platform/fe310000.sdhci/by-name/system               /usr       ext4     ro,barrier=1  wait,required
  4.     /dev/block/platform/fe310000.sdhci/by-name/vendor              /vendor        ext4     ro,barrier=1  wait,required
  5.     /dev/block/platform/fe310000.sdhci/by-name/userdata               /data       ext4     nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600
复制代码
3.6.2 修改方法
先查看分区挂载路径,不同产品的分区路径的前缀,可以用如下命令查看。查到的前缀加上分区名称,就是完整的挂载路径。
  1.     # find /dev/ -name "by-name"
  2.     /dev/block/platform/fe310000.sdhci/by-name
复制代码
然后修改配置文件。可以在代码中修改后再编译,也可以把busybox打包到system image中通过vi修改,还可以直接基于image文件修改,方法如下。
  • 在Linux服务器上,拿到vendor.img和system.img
  • 新建空文件夹,比如temp
  • 将system.img mount到temp目录
  • 修改temp/system/etc/init.without_two_stages.cfg文件中的挂载路径,并保存。不同产品怎么修改列在后面。
  • umout temp
  • 将vendor.img mount到temp目录
  • 修改temp/etc/fstab.rk3568文件中的挂载路径,并保存。不同产品怎么修改列在后面。
  • umout temp
    执行命令可参考:

  1.     tanpengju@OpenHarmony:~/firefly/hihope$ ls
  2.     system.img  userdata.img  vendor.img
  3.     tanpengju@OpenHarmony:~/firefly/hihope$ mkdir temp
  4.     tanpengju@OpenHarmony:~/firefly/hihope$ sudo mount system.img temp
  5.     tanpengju@OpenHarmony:~/firefly/hihope$ ls temp
  6.     bin  config  data  dev  etc  init  lib  lost+found  proc  sys  system  updater  vendor
  7.     tanpengju@OpenHarmony:~/firefly/hihope$ sudo vi temp/system/etc/init.without_two_stages.cfg
  8.     tanpengju@OpenHarmony:~/firefly/hihope$ sudo umount temp
  9.     tanpengju@OpenHarmony:~/firefly/hihope$ ls temp/
  10.     tanpengju@OpenHarmony:~/firefly/hihope$ sudo mount vendor.img temp
  11.     tanpengju@OpenHarmony:~/firefly/hihope$ ls temp/
  12.     etc  lost+found
  13.     tanpengju@OpenHarmony:~/firefly/hihope$ sudo vi temp/etc/fstab.rk3568
  14.     tanpengju@OpenHarmony:~/firefly/hihope$ sudo umount temp
复制代码
完成修改后,烧录修改后的 system.img 和 vendor.img。
烧录后在单板串口通过mount命令查看分区挂载情况,确认oem、userdata分区成功挂载到/vendor和/data目录。

3.6.3 不同产品修改点
Firefly ROC-RK3568-PC和Firefly AIO-3568J ,主要修改了分区名称。
(1)/system/etc/init.without_two_stages.cfg文件
  1.     "mount ext4 /dev/block/platform/fe310000.sdhci/by-name/oem /vendor wait rdonly barrier=1",
  2.     "mount ext4 /dev/block/platform/fe310000.sdhci/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc"
复制代码
(2)/vendor/etc/fstab.rk3568文件
  1.     # fstab file.
  2.     # <src>    <mnt_point>    <type>    <mnt_flags and options>    <fs_mgr_flags>
  3.     /dev/block/platform/fe310000.sdhci/by-name/rootfs               /usr       ext4     ro,barrier=1  wait,required
  4.     /dev/block/platform/fe310000.sdhci/by-name/oem              /vendor        ext4     ro,barrier=1  wait,required
  5.     /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 ,主要修改分区路径和名称。
(1)/system/etc/init.without_two_stages.cfg文件
  1.     "mount ext4 /dev/block/platform/fe330000.sdhci/by-name/oem /vendor wait rdonly barrier=1",
  2.     "mount ext4 /dev/block/platform/fe330000.sdhci/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc"
复制代码
(2)/vendor/etc/fstab.rk3568文件
  1.     # fstab file.
  2.     # <src>    <mnt_point>    <type>    <mnt_flags and options>    <fs_mgr_flags>
  3.     /dev/block/platform/fe330000.sdhci/by-name/rootfs               /usr       ext4     ro,barrier=1  wait,required
  4.     /dev/block/platform/fe330000.sdhci/by-name/oem              /vendor        ext4     ro,barrier=1  wait,required
  5.     /dev/block/platform/fe330000.sdhci/by-name/userdata               /data       ext4     nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600
复制代码
3.7 步骤7 修改文件系统读写权限
改下system.img
把 system/etc/init.cfg 和 system/etc/init.without_two_stages.cfg,把
  1. mount rootfs rootfs / remount bind ro nodev
复制代码
改为:
  1. mount rootfs rootfs / remount bind rw nodev
复制代码
3.8 步骤8 触摸屏的适配
首先,查找触摸屏对应的设备。使用 cat /proc/bus/input/devices找到触摸屏对应的设备。比如,这里触摸屏是第4个设备,记录Name为"himax-touchscreen"。
  1.     # cat /proc/bus/input/devices
  2.     I: Bus=0019 Vendor=524b Product=0006 Version=0100
  3.     N: Name="fe6e0030.pwm"
  4.     P: Phys=gpio-keys/remotectl
  5.     S: Sysfs=/devices/platform/fe6e0030.pwm/input/input0
  6.     U: Uniq=
  7.     H: Handlers=kbd event0 cpufreq
  8.     B: PROP=0
  9.     B: EV=3
  10.     B: KEY=100 0 0 40408800 1c16c0 0 0 0
  11.     ​
  12.     I: Bus=0019 Vendor=0000 Product=0000 Version=0000
  13.     N: Name="rk805 pwrkey"
  14.     P: Phys=rk805_pwrkey/input0
  15.     S: Sysfs=/devices/platform/fdd40000.i2c/i2c-0/0-0020/rk805-pwrkey/input/input1
  16.     U: Uniq=
  17.     H: Handlers=kbd event1 cpufreq
  18.     B: PROP=0
  19.     B: EV=3
  20.     B: KEY=100000 0 0 0
  21.     ​
  22.     I: Bus=0000 Vendor=0000 Product=0000 Version=0000
  23.     N: Name="Typec_Headphone"
  24.     P: Phys=fu***302/typec
  25.     S: Sysfs=/devices/platform/fdd40000.i2c/i2c-0/0-0022/input/input2
  26.     U: Uniq=
  27.     H: Handlers=event2
  28.     B: PROP=0
  29.     B: EV=21
  30.     B: SW=4
  31.     ​
  32.     I: Bus=0000 Vendor=0000 Product=0000 Version=0000
  33.     N: Name="himax-touchscreen"
  34.     P: Phys=
  35.     S: Sysfs=/devices/virtual/input/input3
  36.     U: Uniq=
  37.     H: Handlers=kbd event3 cpufreq
  38.     B: PROP=2
  39.     B: EV=b
  40.     B: KEY=10 0 0 0 0 0 0 0 400 0 0 0 2000000 0 40000800 40 0 0 0
  41.     B: ABS=6658000 0
  42.     ​
  43.     I: Bus=0019 Vendor=0001 Product=0001 Version=0100
  44.     N: Name="adc-keys"
  45.     P: Phys=adc-keys/input0
  46.     S: Sysfs=/devices/platform/adc-keys/input/input4
  47.     U: Uniq=
  48.     H: Handlers=kbd event4 cpufreq
  49.     B: PROP=0
  50.     B: EV=3
  51.     B: KEY=40000800 40000 1000000 0 0
复制代码
然后,将触摸屏设备的Name配置到udev的rule中,让udev自动识别该名称的设备为触摸屏设备。在/etc/udev/rules.d/touchscreen.rules文件末尾中,添加下面这句话,其中"himax-touchscreen"是上一步查询到的名称,不同硬件环境下不一样。
  1. ATTR{name}=="himax-touchscreen", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
复制代码
修改后的touchscreen.rules文件,示意如下:
  1.     # cat /etc/udev/rules.d/touchscreen.rules
  2.     ATTRS{name}=="VSoC touchscreen", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
  3.     ATTRS{name}=="VSoC keyboard", ENV{ID_INPUT}="1", ENV{ID_INPUT_KEYBOARD}="1"
  4.     DRIVERS=="hid-multitouch", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
  5.     ATTR{name}=="himax-touchscreen", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1"
复制代码
修改touchscreen.rules后,需要重启设备生效。

4 适配效果
Firefly ROC-RK3568-PC:
                        

Firefly AIO-3568J :
                        

Firefly AIO-3399J:


转自:Firefly开源社区   作者:Firefly_Javier



回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友