|
|
|
|
公众号矩阵

树莓派4B移植OHOS 3.0 LTS标准系统

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

作者:亮子力来源:鸿蒙社区|2021-11-23 15:35

想了解更多内容,请访问:

51CTO和华为官方战略合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

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

树莓派4B移植OHOS 3.0 LTS标准系统-鸿蒙HarmonyOS技术社区

我的方法比较简单粗暴,直接使用的树莓派的树莓派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

然后修改下面几项:

  1. Security options  --->   
  2.     (32768) Low address space for LSM to protect from user allocation  
  3.  
  4.     [*] NSA SELinux Support             (选中) 
  5.     [*]   NSA SELinux boot parameter    (选中) 
  6.     [ ]   NSA SELinux runtime disable 
  7.     [*]   NSA SELinux Development Support 
  8.     [*]   NSA SELinux AVC Statistics 
  9.     (1)   NSA SELinux checkreqprot default value    (设置为1) 
  10.     (9)   NSA SELinux sidtab hashtable size 
  11.     (256) NSA SELinux SID to context string translation cache size 
  12.         First legacy 'major LSM' to be initialized (SELinux)  ---> (选中) SELinux 
  13.         Ordered list of enabled LSMs (填入:"lockdown,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf"
  14.  Device Drivers  ---> 
  15.     Android  ---> 
  16.         [*] Android Drivers (开启) 
  17.         [*]   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。当然可以直接将驱动编进内核也是可以的。

  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 seccess\n"); 
  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 seccess\n"); 
  16. crtc_id = res->crtcs[0]; 
  17. conn_id = res->connectors[0]; 
  18.  
  19. conn = drmModeGetConnector(fd, conn_id);    // 获取 drm_mode 
  20. if (!conn) { 
  21.     printf("ERROR: drmModeGetConnector failed!\n"); 
  22. }else
  23.     printf("drmModeGetConnector seccess\n"); 

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

1.为modetest添加BUILD.gn

third_party\libdrm\tests\modetest\BUILD.gn

  1. import("//build/ohos.gni"
  2.  
  3. ohos_executable("modetest") { 
  4.  
  5.   sources = [ 
  6.     "buffers.c"
  7.     "cursor.c"
  8.     "modetest.c"
  9.   ] 
  10.  
  11.   cflags = [ 
  12.       "-Wno-pointer-arith"
  13.   ] 
  14.  
  15.   include_dirs = [ 
  16.     "../"
  17.     "."
  18.   ] 
  19.    
  20.   configs = [ "//third_party/libdrm:libdrm_config" ] 
  21.  
  22.   public_configs = [ "//third_party/libdrm:libdrm_public_config" ] 
  23.  
  24.   deps = [ 
  25.     "//third_party/libdrm:libdrm"
  26.     "//third_party/libdrm/tests/util/:util"
  27.   ] 
  28.  
  29.   public_deps = [] 
  30.  
  31.   install_images = [ 
  32.     "system"
  33.     "updater"
  34.   ] 
  35.   part_name = "graphic_standard" 
  36.   subsystem_name = "graphic" 

2.modetest依赖这个

third_party\libdrm\tests\util\BUILD.gn

  1. import("//build/ohos.gni"
  2.  
  3. ohos_static_library("util") { 
  4.  
  5.   sources = [ 
  6.     "format.c"
  7.     "kms.c"
  8.     "pattern.c"
  9.   ] 
  10.  
  11.   cflags = [] 
  12.  
  13.   include_dirs = [ 
  14.     "../"
  15.     "."
  16.   ] 
  17.    
  18.   configs = [ "//third_party/libdrm:libdrm_config" ] 
  19.  
  20.   public_configs = [ "//third_party/libdrm:libdrm_public_config" ] 
  21.  
  22.   deps = [ 
  23.     "//third_party/libdrm:libdrm"
  24.   ] 
  25.  
  26.   public_deps = [] 

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

third_party\weston\BUILD.gn

  1. "//third_party/libdrm:libdrm"
  2. "//third_party/libdrm/tests/util/:util"
  3. "//third_party/libdrm/tests/modetest/:modetest"

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

  1. third_party\libdrm\tests\util\pattern.c:988 
  2.     // void *mem_base = mem; 

如果modetest通过了,那剩下的就简单了指定weston的后端就可以了。

system\etc\weston.ini

  1. [output
  2. name=card0 

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

  1. hexdump /dev/input/event2   # 可以使用hexdump看触摸设备有没有输出,可惜这个命令也不支持 
  2. cat /dev/input/event2       # cat也可以凑合用,只是输出乱码,但能证明触摸是否好用 

然后查看驱动模块

  1. ls -l /sys/dev/char/|grep input    # 查看input下的触摸设备的主次设备号 
  2. cat /sys/dev/char/226\:0/device/uevent  # 然后输入主次设备号,查看设备的驱动程序 
  3. DRIVER=raspberrypi-ts 
  4. ... ... 

发现驱动是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,就直接放到一起了,近期会更新,感兴趣的可以关注,一起讨论。

想了解更多内容,请访问:

51CTO和华为官方战略合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

【编辑推荐】

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区
  2. 打造一款定制化鸿蒙发行版
  3. 鸿蒙开源第三方组件—SwipeCaptcha_ohos3.0旋转验证组件
  4. OpenHarmony源码解析之安全子系统 (应用权限管理)
  5. HarmonyOS自定义组件之分页功能组件封装实例
  6. HarmonyOS Sample之AI能力之NLU引擎服务
【责任编辑:jianghua TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢
24H热文
一周话题
本月获赞

订阅专栏+更多

带你轻松入门 RabbitMQ

带你轻松入门 RabbitMQ

轻松入门RabbitMQ
共4章 | loong576

58人订阅学习

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

14人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

42人订阅学习

视频课程+更多

linux基础知识和项目实战部署课程

linux基础知识和项目实战部署课程

讲师:陈槐15500人学习过

AD活动目录管理 - 理论与实战

AD活动目录管理 - 理论与实战

讲师:杰森洋64599人学习过

汇编语言教程

汇编语言教程

讲师:杨大毛769人学习过

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微