2. Linux SDK 简介

Xniupi Linux SDK是基于Rockchip Linux SDK优化开发的针对XNIUPI小牛派R系列开发板/开发主机的Linux SDK,包含 Linux 系统开发用到的 boot 源码、内核源码、MCU源码、驱动、工具、系统中间件与应用程序包等,可以方便的定制、编译、打包生成Linux固件镜像。

2.1 SDK 工程目录结构

Xniupi Linux SDK工程目录包含有buildroot、debian、app、kernel、u-boot、device、docs、external等目录。采用manifest来管理仓库,用repo工具来管理每个目录或其子目录会对应的git工程。以下为SDK工程目录结构(以基于RK3588的XNIUPI-R800为例):

XNIUPI-R800_RK3588_Linux_SDK
|-- app # 存放上层应用APP,主要是一些应用Demo
|-- buildroot
|   |-- configs
|   |   |-- rockchip_rk3588_defconfig  # Rockchip RK3588 的默认配置文件
|   |-- package
|   |   |-- custom_package  # 自定义的软件包目录
|   |   |-- rockchip
|   |       |-- rk-kernel  # RK 内核相关的配置和补丁
|   |           |-- patches  # 内核补丁文件
|   |           |-- configs  # 内核配置文件
|   |-- support
|   |   |-- toolchain  # 工具链相关的脚本和配置
|-- debian
|   |-- overlay # 存放文件和目录,用于覆盖根文件系统,满足定制化需求,比如添加自定义配置文件、脚本等
|   |-- overlay-debug  # 可能用于存放调试相关的覆盖文件,比如包含调试工具、调试信息配置等
|   |-- packages # 用于存放 Debian 软件包相关文件,如软件包的源代码、编译脚本、控制文件等
|   |-- packages - patches # 存放对 Debian 软件包的补丁文件,用于修改软件包的源代码以适配特定需求或修复问题
|   |-- scripts # 包含各种脚本文件,可能用于自动化构建、配置、打包 Debian 系统相关的任务,比如编译脚本、安装脚本等
|   |-- ubuntu - build - service # 可能用于存放 Ubuntu 构建服务相关的配置文件,比如构建服务的脚本、配置文件等
|-- device
|   |-- rockchip
|   |   |-- rk3588
|   |       |-- rockchip_rk3588_evb7_v11_defconfig # 一个defconfig 配置代表一种 BSP 支持
|-- docs # 存放文档,包括开发指南、用户手册等
|-- external # 存放第三方仓库,比如显示、音视频、摄像头、网络、安全等
|   |-- alsa-config  # ALSA音频配置相关
|   |-- camera_engine_rkaiq  # Rockchip AIQ相机引擎
|   |-- chromium  # Chromium浏览器相关
|   |-- common_algorithm  # 通用算法库
|   |-- dpdk  # 数据平面开发套件
|   |-- drm-cursor  # DRM显示光标相关
|   |-- gstreamer-rockchip  # Rockchip定制的GStreamer多媒体框架
|   |-- libmali  # Mali GPU驱动库
|   |-- linux-rga  # Rockchip RGA(2D加速)驱动
|   |-- mpp  # Rockchip媒体处理平台
|   |-- recovery  # 恢复模式相关
|   |-- rk_pcba_test  # PCBA测试工具
|   |-- rknn-toolkit2  # RKNN神经网络工具包
|   |-- rknpu2  # Rockchip NPU驱动
|   |-- rkscript  # Rockchip脚本工具
|   |-- rktoolkit  # Rockchip工具包
|   |-- rkupdate  # 固件更新工具
|   |-- rkwifibt  # WiFi/BT驱动
|   |-- rkwifibt-app  # WiFi/BT应用
|   |-- rockchip-test  # Rockchip测试工具
|   |-- rockit  # Rockchip IT测试框架
|   |-- security  # 安全相关组件
|   |-- uac_app  # USB音频应用
|   |-- uvc_app  # USB视频应用
|   |-- xserver  # X窗口系统服务
|-- kernel
|   |-- arch
|   |   |-- arm64  # ARM64 架构相关代码
|   |       |-- boot  # 启动相关代码
|   |       |-- configs  # 内核配置文件
|   |       |-- dts  # 设备树源文件目录
|   |           |-- rockchip  # Rockchip 设备树文件
|   |-- drivers
|   |   |-- display  # 显示驱动目录
|   |       |-- rockchip  # Rockchip 显示驱动相关代码
|   |   |-- input  # 输入设备驱动目录
|   |-- fs  # 文件系统相关代码
|-- output # 存放编译输出的固件信息、编译信息、XML、主机环境等
|   |-- log # 日志
|-- prebuilts # 存放交叉编译工具链
|-- rkbin # 存放Rockchip相关二进制和工具
|   |-- bin  # 二进制文件目录
|   |-- scripts  # 脚本目录
|   |-- tools  # 工具目录
|-- rockdev  -> output/firmware  # 软链接到 output/firmware
|-- tools # 存放常用开发工具
|-- u-boot
|   |-- arch
|   |   |-- arm64  # ARM64 架构相关代码
|   |-- board
|   |   |-- rockchip  # Rockchip 相关的开发板代码
|   |   |-- rk3588  # RK3588 开发板相关代码
|   |-- common  # 通用代码目录
|   |-- include  # 头文件目录
|-- yocto
|   |-- conf
|   |   |-- local.conf  # Yocto 本地配置文件
|   |-- layers
|   |   |-- meta-rockchip  # Rockchip 相关的层目录
|   |       |-- recipes-core  # 核心配方目录
|   |       |-- recipes-kernel  # 内核配方目录

2.2 Linux软件框架

SDK软件架构主要分为四个层次:启动层、内核层、中间层(库)、应用层,系统框图架如下: Linux系统框架图

2.2.1 启动层

启动层主要主要提供系统启动,如BootROM、U-Boot、ATF等相关支持。

2.2.2 内核层

内核层主要提供Linux Kernel的标准实现,Linux也是一个开放的操作系统,Rockchip平台的Linux核心为标准的Linux4.19/5.10内核,提供安全性,内存管理,进程管理,网络协议栈等基础支持;主要是通过Linux内核管理设备硬件资源,如CPU调度、缓存、内存、I/O等。

2.2.3 中间层(库)

中间库对应一般嵌入式系统,相当于中间件层次。包含了各种系统基础库,及第三方开源程序库支持,对应用层提供API接口,系统定制者和应用开发者可以基于Libraries的API开发新的应用。

2.2.4 应用层

应用层主要实现具体的产品功能及交互逻辑,需要一些系统基础库及第三方程序库支持,开发者可以开发是自己的应用程序,提供系统各种能力给到最终用户。

2.3 SDK 已集成的 Linux 发行版

Xniupi Linux SDK目前已集成主流的几个Linux发行版(Distribution),包括buildroot、Debian、Yocto,以下简要介绍这几种SDK原生支持的Linux发行版。

2.3.1 Buildroot

Rockchip Linux SDK 的Buildroot系统,其包含了基于 Linux 系统开发用到的各种系统源码,驱动,工具,应用软件包。Buildroot 是 Linux 平台上一个开源的嵌入式 Linux 系统自动构建框架。整个Buildroot 是由 Makefile 脚本和 Kconfig 配置文件构成的。可通过Buildroot配置,编译出一个完整的可以直接烧写到机器上运行的 Linux 系统软件。 Buildroot_Compilation_Diagram Buildroot 有以下几点优势:

  • 通过源码构建,有很大的灵活性;

  • 方便的交叉编译环境,可以进行快速构建,容易上手;

  • 提供系统各组件的配置,方便定制开发。

使用 Buildroot 的 project 最出名的就是 Openwrt。可以看到,由它制作出的镜像可以跑在搭载16 Mb SPI NOR的路由器上,系统基本没包含多余的东西。 这就是得益于 Buildroot的简单化。整个 Buildroot工程在一个git维护。

Buildroot 使用 kconfig 和 make,一个defconfig 配置代表一种 BSP 支持。Buildroot 本身不具备扩展能力,用户需要自己通过脚本来完成工作。这些列出来的特点,都是和 Yocto 不同的地方。

