[OpenHarmony RK3568] (二)基础开发

文章目录

    • 一、概述
      • 1.1 设备相关的文件夹
    • 二、准备工作
      • 2.1 修改显示的版本号等
      • 2.2 关闭使用ramdisk
    • 三、分析OpenHarmony系统构成和所需固件
      • 3.1 分区文件
      • 3.2 系统构成所需固件
    • 四、制作内核补丁
      • 4.1 首先第一次编译
      • 4.2 复制内核源码
      • 4.3 将源码作为git仓库
      • 4.4 增加对自己设备的支持
      • 4.4 制作补丁
      • 4.5 修改编译内核脚本
    • 五、编译并烧写即可

一、概述

本文讲述如何修改内核配置等基础修改

1.1 设备相关的文件夹

vendor/hihope/rk3568

device/board/hihope/rk3568

device/soc/rockchip/rk3568

二、准备工作

2.1 修改显示的版本号等

base/startup/init_lite/servcies/etc/param/ohos.para

这个设置修改的是设置->设备信息中的内容

const.actionable_compatible_property.enabled=false
const.postinstall.fstab.prefix=/system
const.secure=1
security.perf_harden=1
const.allow.mock.location=0
const.debuggable=1
const.build.characteristics=default
const.product.model=test3568
const.product.name="这里写设备名字"
persist.sys.usb.config=hdc
const.sandbox=enable
const.product.devicetype=M3568
const.software.model=default
const.product.manufacturer=这里写公司名字
const.product.brand=default
const.build.product=default
const.product.hardwareversion=default
const.product.bootloader.version=bootloader
const.product.cpu.abilist=default
const.product.software.version=这里写固件名字
const.product.incremental.version=default
const.product.firstapiversion=1
const.product.build.type=default
const.product.build.user=default
const.product.build.host=default
const.product.build.date=default
const.product.hardwareprofile=default
const.ohos.buildroothash=default

2.2 关闭使用ramdisk

vendor/hihope/rk3568/config.json

我们不需要使用ramdisk进行初始化,找到enable_ramdisk,改为false

"enable_ramdisk": false,

三、分析OpenHarmony系统构成和所需固件

3.1 分区文件

可以参考paramter.txt

FIRMWARE_VER:11.0
MACHINE_MODEL:rk3568_r
MACHINE_ID:007
MANUFACTURER: rockchip
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: rk3568_r
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00030000@0x00008000(boot),0x00002000@0x00038000(resource),0x00002000@0x0003A000(misc),0x000010000@0x0003C000(updater),0x100000@0x004C000(vendor),0x00400000@0x0014C000(system),-@0x0054C000(userdata:grow)
uuid:system=614e0000-0000-4b53-8000-1d28000054a9
uuid:boot=a2d37d82-51e0-420d-83f5-470db993dd35
uuid:userdata=8b13db99-110a-41c2-b16b-dfd44d7ebeca

3.2 系统构成所需固件

uboot:uboot第二部分分区,烧写uboot.img

boot:kernel的分区,同样包含了设备树,烧写boot.img

resource:烧写resource.img,里面包含了logo

misc:空分区,但是以后可能胡有用

updater:存放updater的分区,未验证,烧写update.img

vendor:存放产商相关代码,烧写vendor.img

system:存放OHOS本身系统代码的分区,烧写sysytem.img

userdata:存放用户数据的分区,剩下的空间都给它,烧写userdata.img

除此以外,还需要MiniLoaderAll.bin和paramter.txt本身。

四、制作内核补丁

4.1 首先第一次编译

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

4.2 复制内核源码

cp ./out/kernel/src_tmp/linux-5.10 ../ohos-kernel -r

4.3 将源码作为git仓库

进入到刚才复制出来的kernel文件夹中,执行以下命令,完成git仓库的初始化

#初始化文件夹作为git仓库
git init

#git全局配置
git config --global user.name "yourname" 
git config --global user.email "youremail"

#进行第一次提交代码
git add -A
git commit -m 'frist commit'

[OpenHarmony RK3568] (二)基础开发_第1张图片

4.4 增加对自己设备的支持

(1) 把自己的设备树放到ohos-kernel/arch/arm64/boot/dts/rockchip

注:设备树一定需要include rk3568-linux.dtsi文件

(2) 修改make-ohos.sh

假设这里我们最终需要生成的设备树文件为my3568-board-linux.dtb

#!/bin/bash

set -e

export PATH=../../../../prebuilts/clang/ohos/linux-x86_64/llvm/bin/:$PATH
export PRODUCT_PATH=vendor/hihope/rk3568
IMAGE_SIZE=64  # 64M
IMAGE_BLOCKS=4096

CPUs=`sed -n "N;/processor/p" /proc/cpuinfo|wc -l`
MAKE="make CROSS_COMPILE=../../../../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-"
BUILD_PATH=boot_linux
EXTLINUX_PATH=${BUILD_PATH}/extlinux
EXTLINUX_CONF=${EXTLINUX_PATH}/extlinux.conf
#TOYBRICK_DTB=toybrick.dtb
MY3568_DTB=my3568-board-linux.dtb

