本文面向希望将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。
整个移植流程可以分为三步:
详细步骤在接下来的章节中介绍。
下面以树莓派3b (BCM2837) 为例,演示将OpenHarmony移植到树莓派的过程。
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
# 进入树莓派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
KBUILD_CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
目前OpenHarmony内核态的基础代码,主要是日志服务相关。轻量化内核日志服务代码包含:
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文件内增加如下代码:
source "drivers/staging/hilog/Kconfig"
source "drivers/staging/hievent/Kconfig"
在三方内核的drivers/staging/Makefile文件内增加如下代码:
obj-$(CONFIG_HILOG) += hilog/
obj-$(CONFIG_HIEVENT) += hievent/
在内核config项中打开对应的CONFIG控制宏:CONFIG_HILOG和CONFIG_HIEVENT。
具体日志使用说明请参见:Hilog_lite组件介绍。
patch_hdf.sh脚本四个参数含义为:第一个入参为工程根目录路径,第二入参为内核目录路径,第三个入参为内核版本路径,第四个参数是当前设备名。
./patch_hdf.sh [工程根目录路径] [内核目录路径] [内核补丁路径] [设备名]
以树莓派3b为示例介绍:
# 进入树莓派kernel目录
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 # 设备名.
HDF补丁执行成功后,默认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
或者通过menuconfig界面打开HDF相关配置,命令如下:
# 生成 .config 配置文件
make ${MAKE_OPTIONS} rpi3b_oh_defconfig
# 更改HDF内核配置
make ${MAKE_OPTIONS} menuconfig
# [*] Device Drivers
# [*] HDF driver framework support --->
配置如下(在Device Drivers -> HDF driver framework support 目录下):
# 执行编译命令
make ${MAKE_OPTIONS} -j33 zImage
欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。
欢迎大家关注工粽号<程序猿百晓生>,0取以下学习清单:
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案)
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
简介
HDF(Hardware Driver Foundation)自测试用例,用于测试HDF框架和外设的基本功能,本文主要介绍HDF内核态用例测试方法。
预置条件
测试前需要在menuconfig里检查HDF测试开关CONFIG_DRIVERS_HDF_TEST=y,代码全量编译通过。
用例编译和测试方法
通过 hdc_std工具 把用例执行文件推送到设备中,然后执行用例即可,操作步骤如下:
用例编译和测试详细步骤如下:
./build.sh --product-name hispark_taurus_standard --build-target hdf_test
等待编译完成。
方法一:使用 hdc_std工具。
mkdir -p data/test
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
方法二:移动到储存卡内,启动树莓派之后装载。
# 让树莓派文件系统读取储存卡根目录
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
cd /data/test
chmod 777 hdf_adapter_uhdf_test_config DevMgrTest OsalTest SbufTest
/hdf_adapter_uhdf_test_config
./DevMgrTest
./OsalTest
./SbufTest
./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.
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。