Rockchip RK3399 - 移植uboot 2017.09 & linux 4.19(友善之家脚本方式)

----------------------------------------------------------------------------------------------------------------------------

开发板 :NanoPC-T4开发板 和 SOM-RK3399核心板+定制底板eMMC16GB LPDDR34GB
显示屏 :15.6英寸HDMI接口显示屏u-boot2017.09 linux4.19
----------------------------------------------------------------------------------------------------------------------------

本节将会介绍官方固件方式uboot 2017.09以及linux 4.19内核的编译过程,教程来自友善之家官方手册。

一、固件制作

1.1 下载工具和固件
root@zhengyang:/work/sambashare/rk3399/friendly# git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19
root@zhengyang:/work/sambashare/rk3399/friendly# git clone https://521github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19
root@zhengyang:/work/sambashare/rk3399/friendly# cd sd-fuse_rk3399/

如果第一个下载比较慢,可以尝试使用第二个命令,切换镜像源。

系统镜像,这里我们以debian-bullseye-desktop-arm64为例,下载地址:https://download.friendlyelec.com/NanoPC-T4

debian-bullseye-desktop-arm64-images.tgz(位于"\03_分区镜像文件"目录下,以实际下载的文件为准)拷贝到/work/sambashare/rk3399/friendly/sd-fuse_rk3399目录下;

root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# ll debian*
-rwxrw-rw- 1 root root 1561144972 Sep 23 18:54 debian-bullseye-desktop-arm64-images.tgz*
-rwxrw-rw- 1 root root         75 Sep 23 18:49 debian-bullseye-desktop-arm64-images.tgz.hash.md5*
root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# tar -xvzf debian-bullseye-desktop-arm64-images.tgz

解压得到debian-bullseye-desktop-arm64文件夹;

root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# ll debian-bullseye-desktop-arm64
-rw-r--r-- 1 root root    8072140 Mar 14  2023 boot.img
-rw-r--r-- 1 root root        912 Apr 14 15:54 dtbo.img
-rw-r--r-- 1 root root     203036 Oct 13  2020 idbloader.img
-rw-r--r-- 1 root root         64 Sep 15 00:14 info.conf
-rw-r--r-- 1 root root   28983316 Sep  5 16:32 kernel.img
-rw-r--r-- 1 root root     391502 Oct 13  2020 MiniLoaderAll.bin
-rw-r--r-- 1 root root      49152 Oct 13  2020 misc.img
-rw-r--r-- 1 root root        461 Sep 15 00:14 parameter.txt
-rw-r--r-- 1 root root    4250112 Sep  5 16:32 resource.img
-rw-r--r-- 1 root root 4006843284 Sep 15 00:14 rootfs.img
-rw-r--r-- 1 root root    4194304 Oct 13  2020 trust.img
-rw-r--r-- 1 root root    4194304 Aug 18  2022 uboot.img
-rw-r--r-- 1 root root     159868 Sep 15 00:14 userdata.img
1.2 编译内核
1.2.1 下载内核源码

下载内核源代码:

root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi4-v4.19.y kernel-rk3399

保存到当前路径kernel-rk3399文件夹中。

1.2.2 修改build-kernel.sh脚本

在编译内核之前我们需要修改build-kernel.sh脚本;

根据自己安装的交叉编译环境,这里我需要替换如下代码为:

CROSS_COMPILE=aarch64-linux-gnu-  修改为 CROSS_COMPILE=arm-linux-

并且将如下代码移除:

export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH 
if [ ! -d /opt/FriendlyARM/toolchain/11.3-aarch64 ]; then
        echo "please install aarch64-gcc-11.3 first, using these commands: "
        echo "    git clone https://github.com/friendlyarm/prebuilts.git -b master --depth 1"
        echo "    cd prebuilts/gcc-x64"
        echo "    sudo tar xvf toolchain-11.3-aarch64.tar.xz -C /"
        exit 1
fi

我安装的交叉编译环境位于/usr/local/arm/12.2.1,并且我已经将其配置为全局环境变量了。

此外我们还需要修改./tools/update_kernel_bin_to_img.sh,配置;

CROSS_COMPILE=arm-linux-
1.2.3 编译内核

执行编译内核命令,编译完成后会自动更新debian-bullseye-desktop-arm64目录下的相关映象文件,包括文件系统中的内核模块 (rootfs.img会被解包并重新打包,即更新/lib/modules下的驱动模块);

root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# KERNEL_SRC=$PWD/kernel-rk3399 ./build-kernel.sh debian-bullseye-desktop-arm64
using official logo.
using official kernel logo.
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  YACC    scripts/kconfig/zconf.tab.c
  LEX     scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
  WRAP    arch/arm64/include/generated/uapi/asm/errno.h
  WRAP    arch/arm64/include/generated/uapi/asm/ioctl.h
