前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一种快速移植 OpenHarmony Linux 内核的方法

一种快速移植 OpenHarmony Linux 内核的方法

原创
作者头像
小帅聊鸿蒙
发布2024-07-28 20:17:12
1280
发布2024-07-28 20:17:12
举报
文章被收录于专栏:鸿蒙开发笔记

移植概述

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

移植到三方芯片平台的整体思路

内核态层和用户态层

为了更好的解释整个内核移植,首先需要介绍一些概念:

我们可以把 OpenHarmony 简单的分为

OpenHarmony = OpenHarmony 内核态层 + OpenHarmony 用户态层

其中 OpenHarmony 内核层就是上图的紫色部分,可以看到,它主要由内核本身(如 Linux Kernel,LiteOS),和一些运行在内核态的一些特性组成,比如 HDF 等。

而 OpenHarmony 用户态层,在上图,就是紫色之外的部分。可以看到,由下往上看,它主要由系统服务层,框架层,应用层组成。在这儿我们将这三层整体称为“OpenHarmony 用户态层”。

为什么这么区分呢?因为我们这篇文章主要是要讨论如何快速的把 OpenHarmony 移植到三方芯片平台上。而 OpenHarmony 的用户态层,整体来说和三方芯片平台的耦合度不高,移植较为方便。而内核态层中的内核本身以及 HDF 驱动框架等,和三方芯片平台的耦合度较高,是移植的重难点。我们先做这个区分,就是为了先把聚光灯打到我们最需要关注的 OpenHarmony 内核态层上,开始分析和解题。另外说明,本文只包含 Linux 内核的快速移植,不包含 LiteOS 的移植。

获得内核态层的两种方法

为了表述方便,我们在下文部分地方用“OH”代替“OpenHarmony”。

将 OH 内核态层继续分解

而将前两项组合,标准 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 的流程

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

  1. 准备整体构建环境,包括将三方芯片平台的现有内核代码拷贝到 OpenHarmony 的整体编译环境下。
  2. OpenHarmony 内核态基础代码的移植。
  3. OpenHarmony 内核态必选特性(如 HDF 等)的移植。

详细步骤在接下来的章节中介绍。

移植到三方芯片平台的步骤

下面以树莓派 3b (BCM2837) 为例,演示将 OpenHarmony 移植到树莓派的过程。

准备整体构建环境

  1. 将三方内核纳入 OpenHarmony 编译环境。

完整编译过一遍标准 Hi3516DV300 的内核之后,clone 树莓派内核源码并复制到 manifest 输出目录下:

代码语言:shell
复制
    export PROJ_ROOT=[OpenHarmony manifest]
    git clone https://gitee.com/xfan1024/oh-rpi3b-kernel.git
    cp -r oh-rpi3b-kernel $PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b
  1. 配置树莓派内核编译环境。
代码语言:shell
复制
    # 进入树莓派kernel目录
    cd out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b
    # 配置编译环境,使用工程项目自带的clang
    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
    export MAKE_OPTIONS="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang"
    export PRODUCT_PATH=vendor/hisilicon/hispark_taurus_linux
  1. 注释掉 clang 不识别的 flag。 PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/arch/arm/Makefile 注释掉以下这一行:
代码语言:shell
复制
    KBUILD_CFLAGS  +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog

移植内核态基础代码

目前 OpenHarmony 内核态的基础代码,主要是日志服务相关。轻量化内核日志服务代码包含:

代码语言:shell
复制
drivers/staging/hilog
drivers/staging/hievent

将以上代码,从 OpenHarmony 内核代码目录 kernel/linux/linux-4.19/drivers/staging 中,拷贝到 out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/drivers/staging 下。

在三方内核的 drivers/staging/Kconfig 文件内增加如下代码:

代码语言:shell
复制
source "drivers/staging/hilog/Kconfig"
source "drivers/staging/hievent/Kconfig"

在三方内核的 drivers/staging/Makefile 文件内增加如下代码:

代码语言:shell
复制
obj-$(CONFIG_HILOG)             += hilog/
obj-$(CONFIG_HIEVENT)           += hievent/

在内核 config 项中打开对应的 CONFIG 控制宏:CONFIG_HILOG 和 CONFIG_HIEVENT。

具体日志使用说明请参见:Hilog_lite 组件介绍

移植内核态必选特性 HDF

  1. 打 HDF 补丁。 在 Linux 内核打 HDF 补丁时,执行补丁 shell 脚本合入 HDF 补丁。
  2. 配置 HDF 补丁脚本的四个变量参数。 2. 获取 patch_hdf.sh 脚本。 3. 执行 patch_hdf.sh 脚本依次传入四个变量参数。 patch_hdf.sh 脚本四个参数含义为:第一个入参为工程根目录路径,第二入参为内核目录路径,第三个入参为内核版本路径,第四个参数是当前设备名。
代码语言:shell
复制
    ./patch_hdf.sh [工程根目录路径] [内核目录路径] [内核补丁路径] [设备名]

以3b 为示例介绍:

代码语言:shell
复制
    PROJ_ROOT/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh \
    PROJ_ROOT  # 指定工程根目录路径 \
    PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b  # 打补丁的内核目录路径 \
    PROJ_ROOT/kernel/linux/patches/linux-4.19 # 内核补丁路径.\
    hi3516dv300 # 设备名.
  1. 配置 config。 提供 HDF 基本配置,如果需要其他功能,通过 menuconfig 打开对应驱动开关即可。 HDF 补丁执行成功后,默认 HDF 开关是关闭的,打开 HDF 基本配置选项如下:
代码语言:shell
复制
    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

或者通过 menuconfig 界面打开 HDF 相关配置,命令如下:

代码语言:shell
复制
    # 生成 .config 配置文件
    make ${MAKE_OPTIONS} rpi3b_oh_defconfig
    # 更改HDF内核配置
    make ${MAKE_OPTIONS} menuconfig
    # [*] Device Drivers
    # [*]   HDF driver framework support --->

配置如下(在 Device Drivers -> HDF driver framework support 目录下):

编译 Image

代码语言:shell
复制
# 执行编译命令
make ${MAKE_OPTIONS} -j33 zImage

编译和运行 HDF 测试用例(可选)

简介

HDF(Hardware Driver Foundation)自测试用例,用于测试 HDF 框架和外设的基本功能,本文主要介绍 HDF 内核态用例测试方法。

预置条件

测试前需要在 menuconfig 里检查 HDF 测试开关 CONFIG_DRIVERS_HDF_TEST=y,代码全量编译通过。

用例编译和测试方法

通过  hdc_std 工具 把用例执行文件推送到设备中,然后执行用例即可,操作步骤如下:

  1. 编译 hdf 测试用例。
  2. 用 hdc_std 工具推送测试文件到设备中。
  3. 进入设备 data/test 目录,执行测试文件即可。

用例编译和测试详细步骤如下:

  1. 编译 hdf 测试用例。

编译 hdf 测试用例命令和文件路径如下:

代码语言:shell
复制
    ./build.sh --product-name hispark_taurus_standard --build-target hdf_test

等待编译完成。

  1. 将测试文件移动到目标移植设备上(以树莓派为例)。

方法一:使用 hdc_std 工具。

  1. 先在树莓派里新建 data/test 目录。
代码语言:shell
复制
mkdir -p data/test
  1. 推送依赖库和测试用例到树莓派。
代码语言:shell
复制
hdc file send XXX\out\{device_name}\hdf\hdf\libhdf_test_common.z.so  /system/lib
        hdc file send XXX\out\{device_name}\tests\unittest\hdf\config\hdf_adapter_uhdf_test_config  /data/test
        hdc file send XXX\out\{device_name}\tests\unittest\hdf\devmgr\DevMgrTest  /data/test
        hdc file send XXX\out\{device_name}\tests\unittest\hdf\osal\OsalTest  /data/test
        hdc file send XXX\out\{device_name}\tests\unittest\hdf\sbuf\SbufTest  /data/test

方法二:移动到储存卡内,启动树莓派之后装载。

1. 拔掉树莓派连接电脑的串口、USB 线,然后拔下数据卡。

2. 将数据卡插入到电脑的读取口,将编译好的 zImage 和测试文件夹 test/下载到电脑,然后移动到数据卡的根目录下。zImage 文件会被替换,请提前做好备份。

3. 最后将数据卡插回树莓派。

代码语言:shell
复制
    # 让树莓派文件系统读取储存卡根目录
    mount -t vfat /dev/block/mmcblk0p1 /boot
    cd /boot/[测试文件目录]
    # 允许修改系统文件
    mount -o remount,rw /
    # 安装测试用库
    mv libhdf_test_common.z.so /system/lib
    mkdir /data/test
    mv * /data/test
  1. 执行测试

1.进入目录执行测试文件目录 data/test。

代码语言:shell
复制
cd /data/test

2.修改文件执行权限。

代码语言:shell
复制
        chmod 777 hdf_adapter_uhdf_test_config DevMgrTest OsalTest SbufTest

3.开始测试。

代码语言:shell
复制
        ./hdf_adapter_uhdf_test_config
        ./DevMgrTest
        ./OsalTest
        ./SbufTest

4.如果所有测试文件输出均显示 PASSED,那么 HDF 功能即安装成功。

示例:DevMgrTest 用例成功结果显示:

代码语言:shell
复制
./DevMgrTest
Running main() from gmock_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from DevMgrTest
[ RUN      ] DevMgrTest.DriverLoaderTest_001
[       OK ] DevMgrTest.DriverLoaderTest_001 (0 ms)
[----------] 1 test from DevMgrTest (0 ms total)
[----------] Global test environment tear-down
Gtest xml output finished
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 移植概述
  • 移植到三方芯片平台的整体思路
    • 内核态层和用户态层
      • 获得内核态层的两种方法
        • 借助已有 Linux 内核来移植 OpenHarmony 的流程
        • 移植到三方芯片平台的步骤
          • 准备整体构建环境
            • 移植内核态基础代码
              • 移植内核态必选特性 HDF
                • 编译 Image
                  • 编译和运行 HDF 测试用例(可选)
                  • 写在最后
                  相关产品与服务
                  日志服务
                  日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档