OpenHarmony-4.0-Release 源码编译记录

本文基于 Ubuntu 20.04.4 LTS

1、环境准备

这个没啥好说的,都是搞机的,用之前编译 aosp 的 linux 环境就行,有小伙伴担心会把之前的环境搞崩,

也有用 docker 编译的,我这里就直接在 aosp 环境下搞了,还省事。

安装下面这三东西,是为了下载 Harmony 源码

sudo apt install curl
sudo apt install python3-pip
sudo apt install git-lfs

安装下面这五个东西,是为了解决编译到最后报错(头铁不信的,你可以试试,等最后再安装)

sudo apt install default-jdk
sudo apt install mtd-utils
sudo apt install scons
sudo apt install gcc-arm-none-eabi
sudo apt install gcc-arm-linux-gnueabi

2、安装 repo

务必按照此步骤安装repo。ubuntu默认提供的repo每次启动都会访问googlge服务器,会被墙。
此外20.04下需要root身份执行–否则提示没权限。
curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
chmod a+x /usr/local/bin/repo
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

3、下载源码

[官网版本更新说明}(https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes)

目前最新为 4.0 版本,内核基于 5.10,老版本 2.x 1.x 已经停止维护,内核基于 4.19

参考官网下载方式

repo init -u https://gitee.com/openharmony/manifest -b OpenHarmony-4.0-Release --no-repo-verify
repo sync -c
repo forall -c ‘git lfs pull’

注意那个 4.0 之前没有 v,以前的版本是有这个 v 的,不然会初始化失败,还有就是注意检查电脑是否断网了

4、下载编译依赖工具包

源码下载完成后,进入根目录执行 bash build/prebuilts_download.sh

看你网速快慢,我这大概20分钟,下载完成后会多出 openharmony_prebuilts 文件夹

5、编译源码

./build.sh --product-name rk3568 --ccache

第一次编译前面阶段 2W 多个文件,后面阶段 6W 多个文件,整体时间看你电脑性能。

编译中间要是出错看提示就行,少啥就自行安装,比如这种

default-jdk is not installed. please install it.
mtd-utils is not installed. please install it.
scons is not installed. please install it.
gcc-arm-none-eabi is not installed. please install it.
gcc-arm-linux-gnueabi is not installed. please install it.
Missing dependencies, please check!
[OHOS INFO] Set cache size limit to 100.0 GB
[OHOS INFO] generated build prop info to /hom

6、烧写固件(劝你先别烧写)

最终固件路径 out\rk3568\packages\phone\images\

里面文件和普通 rk3568 aosp 项目大差不差,所以烧写方式也是一样的。

打开 rk 烧写工具,选择加载配置,选择 images 里的 config.cfg,把对应的 image

都重新选择替换就行。想要看图的可以去参考这个OpenHarmony 入门

7、内核及驱动移植

没有任何修改编译后的固件肯定是无法在板子上跑起来的,我这里修改了很长时间也没有搞定,这里记录一下一些心得。

主要原因就是内核版本差异太大,无法平行移植,有些小伙伴直接整个 kernel 替换了就成功跑起来了。

3568 有些版本的内核用的是 4.19(我这里就是),而最新的 harmony 都是基于 5.10 了

harmony 内核源码修改路径 out\kernel\src_tmp\linux-5.10

你要是内核版本一致就可以直接替换所有文件,然后稍微修改一下如下编译规则文件

out\kernel\src_tmp\linux-5.10\make-ohos.sh

替换原有 TOYBRICK_DTB 为你自己的,比如 MY3568_DTB, 总共 4 处修改

