更新升级 专属应用 系统故障 硬件故障 电脑汽车 鸿蒙刷机 鸿蒙开发Linux教程 鸿蒙开发Linux命令
当前位置:HMXT之家 > 应用开发 > 技术讲解:树莓派4B移植OHOS 3.0 LTS标准系统,附思路方法

技术讲解:树莓派4B移植OHOS 3.0 LTS标准系统,附思路方法

更新时间:2021-11-29 10:07:43浏览次数:298+次

以下是技术讲解内容:树莓派4B移植OHOS 3.0 LTS(OpenHarmony 3.0 LTS)标准系统,以下将给出具体的思路方法,供鸿蒙开发者参考。

前言

终于在树莓派4B上将OHOS3.0启动起来了,虽然还不完整,目前只能实现的显示和触摸。以下将和大家分享下我的思路,相关动画截图如下:

\

相关参考:在鸿蒙HarmonyOS开发中经常出现的ohos代表的是什么意思

技术内容

我的方法比较简单粗暴,直接使用的树莓派的树莓派linux rpi-5.10.y内核。Git地址:https://github.com/raspberrypi/linux,然后编译OHOS3.0的文件系统,看缺什么补什么大概是这个意思。目前发现OHOS需要内核开启selinux和binder make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig,然后修改下面几项:

Security options  --->

    (32768) Low address space for LSM to protect from user allocation

    [*] NSA SELinux Support             (选中)

    [*]   NSA SELinux boot parameter    (选中)

    [ ]   NSA SELinux runtime disable

    [*]   NSA SELinux Development Support

    [*]   NSA SELinux AVC Statistics

    (1)   NSA SELinux checkreqprot default value    (设置为1)

    (9)   NSA SELinux sidtab hashtable size

    (256) NSA SELinux SID to context string translation cache size

        First legacy 'major LSM' to be initialized (SELinux)  ---> (选中) SELinux

        Ordered list of enabled LSMs (填入:"lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf")

 Device Drivers  --->

    Android  --->

        [*] Android Drivers (开启)

        [*]   Android Binder IPC Driver (开启)

目前发现开启这两项hilog就可以输出。内核挂上根文件系统,至少可以启动串口有输出了。然后分析下OHOS的图形子系统。OHOS目前是内核 -> DRM -> libdrm -> wayland -> weston这么个模式,如有错误欢迎指出。这里要感谢梁克雷和钊哥ohos第三方板移植群各位的支持。所以树莓派的DRM正常了,后面显示应该就是没为题的。好在树莓派的生态比较开放,资料还是比较好获取的,在树莓派官方论坛关注了一段时间。Pi4的GPU是VideoCore VI支持OpenGL ES 3.2,而Pi3的GPU是VideoCore IV支持OpenGL ES 2.0。VideoCore IV驱动程序是VC4,VideoCore VI驱动程序的V3D。需要在config.txt中开启vc4-fkms-v3d,而驱动kernal已经提供了模块,只要在init阶段将模块加载就可以了,这里有个比较麻烦的地方,OHOS的根文件系统使用的是Toybox,但是很多工具不支持,比如modprobe就没有,所以只能根据modules.dep文件,一个一个insmod。当然可以直接将驱动编进内核也是可以的:

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/drm_panel_orientation_quirks.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/backlight/backlight.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/drm.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/media/cec/core/cec.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/syscopyarea.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/sysfillrect.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/sysimgblt.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/fb_sys_fops.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/drm_kms_helper.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-timer.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-pcm.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-compress.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-pcm-dmaengine.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/sound/soc/snd-soc-core.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/vc4/vc4.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/scheduler/gpu-sched.ko",

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/v3d/v3d.ko"

为了验证drm和libdrm是否正常,我写了一个简单的测试:

    fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);

    if (fd < 0) {

        printf("open failed");

    }else{

        printf("open seccess\n");

    }

    uint32_t conn_id;

    uint32_t crtc_id;

    res = drmModeGetResources(fd);  // 获取 crtc_id 和 connector_id

    if (!res) {

        printf("ERROR: drmModeGetResources failed!\n");

        drmClose(fd);

        return -1;

    }else{

        printf("drmModeGetResources seccess\n");

    }

    crtc_id = res->crtcs[0];

    conn_id = res->connectors[0];

    conn = drmModeGetConnector(fd, conn_id);    // 获取 drm_mode

    if (!conn) {

        printf("ERROR: drmModeGetConnector failed!\n");

    }else{

        printf("drmModeGetConnector seccess\n");

    }

其实libdrm是自带测试的modetest,但是OHOS没有加入编译。也可以将modetest加入编译框架。

1.为modetest添加BUILD.gn

third_party\libdrm\tests\modetest\BUILD.gn:

import("//build/ohos.gni")

ohos_executable("modetest") {

  sources = [

    "buffers.c",

    "cursor.c",

    "modetest.c",

  ]

  cflags = [

      "-Wno-pointer-arith",

  ]

  include_dirs = [

    "../",

    ".",

  ] 

  configs = [ "//third_party/libdrm:libdrm_config" ]

  public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

  deps = [

    "//third_party/libdrm:libdrm",

    "//third_party/libdrm/tests/util/:util",

  ]

  public_deps = []

  install_images = [

    "system",

    "updater",

  ]

  part_name = "graphic_standard"

  subsystem_name = "graphic"

}

2.modetest依赖这个

third_party\libdrm\tests\util\BUILD.gn:

import("//build/ohos.gni")

ohos_static_library("util") {

  sources = [

    "format.c",

    "kms.c",

    "pattern.c",

  ]

  cflags = []

  include_dirs = [

    "../",

    ".",

  ]

  configs = [ "//third_party/libdrm:libdrm_config" ]

  public_configs = [ "//third_party/libdrm:libdrm_public_config" ]

  deps = [

    "//third_party/libdrm:libdrm",

  ]

  public_deps = []

}

3.加入到OHOS编译框架,加在weston的依赖项里就可以了

third_party\weston\BUILD.gn:

"//third_party/libdrm:libdrm",

"//third_party/libdrm/tests/util/:util",

"//third_party/libdrm/tests/modetest/:modetest",

有个报错,问题不大,提示这个未使用,注释的就好了:

third_party\libdrm\tests\util\pattern.c:988

    // void *mem_base = mem;

如果modetest通过了,那剩下的就简单了指定weston的后端就可以了。system\etc\weston.ini:

[output]

name=card0

接下来是触摸部分,我使用的是DSI接口的触摸屏:

hexdump /dev/input/event2   # 可以使用hexdump看触摸设备有没有输出,可惜这个命令也不支持

cat /dev/input/event2       # cat也可以凑合用,只是输出乱码,但能证明触摸是否好用

然后查看驱动模块:

ls -l /sys/dev/char/|grep input    # 查看input下的触摸设备的主次设备号

cat /sys/dev/char/226\:0/device/uevent  # 然后输入主次设备号,查看设备的驱动程序

DRIVER=raspberrypi-ts

... ...

发现驱动是raspberrypi-ts,那就好办了,在init的时候安装这个模块就好了:

"insmod /lib/modules/5.10.76-v7l/kernel/drivers/input/touchscreen/raspberrypi-ts.ko"

注:基本是这么个思路,写出来和大家分享下,希望对正在移植的小伙伴能有些帮助。当然加到鸿蒙编译框架可能没有这么简单,接下来我会先整理这部分的文档,就更新在https://gitee.com/liangzili/harmony-raspberry这个仓:

\

以上这个码仓我之前移植过OHOS1.0 LiteOS-A内核到树莓派2ModuleB,就直接放到一起了,会持续的更新,以分享更多的技术。