......

其中:

  • KERNEL_SRC配置为内核源码所在路径;
  • $1配置为目标OS系统debian-bullseye-desktop-arm64

编译完成后会在./out路径下生成若干文件:

root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# ll out/
drwxr-xr-x  8 root root 4096 Sep 23 20:54 cryptodev-linux/
-rw-r--r--  1 root root   20 Sep 23 20:59 debian-bullseye-desktop-arm64_rootfs-img.info
-rw-r--r--  1 root root  167 Sep 23 18:21 .gitignore
drwxr-xr-x  3 root root 4096 Sep 23 20:36 output_rk3399_kmodules/
drwxr-xr-x 23 root root 4096 Sep 23 20:58 rootfs_new/
drwxr-xr-x  9 root root 4096 Sep 23 20:55 rtl8812au/
drwxr-xr-x 10 root root 4096 Sep 23 20:54 rtl8821CU/
drwxr-xr-x  9 root root 4096 Sep 23 20:55 rtl8822bu/

其中:

  • cryptodev-linuxrtl8812aurtl8821CUrtl8822bucryptodev以及usb wifi驱动源码;
  • output_rk3399_kmodules:为内核驱动模块;
root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# ls out/output_rk3399_kmodules/lib/modules/4.19.193/
cryptodev.ko   modules.alias.bin          modules.builtin.bin  modules.devname  modules.symbols      rtl8821CU.ko
kernel         modules.builtin            modules.dep          modules.order    modules.symbols.bin  rtl8822bu.ko
modules.alias  modules.builtin.alias.bin  modules.dep.bin      modules.softdep  rtl8812au.ko
  • rootfs_new:新的根文件系统的源码;

此外debian-bullseye-desktop-arm64目录下的内核镜像和根文件系统被更新了;

root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# ll debian-bullseye-desktop-arm64
-rw-r--r--  1 root root    8072140 Mar 14  2023 boot.img
-rw-r--r--  1 root root        912 Apr 14 15:54 dtbo.img
-rw-r--r--  1 root root     203036 Oct 13  2020 idbloader.img
-rw-r--r--  1 root root         64 Sep 15 00:14 info.conf
-rw-r--r--  1 root root   31207444 Sep 23 20:55 kernel.img    # 更新了 
-rw-r--r--  1 root root     391502 Oct 13  2020 MiniLoaderAll.bin
-rw-r--r--  1 root root      49152 Oct 13  2020 misc.img
-rw-r--r--  1 root root        461 Sep 23 20:59 parameter.txt  # 更新了
-rw-r--r--  1 root root    4024320 Sep 23 20:55 resource.img   # 更新了 
-rw-r--r--  1 root root 4001059708 Sep 23 20:59 rootfs.img     # 更新了 
-rw-r--r--  1 root root    4194304 Oct 13  2020 trust.img
-rw-r--r--  1 root root    4194304 Aug 18  2022 uboot.img
-rw-r--r--  1 root root     159868 Sep 15 00:14 userdata.img

如果感兴趣可以分析一下./build-kernel.sh的主要工作流程:

(1) 首先配置内核

make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} ${KCFG}

其中:

  • CROSS_COMPILE被配置成arm-linux-
  • ARCH被配置成arm64
  • KCFG被配置成nanopi4_linux_defconfig;

(2) 编译内核

make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} ${KALL} -j$(nproc)

其中:

  • KALL被配置成nanopi4-images;编译规则定义在arch/arm64/Makefile文件;
  • $(nproc):用于获取系统中可用的处理器核心数;

arch/arm64/Makefile文件;

# 编译生成kernel.img
kernel.img: Image.lz4
        $(Q)scripts/mkkrnlimg $(objtree)/arch/arm64/boot/Image $(objtree)/kernel.img >/dev/null
        @echo '  Image:  kernel.img is ready'        
DTBS := rk33*-nanopi*-rev*.dtb
# 调用scripts/resource_tool编译生成resource.img(由设备树、图片资源文件组成,不包含内核)
nanopi4-images: dtbs kernel.img $(LOGO) $(LOGO_KERNEL)
        $(Q)$(srctree)/scripts/mkimg --dtb $(DTBS) --keep-dtb-name

(3) 编译驱动模块

rm -rf ${KMODULES_OUTDIR}
mkdir -p ${KMODULES_OUTDIR}
make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} INSTALL_MOD_PATH=${KMODULES_OUTDIR} modules -j$(nproc)
if [ $? -ne 0 ]; then
   echo "failed to build kernel modules."
   exit 1
fi

其中:

  • 内核模块路径被配置为./out/output_rk3399_kmodules
