RK3568 Linux驱动学习——SDK安装编译

前言

开始再次熟悉Linux下的驱动开发相关工作。

这次用Armv8架构的RK3568开发板,比之前的stm32mp157变成了64位(之前是Armv7);但是因为外设变多了,所以不能直接uboot、kernel和rootfs来完成,需要厂商专门的SDK。

SDK介绍

半导体厂商会将这些东西打包到一起提供给用户,也就是SDK包(提供的SDK包有两种,一种是安卓SDK,另一种是Linux SDK)。这里主要是来看Linux SDK的一些使用方法。

我用的是正点原子的RK3568开发板,基于RK3568芯片开发,厂商是瑞芯微,提供了全面的SDK包,Linux SDK包含了:

  • app:存放上层应用app,包括Qt应用程序,以及其它的C/C++应用程序。
  • buildroot:基于buildroot开发的根文件系统。
  • debian:基于Debian开发的根文件系统。
  • device/rockchip:存放各芯片板级配置文件和Parameter文件,以及些编译与打包固件的脚本和预备文件。
  • docs:存放芯片模块开发指导文档、平台支持列表、芯片平台相关文档、Linux开发指南等。
  • external:存放所需的第三方库,包括音频、视频、网络、recovery等。
  • kernel:Linux4.19版本内核源码。
  • prebuilts:存放交叉编译工具链
  • rkbin:存放Rockchip相关的Binary和工具。
  • rockdev:存放编译输出固件,编译SDK后才会生成该文件夹。
  • tools:存放Linux和Windows操作系统环境下常用的工具,包括镜像烧录工具、SD卡升级启动制作工具、批量烧录工具等,RKDevTool工具以及Linux_Upgrade_Tool工具在该目录下均可找到。
  • u-boot:基于v2017.09版本进行开发的uboot源码。
  • yocto:基于Yocto开发的根文件系统。

使用说明

安装RK3568 Linux SDK

安装依赖软件包

需要先安装软件包:

bash 复制代码
sudo apt-get install curl python2.7 python-pyelftools git ssh 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 python3-pip libncurses-dev python3-pyelftools vim mtd-utils

安装完成后,将python2.7设置为默认python版本:

bash 复制代码
sudo rm -rf /usr/bin/python
sudo ln -s /usr/bin/python2 /usr/bin/python

安装repo(仅学习,无需完成)

repo是建立在Git上的一个多仓库管理工具 ,可以组织多个仓库的上传和下载用于管理多个Git存储仓库。RK3568 Linux SDK中代码和相关文档被划分成了若干个git仓库分别进行版本管理(SDK包含了若干个git仓库),开发者可以使用repo工具对这些git仓库进行统一下载、提交、切换分支等操作。

安装SDK需要使用到repo工具,所以要先安装repo。

可以先创建bin文件夹,并设置到PATH环境变量中:

bash 复制代码
mkdir ~/bin
export PATH=~/bin:$PATH

可以通过清华站点来下载repo工具,并给可执行权限

bash 复制代码
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod a+x ~/bin/repo

repo其实就是一个python脚本

git配置

使用repo之前,先配置git信息:

bash 复制代码
git config --global user.name "name"
git config --global user.email "email"

配置好之后可以通过如下命令查看git信息:

bash 复制代码
git config --list

安装SDK

将下载好的SDK文件,拷贝到虚拟机中,然后如下设置:

bash 复制代码
mkdir ~/rk3568_linux_sdk
tar xvf atk-rk3568_linux_release_v1.4_20250104.tgz  -C ~/rk3568_linux_sdk

如上完成解压后,~/rk3568_linux_sdk/目录下就会有一个.repo文件夹,如下图所示:

执行如下命令可检查到源码:

bash 复制代码
cd ~/rk3568_linux_sdk
..repo/repo/repo sync -l -j4

同步完成后,~/rk3568_linux_sdk/目录下如下图所示:

SDK瘦身

Ubuntu可能磁盘空间比较紧张,可以对SDK瘦身,将SDK源码根目录下.repo(隐藏文件夹,ls -a可以看到)删除。

Note:

.repo文件夹保存了SDK的git仓库的git提交信息,一旦删除就看不到git了,不建议删掉

SDK软件框架

SDK工程目录介绍

