当前位置: 首页 > news >正文

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文件夹,如下图所示:
rk3568_linux_sdk目录下文件
执行如下命令可检查到源码:

cd ~/rk3568_linux_sdk
..repo/repo/repo sync -l -j4

检出源码

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

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软件框图

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。

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

ls .repo/manifests/rk356x_linux/rk356x_linux_release*

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

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脚本使用方法:

./build.sh -h

查看帮助信息

常用如下:

./build.sh 常用指令

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

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

tar -xzf dl.tgz -C ~/rk3568_linux_sdk/buildroot/

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

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

./build.sh all

一键自动编译整个SDK

整个编译过程大约花了三个小时,出现"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目录
执行完后,进入rockdev目录,有如下结果:

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命令一样

./build.sh结果

单独编译

单独编译U-Boot

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

./build.sh uboot

开始编译uboot
uboot编译完成

编译完成后有两个镜像:

./uboot/uboot.img
./uboot/rk356x_spl_loader_v1.13.112.bin

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

单独编译kernel

执行如下命令:

./build.sh kernel

开始编译kernel
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根文件系统,在./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

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

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

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

recovery镜像

打包成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

打包成update.img

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

SDK清理

可以执行如下命令:

./build.sh cleanall

镜像介绍

会有如下图所示的一系列镜像:
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/288037.html

相关文章:

  • 浅谈Rust语言特性
  • [C/C++安全编程]_[中级]_[如何避免出现野指针]
  • MySQL 写入性能优化全攻略(附 GitHub 面试题项目链接)
  • 相机参数的格式与作用
  • 大语言模型置信度增强实战指南
  • 第 3 篇:《WHERE 就是刷选项——像点外卖一样精确筛房!》
  • 【硬件】嵌入式问题
  • FPGA相关通信问题详解
  • XSS漏洞总结
  • 商业秘密视域下计算机软件的多重保护困境
  • 正点原子stm32F407学习笔记9——PWM 输出实验
  • 深度学习中的模型剪枝工具Torch-Pruning的使用
  • HAMR硬盘高温写入的可靠性问题
  • RHCE(2)
  • Qt Graphs 模块拟取代 charts 和 data visualization还有很长的路要走
  • 完美解决 Ubuntu 中自定义启动器图标重复的问题(以 MATLAB 为例)
  • 游戏开发日志
  • 操作系统-进程同步机制
  • 搭建比分网服务器怎么选数据不会卡顿?
  • SEO长尾关键词优化实战指南抢占市场
  • 基于DTLC-AEC与DTLN的轻量级实时语音增强系统设计与实现
  • 你的网站正在被Google最新算法惩罚吗?
  • SpringJDBC源码初探-JdbcTemplate类
  • xss的利用
  • 博图SCL语言中常用运算符使用详解及实战案例(下)
  • 抖音回应:没有自建外卖,就是在团购的基础上增加的配送功能
  • 前端开发技巧:浏览器模拟弱网络环境
  • Streamlit 官翻 4 - 快速参考、知识库 Quick Reference
  • 电脑windows系统深度维护指南
  • 网络包从客户端发出到服务端接收的过程