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

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

[[436362]]

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

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

https://harmonyos.51cto.com

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

[[436363]]

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

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2022-06-21 11:02:27

系统移植鸿蒙

2021-12-09 10:11:04

鸿蒙HarmonyOS应用

2021-12-31 10:00:30

鸿蒙HarmonyOS应用

2022-01-04 15:35:51

鸿蒙HarmonyOS应用

2021-09-26 10:22:41

鸿蒙HarmonyOS应用

2021-10-09 10:12:39

鸿蒙HarmonyOS应用

2022-09-27 15:57:20

OHOS代码仓库

2021-11-08 07:19:45

鸿蒙HarmonyOS应用

2024-03-22 15:28:36

树莓派Linux

2022-09-07 15:08:58

操作系统鸿蒙

2022-09-13 16:10:15

鸿蒙操作系统

2022-09-16 15:01:37

操作系统技术鸿蒙

2022-09-06 15:46:52

speexdsp鸿蒙

2021-12-29 16:11:11

鸿蒙HarmonyOS应用

2022-09-14 15:28:19

操作系统鸿蒙

2022-09-15 15:21:22

操作系统鸿蒙

2023-06-27 15:12:46

C++三方库移植

2021-01-25 16:39:08

鸿蒙HarmonyOS添加单板

2021-01-26 13:50:43

鸿蒙HarmonyOS应用开发

2021-11-29 15:17:48

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号