详情请访问:https://harmonyos.51cto.com与华为官方共建的鸿蒙技术社区,终于在树莓派4B.0启动时实现了OHOS3,虽然不完整,目前只能实现显示和触控。但我可以和你分享我的想法。我的方法比较简单粗暴,直接使用树莓派的linuxrpi-5.10.y内核。git地址:https://github.com/raspberrypi/linux然后编译OHOS3.0的文件系统,看看缺什么补什么,大概就是这个意思。目前发现OHOS需要内核打开selinux和bindermakeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-menuconfig然后修改如下几项:Securityoptions--->(32768)LowaddressspaceforLSMtoprotectfromuserallocation[*]NSASELinuxSupport(selected)[*]NSELinuxbootparameter(selected)[]NSASELinuxruntimedisable[*]NSASELinuxDevelopmentSupport[*]NSASELinuxAVCStatistics(1)NSASELinuxcheckreqprotdefaultvalue(setto1)(9)NSASELinuxsidtabhashtablesize(256)NSASELinuxSIDtocontextstringtranslationcachesizeFirstlegacy'ownnitialized>(tobeiiinitialized)--enabled填写"list)yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor,bpf")DeviceDrivers--->Android--->[*]AndroidDrivers(enabled)[*]AndroidBinderIPCDriver(enabled)目前找到使这两个hilog可以输出。内核挂载根文件系统,至少串口可以启动有输出。然后分析OHOS的图形子系统。OHOS目前的模式是kernel->DRM->libdrm->wayland->weston,如有错误请指出。在此感谢@梁克雷和赵哥ohos第三方板移植群的支持。所以树莓派的DRM是正常的,下面的显示应该没问题。好在树莓派的生态比较开放,资料也比较容易获取。我已经在树莓派官方论坛上躺了一段时间了。Pi4的GPU是支持OpenGLES3.2的VideoCoreVI,而Pi3的GPU是支持OpenGLES2.0的VideoCoreIV。VideoCoreIV驱动是VC4,VideoCoreVI驱动是V3D。需要在config.txt中启用vc4-fkms-v3d,并且驱动内核已经提供了模块,只需在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("openfailed");}else{printf("openseccess\n");}uint32_tconn_id;uint32_tcrtc_id;res=drmModeGetResources(fd);//获取crtc_id和connector_idif(!res){printf("ERROR:drmModeGetResourcesfailed!\n");drmClose(fd);return-1;}else{printf("drmModeGetResourcesseccess\n");}crtc_id=res->crtcs[0];conn_id=res->连接器[0];conn=drmModeGetConnector(fd,conn_id);//获取drm_modeif(!conn){printf("ERROR:drmModeGetConnectorfailed!\n");}else{printf("drmModeGetConnectorsaccess\n");}其实libdrm有自己的测试modetest,但OHOS未包含在编译中也可以将modetest加入编译框架1.为modetest添加BUILD.gntird_party\libdrm\tests\modetest\BUILD.gnimport("//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.gnimport("//build/ohos.gni")ohos_static_library("util"){sources=["format.c","kms.c","pattern.c",]cflags=[]include_dirs=["../",".",]configs=[“//第三方y/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#Yes用hexdump看touch设备有没有输出,可惜这个命令不支持cat/dev/input/event2#cat也可以,只是输出乱码,但是可以证明touch是否容易使用。然后ch查看驱动模块ls-l/sys/dev/char/|grepinput#在inputcat/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了。.0LiteOS-Akernel到RaspberryPi2ModuleB,直接放在一起,近期会更新。有兴趣的可以关注一起讨论。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区
