首發(fā)!友善之臂NanoPi M1 Plus移植Openharmony標準版
首先感謝永恒666分享的
4412開發(fā)板移植openharmony3.0標準版-原來移植ohos可以這樣簡單!
本文參考這種方式在友善之臂NanoPi M1 Plus上移植了Openharmony標準版
用的方法比較簡單粗暴,目前只是能成功跑起來看到畫面。

整理實現(xiàn)方式如下:
一 OpenHarmony Linux內(nèi)核移植
參考:一種快速移植OpenHarmony Linux內(nèi)核的方法
1.按照Building U-boot and Linux for H5/H3/H2+/zh獲取NanoPi M1 Plus內(nèi)核
主要步驟如下:
1.1 安裝交叉編譯器
下載交叉編譯器arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz,然后解壓編譯器:
- $ mkdir -p /opt/FriendlyARM/toolchain
- $ tar xf arm-cortexa9-linux-gnueabihf-4.9.3.tar.xz -C /opt/FriendlyARM/toolchain/
然后將編譯器的路徑加入到PATH中,用vi編輯vi ~/.bashrc,在末尾加入以下內(nèi)容,
此處建議使用每次重開終端前輸入以下指令的方式:
- $ export PATH=/opt/FriendlyARM/toolchain/4.9.3/bin:$PATH
- $ export GCC_COLORS=auto
執(zhí)行一下~/.bashrc腳本讓設置立即在當前shell窗口中生效,注意"."后面有個空格:
- $ . ~/.bashrc
這個編譯器是64位的,不能在32位的Linux系統(tǒng)上運行,安裝完成后,你可以快速的驗證是否安裝成功:
- $ arm-linux-gcc -v
- gcc version 4.9.3 (ctng-1.21.0-229g-FA)
1.2 編譯Linux內(nèi)核
在編譯過ipcamera_hispark_taurus的源碼中下載NanoPi M1 Plus Linux4.14內(nèi)核源碼,并切換分支:
我的ohos3.0路徑是/home/soon/ohos300/,這個路徑替換成你自己的
- $ cd /home/soon/ohos300/out/KERNEL_OBJ/kernel/src_tmp
- $ git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1
- $ mv linux linux-nanopi
編譯確認環(huán)境沒有問題:
- $ sudo apt-get install u-boot-tools
- $ cd /home/soon/ohos300/out/KERNEL_OBJ/kernel/src_tmp/linux-nanopi
- $ touch .scmversion
- $ make sunxi_defconfig ARCH=arm CROSS_COMPILE=arm-linux-
- $ make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
編譯完成后會在arch/arm/boot/目錄下生成zImage,并且在arch/arm/boot/dts/目錄下生成dtb文件。
2 內(nèi)核態(tài)基礎代碼的移植
將以下路徑代碼,從OpenHarmony3.0內(nèi)核代碼目錄kernel/linux/linux-4.19/drivers/staging中,拷貝到out/KERNEL_OBJ/kernel/src_tmp/linux-nanopi/drivers/staging 下。
- drivers/staging/hilog
- drivers/staging/hievent
- soon@soon-u20:~/ohos300/out/KERNEL_OBJ/kernel/src_tmp/linux-nanopi/drivers/staging $ ls -al
- total 224
- drwxrwxr-x 52 soon soon 4096 12月 29 22:51 .
- drwxrwxr-x 132 soon soon 4096 12月 29 22:53 ..
- drwxrwxr-x 4 soon soon 4096 12月 29 22:51 android
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 board
- -rw-rw-r-- 1 soon soon 628 12月 29 22:51 built-in.o
- -rw-rw-r-- 1 soon soon 251 12月 29 22:51 .built-in.o.cmd
- drwxrwxr-x 3 soon soon 4096 12月 29 19:24 ccree
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 clocking-wizard
- drwxrwxr-x 4 soon soon 4096 12月 29 19:24 comedi
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 dgnc
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 emxx_udc
- drwxrwxr-x 2 soon soon 4096 12月 29 22:51 fbtft
- drwxrwxr-x 3 soon soon 4096 12月 29 19:24 fsl-dpaa2
- drwxrwxr-x 4 soon soon 4096 12月 29 19:24 fsl-mc
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 fwserial
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 gdm724x
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 goldfish
- drwxrwxr-x 4 soon soon 4096 12月 29 19:24 greybus
- drwxrwxr-x 2 soon soon 4096 12月 29 19:24 gs_fpgaboot
- drwxr-xr-x 2 soon soon 4096 12月 29 19:49 hievent
- drwxr-xr-x 2 soon soon 4096 12月 29 19:49 hilog
在三方內(nèi)核的drivers/staging/Kconfig文件內(nèi)增加如下代碼:
- source "drivers/staging/hilog/Kconfig"
- source “drivers/staging/hievent/Kconfig”
在內(nèi)核config項中打開對應的CONFIG控制宏:CONFIG_HILOG和CONFIG_HIEVENT。
- CONFIG_HILOG=y
- CONFIG_HI_LOG_BUFFER_SIZE=2048
- CONFIG_HIEVENT=y
3 內(nèi)核態(tài)必選特性HDF的移植
3.1打HDF補丁
因為patch_hdf.sh是最近才上傳的,如果用repo下載的,先更新下/home/soon/ohos300/drivers/adapter/khdf/linux這個目錄
也可以去把整個倉庫下載來替換。指令更新可以使用如下
- git pull
- git checkout master
在Linux內(nèi)核打HDF補丁時,執(zhí)行補丁shell腳本合入HDF補丁。
配置HDF補丁腳本的三個變量參數(shù)。
獲取patch_hdf.sh腳本。
執(zhí)行patch_hdf.sh腳本依次傳入三個變量參數(shù)。
patch_hdf.sh腳本三個參數(shù)含義為:
第一個入?yún)楣こ谈夸浡窂剑诙雲(yún)閮?nèi)核目錄路徑,第三個入?yún)閔df補丁文件。
./patch_hdf.sh [工程根目錄路徑] [內(nèi)核目錄路徑] [hdf補丁文件]
我這邊用的指令如下
- /home/soon/ohos300/drivers/adapter/khdf/linux/patch_hdf.sh \
- /home/soon/ohos300 \
- /home/soon/ohos300/out/KERNEL_OBJ/kernel/src_tmp/linux-nanopi \
- /home/soon/ohos300/kernel/linux/patches/linux-4.19/hi3516dv300_patch/hdf.patch
3.2配置config
提供HDF基本配置,如果需要其他功能,通過menuconfig打開對應驅動開關即可。
HDF補丁執(zhí)行成功后,默認HDF開關是關閉的,打開HDF基本配置選項如下:
- CONFIG_DRIVERS_HDF=y
- CONFIG_HDF_SUPPORT_LEVEL=2
- CONFIG_DRIVERS_HDF_PLATFORM=y
- CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI=y
- CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y
- CONFIG_DRIVERS_HDF_PLATFORM_I2C=y
- CONFIG_DRIVERS_HDF_PLATFORM_UART=y
- CONFIG_DRIVERS_HDF_TEST=y
4 打開內(nèi)核的一些關鍵配置
4.1 打開 Android Drivers 和Android Binder IPC Driver
Device Drivers —>
Android —>
[] Android Drivers (開啟)
[] Android Binder IPC Driver (開啟)
4.2 打開SELinux Support相關配置
參考亮子力的整理,樹莓派4B移植OHOS 3.0 LTS標準系統(tǒng)
可以在make menuconfig 下用/ 執(zhí)行查找關鍵字,看配置項的位置和依賴,
也可以參考文章附件配置。
5 重新編譯生成zImage 和dtb
配置完成后直接下以下指令:
- $ make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux-
編譯完成后會在arch/arm/boot/目錄下生成zImage,并且在arch/arm/boot/dts/目錄下生成dtb文件。把這兩個文件拷貝出來備用。
二 合成boot.img
1. 先拷貝一份NanoPi M1 Plus的boot 分區(qū)到~/ohos300/out/ohos-arm-release/packages/phone/boot/下。
可以從制作的SD卡上拷貝,如何制作SD 啟動卡參考NanoPi M1 Plus 4.3.3.1 燒寫到TF卡。
2.替換zImage和dtb文件
- cp -f /home/soon/ohos300/out/KERNEL_OBJ/kernel/src_tmp/linux-nanopi/arch/arm/boot/zImage /home/soon/ohos300/out/ohos-arm-release/packages/phone/boot/
- cp -f /home/soon/ohos300/out/KERNEL_OBJ/kernel/src_tmp/linux-nanopi/arch/arm/boot/dts/sun8i-*-nanopi-*.dtb /home/soon/ohos300/out/ohos-arm-release/packages/phone/boot/
3.用build_boot.py生成boot.img
參考樹莓派rpi3的device\rpi3\rpi3\kernel\build_kernel.py腳本,修改:
- #!/usr/bin/env python3
- import sys
- import os
- import os.path
- import subprocess
- import multiprocessing
- import shutil
- import pathlib
- bootimgsize = 64*1024*1024
- command = sys.argv[1]
- output_dir = sys.argv[2]
- def make_boot_img():
- oldpwd = os.getcwd()
- os.chdir(output_dir)
- imagefile = 'images/boot.img'
- imagefile_tmp = imagefile + '.tmp'
- boot_dir = 'boot'
- with open(imagefile_tmp, 'wb') as writer:
- writer.truncate(bootimgsize)
- subprocess.run(F'mkfs.vfat {imagefile_tmp} -n BOOT', shell=True, check=True)
- subprocess.run(F'mcopy -i {imagefile_tmp} {boot_dir}/* ::/', shell=True, check=True)
- os.rename(imagefile_tmp, imagefile)
- os.chdir(oldpwd)
- command_table = {
- 'bootimg': make_boot_img,
- }
- command_table[command]()
把build_boot.py放到~/ohos300 執(zhí)行以下指令生成boot.img,
- soon@soon-u20:~/ohos300 $ python3 build_boot.py bootimg /home/soon/ohos300/out/ohos-arm-release/packages/phone
- mkfs.fat 4.1 (2017-01-24)
三 合成SD卡燒錄img
參考Make Image Files for H3
1 下載Build an sd card image環(huán)境
- git clone https://github.com/friendlyarm/sd-fuse_h3.git
- cd sd-fuse_h3
- wget http://112.124.9.243/dvdfiles/H3/images-for-eflasher/friendlycore-focal_4.14_armhf.tgz
- tar xvzf friendlycore-focal_4.14_armhf.tgz
2 準備system.img、vendor.img、userdata.img
這邊用的之前編譯的樹莓派rpi3的img
將friendlycore-focal_4.14_armhf下的.img 刪除
并將之前合好的boot.img、system.img、vendor.img、userdata.img拷貝到該目錄下。
3 修改partmap.txt
- # sd0 partition map
- # flash= <device>.<dev no>:<partition>:<fstype>:<start>,<length>
- # support device : eeprom, nand, mmc
- # support fstype : 2nd, boot, raw, fat, ext4, ubi
- #
- # CPU=h3
- flash=mmc,0:boot0:raw:0x2000,0x17FE000:u-boot-sunxi-with-spl.bin;
- flash=mmc,0:boot:fat:0x1800000,0x4000000:boot.img;
- flash=mmc,0:system:ext4:0x5800000,0x20000000:system.img;
- flash=mmc,0:vendor:ext4:0x025800000,0x4000000:vendor.img;
- flash=mmc,0:userdata:ext4:0x29800000,0x12C00000:userdata.img;
4 合成SD卡燒錄img
在sd-fuse_h3目錄下執(zhí)行:
- sudo ./mk-sd-image.sh friendlycore-focal_4.14_armhf h3-sd-friendlycore.img
- soon@soon-u20:~/nanopi-m1-plus/sd-fuse_h3 $ sudo ./mk-sd-image.sh friendlycore-focal_4.14_armhf h3-sd-friendlycore.img
- [sudo] password for soon:
- Creating RAW image: out/h3-sd-friendlycore.img (7800 MB)
- ---------------------------------
- 0+0 records in
- 0+0 records out
- 0 bytes copied, 0.0010239 s, 0.0 kB/s
- Using device: /dev/loop14
- ---------------------------------
- Friendlycore-focal_4.14_armhf filesystem fusing
- Image root: ./friendlycore-focal_4.14_armhf
- ----------------------------------------------------------------
- [/dev/loop14] capacity = 7438MB, 7799999488 bytes
- current /dev/loop14 partition:
- MBR.0 start : 0x0000100000 size 0x01d0da8c00 kB
- ----------------------------------------------------------------
- parsing ./friendlycore-focal_4.14_armhf/partmap.txt:
- part.0 flash=mmc,0:boot0:raw:0x2000,0x17fe000:u-boot-sunxi-with-spl.bin:[RAW] ./friendlycore-focal_4.14_armhf/u-boot-sunxi-with-spl.bin
- part.1 flash=mmc,0:boot:fat:0x1800000,0x4000000:boot.img:[MBR] ./friendlycore-focal_4.14_armhf/boot.img
- part.2 flash=mmc,0:system:ext4:0x5800000,0x20000000:system.img:[MBR] ./friendlycore-focal_4.14_armhf/system.img
- part.3 flash=mmc,0:vendor:ext4:0x25800000,0x4000000:vendor.img:[MBR] ./friendlycore-focal_4.14_armhf/vendor.img
- part.4 flash=mmc,0:userdata:ext4:0x29800000,0x12c00000:userdata.img:[MBR] ./friendlycore-focal_4.14_armhf/userdata.img
- ----------------------------------------------------------------
- create new MBR 4:
- [MBR.0] start : 0x0001800000 size 0x0004000000
- [MBR.1] start : 0x0005800000 size 0x0020000000
- [MBR.2] start : 0x0025800000 size 0x0004000000
- [MBR.3] start : 0x0029800000 size 0x0012c00000
- ----------------------------------------------------------------
- copy from: ./friendlycore-focal_4.14_armhf to /dev/loop14
- [RAW. 0]: 2040 KB | ./friendlycore-focal_4.14_armhf/u-boot-sunxi-with-spl.bin > 100% : done.
- [MBR. 0]: 65536 KB | ./friendlycore-focal_4.14_armhf/boot.img > 100% : done.
- [MBR. 1]: 524288 KB | ./friendlycore-focal_4.14_armhf/system.img > 100% : done.
- [MBR. 2]: 65536 KB | ./friendlycore-focal_4.14_armhf/vendor.img > 100% : done.
- [MBR. 3]: 307200 KB | ./friendlycore-focal_4.14_armhf/userdata.img > 21 100% : done.
- ----------------------------------------------------------------
- /dev/loop14: msdos partitions 1 2 3 4
- ### try to resize2fs: /dev/loop14p3
- resize2fs 1.45.5 (07-Jan-2020)
- The filesystem is already 16384 (4k) blocks long. Nothing to do!
- ---------------------------------
- Friendlycore-focal_4.14_armhf is fused successfully.
- All done.
- ---------------------------------
- RAW image successfully created (23:44:53).
- -rw-r--r-- 1 root root 7799999488 12月 30 23:44 out/h3-sd-friendlycore.img
- Tip: You can compress it to save disk space.
- soon@soon-u20:~/nanopi-m1-plus/sd-fuse_h3 $
會在out目錄下生成img
- soon@soon-u20:~/nanopi-m1-plus/sd-fuse_h3/out $ ls -al
- total 964620
- drwxrwxr-x 2 soon soon 4096 12月 30 23:46 .
- drwxrwxr-x 10 soon soon 4096 12月 30 23:46 ..
- -rw-rw-r-- 1 soon soon 167 12月 6 22:28 .gitignore
- -rw-r--r-- 1 root root 7799999488 12月 30 23:44 h3-sd-friendlycore.img
- soon@soon-u20:~/nanopi-m1-plus/sd-fuse_h3/out $
5 燒錄img
可以用dd 也可以用Win32DiskImager,dd指令如下:
- sudo dd if=out/h3-sd-friendlycore.img bs=1M of=/dev/sdX