#!/bin/bashset -eSCRIPTPATH=$(dirname $realpath "$0")
export PATH=$(realpath $SCRIPTPATH/../../../../)/prebuilts/clang/ohos/linux-x86_64/llvm/bin/:$(realpath $SCRIPTPATH/../../../../)/prebuilts/develop_tools/pahole/bin/:$PATH
export PRODUCT_PATH=vendor/hihope/rk3568
IMAGE_SIZE=64  # 64M
IMAGE_BLOCKS=4096
ENABLE_LTO_O0=${3}CPUs=`sed -n "N;/processor/p" /proc/cpuinfo|wc -l`
MAKE="make LLVM=1 LLVM_IAS=1 CROSS_COMPILE=aarch64-linux-gnu-"
[ "${ENABLE_LTO_O0}" == "enable_lto_O0" ] && MAKE="${MAKE} KCFLAGS=-Wl,--lto-O0"
BUILD_PATH=boot_linux
EXTLINUX_PATH=${BUILD_PATH}/extlinux
EXTLINUX_CONF=${EXTLINUX_PATH}/extlinux.conf
# TOYBRICK_DTB=toybrick.dtb
MY3568_DTB=rk3568-evb1-ddr4-v10.dtb
if [ ${KBUILD_OUTPUT} ]; thenOBJ_PATH=${KBUILD_OUTPUT}/
fiID_MODEL=1
ID_ARCH=2
ID_UART=3
ID_DTB=4
ID_IMAGE=5
ID_CONF=6
model_list=("TB-RK3568X0   arm64 0xfe660000 rk3568-toybrick-x0-linux  Image rockchip_linux_defconfig""TB-RK3568X10  arm64 0xfe660000 rk3568-toybrick-x10-linux Image rockchip_linux_defconfig""MYBOARD3568   arm64 0xfe660000 rk3568-evb1-ddr4-v10 Image rockchip_linux_defconfig"
)function help()
{echo "Usage: ./make-ohos.sh {BOARD_NAME}"echo "e.g."for i in "${model_list[@]}"; doecho "  ./make-ohos.sh $(echo $i | awk '{print $1}')"done
}function make_extlinux_conf()
{dtb_path=$1uart=$2image=$3echo "label rockchip-kernel-5.10" > ${EXTLINUX_CONF}echo "	kernel /extlinux/${image}" >> ${EXTLINUX_CONF}# echo "	fdt /extlinux/${TOYBRICK_DTB}" >> ${EXTLINUX_CONF}echo "	fdt /extlinux/${MY3568_DTB}" >> ${EXTLINUX_CONF}cmdline="append earlycon=uart8250,mmio32,${uart} root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4"echo "  ${cmdline}" >> ${EXTLINUX_CONF}
}function make_kernel_image()
{arch=$1conf=$2dtb=$3if [ "$GPUDRIVER" == "mesa3d" ]; then config_base="arch/${arch}/configs/${conf}"config_frag="../../../../device/soc/rockchip/panfrost.config"ARCH=${arch} ./scripts/kconfig/merge_config.sh ${config_base} ${config_frag}else${MAKE} ARCH=${arch} ${conf}fiif [ $? -ne 0 ]; thenecho "FAIL: ${MAKE} ARCH=${arch} ${conf}"return -1fi${MAKE} ARCH=${arch} ${dtb}.img -j${CPUs}if [ $? -ne 0 ]; thenecho "FAIL: ${MAKE} ARCH=${arch} ${dtb}.img"return -2fireturn 0
}function make_ext2_image()
{blocks=${IMAGE_BLOCKS}block_size=$((${IMAGE_SIZE} * 1024 * 1024 / ${blocks}))if [ "`uname -m`" == "aarch64" ]; thenecho y | sudo mke2fs -b ${block_size} -d boot_linux -i 8192 -t ext2 boot_linux.img ${blocks}elsegenext2fs -B ${blocks} -b ${block_size} -d boot_linux -i 8192 -U boot_linux.imgfireturn $?
}function make_boot_linux()
{arch=${!ID_ARCH}uart=${!ID_UART}dtb=${!ID_DTB}image=${!ID_IMAGE}conf=${!ID_CONF}if [ ${arch} == "arm" ]; thendtb_path=arch/arm/boot/dtselsedtb_path=arch/arm64/boot/dts/rockchipfirm -rf ${BUILD_PATH}mkdir -p ${EXTLINUX_PATH}make_kernel_image ${arch} ${conf} ${dtb}if [ $? -ne 0 ]; thenexit 1fimake_extlinux_conf ${dtb_path} ${uart} ${image}cp -f ${OBJ_PATH}arch/${arch}/boot/${image} ${EXTLINUX_PATH}/# cp -f ${OBJ_PATH}${dtb_path}/${dtb}.dtb ${EXTLINUX_PATH}/${TOYBRICK_DTB}cp -f ${OBJ_PATH}${dtb_path}/${dtb}.dtb ${EXTLINUX_PATH}/${MY3568_DTB}cp -f logo*.bmp ${BUILD_PATH}/if [ "enable_ramdisk" != "${ramdisk_flag}" ]; thenmake_ext2_imagefi
}ramdisk_flag=$2
found=0
for i in "${model_list[@]}"; doif [ "$(echo $i | awk '{print $1}')" == "$1" ]; thenmake_boot_linux $ifound=1fi
done

device\board\hihope\rk3568\kernel\build_kernel.sh

修改内核编译指定使用刚刚的 MYBOARD3568,替换原来 TB-RK3568X0

# eval $MAKE_OHOS_ENV ./make-ohos.sh TB-RK3568X0 $RAMDISK_ARG ${ENABLE_LTO_O0}
eval $MAKE_OHOS_ENV ./make-ohos.sh MYBOARD3568 $RAMDISK_ARG ${ENABLE_LTO_O0}

再次执行 ./build.sh --product-name rk3568 --ccache 重新编译

