OpenHarmony 三方内核移植

如下图所示,OpenHarmony 内核层主要包含OH Linux内核、OH内核态特性。其中OH Linux内核可以看成是由三方Linux内核+OH内核态基础代码的组成。

OH 默认Linux内核为5.10,为保证稳定性,移植OH时使用目标芯片的原生内核,在此基础上添加OH内核态基础代码、OH内核态特性。即,选择的移植方案是:OH 内核层 = 目标芯片的Linux 内核 + OH内核态基础代码 + HDF特性 ,以目标芯片Linux-4.19.15内核移植OH为例,移植过程如下:

0.首先准备内核源码

bash 复制代码
tar zxvf linux-4.19.15-860-oh.tar.gz  oh源码根目录/kernel/linux/linux-4.19.15

1 添加内核基础代码

ini 复制代码
# 0\. 移植内核态基础代码 主要是hilog 和hievent,参考链接
https://docs.openharmony.cn/pages/v4.1/zh-cn/device-dev/porting/porting-linux-kernel.md/
   0.1 将以下文件,
         drivers/staging/hilog 
         drivers/staging/hievent
       从OpenHarmony内核代码目录kernel/linux/linux-4.19/drivers/staging中拷贝到kernel/linux/linux-4.19.15/drivers/staging中。
   0.2 在三方内核的linux-4.19.15/drivers/staging/Kconfig文件内增加如下代码:
        source "drivers/staging/hilog/Kconfig"
        source "drivers/staging/hievent/Kconfig"
   0.3 在在三方内核的linux-4.19.15/drivers/路径下的Makefile中添加配置
       obj-$(CONFIG_HILOG)             += hilog/
       obj-$(CONFIG_HIEVENT)           += hievent/

# 1\. 内核config,拷贝内核根目录原来的.config文件到OH如下路径,并重命名target_small_defconfig.config
        kernel/linux/config/linux-4.19.15/arch/csky/configs/target_small_defconfig.config
        # 添加HDF选项,参考上面链接添加以下内容,
        # 参考kernel/linux/config/linux-4.19/arch/arm/configs/hispark_taurus_small_defconfig添加
        CONFIG_DRIVERS_HDF=y
        CONFIG_HDF_SUPPORT_LEVEL=1
        CONFIG_DRIVERS_HDF_PLATFORM=y
        # CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI is not set
        # CONFIG_DRIVERS_HDF_PLATFORM_MIPI_CSI is not set
        CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y
        CONFIG_DRIVERS_HDF_PLATFORM_I2C=y
        # CONFIG_DRIVERS_HDF_PLATFORM_WATCHDOG is not set
        CONFIG_DRIVERS_HDF_PLATFORM_PWM=y
        CONFIG_DRIVERS_HDF_PLATFORM_UART=y
        # CONFIG_DRIVERS_HDF_PLATFORM_SDIO is not set
        # CONFIG_DRIVERS_HDF_PLATFORM_EMMC is not set
        CONFIG_DRIVERS_HDF_PLATFORM_MMC=y
        CONFIG_DRIVERS_HDF_PLATFORM_SPI=y
        CONFIG_DRIVERS_HDF_PLATFORM_RTC=y
        # CONFIG_PWM_HI35XX is not set
        # CONFIG_DRIVERS_HDF_PLATFORM_REGULATOR is not set
        CONFIG_DRIVERS_HDF_PLATFORM_ADC=y
        # CONFIG_DRIVERS_HDF_PLATFORM_TRACE is not set
        # CONFIG_DRIVERS_HDF_PLATFORM_DUMPER is not set
        # CONFIG_IMX8MM_EMMC is not set
        # CONFIG_IMX8MM_SDIO is not set
        # CONFIG_DRIVERS_HDF_PLATFORM_IMX8MM_MIPI_DSI is not set
        CONFIG_DRIVERS_HDF_TEST=y
        # CONFIG_IMX8MM_SPI_TEST is not set
        # CONFIG_DRIVERS_HDF_DISP is not set
        # CONFIG_DRIVERS_HDF_INPUT is not set
        # CONFIG_DRIVERS_HDF_NETDEV_EXT is not set
        # CONFIG_DRIVERS_HDF_BT is not set
        # CONFIG_DRIVERS_HDF_SENSOR is not set
        # CONFIG_DRIVERS_HDF_STORAGE is not set
        # CONFIG_IMX8MM_SDIO_TEST is not set
        # CONFIG_DRIVERS_HDF_USB_PNP_NOTIFY is not set
        # CONFIG_DRIVERS_HDF_AUDIO is not set
        # CONFIG_DRIVERS_HDF_VIBRATOR is not set
        # CONFIG_DRIVERS_HDF_DSOFTBUS is not set
        # CONFIG_DRIVERS_HDF_LIGHT is not set
        # CONFIG_DRIVERS_HDF_NETWORK is not set

DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。

erlang 复制代码
`欢迎大家关注公众号<程序猿百晓生>,可以了解到以下知识点。`
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.鸿蒙版性能优化指南
.......

2 打hdf补丁

如果不添加HDF补丁,编译会报错遇到 undefined reference to _hdf_drivers_end' 、 undefined reference to _hdf_drivers_start'

检查内核补丁, 发现是因为执行drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh时,默认添加的补丁路径和内容为:

diff 复制代码
kernel/linux/patches/linux-4.19/common_patch/hdf.patch
// 部分内容如下:
    //-----------------------------针对arm64架构的hdf补丁--------------------------------
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index 69e7c8d4a..6bdc118dd 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S  //
@@ -176,6 +176,15 @@ SECTIONS
 		INIT_RAM_FS
 		*(.init.rodata.* .init.bss)	/* from the EFI stub */
 	}
+
+#ifdef CONFIG_DRIVERS_HDF
+	.init.hdf_table : {
+		_hdf_drivers_start = .;
+		*(.hdf.driver)
+		_hdf_drivers_end = .;
+	}
+#endif
+
 	.exit.data : {
 		ARM_EXIT_KEEP(EXIT_DATA)
 	}
// --------------------------------针对arm架构的hdf补丁----------------------------------
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 23150c0f0..2780470c5 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -121,6 +121,14 @@ SECTIONS
 		__pv_table_end = .;
 	}

+#ifdef CONFIG_DRIVERS_HDF
+	.init.hdf_table : {
+		_hdf_drivers_start = .;
+		*(.hdf.driver)
+		_hdf_drivers_end = .;
+	}
+#endif
+
 	INIT_DATA_SECTION(16)
//--------------------------------如果目标芯片架构比较新,需要补充目标芯片如csky架构的hdf补丁------------------------------

hi3516是arm架构的,而新的csky架构,所以这个默认common_patch/hdf.patch补丁打到了arch/arm中,两种解决方法:

  • 1.在 kernel/linux/patches/linux-4.19/common_patch/hdf.patch中添加针对csky的补丁,

  • 2.直接修改/kernel/src_tmp/linux-4.19.15/arch/csky/kernel/vmlinux.lds.S,添加hdf占位符代码:

ini 复制代码
// 32行开始添加如下代码	
#ifdef CONFIG_DRIVERS_HDF
	.init.hdf_table : {
		_hdf_drivers_start = .;
		*(.hdf.driver)
		_hdf_drivers_end = .;
	}

方法1需要制作补丁文件,因为需要找到目标芯片的linux内核、OH内核提交hdf补丁的pr,因为难以寻找,故选择方法2,手动添加

ini 复制代码
# 2\. 内核补丁  
       2.1 手动添加HDF补丁,直接修改//kernel/linux/linux-4.19.15/arch/csky/kernel/vmlinux.lds.S,添加代码:
        # 32行开始添加如下代码	
        #ifdef CONFIG_DRIVERS_HDF
            .init.hdf_table : {
                _hdf_drivers_start = .;
                *(.hdf.driver)
                _hdf_drivers_end = .;
            }
相关推荐
Georgewu2 小时前
【HarmonyOS 5】AttributeModifier和AttributeUpdater详解
harmonyos
悬空八只脚2 小时前
一定要看到花开-M1下的环境噩梦
harmonyos
程序猿阿伟3 小时前
《探秘鸿蒙分布式软总线:开启无感发现与零等待传输新时代》
分布式·华为·harmonyos
Scout-leaf4 小时前
UTC时间与正常时间相互转换的shell脚本
嵌入式
政安晨6 小时前
【嵌入式人工智能产品开发实战】(二十)—— 政安晨:小智AI嵌入式终端代码解读:【B】小智AI嵌入式终端OTA升级功能深度解析
c++·人工智能·嵌入式·ota·小智ai·代码解读·ai聊天助手
沅霖14 小时前
Harmony鸿蒙应用开发-录音保存并播放音频
harmonyos
威哥爱编程15 小时前
利用DevEco Profiler定位性能瓶颈,优化资源占用
华为·harmonyos·arkts
ChinaDragonDreamer15 小时前
HarmonyOS:使用geoLocationManager (位置服务)获取位置信息
harmonyos·鸿蒙
威哥爱编程15 小时前
鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解
华为·harmonyos·arkts
少年的云河月16 小时前
OpenHarmony Camera组件简介
harmonyos·相机·openharmony·camera