OpenHarmony(鸿蒙南向开辟)——标准系统移植指南(二)Linux内核 ...

打印 上一主题 下一主题

主题 1001|帖子 1001|积分 3003

移植概述

本文面向希望将OpenHarmony移植到三方芯片平台硬件的开辟者,先容一种借助三方芯片平台自带Linux内核的现有能力,快速移植OpenHarmony到三方芯片平台的方法。
移植到三方芯片平台的整体思绪

内核态层和用户态层

为了更好的表明整个内核移植,起首必要先容一些概念:
我们可以把OpenHarmony简单的分为
OpenHarmony = OpenHarmony内核态层 + OpenHarmony用户态层

其中OpenHarmony内核层就是上图的紫色部分,可以看到,它主要由内核本身(如Linux Kernel,LiteOS),和一些运行在内核态的一些特性组成,好比HDF等。
而OpenHarmony用户态层,在上图,就是紫色之外的部分。可以看到,由下往上看,它主要由系统服务层,框架层,应用层组成。在这儿我们将这三层整体称为“OpenHarmony用户态层”。
为什么这么区分呢?因为我们这篇文章主要是要讨论如何快速的把OpenHarmony移植到三方芯片平台上。而OpenHarmony的用户态层,整体来说和三方芯片平台的耦合度不高,移植较为方便。而内核态层中的内核本身以及HDF驱动框架等,和三方芯片平台的耦合度较高,是移植的重难点。我们先做这个区分,就是为了先把聚光灯打到我们最必要关注的OpenHarmony内核态层上,开始分析息争题。另外说明,本文只包罗Linux内核的快速移植,不包罗LiteOS的移植。
得到内核态层的两种方法

为了表述方便,我们在下文部分地方用“OH”取代“OpenHarmony”。
将OH内核态层继续分解
OH内核态层 = OH Linux内核 + OH内核态特性(可选特性或者必选特性,如必选特性HDF,今后的可选特性HMDFS等)
而OH Linux内核 = 标准LTS Linux 内核 + 三方SoC芯片平台代码 + OH内核态底子代码(支撑OH用户态层运行的最底子代码)
因此OH内核态层 = 标准LTS Linux 内核 + 三方SoC芯片平台代码 + OH内核态底子代码 + OH内核态特性(如HDF)

而将前两项组合,标准LTS Linux 内核 + 三方SoC芯片平台代码,其实就是一个三方Linux内核的底子组成。从上面的推导可以看出,OpenHarmony 内核态层其实能够由两种方法得到:
方法一:OH 内核态层 = 三方Linux内核 + OH内核态底子代码 + OH内核态特性(如HDF,今后的HMDFS等)
也就是直接借助三方Linux内核,再加上底子OH内核态底子代码、以及HDF等OH内核态特性。
方法二:OH 内核态层 = OH Linux内核 + OH内核态特性(如HDF,今后的HMDFS等)
也就是直接采取OHLinux内核,然后再加入OH的其他内核态特性。
当前方法二中OHLinux内核支持的三方芯片平台还不够丰富。为了能够相应三方开辟者快速移植OpenHarmony的要求,下文会着重先容方法一,即借助三方已有的Linux内核,来快速移植OpenHarmony。
借助已有Linux内核来移植OpenHarmony的流程

整个移植流程可以分为三步:

  • 预备整体构建环境,包括将三方芯片平台的现有内核代码拷贝到OpenHarmony的整体编译环境下。
  • OpenHarmony内核态底子代码的移植。
  • OpenHarmony内核态必选特性(如HDF等)的移植。
具体步骤在接下来的章节中先容。
移植到三方芯片平台的步骤

下面以树莓派3b (BCM2837) 为例,演示将OpenHarmony移植到树莓派的过程。
预备整体构建环境


  • 将三方内核纳入OpenHarmony编译环境。 完备编译过一遍标准Hi3516DV300的内核之后,clone树莓派内核源码并复制到manifest输出目录下:
  1.     export PROJ_ROOT=[OpenHarmony manifest]
  2.     git clone https://gitee.com/xfan1024/oh-rpi3b-kernel.git
  3.     cp -r oh-rpi3b-kernel $PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b