8、编译错误举例

错误1、内核版本差异,dts 文件属性不兼容,出现在 rk3568-dram-default-timing.dtsi 中 260 行,去修改注释即可

[OHOS ERROR] DTC arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtb
[OHOS ERROR] Error: /home/ubuntu/code/OpenHarmony4.0/out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568-dram-default-timing.dtsi:260.27-28 syntax error
[OHOS ERROR] FATAL ERROR: Unable to parse input tree
[OHOS ERROR] make[3]: *** [scripts/Makefile.lib:329: arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtb] Error 1
[OHOS ERROR] make[2]: *** [/home/ubuntu/code/OpenHarmony4.0/out/kernel/src_tmp/linux-5.10/Makefile:1405: rockchip/rk3568-evb1-ddr4-v10.dtb] Error 2
[OHOS ERROR] make[2]: *** Waiting for unfinished jobs…
[OHOS ERROR] make[1]: *** [arch/arm64/Makefile:208: rk3568-evb1-ddr4-v10.img] Error 2
[OHOS ERROR] make[1]: Leaving directory ‘/home/ubuntu/code/OpenHarmony4.0/out/kernel/OBJ/linux-5.10’
[OHOS ERROR] make: *** [Makefile:185: __sub-make] Error 2

错误2、修改的配置文件有问题

[OHOS ERROR] FAILED: …/kernel/src_tmp/linux-5.10/boot_linux …/kernel/checkpoint/compile_check
[OHOS ERROR] /usr/bin/env …/…/device/board/hihope/rk3568/kernel/build_kernel.sh …/…/kernel/linux/linux-5.10 /home/ubuntu/code/OpenHarmony4.0/out/rk3568/packages/phone/images /home/ubuntu/code/OpenHarmony4.0/device/board/hihope/rk3568 vendor/hihope/rk3568 /home/ubuntu/code/OpenHarmony4.0 rockchip rk3568 hihope root default disable_lto_O0

9、开机 logo 替换

device\board\hihope\rk3568\kernel\logo.bmp

device\board\hihope\rk3568\kernel\logo_kernel.bmp

10、一些常见路径

applications\standard 系统核心应用,包括日历、电话、相机、联系人、Setting、SystemUI 等

out\kernel\src_tmp\linux-5.10 最终编译内核源码路径

out\kernel\OBJ\linux-5.10 内核源码编译 obj 路径

kernel\linux\linux-5.10 SDK自带原生 kernel 路径

device\board\hihope\rk3568 编译脚本路径

openharmony kernel 代码构成如下:

①、SDK 自带原生 kernel(kernel\linux\linux-5.10\)

②、openharmony HDF驱动补丁包 hdf.patch(kernel\linux\patches\linux-5.10\rk3568_patch\)

③、方案商需求的内核补丁包 kernel.patch(kernel\linux\patches\linux-5.10\rk3568_patch\)

由1中kernel加上2、3中的patch,组合成最终的kernel代码(out\kernel\src_tmp\linux-5.10)

该工作由 device\board\hihope\rk3568\kernel\build_kernel.sh完成

脚本每次执行会时开头都会删除 out\kernel\src_tmp\linux-5.10 目录,重新组合生成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/153421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】聚合函数、group by、update、delete

聚合函数、group by、update、delete 前言正式开始update将孙悟空同学的数学成绩变更为 80 分将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分将总成绩倒数前三的 3 位同学的数学成绩加上 30 分将所有同学的语文成绩更新为原来的 2 倍 delete删除孙悟空同…

android13(T) 网络比分机制

网络比分核心类 packages\modules\Connectivity\framework\src\android\net\NetworkScore.java packages\modules\Connectivity\framework\src\android\net\NetworkAgent.java packages\modules\Connectivity\service\src\com\android\server\ConnectivityService.java 1、WI…

#gStore-weekly | gAnswer源码解析 调用NE模块流程

简介 gAnswer系统的主要思想,是将自然语言问题转化为语义查询图,再和RDF图做子图匹配。在转换成查询图的第一步就是确定查询图的节点,即节点提取(Node Extraction, NE)。 查询图中的节点由实体(entity&am…

【C++上层应用】1. 异常处理

文章目录 【 1. C的标准异常 】【 2. 异常转移处理 】2.1 throw 抛出异常2.2 try 捕获异常2.3 catch 捕获异常2.4 实例 【 3. 定义新的异常 】 异常是程序在执行期间产生的问题,比如编译报错、链接错误等。 【 1. C的标准异常 】 C 提供了一系列标准的异常&#xf…

[Spring Cloud] Nacos 实战 + Aws云服务器

文章目录 前言一、拥有一台Aws Linux服务器1.1、选择Ubuntu版本Linux系统1.2、创建新密钥对1.3、网络设置1.4、配置成功,启动实例1.5、回到实例区域1.6、进入具体的实例1.7、设置安全组 二、在Mac上连接Aws云服务,并安装配置JDK112.1、解决离奇的错误2.2…

Zynq-Linux移植学习笔记之66- 国产ZYNQ通过裕太PHY8521连接国产交换芯片

1、背景介绍 ZYNQ通过裕太PHY 8521主要连接两种国产交换芯片,一种为盛科的CTC8096,另一种为32所的JEM5396。框图示意如下: 2、硬件状态确认 首先检查phy的模式,确认为SGMII_MAC-RGMII_PHY 可通过读出A001寄存器确认状态 读出来应…

RESTful API 设计指南——开篇词

引言 十年后的今天,我终于学会了RESTful API。 以上,就是我最近一个月的心路历程。入职新公司不到2周,自己都还没完全理解RESTful API就要求给校招应届生培训,着实压力山大。培训结束后也感觉收获颇丰,遂总结分享出来&…

牛客——OR36 链表的回文结构(C语言,配图,快慢指针)

目录 思路一:链表翻转 思路二:快慢指针,分别从头和尾间开始比较 本题是没有对C的支持的,但因为CPP支持C,所以这里就用C写了,可以面向更多用户 链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 思路一&am…

redis数据结构

redis数据结构 redis全名(Remote Dictionary Server),即远程字典服务 redis的值的数据结构类型有String、List、Set、Hash、zset(sorted set,有序集合)、Bitmaps(位图)、HyperLogLogs 注意:我使用的版本是6.0.10,不同版本可能略有…

YOLOv8-seg改进:重新思考轻量化视觉Transformer中的局部感知CloFormer,提升上下文感知权重来增强局部特征 |2023清华

🚀🚀🚀本文改进:CloFormertAttention利用共享权重和上下文感知权重有效地提取高频局部特征表示 🚀🚀🚀SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻…

Java Enumeration 接口

Java Enumeration 接口 这段代码展示了如何使用 Enumeration 接口来遍历 Properties 对象的键。在这里,foo.getProp() 返回一个 Properties 对象,而 propertyNames() 方法返回一个 Enumeration 对象,它包含了 Properties 对象中所有键的枚举。…

synchronized锁膨胀过程

轻量级锁: 使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以 使用轻量级锁来优化。 轻量级锁原理 1.创建锁记录(Lock Record)对象&#…

简述谈一谈人工智能

人工智能对我们的生活影响有多大 人工智能在当今社会中扮演着不可忽视的角色,其对我们生活的影响之巨大,如同一位巧妙的魔术师,为我们解决问题、提供建议,甚至超越时间的界限,预测未来。从智能手机到智能家居&#xf…

光谱图像超分辨率综述

光谱图像超分辨率综述 简介 ​ 论文链接:A Review of Hyperspectral Image Super-Resolution Based on Deep Learning UpSample网络框架 1.Front-end Upsampling ​ 在Front-end上采样中,是首先扩大LR图像,然后通过卷积网络对放大图像进行…

竞赛 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR

文章目录 0 简介1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! &a…

什么是媒体见证?媒体宣传有哪些好处?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 一,什么是媒体见证? 媒体见证是指企业举办活动,发布会,邀请媒体现场采访的一种宣传方式,媒体到场后,对其进行记录…

JAVA整理学习实例(四)数据结构

JAVA整理学习实例(四)数据结构 注:不积跬步,无以至千里,学习之路,任重而道远。很多技术,学着学着就回到了理论上。基础知识很差,博客写起来很难。。。写的不对的和不好的&#xff0c…

lenovo联想笔记本ThinkPad P1 Gen5/X1 Extreme Gen5原装出厂Windows11预装OEM系统

链接:https://pan.baidu.com/s/13E97Nwc-0-N7ffPjEeeeOw?pwdep4l 提取码:ep41 原装出厂系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具:32G或以上的U盘 文件格式:ISO 文件大小&#xff…

Java实现俄罗斯方块游戏

俄罗斯方块游戏本身的逻辑: 俄罗斯方块游戏的逻辑是比较简单的。它就类似于堆砌房子一样,各种各样的方地形状是不同的。但是,俄罗斯方块游戏的界面被等均的分为若干行和若干列,因此方块的本质就是占用了多少个单元。 首先来考虑…

解决 Python requests 库中 SSL 错误转换为 Timeouts 问题

解决 Python requests 库中 SSL 错误转换为 Timeouts 问题:理解和处理 SSL 错误的关键 在使用Python的requests库进行HTTPS请求时,可能会遇到SSL错误,这些错误包括但不限于证书不匹配、SSL层出现问题等。如果在requests库中设置verifyFalse&…