if [ ${KBUILD_OUTPUT} ]; then
	OBJ_PATH=${KBUILD_OUTPUT}/
fi

ID_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 my3568-board-linux     Image rockchip_linux_defconfig"
)


function help()
{
	echo "Usage: ./make-ohos.sh {BOARD_NAME}"
	echo "e.g."
	for i in "${model_list[@]}"; do
		echo "  ./make-ohos.sh $(echo $i | awk '{print $1}')"
	done
}


function make_extlinux_conf()
{
	dtb_path=$1
	uart=$2
	image=$3
	
	echo "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=$1
	conf=$2
	dtb=$3
	
	${MAKE} ARCH=${arch} ${conf}
	if [ $? -ne 0 ]; then
		echo "FAIL: ${MAKE} ARCH=${arch} ${conf}"
		return -1
	fi

	${MAKE} ARCH=${arch} ${dtb}.img -j${CPUs}
	if [ $? -ne 0 ]; then
		echo "FAIL: ${MAKE} ARCH=${arch} ${dtb}.img"
		return -2
	fi

	return 0
}

function make_ext2_image()
{
	blocks=${IMAGE_BLOCKS}
	block_size=$((${IMAGE_SIZE} * 1024 * 1024 / ${blocks}))

	if [ "`uname -m`" == "aarch64" ]; then
		echo y | sudo mke2fs -b ${block_size} -d boot_linux -i 8192 -t ext2 boot_linux.img ${blocks}
	else
		genext2fs -B ${blocks} -b ${block_size} -d boot_linux -i 8192 -U boot_linux.img
	fi

	return $?
}

function make_boot_linux()
{
	arch=${!ID_ARCH}
	uart=${!ID_UART}
	dtb=${!ID_DTB}
	image=${!ID_IMAGE}
	conf=${!ID_CONF}
	if [ ${arch} == "arm" ]; then
		dtb_path=arch/arm/boot/dts
	else
		dtb_path=arch/arm64/boot/dts/rockchip
	fi

	rm -rf ${BUILD_PATH}
	mkdir -p ${EXTLINUX_PATH}

	make_kernel_image ${arch} ${conf} ${dtb}
	if [ $? -ne 0 ]; then
		exit 1
	fi
	make_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}" ]; then
		make_ext2_image
	fi
}

ramdisk_flag=$2
found=0
for i in "${model_list[@]}"; do
	if [ "$(echo $i | awk '{print $1}')" == "$1" ]; then
		make_boot_linux $i
		found=1
	fi
done

4.4 制作补丁

注意:尽量不要在这份代码中编译!,否则产生的日志文件过大,可以复制一份去尝试编译

假设我们做了若干次修改后,我们使用git log命令去查看提交的日志(因为我的源码里面日志比较敏感,就不全放了)

[OpenHarmony RK3568] (二)基础开发_第2张图片

假设第一次提交,也就是first commit的日志id为 8148df7c6fdc0bfc5f7549c0eae011043320a461,最新提交的日志id为fd459ec617481a6d3b6ae6b311c58cc9f95ea38d

那么就是git diff 8148df7c6fdc0bfc5f7549c0eae011043320a461 fd459ec617481a6d3b6ae6b311c58cc9f95ea38d > 0001-fixed-kernel-for-myboard.patch

然后移植到SDK中,这里建议用mv,防止下次生成补丁的时候,把补丁文件本身也生成进去

mv 0001-fixed-kernel-for-myboard.patch  /home/fenix/SDK/kernel/linux/patches/linux-5.10/rk3568_patch

4.5 修改编译内核脚本

device/board/hihope/rk3568/kernel/build_kernel.h

增加编译时候对补丁的调用,并更改编译内核的目标板子为我们自己的

...
KERNEL_PATCHES="${ROOT_DIR}/kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch 
				${ROOT_DIR}/kernel/linux/patches/linux-5.10/rk3568_patch/0001-fix-m3568.patch"
...

#HDF patch
bash ${ROOT_DIR}/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh ${ROOT_DIR} ${KERNEL_SRC_TMP_PATH} ${HDF_PATCH}

#kernel patch
for KERNEL_PATCH in $KERNEL_PATCHES
do
    patch -p1 < ${KERNEL_PATCH}
done

....


if [ "enable_ramdisk" == "${9}" ]; then
	#./make-ohos.sh TB-RK3568X0 enable_ramdisk
	./make-ohos.sh MYBOARD3568 enable_ramdisk
else
    #./make-ohos.sh TB-RK3568X0 disable_ramdisk
	./make-ohos.sh MYBOARD3568 disable_ramdisk
fi

五、编译并烧写即可

这个不用我教了吧

下一篇:[OpenHarmony RK3568] (三)蓝牙芯片适配

你可能感兴趣的:(OpenHarmony,RK3568,鸿蒙,鸿蒙系统)