《Linux操作系统 – RK3568开发笔记》第3章 源码编译

开发环境:
主机:Ubuntu 18.04
开发板:OK3568-C开发板

3.1准备源码

1.创建工作目录

$ mkdir -p ~/rk3568

2.拷贝源码

将用户资料中的源码文件 OK3568-linux-source.tar.bz2.a*拷贝到虚拟机~/rk3568 目录。

Xw6DSS.md.png

拷贝文件的方式有很多,笔者使用的是共享文件夹方式。

【注】OK3568源码使用分段压缩,每段最大4G,这样方便拷贝,因此有些存储器单文件最大支持4G。

3.解压源码

$ cat OK3568-linux-source.tar.bz2.a* > OK3568-linux-source.tar.bz2
$ tar -xvf OK3568-linux-source.tar.bz2

耐心等待完成即可,解压时间有点久。

4.进入源码

$ cd ~/rk3568/OK3568-linux-source

目录结构

$ tree -L 1
bruceou@ubuntu:~/rk3568/OK3568-linux-source$ tree -L 1
.
├── app
├── buildroot  # Buildroot 根文件系统编译目录
├── build.sh -> device/rockchip/common/build.sh   # 编译脚本
├── debian  # Debian 根文件系统编译目录
├── device  # 编译相关配置文件
├── docs
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh  # 链接脚本
├── prebuilts
├── rkbin
├── rkflash.sh -> device/rockchip/common/rkflash.sh  # 烧写脚本
├── tools   #工具目录
├── u-boot   # u-boot目录
└── yocto

12 directories, 5 files

Xw6rQg.md.png

3.2编译SDK

1.编译前配置
在 device/rockchip/ok3568/目录下,有不同板型的配置文件,选择配置文件:

$./build.sh BoardConfig-ok3568.mk

相关配置介绍:

#!/bin/bash

# Target arch
export RK_ARCH=arm64 # 64位 ARM 架构
# Uboot defconfig
export RK_UBOOT_DEFCONFIG=OK3568-C # u-boot 配置文件
# Uboot image format type: fit(flattened image tree)
export RK_UBOOT_FORMAT_TYPE=fit
# Kernel defconfig
export RK_KERNEL_DEFCONFIG=OK3568-C-linux_defconfig# kernel 配置文件
# Kernel defconfig fragment
export RK_KERNEL_DEFCONFIG_FRAGMENT=
# Kernel dts
export RK_KERNEL_DTS=OK3568-C-linux# dts 文件
# boot image type
export RK_BOOT_IMG=boot.img
# kernel image path
export RK_KERNEL_IMG=kernel/arch/arm64/boot/Image
# kernel image format type: fit(flattened image tree)
export RK_KERNEL_FIT_ITS=boot.its
# parameter for GPT table
export RK_PARAMETER=parameter-buildroot-fit.txt# 分区表
# Buildroot config
export RK_CFG_BUILDROOT=OK3568# Buildroot 配置
# Recovery config
export RK_CFG_RECOVERY=OK3568-recovery # recovery 配置
# Recovery image format type: fit(flattened image tree)
export RK_RECOVERY_FIT_ITS=boot4recovery.its
# ramboot config
export RK_CFG_RAMBOOT=
# Pcba config
export RK_CFG_PCBA=
# Build jobs
export RK_JOBS=40
# target chip
export RK_TARGET_PRODUCT=ok3568
# Set rootfs type, including ext2 ext4 squashfs
export RK_ROOTFS_TYPE=ext4
# yocto machine
export RK_YOCTO_MACHINE=rockchip-rk3568-evb
# rootfs image path
export RK_ROOTFS_IMG=rockdev/rootfs.${RK_ROOTFS_TYPE}
# Set ramboot image type
export RK_RAMBOOT_TYPE=
# Set oem partition type, including ext2 squashfs
export RK_OEM_FS_TYPE=ext2
# Set userdata partition type, including ext2, fat
export RK_USERDATA_FS_TYPE=ext2
#OEM config
export RK_OEM_DIR=oem_normal
# OEM build on buildroot
#export RK_OEM_BUILDIN_BUILDROOT=YES
#userdata config
export RK_USERDATA_DIR=userdata_normal
#misc image
export RK_MISC=wipe_all-misc.img
#choose enable distro module
export RK_DISTRO_MODULE=
# Define pre-build script for this board
export RK_BOARD_PRE_BUILD_SCRIPT=app-build.sh