SDK源码根目录下包含有app、buildroot、debian、device、external、teools、u-boot、yocto等多个目录,每个目录或其子目录会对应一个git工程:因为SDK的代码和相关文档被划分成了若干git仓库分别进行版本管理(所以SDK实际上包含有若干git仓库),它们按照功能、所属模块划分,分别组织到不同的目录下。

  • app:存放上层应用app,包括Qt应用程序,以及其它的C/C++应用程序。
  • buildroot:基于buildroot开发的根文件系统。
  • debian:基于Debian开发的根文件系统。
  • device/rockchip:存放各芯片板级配置文件和Parameter文件,以及些编译与打包固件的脚本和预备文件。
  • docs:存放芯片模块开发指导文档、平台支持列表、芯片平台相关文档、Linux开发指南等。
  • external:存放所需的第三方库,包括音频、视频、网络、recovery等。
  • kernel:Linux4.19版本内核源码。
  • prebuilts:存放交叉编译工具链
  • rkbin:存放Rockchip相关的Binary和工具。
  • rockdev:存放编译输出固件,编译SDK后才会生成该文件夹。
  • tools:存放Linux和Windows操作系统环境下常用的工具,包括镜像烧录工具、SD卡升级启动制作工具、批量烧录工具等,RKDevTool工具以及Linux_Upgrade_Tool工具在该目录下均可找到。
  • u-boot:基于v2017.09版本进行开发的uboot源码。
  • yocto:基于Yocto开发的根文件系统。

SDK软件框架

SDK软件框图如下图所示,从上到下分为Bootloader、Linux kernel、Libraries】Applications四个层次,各层内容如下:

  • Bootloader层主要提供底层系统支持包,如Bootloader、U-Boot、ATF相关支持。
  • Kernel层主要提供Linux Kernel的标准实现,Linux也是一个开放的操作系统。Rockchip平台的Linux核心为标准的Linux4.4/4.19/5.10内核,提供安全性、内存管理、进程管理、网络协议栈等基础支持;主要是通过Linux内核管理设备硬件资源,如CPU调度、缓存、内存、I/O等。
  • Libraries层对应一般嵌入式系统,相当于中间件层次,包含了各种系统基础库,以及第三方开源程序库支持,对应用层提供API接口,系统定制者和应用开发者可以基于Libraries层的API开发新的应用。
  • Applications层主要是实现具体的产品功能及交互逻辑,需要要一些系统基础库及第三方程序库支持。开发者可以开发实现自己的应用程序。提供系统各种能力给到最终用户。

SDK版本查询

正点原子RK3568 Linux SDK的版本可分为RK版本和ATK版本:RK版本表示本SDK是基于RK官方(Rockchip,瑞芯微)的某版本Linux SDK进行的二次开发;在RK原生SDK的基础上进行二次开发,以适配正点原子的ATK-DLRK3568开发平台以及进行一些相应的扩展。

ATK版本则表示正点原子Linux技术团队对RK3568 LinuxSDK所定义的内部版本号,每一次发布的SDK都会有一个版本号与之对应。

SDK源码根目录 下,执行如下命令可查询当前SDK的ATK版本

bash 复制代码
realpath .repo/manifests/rk3568_linux_release.xml

可以看到我的ATK版本为V1.4。

SDK源码根目录 下,执行如下命令可查询当前SDK的RK版本

bash 复制代码
ls .repo/manifests/rk356x_linux/rk356x_linux_release*

可以看到当前SDK的RK版本号为V1.3.0,发布日期为2022.06.20。

SDK全自动编译

进入SDK源码根目录下,在编译之前先执行如下命令指定SDK的板级配置文件

bash 复制代码
./build.sh lunch

回车确认后如下:

build.sh是RK提供的编译脚本,可以方便快速构建各种镜像文件以及对镜像的打包操作,可以一键自动编译整个SDK,也可以单独编译U-Boot、Linux kernel、buildroot等。

build.sh其实是软链接文件,实际指向了 device/rockchip/common/build.sh 文件,如下:

可执行如下命令查看build.sh脚本使用方法:

bash 复制代码
./build.sh -h

常用如下:

选择板级配置文件后,接下来便可以进行编译了:整个SDK编译过程中最耗时的部分便是根文件系统的编译了,在编译根文件系统的过程中会通过网络下载很多的第三方库文件;首先,下载过程会占用很多时间导致编译时间拉长;其次,如果网络环境不稳定或者第三方库文件的下载源发生变更,很容易导致下载失败,进而导致根文件系统统编译出错。所以,为了加快根文件系统的编译过程、也为了降低编译根文件系统时出现问题的概率,可以预先把编译根文件系统所需的第三方库文件拷贝到SDK中

把dl.tgz文件拷贝到虚拟机后执行如下命令:

bash 复制代码
tar -xzf dl.tgz -C ~/rk3568_linux_sdk/buildroot/

解压完成后可以进入~/rk3568_linux_sdk/buildroot/目录下,会有一个dl目录,就是第三方库文件

之后可以进行SDK编译,进入源码根目录后,执行如下命令编译整个SDK:

c 复制代码
./build.sh all

整个编译过程大约花了三个小时,出现"Running build_all succeeded"字符串则证明编译完成。

编译完成后,会生成各种镜像,包括boot.img、uboot.img、MiniLoadderAll.bin、rootfs.img、recovery.img等等,但是这些镜像文件散布在各自的源码目录下、不方便查找,此时可以执行如下命令将它们打包到SDK/rockdev目录

bash 复制代码
./build.sh firmware

或者直接执行SDK源码根目录的./mkfirmware.sh脚本:

bash 复制代码
./mkfirmware.sh

执行完后,进入rockdev目录,有如下结果:

该目录下都是软链接文件,链接到真正的镜像文件。

还可以直接执行./build.sh脚本,会比之前的all编译多出如下几个操作:

  1. 执行./mkfirmware.sh将所有镜像打包到rockdev目录
  2. 将rockdev目录下所有镜像打包成一个update.img固件
  3. 复制rockdev目录下的镜像到IMAGE/*** RELEASE_TEST/IMAGES目录(***是编译日期)
  4. 保存各个模块的补丁到IMAGE/*** RELEASE_TEST/PATCHES目录

Note: ./build.sh和./build.sh allsave命令一样

单独编译

单独编译U-Boot

通过build.sh脚本单独编译U-Boot,在SDK源码目录执行如下命令:

bash 复制代码
./build.sh uboot


编译完成后有两个镜像:

bash 复制代码
./uboot/uboot.img
./uboot/rk356x_spl_loader_v1.13.112.bin

第二个实际就是MiniLoaderAll.bin,只是重命名。

单独编译kernel

执行如下命令:

bash 复制代码
./build.sh kernel


编译成功后会有boot.img镜像,在./kernel/boot.img。

如上会编译整个Linux内核源码,包括内核设备树、内核模块,如果需要单独编译某个内核模块,可以如下命令执行编译:

bash 复制代码
./build.sh modules

先编译好内核源码,才能这样编译某个特定模块

单独编译rootfs

根文件系统,RK3568的Linux SDK支持很多种,包括buildroot、yocto以及Debian,这里主要就看buildroot。RK官方不推荐Yocto。

命令如下:

bash 复制代码
./build.sh buildroot


编译成功后会生成buildroot根文件系统,在./buildroot/output/rockchip_rk3568/images/目录下,如下图:

对于RK3568来说,使用ext4格式镜像就是rootfs.ext2,且会将其重命名为rootfs.img。

也可以通过如下命令来完成编译:

bash 复制代码
./build.sh rootfs

这个就不局限于buildroot了,但是默认buildroot,可通过环境变量RK_ROOTFS_SYSTEM来指定

bash 复制代码
# 制定编译buildroot
export RK_ROOTFS_SYSTEM=buildroot
./build.sh rootfs

需要注意,一定在编译根文件系统之前,先编译Linux内核

单独编译recovery

如下命令:

bash 复制代码
./build.sh recovery


recovery.img用于进入recovery模式,该镜像会烧录到开发板recovery分区。

recovery.img是由多个镜像合并而成 ,其中包含ramdisk(recovery模式下挂载的根文件系统)、内核镜像、内核DTB以及资源镜像resource.img 。所以,在编译recovery之前,也必须提前编译好Linux内核

编译成功后,生成recovery.img,该镜像输出在buildroot/output/rockchip_rk356x_recovery/images/目录下,如下所示:

打包成update.img镜像

update.img是多个镜像的集合体(由多个镜像打包合并而成),使用RK提供的工具可以将各个分立镜像(譬如uboot.img、boot.img、MiniLoaderAll.bin、parameter.txt、nnisc.img、rootfs.img、oem.img、userdata.img、recovery.img等)打包成一个update.img固件,方便用户烧录、升级。

可以通过如下命令将rockdev目录下的各个分立镜像打包成一个update.img固件,使

用update.img固件更加方便烧录、更新!

bash 复制代码
./build.sh updateimg

打包后,会在rockdev目录下生成update.img固件,如下:

SDK清理

可以执行如下命令:

bash 复制代码
./build.sh cleanall

镜像介绍

会有如下图所示的一系列镜像:

相关推荐
岩中竹3 分钟前
广东省省考备考(第四十八天7.17)——言语理解,资料分析(知识点回顾与题目训练)
笔记
青竹易寒9 分钟前
Linux命令技术笔记-sed+awk命令详解
linux·运维·服务器
Kiri霧15 分钟前
Kotlin泛型约束
android·linux·windows·kotlin
gjf05_0516 分钟前
人该怎样活着呢?55
学习
试着44 分钟前
零基础学习性能测试第二章-linux服务器监控:CPU监控
linux·服务器·学习·零基础·性能测试·cpu监控
绵绵细雨中的乡音1 小时前
Linux进程通信——共享内存:System V 进程间通信的极速方案
linux·运维·服务器
Norvyn_71 小时前
LeetCode|Day19|14. 最长公共前缀|Python刷题笔记
笔记·python·leetcode
名字不要太长 像我这样就好2 小时前
【iOS】消息传递和消息转发
开发语言·学习·macos·ios·objective-c
屁股割了还要学2 小时前
【C语言进阶】题目练习(3)
c语言·开发语言·c++·学习·算法·青少年编程
老马啸西风2 小时前
windows wsl ubuntu 如何安装 open-jdk8
linux·windows·ubuntu·docker·容器·k8s·kvm