TOPPATH=$PWD
OUT=$TOPPATH/out
if [ ! -d $OUT ]; then
        echo "path not found: $OUT"
        exit 1
fi
KMODULES_OUTDIR="${OUT}/output_${SOC}_kmodules"  # out/output_rk3399_kmodules

(4) 安装驱动模块

make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} INSTALL_MOD_PATH=${KMODULES_OUTDIR} modules_install
if [ $? -ne 0 ]; then
    echo "failed to build kernel modules."
         exit 1
fi
# 用于构建并输出内核版本号
KERNEL_VER=`make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} kernelrelease`
rm -rf ${KMODULES_OUTDIR}/lib/modules/${KERNEL_VER}/kernel/drivers/gpu/arm/mali400/
# 如果模块依赖文件modules.dep"不存在,则生成内核模块的依赖关系
[ ! -f "${KMODULES_OUTDIR}/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b ${KMODULES_OUTDIR} -E Module.symvers -F System.map -w ${KERNEL_VER}
# 去除驱动中的符号信息
(cd ${KMODULES_OUTDIR} && find . -name \*.ko | xargs ${CROSS_COMPILE}strip --strip-unneeded)

(5) 编译cryptodev.ko驱动,并拷贝到内核模块路径下;

# build cryptodev-linux
(cd ${OUT} && {
	if [ ! -d cryptodev-linux ]; then
		git clone https://github.com/cryptodev-linux/cryptodev-linux.git -b master cryptodev-linux
	fi
	(cd cryptodev-linux && {
		make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KERNEL_DIR=${KERNEL_SRC}
		cp cryptodev.ko ${KMODULES_OUTDIR}/lib/modules/${KERNEL_VER} -afv
	})
})

cryptodev-linux 是一个linux内核模块,它提供了一个加密硬件的接口,可在用户空间中使用该接口来执行加密和解密操作。

(6) 编译usb wifi driver

if [ ${BUILD_THIRD_PARTY_DRIVER} -eq 1 ]; then
	for (( i=0; i<${#KERNEL_3RD_DRIVERS[@]}; i++ ));
	do
		build_external_module ${KERNEL_3RD_DRIVERS[$i]} ${KERNEL_3RD_DRIVER_BRANCHES[$i]} ${KERNEL_3RD_DRIVER_NAME[$i]}
	done
fi

(7) 更新内核模块依赖

(cd ${KMODULES_OUTDIR}/lib/modules/${KERNEL_VER}/ && {
	rm -rf ./build ./source
	echo "depmod ${KMODULES_OUTDIR} ${KERNEL_VER} ..."
	depmod -a -b ${KMODULES_OUTDIR} ${KERNEL_VER}
})

其中:

  • -a 选项表示更新所有已经加载或已知的内核模块的依赖关系;
  • -b 选项用于指定内核模块所在的目录;

(8) 执行./tools/update_kernel_bin_to_img.sh脚本解压并重新打包rootfs.img

./tools/update_kernel_bin_to_img.sh ${OUT} ${KERNEL_SRC} ${TARGET_OS} ${TOPPATH}/prebuilt

其中:

  • OUT配置为./out
  • KERNEL_SRC配置为./kernel-rk3399
  • TARGET_OS配置为debian-bullseye-desktop-arm64
  • TOPPATH配置为./

其主要工作就是:

  • 挂载根文件系统./debian-bullseye-desktop-arm64/rootfs.img到某个路径;
  • 删除原有的驱动模块,即mount_point/lib/modules/*文件
  • 使用cp -af将新编译的驱动模块拷贝到mount_point/lib/modules
  • 如果存在固件(比如wifi固件文件为brcmfmac4356-sdio.bin),使用cp -af将新编译的固件库拷贝到mount_point/lib/firmware
  • 重新制作根文件系统镜像文件;
1.3 编译内核头文件

linux-headers(内核头文件)包含各种头文件,可以让设备具有本地编译驱动的能力。

编译内核头文件运行如下命令:

root@zhengyang:/work/sambashare/rk3399/friendly/sd-fuse_rk3399# MK_HEADERS_DEB=1 BUILD_THIRD_PARTY_DRIVER=0 KERNEL_SRC=$PWD/kernel-rk3399 ./build-kernel.sh debian-bullseye-desktop-arm64

这里设置了MK_HEADERS_DEB=1表示编译内核头文件;

这里我们分析一下内核头文件的编译过程,其实现代码如下:

if [ ${MK_HEADERS_DEB} -eq 1 ]; then
	# 设置内核头文件dep包路径为 ./out/linux-headers-4.19.193.deb
	KERNEL_HEADERS_DEB=${OUT}/linux-headers-${KERNEL_VER}.deb
	rm -f ${KERNEL_HEADERS_DEB}
	# 1. 重点 构建debian包
	make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} bindeb-pkg
	if [ $? -ne 0 ]; then
		echo "failed to build kernel header."
		exit 1
	fi

    # 跳转到 ./kernel-rk3399/debian/hdrtmp目录下
	(cd ${KERNEL_SRC}/debian/hdrtmp && {
		# 删除usr/src/linux-headers*/scripts/子目录下以 .o 结尾的文件和以 .*.cmd结尾的隐藏文件
		find usr/src/linux-headers*/scripts/ \
			-name "*.o" -o -name ".*.cmd" | xargs rm -rf

		# 2. 设置头文件脚本目录./files/linux-headers-4.19.y-bin_arm64/scripts
		HEADERS_SCRIPT_DIR=${TOPPATH}/files/linux-headers-4.19.y-bin_arm64/scripts
		if [ -d ${HEADERS_SCRIPT_DIR} ]; then
			# 拷贝脚本文件到 usr/src/linux-headers-4.19.193/scripts/
			cp -avf ${HEADERS_SCRIPT_DIR}/* ./usr/src/linux-headers-*${KERNEL_VER}*/scripts/
			if [ $? -ne 0 ]; then
				echo "failed to copy bin file to /usr/src/linux-headers-${KERNEL_VER}."
				exit 1
			fi
		else
			echo "not found files/linux-headers-x.y.z-bin_arm64, why?"
			exit 1
		fi

		find . -type f ! -path './DEBIAN/*' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums
	})
	
	# 3. 使用dpkg工具将指定的目录打包成一个debian软件包
	dpkg -b ${KERNEL_SRC}/debian/hdrtmp ${KERNEL_HEADERS_DEB}
	if [ $? -ne 0 ]; then
		echo "failed to re-make deb package."
		exit 1
	fi

	# clean up 移除./路径下的xxx.deb文件
	(cd $TOPPATH && {
		rm -f linux-*${KERNEL_VER}*_arm64.buildinfo
		rm -f linux-*${KERNEL_VER}*_arm64.changes
		rm -f linux-headers-*${KERNEL_VER}*_arm64.deb
		rm -f linux-image-*${KERNEL_VER}*_arm64.deb
		rm -f linux-libc-dev_*${KERNEL_VER}*_arm64.deb
				rm -f linux-firmware-image-*${KERNEL_VER}*_arm64.deb
	})
fi

(1) 这里其中有一条比较重要的命令:

make CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} bindeb-pkgmkae bindeb-pkg

make bindeb-pkg是一个用于构建debian包的命令,它通常用于编译linux内核并生成对应的debian软件包。

当执行make bindeb-pkg 命令时,它会读取当前目录下的linux内核源代码,并根据配置文件进行内核编译。

编译过程将包括编译内核、生成模块、创建initramfs等步骤。最后,它将生成一组二进制文件和相关的debian控制文件,用于创建 debian包。

对于linux 4.19

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Rockchip RK3566是一款由Rockchip推出的高性能应用处理器,其集成了四核ARM Cortex-A55 CPU和ARM Mali-G52 GPU。在移植U-Boot 2023.04时,我们需要考虑以下几个方面的工作: 1. 了解RK3566芯片的硬件架构和技术规格,包括处理器核心、内存控制器、外设接口等。这将有助于理解U-Boot如何与硬件交互,并进行相应的配置。 2. 下载并准备U-Boot 2023.04的源代码。在Rockchip官方网站或开源社区中可以找到最新的U-Boot源代码。将其下载并解压到开发机上。 3. 设置交叉编译环境。因为U-Boot是一个跨平台的项目,所以需要配置适合RK3566的交叉编译器,确保能够正确编译U-Boot源代码。 4. 配置U-Boot。根据RK3566的硬件架构和技术规格,需要进行相应的配置,包括处理器、内存、外设等设置。这些设置在U-Boot的配置文件中进行,可以根据需求进行修改。 5. 编译U-Boot。在配置好U-Boot后,使用交叉编译器编译U-Boot源代码。编译完成后,将生成的U-Boot二进制文件烧录到RK3566的启动设备上,如eMMC或SD卡。 6. 测试U-Boot。将准备好的启动设备插入RK3566开发板中,根据开发板的启动方式,进入U-Boot命令行界面。在命令行界面中可以进行各种操作和调试,如加载内核、启动操作系统等。 7. 调试和优化。在移植和测试U-Boot过程中,可能会出现一些问题和不稳定的情况。需要通过调试和优化来解决这些问题,确保U-Boot的正常运行和稳定性。 总之,移植U-Boot 2023.04到Rockchip RK3566需要了解芯片的硬件架构和技术规格,配置和编译U-Boot源代码,进行测试和调试。这样可以确保U-Boot能够与RK3566正常交互,并为后续的操作系统加载和启动提供基础支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值