2.编译
编译 u-boot

$./build.sh uboot

Xw6syQ.md.png

……

Xw6yLj.md.png

编译 kernel

$./build.sh kernel

Xw6ces.md.png

Xw6gwn.md.png

【注】编译一段时间后会弹出下图界面,需要选择,提取图中信息, VCCIO4 和 VCCIO6 选择 1800000 其余选择 3300000,使用上下方向按键选择选项,按回车确认选择即可。

Xw62oq.md.png

编译 recovery

$./build.sh recovery

Xw6WF0.md.png

……

Xw6fYV.md.png

编译 Buildroot 根文件系统

$./build.sh buildroot

Xw6hWT.md.png

制作文件系统的时间会比较久,请耐心等待编译完成。
注1:确保作为普通用户编译 Buildroot 根文件系统,避免不必要的错误。
注2:如果不想编译文件系统,也可直接从已有的镜像中解压后,将其拷贝到rockdev目录下。

3.打包固件
更新各部分镜像链接到 rockdev/目录:

$./mkfirmware.sh

打包固件,生成的完整固件会保存到 rockdev/目录。

$./build.sh updateimg

Xw65SU.md.png

[PS]全自动编译

全自动编译会执行上述编译、打包操作,生成完整固件。

$./build.sh

3.3分区说明

1.parameter 分区表

parameter.txt 文件中包含了固件的分区信息,以 parameter-buildroot.txt 为例:
路径:device/rockchip/ok3568/parameter-buildroot-fit.txt

FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3568
MACHINE_ID: 007
MANUFACTURER: RK3568
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00010000@0x00008000(boot),0x00010000@0x00018000(recovery),0x00010000@0x00028000(backup),0x00c00000@0x00038000(rootfs),0x00040000@0x00c38000(oem),-@0x00c78000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

CMDLINE 属性是我们关注的地方,以 uboot 为例, 0x00002000@0x00004000(uboot) 中 0x00004000 为uboot 分区的起始位置,0x00002000 为分区的大小,以此类推。

2.package-file

package-file 文件用于打包固件时确定需要的分区镜像和镜像路径,同时它需要与 parameter.txt 文件保持一致。

路径:tools/linux/Linux_Pack_Firmware/rockdev/rk356x-package-file

# NAME      Relative path
#
#HWDEF      HWDEF
package-file    package-file
bootloader  Image/MiniLoaderAll.bin
parameter   Image/parameter.txt
#trust      Image/trust.img
uboot       Image/uboot.img
misc        Image/misc.img
#resource   Image/resource.img
#kernel     Image/kernel.img
boot        Image/boot.img
recovery    Image/recovery.img
rootfs      Image/rootfs.img
oem     Image/oem.img
userdata    Image/userdata.img
# 要写入backup分区的文件就是自身(update.img)
# SELF 是关键字,表示升级文件(update.img)自身
# 在生成升级文件时,不加入SELF文件的内容,但在头部信息中有记录
# 在解包升级文件时,不解包SELF文件的内容。
backup      RESERVED
#update-script  update-script
#recover-script recover-script

3.4镜像制作

编译源码可直接得到镜像,但是编译时间太长,有些部分不需要再次编译,只需要从已有的镜像中解包,然后再和新编译的部分组合打包即可,下面是制作方法。

1.工具安装
下载工具包:

$ git clone https://github.com/TeeFirefly/rk2918_tools.git  

进入工具包目录:

$ cd rk2918_tools

编译:

$ make

Xw6IlF.md.png

将可执行文件拷贝到用户二进制目录:

$ sudo cp afptool img_unpack img_maker mkkrnlimg /usr/local/bin

2.解包
将update.img拷贝到Ubuntu中,然后使用命令解包:

$ img_unpack update.img img

Xw6oy4.md.png

解包到img目录,img目录会自动生成,解析成功之后,img 目录下会生成 loader.img 和update.img。

Xw6TOJ.md.png

接下来进入到img 目录,使用 afptool -unpack 解压:

$ afptool -unpack update.img update

Xw6Hm9.md.png

解压到update目录

打开update目录,里面有很多img文件。

Xw6bwR.md.png

将需要的文件复制到rockdev目录下。

3.合成update.img
然后源码目录以下命令即可:

$./build.sh updateimg

Xw65SU.md.png


欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎


欢迎订阅我的微信公众号

关注公众号[嵌入式实验楼]获取更多资讯

Related posts

Leave a Comment