河南省教育厅官方网站师德建设,线上商城怎么推广,网站建设英语词汇,企业系统包括哪些RK3588编译烧录Linux固件
1、开发环境及工具准备
Rockchip Linux 软件包#xff1a;linux-5.10-gen-rkr4
主机#xff1a;
安装VMware搭建虚拟机#xff0c;版本为Ubuntu 20.04 (硬盘容量大于100G#xff09;安装远程连接工具MobaXterm#xff08;可连接虚拟机方…RK3588编译烧录Linux固件
1、开发环境及工具准备
Rockchip Linux 软件包linux-5.10-gen-rkr4
主机
安装VMware搭建虚拟机版本为Ubuntu 20.04 (硬盘容量大于100G安装远程连接工具MobaXterm可连接虚拟机方便文件传输
2、SDK编译环境搭建
1、安装库和工具集
sudo apt-get install git ssh make gcc libssl-dev liblz4-tool expect g patchelf chrpath gawk texinfo chrpath diffstat binfmt-support qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g-multilib unzip device-tree-compiler ncurses-dev libgucharmap-2-90-dev bzip2 expat gpgv2 cpp-aarch64-linux-gnu time mtd-utils
2、创建工作目录
mkdir ~/RK35883、拷贝SDK至工作目录
可通过MobaXterm实现PC与虚拟机之间传输文件
4、解压SDK
解压命令:
cat linux-5.10-gen-rkr4.tar.gzaa* | tar xzvf -5、检查和升级软件包
检查make版本(要求make 4.0及以上版本
make -v
GNU Make 4.2
Built for x86_64-pc-linux-gnu升级make版本
git clone https://github.com/mirror/make.git
cd make
git checkout 4.2
git am $BUILDROOT_DIR/package/make/*.patch
autoreconf -f -i
./configure
make make -j8
sudo install -m 0755 make /usr/bin/make检查lz4版本要求安装 lz4 1.7.3及以上版本
lz4 -v
*** LZ4 command line interface 64-bits v1.9.4, by Yann Collet ***
refusing to read from a console升级lz4版本
git clone https://github.com/lz4/lz4.git
cd lz4
make
sudo make install
sudo install -m 0755 lz4 /usr/bin/lz4检查和升级git版本
git clone https://github.com/mirror/make.git --depth 1 -b 4.2
cd make
git am $BUILDROOT_DIR/package/make/*.patch
autoreconf -f -i
./configure
make make -j8
install -m 0755 make /usr/local/bin/make6、git配置
在~/RK3588/linux-5.10-gen-rkr4目录下
git config --global user.name your name
git config --global user.email your mail7、安装repo
mkdir ~/bin
export PATH~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod ax ~/bin/repo3、编译SDK
可参考 device/rockchip/common/README.md 编译说明。
SDK编译命令查看
make helpSDK配置
可通过make lunch或者./build.sh lunch进⾏配置其他功能的配置可通过make menuconfig来配置相关属性
全自动编译
进⼊~/RK3588/linux-5.10-gen-rkr4目录执⾏以下命令⾃动完成所有的编译
./build.sh all # 只编译模块代码u-BootkernelRootfsRecovery
# 需要再执⾏./mkfirmware.sh 进⾏固件打包
./build.sh # 编译模块代码u-BootkernelRootfsRecovery
# 打包成update.img完整升级包
# 所有编译信息复制和⽣成到out⽬录下默认是 Buildroot可以通过设置坏境变量 RK_ROOTFS_SYSTEM 指定不同 rootfs。
RK_ROOTFS_SYSTEM ⽬前可设定三种系统buildroot、debian、 yocto 。
比如需要生成debian的命令如下
export RK_ROOTFS_SYSTEMdebian
./build.sh模块编译
./build.sh uboot
./build.sh kernel
./build.sh recovery
./build.sh rootfs
...4、烧写固件
安装烧录工具
Windows 驱动安装助手~/RK3588/linux-5.10-gen-rkr4/tools/windows/DriverAssitant_v5.12.zipWindows 烧写⼯具~/RK3588/linux-5.10-gen-rkr4/tools/windows/RKDevTool_Release_v3.15
打包工具
主要⽤于各分⽴固件打包成⼀个完整的update.img固件⽅便升级。
路径/tools/linux/Linux_Pack_Firmware/rockdev
./mkupdate.sh烧录
运行DriverAssitant_v5.12里面的DriverInstall.exe先选择驱动卸载然后再选择驱动安装。通过Type-C数据线连接开发板与pc运行RKDevTool.exe。若驱动安装没有问题会自动识别到ADB设备如图 注若显示发现一个ADB设备则在升级固件界面点击【切换】即可进入loader烧录模式。
按【固件】按钮选择要升级的固件文件加载固件之后点击【升级】按钮等待烧写完成即可。 5、ADB使用
这里主要介绍windows下使用adb进行调试
步骤
下载windows版本的adb.zip解压到C:\adb配置环境变量1、键盘按键win r2、打开“系统属性”窗口3、“高级”→“环境变量”→“系统变量”4、找到“Path”双击新建复制adb路径进去点击“确定”按钮添加成功常用的adb命令 adb help //可查看所有命令adb versionadb start-server //启动adb服务adb kill-server //关闭adb服务adb devicesadb shelladb push [-p] local remoteadb pull [-p] [-a] remote [local]
第一章 构建 Debian Linux 系统
我们需要按【01_RK3588编译烧录Linux固件】全自动编译一次默认是编译 Buildroot 系统也会编 译 uboot 和内核buildroot 某些软件包依赖内核所以我们必须编译内核再编译 Buildroot。同 理 Debian 也需要从 Buildroot 编译后的产物拷贝相关软件到 Debian 中一般是一些驱动模块。 所以它们的编译关系是不可分开的。
1.1 Debian 安装 qemu
构建Debian系统需要依赖你电脑本地的环境有些依赖包需要下载
在 SDK 顶层目录进入 debian 路径下
cd debian/执行下面的指令安装 qemu 及需要的一些包
sudo apt-get install binfmt-support qemu-user-static live-build
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f1.2 构建 Debian 系统
执行下面指令开始构建 Debian 系统。注意如果你没有先编译 buildroot 和内核虽然不会 报错完整的系统会从 buildroot 和内核中拷贝一些驱动或者文件到 Debian 系统中拷贝的文 件是 Wifi 驱动和蓝牙驱动。注意构建的时候 Ubuntu 必须能上网因为 Debian 会从网上下载 构建所需要的资源
## IntroductionA set of shell scripts that will build GNU/Linux distribution rootfs image
for rockchip platform.## Available Distro* Debian 11 (Bullseye-X11 and Wayland)~~
sudo apt-get install binfmt-support qemu-user-static
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f
## Usage for 32bit Debian 11 (Bullseye-32)### Building debian system from linaroBuilding a base debian system by ubuntu-build-service from linaro.RELEASEbullseye TARGETbase ARCHarmhf ./mk-base-debian.sh
Building a desktop debian system by ubuntu-build-service from linaro.RELEASEbullseye TARGETdesktop ARCHarmhf ./mk-base-debian.sh
### Building overlay with rockchip audio/video hardware acceleratedBuilding with overlay with rockchip debian rootfs:RELEASEbullseye ARCHarmhf ./mk-rootfs.sh
Building with overlay with rockchip debug debian rootfs:VERSIONdebug ARCHarmhf ./mk-rootfs-bullseye.sh
### Creating roofs imageCreating the ext4 image(linaro-rootfs.img):./mk-image.sh
---## Usage for 64bit Debian 11 (Bullseye-64)Building a base debian system by ubuntu-build-service from linaro.RELEASEbullseye TARGETdesktop ARCHarm64 ./mk-base-debian.sh
Building the rk-debian rootfs:RELEASEbullseye ARCHarm64 ./mk-rootfs.sh
Building the rk-debain rootfs with debug:VERSIONdebug ARCHarm64 ./mk-rootfs-bullseye.sh
Creating the ext4 image(linaro-rootfs.img):./mk-image.sh---## Cross Compile for ARM Debian[Docker Multiarch](http://opensource.rock-chips.com/wiki_Cross_Compile#Docker)## Package Code BasePlease apply [those patches](https://github.com/rockchip-linux/rk-rootfs-build/tree/master/packages-patches) to release code base before rebuilding!## License informationPlease see [debian license](https://www.debian.org/legal/licenses/)## FAQ- noexec or nodev issue
noexec or nodev issue /usr/share/debootstrap/functions: line 1450:
../rootfs/ubuntu-build-service/bullseye-desktop-arm64/chroot/test-dev-null:
Permission denied E: Cannot install into target
...
mounted with noexec or nodevSolution: mount -o remount,exec,dev xxx (xxx is the mount place), then rebuild it.
mk-base-debian.sh 在Debian官网下载基础包有些系统组件不需要的话可以在这里修改定制mk-rootfs-bullseye.sh二次定制Debian系统主要是一些已经打包好了的安装包在这里你也可以加载你需要的应用软件mk-image.sh打包Debian系统为img文件
构建过程中首先会下载 Debian 系统下载完 Debian 系统后开始解压 Debian 系统 此时需要用户权限请输入你的用户密码提升为 sudo 权限再继续编译。注意千万不要为了 省事直接以 root 用户直接构建避免出现离奇的错误
1.3 如何使用编译出来的 linaro-rootfs.img
上述编译在debian目录下生成linaro-rootfs.img
1.3.1 分区烧录
可以参考分区烧录视频在烧录工具中单独勾选“rootfs”位置
1.3.2 完整Debian系统
上面编译出来的只是文件系统无法生成 update.img如果你要生成 update.img在SDK首目录执行下 面的操作。
export RK_ROOTFS_SYSTEMdebian # 构建系统类型为 debian
./build.sh # 执行./build.sh 会生成 update.img构建的过程中会编译 Uboot、内核等等等漫长的时间后最后会将 Uboot、内核和文件系 统等打包生成 update.img。 生成的 update.img 在 SDK/rockdev 下。
第二章 Debian 系统开发
Debian 是一种完全自由开放并广泛用于各种设备的 Linux 操作系统。选择 Debian 原因如 下Debian 是自由软件并且保持 100%自由。每个人都能自由使用、修改以及发布。大家可 以基于 Rockchip 构建的 Debian 系统进行二次开发。 Debian 是一个基于 Linux 稳定且安全的操作系统其使用范围包括笔记本计算机台式机和 服务器等。它的稳定性和可靠性就深受用户的喜爱。 Debian 还是许多其他发行版的种子和基础例如 Ubuntu、Knoppix、PureOS 等由世界各 种的数百名志愿者共同制作。 目前 Rockchip RK3588 已经适配并支持。
2.1 Debian 版本
输入下面的指令查看 Debian 版本如下可以看到是 Debian11 版本。
cat /etc/issue输入下面的指令查看 内核 版本
uname -a2.2 如何更新源
所谓的源就是源头我们常见的源有阿里云源mirrors.aliyun.com中科大源 mirrors.ustc.edu.cn南京大学mirror.nju.edu.cn源清华大学源mirrors.tuna.tsinghua.edu.cn 还有 Debian 官方源deb.debian.org等都提供了对 Debian 源的服务。在 Rockchip 中默认使用 的是中科大源mirrors.ustc.edu.cn。实际上 Rockchip 已经为我们由 Debian 官方源切换为中科 大源只要是国内的源下载速度都是较快的。我们可以无需再换源。如果我们还是想试试换 其他源可以按以下的方法来更换其它源。 查看默认的源
cat /etc/apt/sources.list修改为其他源例如阿里云源如下替换完成保存。如需要替换成其它源可以自行尝试。 编辑/etc/apt/sources.list 文件替换成如下内容。
deb http://mirrors.aliyun.com/debian buster main contrib non-free
deb-src http://mirrors.aliyun.com/debian buster main contrib non-free
deb http://mirrors.aliyun.com/debian-security buster/updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian-security buster/updates main contrib non-free
deb http://mirrors.aliyun.com/debian buster-updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian buster-updates main contrib non-free执行下面指令更新本地仓库也就是重定向软件包列表。更新软件源记得插网线并且网线可以上网的
apt-get upgrade
apt-get update2.3 软件包管理
查看系统已经安装的软件
apt list --installed查看可安装的软件执行下面的指令查看可安装的软件若软件已经安装会显示已安装。
apt list使用 apt remove 来卸载软件。apt 会解决和安装模块的依赖问题,并会咨询软件仓库, 但不会
安装本地的 deb 文件, apt 是建立在 dpkg 之上的软件管理工具。所以我们一般用 apt 管理软件。
例如我们卸载 vim 软件。首先我们查看 vim 是否已经安装。可以执行下面指令。
apt list --installed | grep vim上图可以看到 vim 已经安装那么我们将它卸载。询问是否卸载时我们输入“y”确认卸载
同样我们使用 apt 来安装软件执行下面的指令安装 vim。
apt install vim2.4 如何创建自启动程序
在 debian 系统很多时候都有开机自启动自己的程序这里有两种方法
2.4.1 /etc/rc.local 方法
通过将自启动程序放到/etc/rc.local 里开机就会自启动也可以写到/etc/init.d 下面 的某个文件里。
这里以/etc/rc.local 文件为例。如下图打印“1111111111111111111111”以此观察系统启动时是 否会自动执行。注意我们的程序不能写到 exit0 后面了
保存后重启开发板可以看到启动后系统执行了这句打印
2.4.2 添加systemd方法
我们先创建一个要启动的脚本。这个脚本就是打印“22222……”在/root 目录下编辑auto_run_script.sh。
#!/bin/bash
echo “2222222222222222222222222222” /dev/ttyFIQ0赋予脚本可执行权限执行下面的指令
chmod x auto_run_script.sh/lib/systemd/system 是系统范围的目录这些文件通常是由发行版的维护者创建的。/etc/systemd/system这个目录也包含 systemd 服务单元文件但是它是用于本地管理员系 统管理员自定义的服务配置。不会被/lib/systemd/system 服务覆盖。
所以我们需要进入/etc/systemd/system 目录下创建一个自启动服务 auto_run_script.service。
cd /etc/systemd/system
vi auto_run_script.service在 auto_run_script.service 里添加以下内容。
[Unit]
DescriptionRun a Custom Script at Startup
Afternetwork.target
[Service]
ExecStart/root/auto_run_script.sh
[Install]
WantedBydefault.target然后我们使用 systemctl daemon-reload 重新加载 systemd 守护进程配置并使用 systemctl enable 建立符号链接关系。
systemctl daemon-reload
systemctl enable auto_run_script.service
systemctl start auto_run_script.service #马上启动此服务重启后我们看看打印信息查看这个服务是否已经启动
如需禁止自启动输入 systemctl disable auto_run_script.service这个就会取消链接下 次开机时不会自启动。如需要完全移除删除这个 auto_run_script.service 以及它的脚本。
一、SDK 开发
本节向用户介绍如何对 RK3588 Linux SDK 进行开发包括 u-boot 开发、Linux 内核开发、buildroot 根文件系统开发、Debian应用开发等armsom-W3开发板的源码可以在https://github.com/ArmSoM/armsom-w3-bsp获取用户可以基于本 SDK 进行二次开发、软件定制以适配自己的 Linux 产品基于本 SDK可以有效实现系统定制和应用移植开发帮助用户快速开发、提高开发效率
二、SDK 板级配置文件
SDK 板级配置文件中提供了一些必要的配置信息。对于 RK3588 平台其板级配置文件位于/device/rockchip/rk3588/目录如下所示
该目录下有多个 BoardConfig-xxxx.mk 文件这些.mk 文件都是板级配置文件每一个.mk 文件都对应一个开发板的资源其中 BoardConfig-rk3588-armsom-w3.mk 就是我们的armsom-w3开发板所使用的板级配置文件。 我们在 SDK 根目录下执行“./build.sh lunch”或者第一次使用./build.sh编译时所列举出来的文件就是从/device/rockchip/rk3588/目录来的如下所示
这里需要选择**“2”**
Which would you like? [0]: 2
switching to board: /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/device/rockchip/rk3588/BoardConfig-rk3588-armsom-w3.mk这些.mk 文件其实是一个 sh 脚本文件打开 BoardConfig-rk3588-armsom-w3.mk 配置文件来看一下里面的内容
#!/bin/bash# Target arch
export RK_KERNEL_ARCHarm64
# Uboot defconfig
export RK_UBOOT_DEFCONFIGrk3588_armsom_w3
# Uboot image format type: fit(flattened image tree)
export RK_UBOOT_FORMAT_TYPEfit
# Kernel defconfig
export RK_KERNEL_DEFCONFIGarmsom_w3_defconfig
# Kernel defconfig fragment
export RK_KERNEL_DEFCONFIG_FRAGMENTrk3588_linux.config
# Kernel dts
export RK_KERNEL_DTSrk3588-armsom-w3
# boot image type
export RK_BOOT_IMGboot.img
# kernel image path
export RK_KERNEL_IMGkernel/arch/arm64/boot/Image
# kernel image format type: fit(flattened image tree)
export RK_KERNEL_FIT_ITSboot.its
# parameter for GPT table
export RK_PARAMETERparameter.txt
# Buildroot config
export RK_CFG_BUILDROOTrockchip_rk3588
# Recovery config
export RK_CFG_RECOVERYrockchip_rk3588_recovery
# Recovery image format type: fit(flattened image tree)
export RK_RECOVERY_FIT_ITSboot4recovery.its
# Pcba config
export RK_CFG_PCBArockchip_rk3588_pcba
# target chip
export RK_CHIPrk3588
# Set rootfs type, including ext2 ext4 squashfs
export RK_ROOTFS_TYPEext4
# debian version (debian10: buster, debian11: bullseye)
export RK_DEBIAN_VERSIONbullseye
# yocto machine
export RK_YOCTO_MACHINErockchip-rk3588-evb
#misc image
export RK_MISCwipe_all-misc.img
# Define package-file
export RK_PACKAGE_FILErk3588-package-file
# Define WiFi BT chip
# Compatible with Realtek and AP6XXX WiFi : RK_WIFIBT_CHIPALL_AP
# Compatible with Realtek and CYWXXX WiFi : RK_WIFIBT_CHIPALL_CY
# Single WiFi configuration: AP6256 or CYW43455: RK_WIFIBT_CHIPAP6256
export RK_WIFIBT_CHIPALL_AP
# Define BT ttySX
export RK_WIFIBT_TTYttyS6RK_ARCH用于指定目标架构rk3588 对应 arm64RK_UBOOT_DEFCONFIG用于指定 U-Boot 的 defconfig 配置文件/u-boot/configs/rk3588_armsom_w3。RK_UBOOT_FORMAT_TYPE用于指定 uboot.img 镜像的格式rk3588 平台默认使用的是 fitflattened image tree格式镜像RK_KERNEL_DEFCONFIG用于指定 Linux Kernel内核的 defconfig 配置文件/kernel/arch/arm64/configs/rk3588_armsom_w3。RK_KERNEL_DEFCONFIG_FRAGMENT用于指定 Linux 内核的 defconfig fragment对于 rk3588 来说是空置RK_KERNEL_DTS用于指定内核设备树文件rk3588-armsom-w3.dts。RK_BOOT_IMG设置为 boot.img 即可RK_KERNEL_IMG用于指定内核镜像的路径kernel/arch/arm64/boot/Image。RK_KERNEL_FIT_ITSrk3588 平台 Linux 系统使用的启动镜像 boot.img 也是 FIT 格式镜像FIT 使用 itsimage source file文件来描述 image 的信息RK_KERNEL_FIT_ITS 用于指定这个 its 文件这个 its 文件必须要存放在/device/rockchip/rk3588/目录下boot.its。RK_PARAMETER用于指定分区表文件分区表文件里面介绍了bootloader、uboot、kernel等分区的大小及位置RK_CFG_BUILDROOT用于指定 buildroot 根文件系统普通模式的 defconfig 配置文件rockchip_rk3588。RK_CFG_RECOVERY用于指定recovery模式下根文件系统recovery模式下使用ramdisk根文件系统的 defconfig 配置文件rockchip_rk3588_recovery_defconfig。RK_RECOVERY_FIT_ITS用于指定 recovery.img 镜像对应的 its 文件。recovery.img 也是 FIT 格式镜像需要使用 its 文件来描述 image 的信息boot4recovery.its。RK_CFG_PCBA用于指定 PCBA 的 defconfig 配置文件RK_ROOTFS_TYPE用于指定根文件系统的类型譬如 ext2、ext4RK_DEBIAN_VERSION用于指定 Debian 的版本debian10: buster, debian11: bullseye默认使用的是 Debian 11不要去改动它RK_YOCTO_MACHINE编译 yocto 时用于指定 machineRK_MISC用于指定 misc 镜像。编译完 SDK 后生成的/rockdev/misc.img 镜像其实就是 RK_MISC 所指定的这个文件只不过是进行了重命名而已RK_MISC 所指定的 misc镜像必须要存放在/device/rockchip/rockimg 目录下RK_WIFIBT_CHIP:有三类wifi/bt平台RTK、AP、CY,根据芯片选择去对应的驱动比如AP6256那就是RK_WIFIBT_CHIPAP6256选择ALL_AP会将编译所有AP系列芯片的驱动RK_WIFIBT_TTY:蓝牙使用的串口
用户可以在/device/rockchip/rk3588目录下添加自己的板级配置文件根据编译脚本实际情况对配置文件中的变量进行修改、或添加新的变量
三、U-Boot 开发
U-Boot 源码在/u-boot 目录是 RK 从 U-Boot 官⽅的 v2017.09 正式版本中切出来进⾏开发的版本
3.1 U-Boot 的设备树
U-Boot 中armsom-w3的设备树文件是u-boot/arch/arm/dts/rk3588-armsom-w3.dts该设备树文件包含了 rk3588.dtsi 和 rk3588-u-boot.dts 原生的 U-Boot 只支持 U-Boot 自己的 DTBRK 平台在原生 U-Boot 基础上增加了 kernel DTB 机制的支持即 U-Boot 会使用 kernel DTB 去初始化外设。这样设计的目的主要是为了兼容外设板级差异譬如 power、clock、display 等。U-Boot 设备树负责初始化存储、调试串口等基础外设而 kernel 设备树初始化存储、调试串口之外的外设譬如 LCD 显示、千兆网等。执行 U-Boot 代码时先用 U-Boot 的设备树完成存储、调试串口的初始化操作然后从存储上加载 kernel 的设备树并转而使用这份设备树继续初始化其余外设。 所以用户一般不需要去修改 U-Boot 的设备树文件除非更换调试串口。
3.2 U-Boot 编译
在SDK源码目录下执行如下命令编译 U-Boot
lhdydtx:~/project_code/3588/3588_linux5.10_v1.0.5$ ./build.sh uboot
processing option: uboot
Using prebuilt GCC toolchain: /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
Start building uboot
TARGET_UBOOT_CONFIGrk3588_armsom_w3## make rk3588_armsom_w3_defconfig -j24
#
# configuration written to .config
#
............
SEC1
pack u-boot.itb okay! Input: /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/rkbin/RKTRUST/RK3588TRUST.iniFIT description: FIT Image with ATF/OP-TEE/U-Boot/MCU
Created: Tue Sep 26 15:51:40 2023Image 0 (uboot)Description: U-BootCreated: Tue Sep 26 15:51:40 2023Type: Standalone ProgramCompression: uncompressedData Size: 1290088 Bytes 1259.85 KiB 1.23 MiBArchitecture: AArch64Load Address: 0x00200000Entry Point: unavailableHash algo: sha256Hash value: fab278a4d10ea177443167fbf78cd9e1372b18cbe143c605d9ad70a637201cb4Image 1 (atf-1)Description: ARM Trusted FirmwareCreated: Tue Sep 26 15:51:40 2023Type: FirmwareCompression: uncompressedData Size: 194404 Bytes 189.85 KiB 0.19 MiBArchitecture: AArch64Load Address: 0x00040000Hash algo: sha256Hash value: 909ea141064f20ffbe6d0c7afbe71e7cfdcd0085014c48b1d8df5cff882e89a7Image 2 (atf-2)Description: ARM Trusted FirmwareCreated: Tue Sep 26 15:51:40 2023Type: FirmwareCompression: uncompressedData Size: 24576 Bytes 24.00 KiB 0.02 MiBArchitecture: AArch64Load Address: 0x000f0000Hash algo: sha256Hash value: 6a970ae6b4d9c8d0dd5f46ea5cb3c27de910aa12d054299d451d5aae6f62bab4Image 3 (atf-3)Description: ARM Trusted FirmwareCreated: Tue Sep 26 15:51:40 2023Type: FirmwareCompression: uncompressedData Size: 20480 Bytes 20.00 KiB 0.02 MiBArchitecture: AArch64Load Address: 0xff100000Hash algo: sha256Hash value: 3ea8cf0d7eeba0b72bed08ca20e02bc50a50def876fb582b0b6649a7f843df38Image 4 (optee)Description: OP-TEECreated: Tue Sep 26 15:51:40 2023Type: FirmwareCompression: uncompressedData Size: 461200 Bytes 450.39 KiB 0.44 MiBArchitecture: AArch64Load Address: 0x08400000Hash algo: sha256Hash value: fde08608450331a80c98b86e21933df13ad84dd7647af5354f38381d9b42ab12Image 5 (fdt)Description: U-Boot dtbCreated: Tue Sep 26 15:51:40 2023Type: Flat Device TreeCompression: uncompressedData Size: 10058 Bytes 9.82 KiB 0.01 MiBArchitecture: AArch64Hash algo: sha256Hash value: e388acd7c02c1af89b73326a103f7b03c8716d2071442ef45fe1618ff8283205Default Configuration: confConfiguration 0 (conf)Description: rk3588-armsom-w3Kernel: unavailableFirmware: atf-1FDT: fdtLoadables: ubootatf-2atf-3optee
********boot_merger ver 1.2********
Info:Pack loader ok.
pack loader okay! Input: /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/rkbin/RKBOOT/RK3588MINIALL.ini
/home/lhd/project_code/3588/3588_linux5.10_v1.0.5/u-bootImage(no-signed, version0): uboot.img (FIT with uboot, trust...) is ready
Image(no-signed): rk3588_spl_loader_v1.09.111.bin (with spl, ddr...) is ready
pack uboot.img okay! Input: /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/rkbin/RKTRUST/RK3588TRUST.iniPlatform RK3588 is build OK, with new .config(make rk3588_armsom_w3_defconfig -j24)
/home/lhd/project_code/3588/3588_linux5.10_v1.0.5/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
Tue Sep 26 15:51:40 CST 2023
Running build_uboot succeeded.编译完成后将会生成 uboot.img 和rk3588_spl_loader_v1.09.111.bin 两个镜像文件
3.3 uboot.img 镜像
uboot.img 是由多个镜像合并而成包括 u-boot 镜像、u-boot dtb 以及 trust 镜像ARM Trusted Firmware OP-TEE。uboot.img 是一种 FITflattened image tree格式镜像支持任意多个 image 打包和校验。使用 file 命令查看 uboot.img如下所示
FIT 使用 itsimage source file文件来描述 image 的信息最后通过 mkimage 工具生成 itbflattened image tree blob镜像那么这个 itb 镜像其实就是 uboot.img 镜像uboot.img 镜像通常含有多份 itb 镜像如下所示
uboot.img uboot.itb * NN 一般是 2这种设计也是为了避免如果第一份镜像启动失败、还可以尝试使用第二份镜像启动。 U-Boot 编译成功后U-Boot 源码目录下会生成很多.bin 镜像以及.dtb 镜像,uboot.img 镜 像 最 终 由 u-boot.dtb、bl31_0x00040000.bin、bl31_0x000f0000.bin、bl31_0xff100000.bin、rk3588_spl_loader_v1.09.111.bin、tee.bin、u-boot-dtb.bin、u-boot-nodtb.bin、u-boot.bin 这些镜像合并而成。uboot.img 是 FIT 格式镜像使用 its 文件来描述 image 的信息最终通过/tools/mkimage 工具生成 itb 镜像its 文件和生成的 itb 文件都在/fit 目录下u-boot.its 文件中描述了有哪些镜像会参与合并成 uboot.itb以及这些镜像的路径等信息
/dts-v1/;/ {description FIT Image with ATF/OP-TEE/U-Boot/MCU;#address-cells 1;images {uboot {description U-Boot;data /incbin/(u-boot-nodtb.bin);type standalone;arch arm64;os U-Boot;compression none;load 0x00200000;hash {algo sha256;};};atf-1 {description ARM Trusted Firmware;data /incbin/(./bl31_0x00040000.bin);type firmware;arch arm64;os arm-trusted-firmware;compression none;load 0x00040000;hash {algo sha256;};};atf-2 {description ARM Trusted Firmware;data /incbin/(./bl31_0x000f0000.bin);type firmware;arch arm64;os arm-trusted-firmware;compression none;load 0x000f0000;hash {algo sha256;};};atf-3 {description ARM Trusted Firmware;data /incbin/(./bl31_0xff100000.bin);type firmware;arch arm64;os arm-trusted-firmware;compression none;load 0xff100000;hash {algo sha256;};};optee {description OP-TEE;data /incbin/(tee.bin);type firmware;arch arm64;os op-tee;compression none;load 0x8400000;hash {algo sha256;};};fdt {description U-Boot dtb;data /incbin/(./u-boot.dtb);type flat_dt;arch arm64;compression none;hash {algo sha256;};};};configurations {default conf;conf {description rk3588-armsom-w3;rollback-index 0x0;firmware atf-1;loadables uboot, atf-2, atf-3, optee;fdt fdt;signature {algo sha256,rsa2048;key-name-hint dev;sign-images fdt, firmware, loadables;};};};
};its 文件的语法规则与 DTS 是完全相同的并无差别。
对于 ARM Trusted Firmware 以及 OP-TEE它们是闭源的RK 只提供了二进制镜像文件并没提供源码。ARM Trusted Firmware 固件对应/bl31.elf、OP-TEE 固件对应/tee.bin编译 U-Boot 源码之前这两个镜像是不存在的编译之后才会出现实际上来自于 /rkbin/bin/rk35/rk3588_bl31_v1.32.elf 和/rkbin/bin/rk35/rk3588_bl32_v1.12.bin这两个镜像文件。打包 uboot.itb 的过程中会将/rkbin/bin/rk35/rk3588_bl31_v1.32.elf 拷贝到/bl31.elf将/rkbin/bin/rk35/rk3588_bl32_v1.12.bin 拷贝到/tee.bin。 bl31.elf 固件并不是直接打包进 uboot.itb而是将 bl31.elf 分解成多个 bl31_xxx.bin 文件最终将这些 bl31_xxx.bin 镜像打包进 uboot.itb。
3.4 rk3588_spl_loader_v1.09.111.bin 镜像
rk3588_spl_loader_v1.09.111.bin这个镜像文件就是MiniLoaderAll.bin 镜像 名字不一样。MiniLoaderAll.bin 是运行在 RK3588 平台 U-Boot 之前的一段 Loader 代码也就是比 U-Boot 更早阶段的 Loader。MiniLoaderAll.bin 由两部分构成TPL(Tiny Program Loader) SPL(Secondary Program Loader)构成。 TPL 运行在 SRAM 中片内内存由 rk3568 芯片内部所固化的 MaskromBootROM代码引导启动其作用是负责完成 DRAM 的初始化工作、并启动 SPLSPL 运行在 DDRSPL的作用是负责完成系统的 lowlevel 初始化、完成 uboot.img 的加载和引导工作。
3.5 镜像启动顺序
这里讲一下 RK3568 平台镜像的启动顺序。涉及到 Trust目前 Rockchip 的 64 位 SoC 平台上使用的是 ARM Trusted Firmware OP-TEE 的组合来实现 Trust32 位 SoC 平台上使用的 是 OP-TEE。 ARM Trusted Firmware 的体系架构里将整个系统分成四种安全等级分别为EL0、EL1、EL2、EL3。将整个安全启动的流程阶段定义为BL1、BL2、BL31、BL32、BL33其中 ARM Trusted Firmware 自身的源代码里提供了 BL1、BL2、BL31 的功能。Rockchip 平台仅使用了其中的 BL31 的功能对于 BL1 和 BL2RK 有自己的一套实现方案。所以在 Rockchip 平台上我们一般也可以“默认”ARM Trusted Firmware 指的就是 BL31而 BL32 使用的则是 OP-TEE。
如果把上述这种阶段定义映射到 Rockchip 平台各级固件上对应关系为MaskromRK 芯片内部固化的引导代码也叫 BootROMBL1、MiniLoaderAll.binBL2、TrustBL31ARM Trusted Firmware BL32OP-TEE、U-BootBL33。 所以 Linux 系统的镜像启动顺序为 Maskrom → MiniLoaderAll.bin → uboot.img → boot.img → rootfs.img 还可以进行细分 Maskrom → TPL(ddr bin) → SPL(miniloader) → Trust(ATF OP-TEE) → u-boot → kernel → rootfs 这个启动流程通过打印信息就可以分析出来以下就是armsom-w3 开发板上电启动时的打印信息
DR V1.09 a930779e06 typ 22/11/21-17:50:56 //DDR版本
# 对开发板的 DDR 进行初始化
LPDDR4X, 2112MHz
channel[0] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size2048MB
channel[1] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size2048MB
channel[2] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size2048MB
channel[3] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size2048MB
Manufacturer ID:0xff
CH0 RX Vref:29.7%, TX Vref:22.8%,22.8%
CH1 RX Vref:31.7%, TX Vref:21.8%,21.8%
CH2 RX Vref:28.7%, TX Vref:23.8%,22.8%
CH3 RX Vref:30.7%, TX Vref:22.8%,21.8%
change to F1: 528MHz
change to F2: 1068MHz
change to F3: 1560MHz
change to F0: 2112MHz
out
# ddr初始化结束开始运行miniloader代码
U-Boot SPL board init
U-Boot SPL 2017.09-gc060f28d70-220414 #zyf (Apr 18 2022 - 18:13:34)
Failed to set cpub01
Failed to set cpub23
unknown raw ID phN
unrecognized JEDEC id bytes: 00, 00, 00
Trying to boot from MMC2
MMC: no card present
mmc_init: -123, time 1
spl: mmc init failed with error: -123
Trying to boot from MMC1
Trying fit image at 0x4000 sector
## Verified-boot: 0
## Checking atf-1 0x00040000 ... sha256(909ea14106...) OK
## Checking uboot 0x00200000 ... sha256(52a313d406...) OK
## Checking fdt 0x0033af68 ... sha256(e388acd7c0...) OK
## Checking atf-2 0x000f0000 ... sha256(6a970ae6b4...) OK
## Checking atf-3 0xff100000 ... sha256(3ea8cf0d7e...) OK
## Checking optee 0x08400000 ... sha256(fde0860845...) OK
Jumping to U-Boot(0x00200000) via ARM Trusted Firmware(0x00040000)
Total: 115.946 msINFO: Preloader serial: 2
NOTICE: BL31: v2.3():v2.3-468-ge529a2760:derrick.huang
NOTICE: BL31: Built : 09:59:49, Nov 21 2022
INFO: spec: 0x1
INFO: ext 32k is not valid
INFO: ddr: stride-en 4CH
INFO: GICv3 without legacy support detected.
INFO: ARM GICv3 driver initialized in EL3
INFO: valid_cpu_msk0xff bcore0_rst 0x0, bcore1_rst 0x0
INFO: system boots from cpu-hwid-0
INFO: idle_st0x21fff, pd_st0x11fff9, repair_st0xfff70001
INFO: dfs DDR fsp_params[0].freq_mhz 2112MHz
INFO: dfs DDR fsp_params[1].freq_mhz 528MHz
INFO: dfs DDR fsp_params[2].freq_mhz 1068MHz
INFO: dfs DDR fsp_params[3].freq_mhz 1560MHz
INFO: BL31: Initialising Exception Handling Framework
INFO: BL31: Initializing runtime services
INFO: BL31: Initializing BL32
INFO: hdmirx_handler: dma not on, ret
I/TC:
I/TC: OP-TEE version: 3.13.0-652-g4542e1efd #derrick.huang (gcc version 10.2.1 20201103 (GNU Toolchain for the A-profile Architecture 10.2-2020.11 (arm-10.16))) #5 2022年 09月 20日 星期二 09:41:09 CST aarch64
I/TC: Primary CPU initializing
I/TC: Primary CPU switching to normal world boot
INFO: BL31: Preparing for EL3 exit to normal world
INFO: Entry point address 0x200000
INFO: SPSR 0x3c9# 进入到 U-Boot开始执行 U-Boot 代码
U-Boot 2017.09 (Sep 11 2023 - 18:03:37 0800)Model: armsom w3
PreSerial: 2, raw, 0xfeb50000
DRAM: 8 GiB
Sysmem: init
Relocation Offset: eda3c000
Relocation fdt: eb9f9c38 - eb9fecd0
CR: M/C/I
Using default environmentHotkey: ctrl //ctrl c进入uboot命令行
......
Total: 861.58 msStarting kernel ...
......对于整个 U-Boot 来说如果你的产品没什么特殊的需求基本不用去动 U-Boot 源码
四、kernel 开发
Linux 内核源码在/kernel 目录下
4.1 内核设备树和 defconfig 配置文件
armsom-w3开发板Linux Kernel 所使用的 defconfig 配置文件为/kernel/arch/arm64/configs/armsom_w3_defconfig。用户可以根据自己的需求更改该文件、使能或禁用内核模块。Rockchip 平台的所有设备树文件都存放在/kernel/arch/arm64/boot/dts/rockchip/目录下。对于 armsom-w3 开发板来说使用的设备树文件为rk3588-armsom-w3.dts。 rk3588-armsom-w3.dts 包含有多个.dtsi 设备树如下所示
#include dt-bindings/gpio/gpio.h
#include dt-bindings/leds/common.h
#include dt-bindings/pwm/pwm.h
#include dt-bindings/pinctrl/rockchip.h
#include dt-bindings/input/rk-input.h
#include dt-bindings/display/drm_mipi_dsi.h
#include dt-bindings/display/rockchip_vop.h
#include dt-bindings/sensor-dev.h
#include dt-bindings/usb/pd.h
#include rk3588.dtsi
#include rk3588-rk806-single.dtsi
#include rk3588-linux.dtsi
#include rk3588-armsom-w3-display.dtsi
#include rk3588-armsom-w3-camera.dtsirk3568.dtsi该设备树文件是 RK3568 平台级设备树文件与具体开发板硬件无关纯SoC 级别的设备树文件由 RK 提供开发者无需改动该文件rk3588-rk806-single.dtsi使用的PMIC电源控制方案,里面描述的是具体的硬件电源节点rk3568-linux.dtsi该设备树包含 Linux 部分特有配置信息rk3588-armsom-w3-display.dtsi关于armsom-w3开发板上面的mipi屏幕配置rk3588-armsom-w3-camera.dtsi关于armsom-w3开发板上面的摄像头配置
rk3588-armsom-w3.dts设备树是提供给用户使用的用户在编译内核源码时只需编译这个设备树。
对于开发板上面使用到的硬件可以在设备树文件下面disabled/okay除了修改设备树还可以对内核进行配置。
在/kernel/使用如下命令修改内核的配置
make ARCHarm64 armsom_w3_defconfig
make ARCHarm64 menuconfig
make ARCHarm64 savedefconfig
cp .config arch/arm64/configs/armsom_w3_defconfig执行make ARCHarm64 menuconfig后进入图形化内核配置界面
对于需要改动的驱动使用“/”键进去搜索界面
输入关键词比如触摸屏的驱动是gt9xx那搜索gt9就会索引到配置位置
按空格键选择配置状态[*]编译进内核 [M]编译成ko文件 [ ]不编译
4.2 内核编译
sdk的交叉编译工具链是prebuilts\gcc\linux-x86\aarch64\gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu\bin\aarch64-none-linux-gnu-gcc在SDK源码目录下直接执行./build.sh kernel直接编译内核代码,第一次编译时间会有点久之后再编译就只会编译修改的内核驱动文件编译完成后会生成 boot.img 以及 resource.img
lhdydtx:~/project_code/3588/3588_linux5.10_v1.0.5/kernel$ ls -l boot.img resource.img
-rw-rw-r-- 1 lhd lhd 32218624 9月 21 18:11 boot.img
-rw-rw-r-- 1 lhd lhd 201216 9月 21 18:11 resource.img关于这两个镜像这里说明一下
4.2.1 boot.img 镜像
RK3588 平台 Linux 系统使用的 boot.img 是一种 FIT 格式镜像它由多个镜像合并而成对于 RK3588 平台来说烧录到开发板 boot 分区的 boot.img 包含了内核镜像 Image、内核 DTB、resource.img 这三部分。可以使用 file 命令查看 boot.img 文件
lhdydtx:~/project_code/3588/3588_linux5.10_v1.0.5/kernel$ file boot.img
boot.img: Device Tree Blob version 17, size1536, boot CPU0, string block size190, DT structure block size1004“Device Tree Blob”表示该文件是一个 FIT 格式镜像。通过 mk-fitimage.sh 脚本打包生成的 boot.img 才是最终烧录到开发板 boot 分区Linux 系统的 boot.img
如果改动了设备树文件需要重新编译设备树得到新的 Kernel DTB然后将它打包进 resource.img、之后再把 resource.img 打包进 boot.img最后将新的 boot.img 烧录到开发板 boot 分区完成替换虽然很麻烦但必须得这么做。
4.2.2 resource.img 镜像
resource.img 是 RK 自己设计的一种镜像用于存放一些资源譬如 u-boot logo 图片、内核logo 图片以及设备树镜像 DTB。resource.img 并不是单独烧录到开发板而是将其打包进boot.img 中最终烧录 boot.img。如果用户需要将开机图片替换为自己的 logo首先需要将你的 U-Boot logo 图片重命名为 logo.bmp、 将你的内核 logo 图片重命名为 logo_kernel.bmp然后将这两个 bmp 图片文件拷贝到内核源码根目录下替换内核源码中默认的 logo 图片。编译内核时会将logo.bmp和logo_kernel.bmp打包进resource.img中然后再把resource.img打包到 boot.img。U-Boot 启动的时候会把这两个 bmp 文件加载到内存中logo.bmp 会在 U-Boot 阶段开始显示logo_kernel.bmp 在内存中的地址会被 U-Boot 传给 Linux Kernel在 Linux Kernel 的 DRM驱动初始化阶段显示。
五、buildroot 开发
Buildroot 源码在/buildroot 目录下 顶层文件名 说明 arch 存放 buildroot 支持的所有 CPU 架构相关的配置文件及构建脚本 board 存放特定目标平台相关的文件譬如内核配置或补丁文件、rootfs覆盖文件等 boot 存放 buildroot 支持的 BootLoader 相关的补丁、校验文件、构建脚本、配置选项等 build Buildroot 编译系统相关组件 configs 存放了所有目标平台的 defconfig 配置文件 dl download 的缩写该目录用于存放下载的各种开源软件包譬如alsa-lib 库、bluez 库、bzip2、curl 工具等在编译过程中buildroot会从网络下载所需软件包、并将其放置在 dl/目录下如果 buildroot下载某软件包时失败、无法下载成功此时我们也可以自己手动下载该软件包、并将其拷贝至 dl 目录下。所有软件包只需下载一次即可不是每次编译都要下载一次除非删除 dl 目录只要 dl 目录下存在该软件包就不用下载了所以往往第一次编译会比较慢因为下载过程会占用很多时间 docs 存放相关的参考文档 fs 存放各种文件系统的源代码 linux 存放 linux 的构建脚本和配置选项 output 该文件夹会在编译 buildroot 后出现output 目录用于存放编译过程中输出的各种文件包括各种编译生成的中间目标文件、可执行文件、lib 库以及最终烧录到开发板的 rootfs 镜像等 package 存放所有 package软件包的构建脚本、配置选项每个软件包目录下package/package_name/都有一个 Config.in 文件和package_name.mk 文件其实就是 Makefile 文件如果需要添加一个新的 package则需对 package/目录进行改动。 support 存放一些为 buildroot 提供功能支持的脚本、配置文件等 toolchain 存放制作各种交叉编译工具链的构建脚本和相关文件binutils、gcc、gdb、kernel-header 和 uClibc utils 存放一些 buildroot 的实用脚本和工具
5.1 常见编译命令
在SDK里面编译buildroot 源码有两种常用的方法一种是在SDK顶层目录直接用命令./build.sh buildroot,还一种是依赖buildroot 源码根目录下的 Makefile 文件。
编译之前先进行配置进入到 buildroot 目录下执行如下命令进行配置
lhdydtx:~/project_code/3588/3588_linux5.10_v1.0.5/buildroot$ source build/envsetup.sh rockchip_rk3588
Top of tree: /home/lhd/project_code/3588/3588_linux5.10_v1.0.5
#TARGET_BOARDrk3588
#OUTPUT_DIRoutput/rockchip_rk3588
#CONFIGrockchip_rk3588_defconfig
make: 进入目录“/home/lhd/project_code/3588/3588_linux5.10_v1.0.5/buildroot”GEN /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/buildroot/output/rockchip_rk3588/Makefile
/home/lhd/project_code/3588/3588_linux5.10_v1.0.5/buildroot/build/parse_defconfig.sh /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/buildroot/configs/rockchip_rk3588_defconfig /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/buildroot/output/rockchip_rk3588/.config.in
Parsing defconfig: /home/lhd/project_code/3588/3588_linux5.10_v1.0.5/buildroot/configs/rockchip_rk3588_defconfig
Using configs/rockchip/chips/rk3588.config as base
Merging configs/rockchip/chips/rk3588_aarch64.config
Merging configs/rockchip/base/kernel.config
Merging configs/rockchip/e2fs.config
Merging configs/rockchip/base/common.config
Merging configs/rockchip/base/base.config
Value of BR2_ROOTFS_OVERLAY is redefined by configs/rockchip/base/base.config:
Previous value: BR2_ROOTFS_OVERLAYboard/rockchip/rk3588/fs-overlay/
Modify value: BR2_ROOTFS_OVERLAYboard/rockchip/common/base
New value: BR2_ROOTFS_OVERLAYboard/rockchip/rk3588/fs-overlay/ board/rockchip/common/base命令中最后一个参数rockchip_rk3568用于指定目标平台的 defconfig 配置文件不带_defconfig 后缀所有目标平台的 defconfig 配置文件都存放在/configs 目录下
配置完成后直接执行 make 或make all命令编译根文件系统,如下所示为部分内容
编译 过程中会编译两次 buildroot
编译 buildroot 得到根文件系统镜像 rootfs.img。rootfs.img 会烧录到开发板 rootfs 分 区。编译 buildroot 得到 ramdisk 根文件系统镜像进入 recovery 模式时挂载 ramdisk 根文 件系统ramdisk 最终会打包进 recovery.img 镜像中recovery.img 会烧录到开发板 recovery 分 区。
Buildroot内置交叉编译其交叉编译⼯具位于buildroot/output/rockchip_rk3588/host/usr ⽬录下输⼊命令查看
cd buildroot/output/rockchip_rk3588/host/usr/bin
./aarch64-linux-gcc --version
aarch64-linux-gcc.br_real (Buildroot -g167e3f26b-dirty) 11.3.0若需要编译单个模块或者第三⽅应⽤⽐如 rockchip-test 模块常⽤相关编译命令如下
编译rknpu2 SDK$make rknpu2重编rknpu2 SDK$make rknpu2-rebuild删除rknpu2 SDK$make rknpu2-dirclean 或者 SDK$rm -rf /buildroot/output/rockchip_rk3588/build/rknpu2-1.0.0
5.2 output 目录介绍
output 目录用于存放编译过程中产生的各种文件包括编译过程生成的中间目标文件、可 执行文件、lib 库以及最终烧录到开发板的 rootfs 镜像等。 output/ ├── rockchip_rk3588 │ ├── build #包含所有构建的软件包包括 buildroot 在宿主机上所需的工具以 及为目标平台编译的软件包 │ ├── host #包含为 Ubuntu 主机宿主机构建的工具以及目标工具链 │ ├── images #存放最终编译输出的镜像 │ ├── Makefile │ ├── staging #一个指向 host/目录中目标工具链 sysroot 的符号链接 │ └── target #根文件系统系统目录用来创建根文件系统镜像rootfs.img 镜像 的内容就是该目录下的内容 5.3 软件包编译
如何编译指定的软件包package在 buildroot/package/文件夹中的某个目录对应的名字或某个子目录对应的名字并且该目录中存在 Config.in 配置文件用于定义 package 配置选项以及package_name.mk 文件Makefile 文件用于定义 package 的构建逻辑。譬如 rkwifibt → package/rockchip/rkwifibt/ rknpu → package/rockchip/rknpu/ rkupdate → package/rockchip/rkupdate/
接着执行命令编译指定的 packagemake package_name
package软件包的构建过程可以分解为configure配置、build编译、install安装 其执行顺序为配置→编译→安装每一步可单独执行执行如下命令
make package_name-configure #执行配置命令
make package_name-build #执行编译命令
make package_name-install #执行安装命令5.4 添加 package软件包
下面通过一个简单的例子向用户介绍如何在 buildroot/package 目录下添加一个自己的package软件包。
5.4.1 开发源码工程
首先进入/app 目录下在该目录下创建一个名为“packagedemo”的文件夹,且在 packagedemo 目录下创建一个.c 源文件 main.c以及一个 Makefile 文件
cd SDK/app
mkdir packagedemo
touch main.c Makefile在 main.c 源文件中编写一个简单的测试代码譬如打印一个“Hello World”。 Makefile 文件中的内容如下所示
package: main.o
$(CC) -o package main.o
%.o: %.c
$(CC) -c $ -o $目的就是将 main.c 源文件编译成一个可执行文件 package。
5.4.2 添加 package
进入/package 目录在该目录下创建一个名为 packagedemo 的目录,并且在packagedemo目录下创建两个文件Config.in 和 packagedemo.mk。
Config.in 文件的内容如下所示
config BR2_PACKAGE_PACKAGEDEMO
bool PACKAGEDEMO
helpthis configuration is used to enable or disable packagedemo.packagedemo.mk 文件的内容如下所示
################################################################################
#
# packagedemo
#
################################################################################
# 给你的软件包定义一个版本号
MYPACKAGE_VERSION 1.0
# 你的软件包所在目录
MYPACKAGE_SITE $(TOPDIR)/../app/packagedemo
# 获取软件包的方式local 表示从本地获取有些包可能需要通过网络下载譬如 git 仓库中
的项目
MYPACKAGE_SITE_METHOD local
# 列出在编译软件包之前 需要执行的配置操作
define MYPACKAGE_CONFIGURE_CMDS
endef
# 列出编译软件包时 需要执行的操作
define MYPACKAGE_BUILD_CMDS
$(MAKE) -C $(D) CC$(TARGET_CC)
endef
# 列出将软件包安装到 target 目录(Buildroot/output/rockchip_rk3588/target)时需要执行的操作
define MYPACKAGE_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(D)/mypackage $(TARGET_DIR)/usr/bin/package
endef
# 表示当前软件包是一个通用型软件包基础结构
$(eval $(generic-package))注意该文件中定义了一些变量以及宏所有的这些变量、宏都以前缀 MYPACKAGE_开头不能乱来它必须等于 Config.in、mypackage.mk 文件所在目录mypackage对应的名字小写字母转换为大写。 表示命令()表示命令(D)表示软件包所在目录注意这个目录并不是/app/mypackage、而是该软件包在 output/rockchip_rk3588/build/目录下对应的文件夹编译软件包之前buildroot 会将/app/mypackage 拷 贝 至 /output/rockchip_rk3588/build/ 目 录 并 重 命 名 为mypackage-1.01.0 就是版本号。所以这个“$(D)”指的是 output/rockchip_rk3588/build/mypackage-1.0 这个目录。 表示顶层目录也就是目录。()表示顶层目录也就是/目录。(TARGET_CC)表示交叉编译器RK 平台默认使用 buildroot 交叉编译器交叉编译器所在路径为/output/rockchip_rk3588/host/bin/aarch64-buildroot-linux-gnu-gcc。 表示命令。()表示命令。(TARGET_DIR)表示 target 目录/output/rockchip_rk3588/target。
接下来打开 package/Config.in 文件将下面这行内容添加到该文件中
source package/packagedemo/Config.in添加完成后保存退出。
5.4.3 使能并编译 package
执行“make menuconfig”打开图形化配置界面输入“/”搜索“packagedemo”找到我们添加的 package将其使能并且保存配置、退出图形化配置界面。
执行make packagedemo-rebuild命令编译该软件包
编 译会 生 成 一 个 可 执 行 文 件 package 其 所 在 路 径 为 output/rockchip_rk3588/target/usr/bin/package
六、Debian开发
源码位于⼯程 /debian ⽬录下
debian
├── mk-base-debian.sh ##获取Debian基础包和编译
├── mk-image.sh ##打包⽣成ext4的固件
├── mk-rootfs-buster/bullseye.sh ##适配Rockchip相关硬件加速包
├── mk-rootfs.sh ##指向具体Rootfs版本⽬前有Buster、Bullseye两个版本。
├── overlay ##适配Rockchip平台共性配置⽂件
├── overlay-debug ##系统常使⽤的调试⼯具
├── overlay-firmware ##⼀些设备firmware的存放⽐如npu/dp等
├── packages ## 包含armhf arm64系统适配硬加速使⽤的预编译的包
├── packages-patches ##预编包基于官⽅打上的补丁
├── readme.md ## ⽂档指引
└── ubuntu-build-service ##从官⽅获取Debian发⾏版可依赖包和定制安装相关包。整个⽬录结构内容是通过Shell脚本来达到获取构建Linux Debian发⾏版源码
6.1 Debian 编译
Debian常用的的编译方式有两种一种是在SDK目录下执行./build.sh debian,或者进入 debian/ ⽬录执行编译命令。
编译和 Debian 固件⽣成参考当前⽬录 readme.md
## IntroductionA set of shell scripts that will build GNU/Linux distribution rootfs image
for rockchip platform.## Available Distro* Debian 11 (Bullseye-X11 and Wayland)~~
sudo apt-get install binfmt-support qemu-user-static
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f
## Usage for 32bit Debian 11 (Bullseye-32)### Building debian system from linaroBuilding a base debian system by ubuntu-build-service from linaro.RELEASEbullseye TARGETbase ARCHarmhf ./mk-base-debian.sh
Building a desktop debian system by ubuntu-build-service from linaro.RELEASEbullseye TARGETdesktop ARCHarmhf ./mk-base-debian.sh
### Building overlay with rockchip audio/video hardware acceleratedBuilding with overlay with rockchip debian rootfs:RELEASEbullseye ARCHarmhf ./mk-rootfs.sh
Building with overlay with rockchip debug debian rootfs:VERSIONdebug ARCHarmhf ./mk-rootfs-bullseye.sh
### Creating roofs imageCreating the ext4 image(linaro-rootfs.img):./mk-image.sh
---## Usage for 64bit Debian 11 (Bullseye-64)Building a base debian system by ubuntu-build-service from linaro.RELEASEbullseye TARGETdesktop ARCHarm64 ./mk-base-debian.sh
Building the rk-debian rootfs:RELEASEbullseye ARCHarm64 ./mk-rootfs.sh
Building the rk-debain rootfs with debug:VERSIONdebug ARCHarm64 ./mk-rootfs-bullseye.sh
Creating the ext4 image(linaro-rootfs.img):./mk-image.sh---## Cross Compile for ARM Debian[Docker Multiarch](http://opensource.rock-chips.com/wiki_Cross_Compile#Docker)## Package Code BasePlease apply [those patches](https://github.com/rockchip-linux/rk-rootfs-build/tree/master/packages-patches) to release code base before rebuilding!## License informationPlease see [debian license](https://www.debian.org/legal/licenses/)## FAQ- noexec or nodev issue
noexec or nodev issue /usr/share/debootstrap/functions: line 1450:
../rootfs/ubuntu-build-service/bullseye-desktop-arm64/chroot/test-dev-null:
Permission denied E: Cannot install into target
...
mounted with noexec or nodevSolution: mount -o remount,exec,dev xxx (xxx is the mount place), then rebuild it.当执行完./mk-image.sh之后会在当前目录下生成Debian固件linaro-rootfs.img。
6.2 系统定制
Debian系统是通过Shell脚构建出来的要对Debian系统进行定制需要在/debian ⽬录下着重关注两个脚本mk-base-debian.sh和mk-rootfs-bullseye.sh
mk-base-debian.sh脚本部分内容如下
cd ubuntu-build-service/$RELEASE-$TARGET-$ARCHecho -e \033[36m Staring Download...... \033[0mmake clean./configuremakeif [ -e linaro-$RELEASE-alip-*.tar.gz ]; thensudo chmod 0666 linaro-$RELEASE-alip-*.tar.gzmv linaro-$RELEASE-alip-*.tar.gz ../../
elseecho -e \e[31m Failed to run livebuild, please check your network connection. \e[0m
fi构建了Debian的linaro-bullseye-alip-20230613-1.tar.gz基础包
对系统的软件包进⾏定制将所需的包列表放在customization/package-lists⽬录下并命名为XXX.list.chroot或XXX.list.binary如果该目录下已经有这个文件可以直接对其进行修改。
mk-rootfs-bullseye.sh适配相关硬件加速包也可以在这里添加自己的应用部分脚本如下
#---------Camera---------
echo -e \033[36m Install camera.................... \033[0m
\${APT_INSTALL} cheese v4l-utils
\${APT_INSTALL} /packages/libv4l/*.deb#---------armsom-w3-test---------
# echo -e \033[36m Install armsom-w3-test.................... \033[0m
# \${APT_INSTALL} /packages/armsom-w3-test/*.deb#---------Xserver---------
echo -e \033[36m Install Xserver.................... \033[0m
\${APT_INSTALL} /packages/xserver/*.debarmsom-w3-test是armsom自写的一个产测软件在debian/packages/arm64下创建armsom-w3-test文件夹将test.deb放在文件夹下
再执行相关脚本就可以将我们的应用打包进系统mk-rootfs-bullseye.sh这里有很多预安装包这里就不解释了已经预安装的Debian deb包可以对其进行解压、修改、重新打包这里提供一种⽅法
#解压出包中的⽂件到extract⽬录下
dpkg -X xxx.deb extract/
#解压出包的控制信息extract/DEBIAN/下
dpkg -e xxx.deb extract/DEBIAN/
#修改⽂件XXX
# 对修改后的内容重新进⾏打包⽣成deb包
dpkg-deb -b extract/ .