小技巧

推荐有较强自主开发能力的用户使用 buildroot 进行开发,大部分用户建议直接使用Debian系统进行二次开发!

2.3.2 Debian

Debian 是一种完全自由开放并广泛用于各种设备的 Linux 操作系统选择Debian原因如下:

  • Debian 是自由软件 Debian 是由自由和开放源代码的软件组成,并将始终保持100%自由。每个人都能自由使用、修改,以及发布。大家可以基于Rockchip构建的Debian系统进行二次开发。

  • Debian 是一个基于 Linux稳定且安全的的操作系统。

  • Debian 是一个广泛用于各种设备的操作系统,其使用范围包括笔记本计算机,台式机和服务器。自1993年以来,它的稳定性和可靠性就深受用户的喜爱。我们为每个软件包提供合理的默认配置。

  • Debian 开发人员会尽可能在其生命周期内为所有软件包提供安全更新。

  • Debian 具有广泛的硬件支持。大多数硬件已获得 Linux 内核的支持。当自由软件无法提供足够的支持时,也可使用专用的硬件驱 动程序。目前Rockchip RK3588/RK3568/RK3566/RK3399/RK3288等芯片已经适配并支持。

  • Debian 提供平滑的更新。

  • Debian 以在其发行周期内轻松流畅地进行更新而闻名,不仅如此,还包括轻松升级到下一个大版本。Rockchip目前已从Debian Stretch(9)升级到Debian Buster(10)和 Bullseye(11)版本。

  • Debian 是许多其他发行版的种子和基础。 许多非常受欢迎的 Linux 发行版,例如 Ubuntu、Knoppix、PureOS、SteamOS 以及 Tails,都选择了 Debian 作为它们的软件基础。Debian 提供了所有工具,因此每个人都可以用能满足自己需求的软件包来扩展 Debian 档案库中的软件包。

  • Debian 项目是一个社区。

Debian 不只是一个 Linux 操作系统。该软件由来自世界各地的数百名志愿者共同制作。即使您不是一个程序员或系统管理员,也可以成为 Debian 社区的一员。

Rockchip定制版的Debian系统是通过Shell脚本来达到获取构建Linux Debian发行版源码,编译和安装适配Rockchip硬加速包的操作系统。

小技巧

目前该系统主要针对客户前期评估、第三方系统移植参考、和产品有复杂桌面需求等。为降低开发难度和维护难度,针对大部分用户,我们还是推荐直接使用 Linux Debian 系统!

2.3.3 Yocto

Yocto 和 Buildroot 一样, 是一套构建嵌入式系统的工具,但是两者的风格完全不同。Yocto 工程是通过一个个单独的包(meta)来维护,比如有的包负责核心,有的包负责外围。有的包用于跑 Rockchip 的芯片,有的包用于安装上weston, 有的包是则是用于跑 debian, 同样采用类似机制的nodejs,社区膨胀非常厉害,活跃度很高,每个人都可分享自己的成果到 github 上,这样的机制保证了我们可从互联网复用别人的工作成果,相当有价值。相比Buildroot系统,Yocto有其更强的编译机制,比如第三方包的依赖和重编,都会自动处理。缺点相对复杂、需VPN网络。

Yocto是一个非常灵活的构建系统,允许用户使用shell和Python来处理各种特殊情况。如果您需要更多关于Yocto的信息,请查看以下参考资料:

Yocto官网

Rockchip Yocto Wiki

Yocto stable branch

小技巧

目前,该系统主要针对国外客户。如果用户使用该系统,需要用户具有较强开发能力,我司不提供额外技术支持!

2.4 系统启动流程

SDK系统启动流程如下: 示例图片

注解

AP 和 MCU 内部都有集成⼀个 BOOTROM,系统上电时先会运⾏ BOOTROM代码,然后 BOOTROM 代码会探测外设存储器并加载 Loader 代码。 Pre Loader ⽬前有 3 个: miniloader(⾮开源), uboot spl 和 loader。

修订历史

修订时间 版本号 修订人 修订内容
2025年4月6号 V0.9 nnewn-kwf 首次创建