复制代码

  • 配置树莓派内核编译环境。
  1.     # 进入树莓派kernel目录
  2.     cd out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b
  3.     # 配置编译环境,使用工程项目自带的clang
  4.     export PATH=$PROJ_ROOT/prebuilts/clang/ohos/linux-x86_64/llvm/bin:$PROJ_ROOT/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/:$PATH
  5.     export MAKE_OPTIONS="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang"
  6.     export PRODUCT_PATH=vendor/hisilicon/hispark_taurus_linux
复制代码

  • 表明掉clang不识别的flag。 PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/arch/arm/Makefile表明掉以下这一行:
  1.     KBUILD_CFLAGS  +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
复制代码
移植内核态底子代码

现在OpenHarmony内核态的底子代码,主要是日记服务相关。轻量化内核日记服务代码包罗:
  1. drivers/staging/hilog
  2. drivers/staging/hievent
复制代码
将以上代码,从OpenHarmony内核代码目录kernel/linux/linux-4.19/drivers/staging中,拷贝到out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/drivers/staging下。
在三方内核的drivers/staging/Kconfig文件内增加如下代码:
  1. source "drivers/staging/hilog/Kconfig"
  2. source "drivers/staging/hievent/Kconfig"
复制代码
在三方内核的drivers/staging/Makefile文件内增加如下代码:
  1. obj-$(CONFIG_HILOG)             += hilog/
  2. obj-$(CONFIG_HIEVENT)           += hievent/
复制代码
在内核config项中打开对应的CONFIG控制宏:CONFIG_HILOG和CONFIG_HIEVENT。
具体日记利用说明请参见:Hilog_lite组件先容。
移植内核态必选特性HDF


  • 打HDF补丁。 在Linux内核打HDF补丁时,实验补丁shell脚本合入HDF补丁。

    • 配置HDF补丁脚本的四个变量参数。
    • 获取patch_hdf.sh脚本。
    • 实验patch_hdf.sh脚本依次传入四个变量参数。

patch_hdf.sh脚本四个参数含义为:第一个入参为工程根目录路径,第二入参为内核目录路径,第三个入参为内核版本路径,第四个参数是当前装备名。
  1.     ./patch_hdf.sh [工程根目录路径] [内核目录路径] [内核补丁路径] [设备名]
复制代码
以树莓派3b为示例先容:
  1.     # 进入树莓派kernel目录
  2.     PROJ_ROOT/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh \
  3.     PROJ_ROOT  # 指定工程根目录路径 \
  4.     PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b  # 打补丁的内核目录路径 \
  5.     PROJ_ROOT/kernel/linux/patches/linux-4.19 # 内核补丁路径.\
  6.     hi3516dv300 # 设备名.
复制代码

  • 配置config。 提供HDF基本配置,如果必要其他功能,通过menuconfig打开对应驱动开关即可。
HDF补丁实验成功后,默认HDF开关是关闭的,打开HDF基本配置选项如下:
  1.     CONFIG_DRIVERS_HDF=y
  2.     CONFIG_HDF_SUPPORT_LEVEL=2
  3.     CONFIG_DRIVERS_HDF_PLATFORM=y
  4.     CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI=y
  5.     CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y
  6.     CONFIG_DRIVERS_HDF_PLATFORM_I2C=y
  7.     CONFIG_DRIVERS_HDF_PLATFORM_UART=y
  8.     CONFIG_DRIVERS_HDF_TEST=y
复制代码
或者通过menuconfig界面打开HDF相关配置,命令如下:
  1.     # 生成 .config 配置文件
  2.     make ${MAKE_OPTIONS} rpi3b_oh_defconfig
  3.     # 更改HDF内核配置
  4.     make ${MAKE_OPTIONS} menuconfig
  5.     # [*] Device Drivers
  6.     # [*]   HDF driver framework support --->
复制代码
配置如下(在Device Drivers -> HDF driver framework support 目录下):

编译Image

  1. # 执行编译命令
  2. make ${MAKE_OPTIONS} -j33 zImage
复制代码
编译和运行HDF测试用例(可选)

