[文章]树莓派4B移植OHOS 3.0 LTS标准系统

阅读量0
0
0
终于在树莓派4B上将OHOS3.0启动起来了,虽然还不完整,目前只能实现的显示和触摸。但是可以和大家分享下我的思路。
移植树莓派4b.gif

我的方法比较简单粗暴,直接使用的树莓派的树莓派linux rpi-5.10.y内核。
Git地址:https://github.com/raspberrypi/linux
然后编译OHOS3.0的文件系统,看缺什么补什么大概是这个意思。
目前发现OHOS需要内核开启selinux和binder
  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
复制代码
然后修改下面几项:
  1. Security options  --->  
  2.     (32768) Low address space for LSM to protect from user allocation

  3.     [*] NSA SELinux Support                                ([font=Cambria]选中[/font][font=Consolas])[/font]
  4.     [*]   NSA SELinux boot parameter        ([font=Cambria]选中[/font][font=Consolas])[/font]
  5.     [ ]   NSA SELinux runtime disable
  6.     [*]   NSA SELinux Development Support
  7.     [*]   NSA SELinux AVC Statistics
  8.     (1)   NSA SELinux checkreqprot default value        ([font=Cambria]设置为[/font][font=Consolas]1)[/font]
  9.     (9)   NSA SELinux sidtab hashtable size
  10.     (256) NSA SELinux SID to context string translation cache size
  11.         First legacy 'major LSM' to be initialized (SELinux)  ---> ([font=Cambria]选中[/font][font=Consolas]) SELinux[/font]
  12.         Ordered list of enabled LSMs ([font=Cambria]填入[/font][font=Consolas]:"lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf")[/font]
  13. Device Drivers  --->
  14.         Android  --->
  15.                 [*] Android Drivers        ([font=Cambria]开启[/font][font=Consolas])[/font]
  16.                 [*]   Android Binder IPC Driver ([font=Cambria]开启[/font][font=Consolas])[/font]
复制代码
目前发现开启这两项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。当然可以直接将驱动编进内核也是可以的。
  1. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/drm_panel_orientation_quirks.ko",
  2. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/backlight/backlight.ko",
  3. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/drm.ko",
  4. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/media/cec/core/cec.ko",
  5. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/syscopyarea.ko",
  6. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/sysfillrect.ko",
  7. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/sysimgblt.ko",
  8. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/video/fbdev/core/fb_sys_fops.ko",
  9. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/drm_kms_helper.ko",
  10. "insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd.ko",
  11. "insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-timer.ko",
  12. "insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-pcm.ko",
  13. "insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-compress.ko",
  14. "insmod /lib/modules/5.10.76-v7l/kernel/sound/core/snd-pcm-dmaengine.ko",
  15. "insmod /lib/modules/5.10.76-v7l/kernel/sound/soc/snd-soc-core.ko",
  16. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/vc4/vc4.ko",
  17. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/scheduler/gpu-sched.ko",
  18. "insmod /lib/modules/5.10.76-v7l/kernel/drivers/gpu/drm/v3d/v3d.ko"
复制代码

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

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

  2.                 if (fd < 0) {

  3.                         printf("open failed");

  4.                 }else{

  5.                         printf("open seccessn");

  6.                 }


  7.                 uint32_t conn_id;

  8.                 uint32_t crtc_id;

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

  10.                 if (!res) {

  11.                         printf("ERROR: drmModeGetResources failed!n");

  12.                         drmClose(fd);

  13.                         return -1;

  14.                 }else{

  15.                         printf("drmModeGetResources seccessn");

  16.                 }

  17.                 crtc_id = res->crtcs[0];

  18.                 conn_id = res->connectors[0];


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

  20.                 if (!conn) {

  21.                         printf("ERROR: drmModeGetConnector failed!n");

  22.                 }else{

  23.                         printf("drmModeGetConnector seccessn");

  24.                 }
复制代码

其实libdrm是自带测试的modetest,但是OHOS没有加入编译。也可以将modetest加入编译框架
1.为modetest添加BUILD.gn
  1. third_partylibdrmtestsmodetestBUILD.gn
复制代码
  1. <span class="18">import("//build/ohos.gni")</span>

  2. <span class="18">ohos_executable("modetest") {</span>

  3. <span class="18">  sources = [</span>
  4. <span class="18">    "buffers.c",</span>
  5. <span class="18">    "cursor.c",</span>
  6. <span class="18">    "modetest.c",</span>
  7. <span class="18">  ]</span>

  8. <span class="18">  cflags = [</span>
  9. <span class="18">      "-Wno-pointer-arith",</span>
  10. <span class="18">  ]</span>

  11. <span class="18">  include_dirs = [</span>
  12. <span class="18">    "../",</span>
  13. <span class="18">    ".",</span>
  14. <span class="18">  ]</span>
  15. <span class="18">  </span>
  16. <span class="18">  configs = [ "//third_party/libdrm:libdrm_config" ]</span>

  17. <span class="18">  public_configs = [ "//third_party/libdrm:libdrm_public_config" ]</span>

  18. <span class="18">  deps = [</span>
  19. <span class="18">    "//third_party/libdrm:libdrm",</span>
  20. <span class="18">    "//third_party/libdrm/tests/util/:util",</span>
  21. <span class="18">  ]</span>

  22. <span class="18">  public_deps = []</span>

  23. <span class="18">  install_images = [</span>
  24. <span class="18">    "system",</span>
  25. <span class="18">    "updater",</span>
  26. <span class="18">  ]</span>
  27. <span class="18">  part_name = "graphic_standard"</span>
  28. <span class="18">  subsystem_name = "graphic"</span>
  29. <span class="18">}</span>
