樹莓派4B移植OHOS 3.0 LTS標(biāo)準(zhǔn)系統(tǒng)
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
終于在樹莓派4B上將OHOS3.0啟動起來了,雖然還不完整,目前只能實(shí)現(xiàn)的顯示和觸摸。但是可以和大家分享下我的思路。
我的方法比較簡單粗暴,直接使用的樹莓派的樹莓派linux rpi-5.10.y內(nèi)核。
Git地址:https://github.com/raspberrypi/linux
然后編譯OHOS3.0的文件系統(tǒng),看缺什么補(bǔ)什么大概是這個意思。
目前發(fā)現(xiàn)OHOS需要內(nèi)核開啟selinux和binder
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
然后修改下面幾項(xiàng):
- 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 (設(shè)置為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 (開啟)
目前發(fā)現(xiàn)開啟這兩項(xiàng)hilog就可以輸出。
內(nèi)核掛上根文件系統(tǒng),至少可以啟動串口有輸出了。然后分析下OHOS的圖形子系統(tǒng)。
OHOS目前是 內(nèi)核 -> DRM -> libdrm -> wayland -> weston 這么個模式,如有錯誤歡迎指出。這里要感謝 @梁克雷 和釗哥ohos第三方板移植群各位的支持。
所以樹莓派的DRM正常了,后面顯示應(yīng)該就是沒為題的。好在樹莓派的生態(tài)比較開放,資料還是比較好獲取的,在樹莓派官方論壇趴了一段時間。
Pi4的GPU是VideoCore VI支持OpenGL ES 3.2,而Pi3的GPU是VideoCore IV支持OpenGL ES 2.0。
VideoCore IV 驅(qū)動程序是 VC4,VideoCore VI 驅(qū)動程序的 V3D。
需要在 config.txt 中開啟 vc4-fkms-v3d
而驅(qū)動kernal已經(jīng)提供了模塊,只要在init階段將模塊加載就可以了
這里有個比較惡心的地方,OHOS的根文件系統(tǒng)使用的是Toybox,但是很多工具不支持,比如modprobe就沒有,所以只能根據(jù)modules.dep文件,一個一個insmod。當(dāng)然可以直接將驅(qū)動編進(jìn)內(nèi)核也是可以的。
- "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"
為了驗(yàn)證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");
- }
其實(shí)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的依賴項(xiàng)里就可以了
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看觸摸設(shè)備有沒有輸出,可惜這個命令也不支持
- cat /dev/input/event2 # cat也可以湊合用,只是輸出亂碼,但能證明觸摸是否好用
然后查看驅(qū)動模塊
- ls -l /sys/dev/char/|grep input # 查看input下的觸摸設(shè)備的主次設(shè)備號
- cat /sys/dev/char/226\:0/device/uevent # 然后輸入主次設(shè)備號,查看設(shè)備的驅(qū)動程序
- DRIVER=raspberrypi-ts
- ... ...
發(fā)現(xiàn)驅(qū)動是raspberrypi-ts,那就好辦了,在init的時候安裝這個模塊就好了。
- "insmod /lib/modules/5.10.76-v7l/kernel/drivers/input/touchscreen/raspberrypi-ts.ko"
基本是這么個思路,寫出來和大家分享下,希望對正在移植的小伙伴能有些幫助。當(dāng)然加到鴻蒙編譯框架可能沒有這么簡單,接下來我會先整理這部分的文檔,就更新在https://gitee.com/liangzili/harmony-raspberry這個倉把,這個碼倉我之前移植過OHOS1.0 LiteOS-A內(nèi)核到樹莓派2ModuleB,就直接放到一起了,近期會更新,感興趣的可以關(guān)注,一起討論。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)