简介
HDF(Hardware Driver Foundation)自测试用例,用于测试HDF框架和外设的基本功能,本文主要先容HDF内核态用例测试方法。
预置条件
测试前必要在menuconfig里检查HDF测试开关CONFIG_DRIVERS_HDF_TEST=y,代码全量编译通过。
用例编译和测试方法
通过 hdc_std工具 把用例实验文件推送到装备中,然后实验用例即可,操作步骤如下:

  • 编译hdf测试用例。
  • 用hdc_std工具推送测试文件到装备中。
  • 进入装备data/test目录,实验测试文件即可。
用例编译和测试具体步骤如下:

  • 编译hdf测试用例。 编译hdf测试用例命令和文件路径如下:
  1.     ./build.sh --product-name hispark_taurus_standard --build-target hdf_test
复制代码
等候编译完成。

  • 将测试文件移动到目的移植装备上(以树莓派为例)。
方法一:利用 hdc_std工具。

  • 先在树莓派里新建data/test目录。
  1.         mkdir -p data/test
复制代码

  • 推送依赖库和测试用例到树莓派。
  1.         hdc file send XXX\out\{device_name}\hdf\hdf\libhdf_test_common.z.so  /system/lib
  2.         hdc file send XXX\out\{device_name}\tests\unittest\hdf\config\hdf_adapter_uhdf_test_config  /data/test
  3.         hdc file send XXX\out\{device_name}\tests\unittest\hdf\devmgr\DevMgrTest  /data/test
  4.         hdc file send XXX\out\{device_name}\tests\unittest\hdf\osal\OsalTest  /data/test
  5.         hdc file send XXX\out\{device_name}\tests\unittest\hdf\sbuf\SbufTest  /data/test
复制代码
方法二:移动到储存卡内,启动树莓派之后装载。

  • 拔掉树莓派毗连电脑的串口、USB线,然后拔下数据卡。
  • 将数据卡插入到电脑的读取口,将编译好的zImage和测试文件夹test/下载到电脑,然后移动到数据卡的根目录下。zImage文件会被替换,请提前做好备份。
  • 末了将数据卡插回树莓派。
  1.         # 让树莓派文件系统读取储存卡根目录
  2.         mount -t vfat /dev/block/mmcblk0p1 /boot
  3.         cd /boot/[测试文件目录]
  4.         # 允许修改系统文件
  5.         mount -o remount,rw /
  6.         # 安装测试用库
  7.         mv libhdf_test_common.z.so /system/lib
  8.         mkdir /data/test
  9.         mv * /data/test
复制代码

  • 实验测试

    • 进入目录实验测试文件目录data/test。

  1.         cd /data/test
复制代码

  • 修改文件实验权限。
  1.         chmod 777 hdf_adapter_uhdf_test_config DevMgrTest OsalTest SbufTest
复制代码

  • 开始测试。
  1.         ./hdf_adapter_uhdf_test_config
  2.         ./DevMgrTest
  3.         ./OsalTest
  4.         ./SbufTest
复制代码

  • 如果所有测试文件输出均显示 PASSED,那么HDF功能即安装成功。 示例:DevMgrTest用例成功结果显示:
  1.        ./DevMgrTest
  2.        Running main() from gmock_main.cc
  3.        [==========] Running 1 test from 1 test case.
  4.        [----------] Global test environment set-up.
  5.        [----------] 1 test from DevMgrTest
  6.        [ RUN      ] DevMgrTest.DriverLoaderTest_001
  7.        [       OK ] DevMgrTest.DriverLoaderTest_001 (0 ms)
  8.        [----------] 1 test from DevMgrTest (0 ms total)
  9.        [----------] Global test environment tear-down
  10.        Gtest xml output finished
  11.        [==========] 1 test from 1 test case ran. (0 ms total)
  12.        [  PASSED  ] 1 test.
复制代码
如果各人想更加深入的学习 OpenHarmony(鸿蒙南向) 开辟的全栈内容,不妨可以参考以下相关学习文档举行学习,助你快速提升自己:
OpenHarmony 开辟环境搭建:https://qr18.cn/CgxrRy


《OpenHarmony源码解析》:https://qr18.cn/CgxrRy



  • 搭建开辟环境
  • Windows 开辟环境的搭建
  • Ubuntu 开辟环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……

系统架构分析:https://qr18.cn/CgxrRy



  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式使命调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 装备开辟学习手册:https://qr18.cn/CgxrRy


OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy


写在末了



  • 如果你觉得这篇内容对你还蛮有帮助,我想约请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和批评』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表