复制代码

2.modetest依赖这个
  1. third_partylibdrmtestsutilBUILD.gn
复制代码
  1. <span class="18">import("//build/ohos.gni")</span>

  2. <span class="18">ohos_static_library("util") {</span>

  3. <span class="18">  sources = [</span>
  4. <span class="18">    "format.c",</span>
  5. <span class="18">    "kms.c",</span>
  6. <span class="18">    "pattern.c",</span>
  7. <span class="18">  ]</span>

  8. <span class="18">  cflags = []</span>

  9. <span class="18">  include_dirs = [</span>
  10. <span class="18">    "../",</span>
  11. <span class="18">    ".",</span>
  12. <span class="18">  ]</span>
  13. <span class="18">  </span>
  14. <span class="18">  configs = [ "//third_party/libdrm:libdrm_config" ]</span>

  15. <span class="18">  public_configs = [ "//third_party/libdrm:libdrm_public_config" ]</span>

  16. <span class="18">  deps = [</span>
  17. <span class="18">    "//third_party/libdrm:libdrm",</span>
  18. <span class="18">  ]</span>

  19. <span class="18">  public_deps = []</span>
  20. <span class="18">}</span>
复制代码

3.加入到OHOS编译框架,加在weston的依赖项里就可以了
  1. third_partywestonBUILD.gn
复制代码
  1. <span class="18">"//third_party/libdrm:libdrm",</span>
  2. <span class="18">"//third_party/libdrm/tests/util/:util",</span>
  3. <span class="18">"//third_party/libdrm/tests/modetest/:modetest",</span>
复制代码
有个报错:问题不大,提示这个未使用,注释的就好了
  1. <span class="18">third_partylibdrmtestsutilpattern.c<font face="Cambria">:</font><font face="Consolas">988</font></span>
  2. <span class="18">        // void *mem_base = mem;</span>
复制代码
如果modetest通过了,那剩下的就简单了指定weston的后端就可以了。
systemetcweston.ini
  1. <span class="17">[</span><span class="19">output</span><span class="17">]</span>
  2. <span class="19">name</span><span class="17">=</span><span class="19">card0</span>
复制代码
接下来是触摸部分,我使用的是DSI接口的触摸屏。
  1. <span class="19">hexdump </span><span class="17">/</span><span class="19">dev</span><span class="17">/</span><span class="19">input</span><span class="17">/</span><span class="19">event2   # <font face="Cambria">可以使用</font><font face="Consolas">hexdump</font><font face="Cambria">看触摸设备有没有输出,可惜这个命令也不支持</font></span>
  2. <span class="19">cat </span><span class="17">/</span><span class="19">dev</span><span class="17">/</span><span class="19">input</span><span class="17">/</span><span class="19">event2                # cat<font face="Cambria">也可以凑合用,只是输出乱码,但能证明触摸是否好用</font></span>
复制代码
然后查看驱动模块
  1. <span class="19">ls </span><span class="17">-</span><span class="19">l </span><span class="17">/</span><span class="19">sys</span><span class="17">/</span><span class="19">dev</span><span class="17">/</span><span class="20">char</span><span class="17">/|</span><span class="19">grep input    # <font face="Cambria">查看</font><font face="Consolas">input</font><font face="Cambria">下的触摸设备的主次设备号</font></span>
  2. <span class="19">cat </span><span class="17">/</span><span class="19">sys</span><span class="17">/</span><span class="19">dev</span><span class="17">/</span><span class="20">char</span><span class="17">/</span><span class="23">226</span><span class="19"></span><span class="17">:</span><span class="23">0</span><span class="17">/</span><span class="19">device</span><span class="17">/</span><span class="19">uevent        # <font face="Cambria">然后输入主次设备号,查看设备的驱动程序</font></span>
  3. <span class="19">DRIVER</span><span class="17">=</span><span class="19">raspberrypi</span><span class="17">-</span><span class="19">ts</span>
  4. <span class="17">...</span><span class="19"> </span><span class="17">...</span>
复制代码
发现驱动是raspberrypi-ts,那就好办了,在init的时候安装这个模块就好了。
  1. "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,就直接放到一起了,近期会更新,感兴趣的可以关注,一起讨论。

回帖

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