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
安装依赖软件包
需要先安装软件包:
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版本:
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环境变量中:
mkdir ~/bin
export PATH=~/bin:$PATH
可以通过清华站点来下载repo工具,并给可执行权限:
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod a+x ~/bin/repo
repo其实就是一个python脚本。
git配置
使用repo之前,先配置git信息:
git config --global user.name "name"
git config --global user.email "email"
配置好之后可以通过如下命令查看git信息:
git config --list
安装SDK
将下载好的SDK文件,拷贝到虚拟机中,然后如下设置:
mkdir ~/rk3568_linux_sdk
tar xvf atk-rk3568_linux_release_v1.4_20250104.tgz -C ~/rk3568_linux_sdk
如上完成解压后,~/rk3568_linux_sdk/目录下就会有一个.repo文件夹,如下图所示:
执行如下命令可检查到源码:
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版本:
realpath .repo/manifests/rk3568_linux_release.xml
可以看到我的ATK版本为V1.4。
在SDK源码根目录下,执行如下命令可查询当前SDK的RK版本:
ls .repo/manifests/rk356x_linux/rk356x_linux_release*
可以看到当前SDK的RK版本号为V1.3.0,发布日期为2022.06.20。
SDK全自动编译
进入SDK源码根目录下,在编译之前先执行如下命令指定SDK的板级配置文件:
./build.sh lunch
回车确认后如下:
build.sh是RK提供的编译脚本,可以方便快速构建各种镜像文件以及对镜像的打包操作,可以一键自动编译整个SDK,也可以单独编译U-Boot、Linux kernel、buildroot等。
build.sh其实是软链接文件,实际指向了 device/rockchip/common/build.sh 文件,如下:
可执行如下命令查看build.sh脚本使用方法:
./build.sh -h
常用如下:
选择板级配置文件后,接下来便可以进行编译了:整个SDK编译过程中最耗时的部分便是根文件系统的编译了,在编译根文件系统的过程中会通过网络下载很多的第三方库文件;首先,下载过程会占用很多时间导致编译时间拉长;其次,如果网络环境不稳定或者第三方库文件的下载源发生变更,很容易导致下载失败,进而导致根文件系统统编译出错。所以,为了加快根文件系统的编译过程、也为了降低编译根文件系统时出现问题的概率,可以预先把编译根文件系统所需的第三方库文件拷贝到SDK中。
把dl.tgz文件拷贝到虚拟机后执行如下命令:
tar -xzf dl.tgz -C ~/rk3568_linux_sdk/buildroot/
解压完成后可以进入~/rk3568_linux_sdk/buildroot/目录下,会有一个dl目录,就是第三方库文件。
之后可以进行SDK编译,进入源码根目录后,执行如下命令编译整个SDK:
./build.sh all
整个编译过程大约花了三个小时,出现"Running build_all succeeded"字符串则证明编译完成。
编译完成后,会生成各种镜像,包括boot.img、uboot.img、MiniLoadderAll.bin、rootfs.img、recovery.img等等,但是这些镜像文件散布在各自的源码目录下、不方便查找,此时可以执行如下命令将它们打包到SDK/rockdev目录:
./build.sh firmware
或者直接执行SDK源码根目录的./mkfirmware.sh脚本:
./mkfirmware.sh
执行完后,进入rockdev目录,有如下结果:
该目录下都是软链接文件,链接到真正的镜像文件。
还可以直接执行./build.sh脚本,会比之前的all编译多出如下几个操作:
- 执行./mkfirmware.sh将所有镜像打包到rockdev目录
- 将rockdev目录下所有镜像打包成一个update.img固件
- 复制rockdev目录下的镜像到IMAGE/*** RELEASE_TEST/IMAGES目录(***是编译日期)
- 保存各个模块的补丁到IMAGE/*** RELEASE_TEST/PATCHES目录
Note: ./build.sh和./build.sh allsave命令一样
单独编译
单独编译U-Boot
通过build.sh脚本单独编译U-Boot,在SDK源码目录执行如下命令:
./build.sh uboot
编译完成后有两个镜像:
./uboot/uboot.img
./uboot/rk356x_spl_loader_v1.13.112.bin
第二个实际就是MiniLoaderAll.bin,只是重命名。
单独编译kernel
执行如下命令:
./build.sh kernel
编译成功后会有boot.img镜像,在./kernel/boot.img。
如上会编译整个Linux内核源码,包括内核设备树、内核模块,如果需要单独编译某个内核模块,可以如下命令执行编译:
./build.sh modules
先编译好内核源码,才能这样编译某个特定模块。
单独编译rootfs
根文件系统,RK3568的Linux SDK支持很多种,包括buildroot、yocto以及Debian,这里主要就看buildroot。RK官方不推荐Yocto。
命令如下:
./build.sh buildroot
编译成功后会生成buildroot根文件系统,在./buildroot/output/rockchip_rk3568/images/目录下,如下图:
对于RK3568来说,使用ext4格式镜像就是rootfs.ext2,且会将其重命名为rootfs.img。
也可以通过如下命令来完成编译:
./build.sh rootfs
这个就不局限于buildroot了,但是默认buildroot,可通过环境变量RK_ROOTFS_SYSTEM来指定:
# 制定编译buildroot
export RK_ROOTFS_SYSTEM=buildroot
./build.sh rootfs
需要注意,一定在编译根文件系统之前,先编译Linux内核。
单独编译recovery
如下命令:
./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固件更加方便烧录、更新!
./build.sh updateimg
打包后,会在rockdev目录下生成update.img固件,如下:
SDK清理
可以执行如下命令:
./build.sh cleanall
镜像介绍
会有如下图所示的一系列镜像: