上手教程
介绍
串口调试
升级固件
介绍
使用USB线缆升级固件
MaskRom模式
使用SD卡升级固件
Linux开发
编译 Linux 固件(内核版本 6.1)
编译 Linux 固件(内核版本 5.10)
Firefly Linux 开发指南
技术案例
Android开发
ADB 使用
编译环境搭建
编译Android12.0 固件
编译 Android14.0 固件
Firefly Android 开发指南
FireflyApi2 使用手册
技术案例
接口使用
ADC 使用
Camera 使用
Display 使用
Ethernet 使用
GPIO 使用
HDMI-IN 使用
LED 使用
PCle 使用
PWM 使用
RTC 使用
SATA 使用
SPI 使用
UART 使用
Watchdog 使用
配件
摄像头模组
显示屏模组
通信模组
其他
大语言模型
NPU使用
常见问题解答
参考资料
资源下载
Core-3588L
产品规格书

上手教程

1. 介绍

Core-3588L 基于 Rockchip 全新一代旗舰 AIoT 芯片 – RK3588,采用了 8nm LP 制程;搭载八核(Cortex-A76 x 4 Cortex-A55 x 4)64位 CPU,主频高达2.4 GHz。

集成 ARM Mali-G610 MP4 四核 GPU,内置 AI 加速器 NPU,可提供6 Tops 算力,支持主流的深度学习框架;最大支持32 GB 大内存;支持 8K 视频编解码和多种格式的视频输入输出;支持多 种操作系统;可适用于 ARM PC、边缘计算、云服务器、智能NVR 等领域。

_images/AIO-3588L.png

2.串口测试

USB转TTL串口模块

一、产品介绍

产品简介

_images/usb-to-ttl-serial.png

发货清单

_images/usb-to-ttl-serial_shop_list.png

详细参数

  参数
尺寸 25x15.5mm
芯片 CP2104
LED Power LED, TX LED, RX LED
USB 类型 MicroUSB
排针 2.54mm 3PIN

二、使用方法

硬件连接

注意: 如使用其它串口适配器遇到 TX 和 RX 不能输入和输出的问题,可以尝试对调 TX 和 RX 的连接。

使用说明

串口参数配置

  • 波特率:1500000

  • 数据位:8

  • 停止位:1

  • 奇偶校验:无

  • 流控:无

说明: 以下表格中板型的调试串口波特率有所不同,是 115200。

板卡型号
RK3128 全系列,RK3288 全系列,AIO-3576JD4

Windows 上使用串口调试

安装驱动

下载驱动并安装:

如果在 Win8 上不能正常使用 PL2303,参考这篇文章, 采用 3.3.5.122 或更老版本的旧驱动即可。

如果在 Windows 系统上安装官网的 CP210X 驱动,使用 PUTTY 或 SecureCRT 等工具设置串口波特率为 1500000,如果出现设置不了或无效的问题,可以下载旧版本驱动

插入适配器后,系统会提示发现新硬件,并初始化,之后可以在设备管理器找到对应的 COM 口:

_images/debug_find_com.png

安装软件

Windows 上一般用 putty 或 SecureCRT。其中我们推荐使用 MobaXterm 免费版本。这是一款功能强大的终端软件,在这里介绍一下,MobaXterm 的使用方法与之类似。

到这里下载 MobaXterm

  1. 选择 sessionSerial

  2. Serial port 修改为在设备管理器中找到的 COM 端口。

  3. 设置 Speed (bsp) 为 1500000。

  4. 点击 OK 按钮。

_images/debug_set_MobaXterm1.png

_images/debug_set_MobaXterm2.png

Ubuntu 上使用串口调试

在 Ubuntu 上可以有多种选择:

  • minicom

  • picocom

  • kermit

篇幅关系,以下就介绍 minicom 的使用。

安装 minicom


注意:Hardware Flow Control Software Flow Control 都要设成 No,否则可能导致无法输入。

设置完成后回到上一菜单,选择 Save setup as dfl 即可保存为默认配置,以后将默认使用该配置。

升级固件

1. 介绍

1.1. 前言

AIO-3588L出厂默认会有一个操作系统,如果用户要运行其他操作系统,需要使用对应的固件烧写到主板。

AIO-3588L有灵活的启动方式。一般情况下,除非硬件损坏,AIO-3588L 开发板是不会变砖的。

如果在升级过程中出现意外,bootloader 损坏,导致无法重新升级,此时仍可以进入 MaskRom 模式来修复。

1.2. 固件获取

1.3. 升级方式

AIO-3588L 支持通过以下两种方式升级固件:

  • 使用USB线缆升级固件

    使用AIO-3588L 将主板连接到电脑上,通过升级工具将固件烧写到主板上。
     

  • 使用SD卡升级固件

    通过升级卡制作工具,将MicroSD卡制作为升级卡(建议使用32G及以下容量的卡),将升级卡插入主板,上电开机,机器自动执行升级。

1.4. 启动存储器

AIO-3588L 从以下的存储器中加载系统:

  • eMMC 接口

  • SDMMC 接口

1.5. 启动模式

AIO-3588L有三种启动模式:

  • Normal 模式

  • Loader 模式

  • MaskRom 模式

1.5.1. Normal 模式

Normal 模式就是正常的启动过程,各个组件依次加载,正常进入系统。

1.5.2. Loader 模式

在 Loader 模式下,bootloader 会进入升级状态,等待主机命令,用于固件升级等。

1.5.3. MaskRom 模式

MaskRom 模式用于 bootloader 损坏时的系统修复。

一般情况下是不用进入 MaskRom 模式的,只有在 bootloader 校验失败(读取不了 IDB 块,或 bootloader 损坏) 的情况下,BootRom 代码 就会进入 MaskRom 模式。此时 BootRom 代码等待主机通过 USB 接口传送 bootloader 代码,加载并运行之。

要强行进入 MaskRom 模式,请参阅《MaskRom模式》一章。

2. 使用USB线缆升级固件

2.1. 前言

本文介绍了如何将主机上的固件,通过Type-C 数据线烧录到 Core-3588L 开发板的存储器中。升级时,需要根据主机操作系统和固件类型来选择合适的升级方式。

2.2. 准备工具

  • AIO-3588L 开发板

  • 固件

  • 主机

  • 良好的Type-C 数据线

2.3. 准备固件

固件可以通过编译SDK获得,也可以通过资源下载处下载公版固件(统一固件)。固件文件一般有两种:

  • 单个统一固件

    统一固件是由分区表、bootloader、uboot、kernel、system等所有文件打包合并成的单个文件。Firefly正式发布的固件都是采用统一固件格式,升级统一固件将会更新主板上所有分区的数据和分区表,并且擦除主板上所有数据。

  • 多个分区镜像

    即各个功能独立的文件,如分区表、bootloader、kernel等,在开发阶段生成。独立分区镜像可以只更新指定的分区,而保持其它分区数据不被破坏,在开发过程中会很方便调试。

通过统一固件解包/打包工具,可以把统一固件解包为多个分区镜像,也可以将多个分区镜像合并为一个统一固件。

2.4. 安装烧写工具

2.4.1. Windows操作系统

  • 安装RK USB驱动

下载 Release_DriverAssistant.zip,解压,然后运行里面的 DriverInstall.exe 。为了所有设备都使用更新的驱动,请先选择驱动卸载,然后再选择驱动安装

_images/upgrade_firmware_install_rk_usb.jpg

  • 运行AndroidTool的RKDevTool.exe

_images/upgrade_firmware_androidtool_zh.png

2.4.2. Linux操作系统

Linux 下无须安装设备驱动

下载 Linux_Upgrade_Tool, 并按以下方法安装到系统中,方便调用:


下载 Linux_adb_fastboot, 并按以下方法安装到系统中,方便调用:


2.5. 进入升级模式

通常我们升级固件的模式有两种,分别是Loader模式和MaskRom模式。烧写固件前,我们需要连接好设备,并让板子进入到可升级模式。

2.5.1. Loader模式

2.5.1.1. 硬件方式进入Loader模式

连接设备并通过RECOVERY按键进入Loader升级模式步骤如下:

  • 先断开电源适配器连接

  • 使用 Type-C 数据线一端连接主机,一端连接开发板

_images/upgrade_otg_interface.jpg

  • 按住设备上的 RECOVERY (恢复)键并保持

  • 硬件版本不同,按键位置可能略有不同,请以实际丝印为准

_images/upgrade_recovery_reset.png

  • 接上电源

  • 大约两秒钟后,松开 RECOVERY 键

2.5.1.2. 软件方式进入Loader模式

Type-C 数据线接好后在串口调试终端或adb shell给板子运行以下命令


2.5.1.3. 查看Loader模式

如何确定板子是否进入Loader模式,我们可以通过工具去查看

Windows操作系统

通过AndroidTool工具可以看到下方提示Found One LOADER Device 

_images/upgrade_firmware_androidtool_zh.png

如果有进行”进入Loader模式”的操作,仍旧没有看到烧写工具提示LOADER,此时可以可以看一下Windows主机是否有提示发现新硬件并配置驱动。打开设备管理器,会见到新设备 Rockusb Device 出现,如下图。如果没有,可返回上一步重新安装驱动

_images/upgrade_firmware_new_equipment.jpg

Linux操作系统

运行upgrade_tool后可以看到连接设备中有个Loader的提示


2.5.2. MaskRom模式

进入MaskRom模式的方法,请参考《MaskRom模式》

2.6. 烧写固件

2.6.1. windows操作系统

2.6.1.1. 烧写统一固件 update.img

烧写统一固件 update.img 的步骤如下:

  1. 切换至Upgrade Firmware页。

  2. Firmware按钮,打开要升级的固件文件。升级工具会显示详细的固件信息。

  3. Upgrade按钮开始升级。

  4. 如果升级失败,可以尝试先按EraseFlash 按钮来擦除 Flash,然后再升级。

_images/upgrade_firmware_erase_flash_zh.png

2.6.1.2. 烧写分区映像

烧写分区映像的步骤如下:

  1. 切换至Upgrade Firmware页。

  2. 勾选需要烧录的分区,可以多选。

  3. 确保映像文件的路径正确,需要的话,点路径右边的空白表格单元格来重新选择。

  4. 点击Run按钮开始升级,升级结束后设备会自动重启。

_images/upgrade_firmware_androidtool_zh.png

2.6.2. Linux操作系统

2.6.2.1. 烧写统一固件 update.img


2.6.2.2. 烧写分区镜像


2.7. 常见问题

2.7.1. 1. 如何强行进入 MaskRom 模式

如果板子进入不了 Loader 模式,此时可以尝试强行进入 MaskRom 模式。操作方法见《MaskRom模式》

2.7.2. 2. 烧写失败分析

如果烧写过程中出现Download Boot Fail, 或者烧写过程中出错,如下图所示,通常是由于使用的USB线连接不良、劣质线材,或者电脑USB口驱动能力不足导致的,请更换USB线或者电脑USB端口排查。 

_images/upgrade_firmware_download_fail.png

3. MaskRom模式

有关启动模式的介绍,请参阅《升级固件介绍》一章

3.1. 简介

MaskRom 模式是设备变砖的最后一条防线。强行进入 MaskRom 涉及硬件操作,有一定风险,因此仅在设备进入不了 Loader 模式的情况下,方可尝试 MaskRom 模式。进入 MaskRom 的原理是人为的把 EMMC 的数据脚与地线短接,系统会认为 EMMC 数据出错,从而清除 EMMC 数据。

请小心阅读,并谨慎操作!

操作步骤如下:

可以按maskrom 按键,然后进行上电 

_images/upgrade_maskrom_key.png

此时设备就会进入 MaskRom 模式。

_images/upgrade_maskrom_zh.png

4. 使用SD卡升级固件

本文主要介绍如何通过MicroSD卡,升级主板上的固件。

使用MicroSD升级固件(建议用32G及以下容量的卡),需要在电脑上,通过做卡工具,将统一固件写入MicroSD卡,目前此操作只支持在Windows操作系统上完成。

4.1. 准备工具

4.2. 操作步骤

  • 下载需要升级到主板上的统一固件。

  • 打开SD_Firmware_Tool,勾选固件升级框,点击选择固件选择正确升级固件。

  • 将MicroSD插入USB读卡器,再插入到电脑USB口上,在列表式组合框中选择正确的USB设备。

  • 点击开始创建之后,等待创建结束。

  • 取出MicroSD卡,插入主板的MicroSD卡插槽,对主板上电开机,主板自动开始升级。

  • 升级完成后,取出MicroSD卡,主板自动重启,完成整个升级固件的流程。

_images/upgrade_firmware_sd_tool_zh.png

Linux开发

1. 编译 Linux 固件 (内核版本 6.1)

1.1. 获取 SDK

请联系销售(sales@t-firefly.com)获取 SDK 下载链接。

注意:

1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上

2. 编译环境请使用 Ubuntu20.04(真机或 docker 容器),如果使用其他版本可能导致编译出错

3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK

4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)

准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以~/proj为例

1.1.1. 校验与解压

下载完成后先验证一下 MD5 码:


1.2. SDK 配置介绍

1.2.1. 目录介绍


1.2.2. 配置文件介绍

device/rockchip/rk3588/ 目录下,有不同板型的配置文件(xxxx_defconfig),用于管理 SDK 每个环节的编译配置。

配置文件命名规则:


1.2.3. 分区说明

parameter 文件中包含了固件的分区信息,比如 device/rockchip/rk3588/parameter-xxxxxx-fit.txt

FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3588
MACHINE_ID: 007
MANUFACTURER: RK3588
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
GROW_ALIGN: 0
CMDLINE: mtdparts=:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00040000@0x00008000(boot:bootable),0x00040000@0x00048000(recovery),0x00010000@0x00088000(backup),0x01c00000@0x00098000(rootfs),-@0x01c98000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
uuid:boot=7A3F0000-0000-446A-8000-702F00006273

CMDLINE 属性是我们关注的地方,以 uboot 为例, 0x00002000@0x00004000(uboot) 中 0x00004000 为 uboot 分区的起始位置,0x00002000 为分区的大小,以此类推。分区的起始位置 分区大小 = 下一个分区的起始位置。

parameter 中数字的单位是 “块”,每块 512 字节。所以 uboot 分区大小为 0x00002000,即 8192 块,共 8192 x 512 / 1024 / 1024 = 4 MiB

1.3. 编译 Ubuntu 固件

1.3.1. 准备工作

执行下面两条命令来安装需要的工具


下载根文件系统:Ubuntu 根文件系统(64位) Kernel6.1,请使用网盘中 kernel-6.1 目录下的文件系统。

下载后将文件系统解压到 SDK/prebuilt_rootfs/ 下,并创建链接


1.3.2. 编译前配置

执行 ./build.sh lunch 列出所有可用的配置文件,输入编号选择对应的配置文件,注意要选择带有 ubuntu 字样的配置文件:


1.3.3. 编译

1.3.3.1. 完整编译

执行如下命令即可


编译完成后会生成完整固件 output/update/update.img

1.3.3.2. 部分编译

一般来说自定义开发只涉及 kernel 和 uboot。因此,在进行过一次完整编译后,如果后续又修改了 kernel 或 uboot,可以部分编译来加快速度。

  • 单独编译 u-boot,生成 u-boot/uboot.img


1.4. 编译 Debian 固件

1.4.1. 准备工作

执行下面两条命令来安装需要的工具


下载根文件系统:Debian 根文件系统(64位),请使用网盘中 kernel-6.1 目录下的文件系统。

下载后将文件系统解压到 SDK/prebuilt_rootfs/ 下,并创建链接


1.4.2. 编译前配置

执行 ./build.sh lunch 列出所有可用的配置文件,输入编号选择对应的配置文件,注意要选择带有 debian 字样的配置文件:


1.4.3. 编译

1.4.3.1. 完整编译

执行如下命令即可


编译完成后会生成完整固件 output/update/update.img

1.4.3.2. 部分编译

一般来说自定义开发只涉及 kernel 和 uboot。因此,在进行过一次完整编译后,如果后续又修改了 kernel 或 uboot,可以部分编译来加快速度。

  • 单独编译 u-boot,生成 u-boot/uboot.img


1.5. 编译 Buildroot 固件

1.5.1. 准备工作

执行下面两条命令来安装需要的工具


1.5.2. 编译前配置

执行 ./build.sh lunch 列出所有可用的配置文件,输入编号选择对应的配置文件,注意要选择带有 buildroot 字样的配置文件:


1.5.3. 编译

1.5.3.1. 完整编译

执行如下命令即可


编译完成后会生成完整固件 output/update/update.img

1.5.3.2. 部分编译

进行过一次完整编译后,如果后续又修改了 kernel 或 uboot,可以部分编译来加快速度。

  • 单独编译 u-boot,生成 u-boot/uboot.img


但是如果你修改了 buildroot,需要重新进行完整编译。

2. 编译 Linux 固件 (内核版本 5.10)

2.1. 获取 SDK

首先准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以~/proj为例

注意:

1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上

2. 编译环境请使用 Ubuntu18.04(真机或 docker 容器),如果使用其他版本可能导致编译出错

3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK

4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)

2.1.1. 安装工具

获取 SDK 需要先安装:


2.1.2. 初始化仓库

  • 方法一(推荐国内用户使用)

SDK 源码存放于 gitlab,国内用户可能下载完整的 SDK 仓库速度比较慢,所以我们提供了一个 SDK 基础包(Linux SDK),国内用户只需要在此基础包上同步 gitlab 上的代码就可以了

下载完成后先验证一下 MD5 码:


  • 方法二

通过 repo 拉取代码,此方法对网络要求较高,有条件可以使用

可选择获取完整 SDK 或者 BSP:

mkdir ~/proj/rk3588_sdk/
cd ~/proj/rk3588_sdk/

## 完整 SDK
repo init --no-clone-bundle --repo-url https://gitlab.com/firefly-linux/git-repo.git -u https://gitlab.com/firefly-linux/manifests.git -b master -m rk3588_linux_release.xml

## BSP ( 只包含基础仓库和编译工具 )
## BSP 包括 device/rockchip 、docs 、 kernel 、 u-boot 、 rkbin 、 tools 和交叉编译链
repo init --no-clone-bundle --repo-url https://gitlab.com/firefly-linux/git-repo.git -u https://gitlab.com/firefly-linux/manifests.git -b master -m rk3588_linux_bsp_release.xml

2.1.3. 同步代码

执行如下命令同步代码:


因为网络环境等原因,.repo/repo/repo sync -c --no-tags 命令更新代码可能会失败,可多次反复执行。

2.2. Linux SDK 配置介绍

2.2.1. 目录介绍


2.2.2. 配置文件介绍

device/rockchip/rk3588/ 目录下,有不同板型的配置文件(xxxx.mk),用于管理 SDK 每个环节的编译配置,相关配置介绍:


2.2.3. 分区说明

2.2.3.1. parameter 分区表

parameter.txt 文件中包含了固件的分区信息,以 parameter-ubuntu-fit.txt 为例:

路径:device/rockchip/rk3588/parameter-xxxxxx-fit.txt

FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3588
MACHINE_ID: 007
MANUFACTURER: RK3588
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot:bootable),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x00c00000@0x00078000(rootfs),0x00040000@0x00c78000(oem),-@0x00cb8000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

CMDLINE 属性是我们关注的地方,以 uboot 为例, 0x00002000@0x00004000(uboot) 中 0x00004000 为uboot 分区的起始位置,0x00002000 为分区的大小,以此类推。

2.2.3.2. package-file

package-file 文件用于打包固件时确定需要的分区镜像和镜像路径,同时它需要与 parameter.txt 文件保持一致。

路径:tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file


2.3. 编译 Ubuntu 固件

本章介绍 Ubuntu 固件的编译流程,推荐在 Ubuntu 18.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。

本教程的编译部分适用于 v1.0.6e 以上 SDK 版本


2.3.2. 编译 SDK

2.3.2.1. 编译前配置

device/rockchip/rk3588/ 目录下,有不同板型的配置文件,选择配置文件:


2.3.2.2. 编译

2.3.2.2.1. 全自动编译


生成的完整固件会保存到 rockdev/pack/ 目录。

2.3.2.2.2. 部分编译
  • 编译 u-boot



2.4. 编译 Yocto 固件

2.4.1. 获取SDK

repo init --no-clone-bundle --repo-url https://gitlab.com/firefly-linux/git-repo.git -u https://gitlab.com/firefly-linux/manifests.git -b master -m rk3588_yocto_kirkstone_release.xml
.repo/repo/repo sync -c

2.4.2. 编译

2.4.2.1. 选择映像

Yocto 项目提供了一些可用于不 layer 的映像。下表列出目前支持构建的映像和相关配方。

映像名字 描述 提供的layer
core-image-minimal A small image that only allows a device to boot Poky
core-image-minimal-xfce A XFCE minimal demo image meta-openembedded/meta-xfce
core-image-sato Image with Sato, a mobile environment and visual style for mobile devices. The image supports X11 with a Sato theme, Pimlico applications, and contains terminal, editor, and file manager Poky
core-image-weston A very basic Wayland image with a terminal Poky
core-image-x11 A very basic X11 image with a terminal Poky

2.4.3. 编译映像文件

使用 bitbake 命令构建的过程需要保证网络连接正常,如果是中国内陆客户需要保证能 ping 通外网

进入目录 ,按顺序执行如下命令


以下是基于 wayland 的 core-image 。需要在 /path/to/yocto/meta-rockchip/conf/machine/include/display.conf 修改 DISPLAY_PLATFORM 为 wayland 。修改如下:

如果想单独编译部分 recipes 可以参考以下内容:


2.4.4. 调整编译速度

修改文件/path/to/yocto/meta-rockchip/conf/machine/firefly-rk3588.conf 中的 BB_NUMBER_THREADS 和 PARALLEL_MAKE 变量配置。若线程数量设置过大可能会导致机器内存不足,导致编译失败。请根据编译机器的配置来设置编译速度。


  • BB_NUMBER_THREADS: The maximum number of threads BitBake simultaneously executes.

  • BB_NUMBER_PARSE_THREADS: The number of threads BitBake uses during parsing.

  • PARALLEL_MAKE: Extra options passed to the make command during the do_compile task in order to specify parallel compilation on the local build host.

  • PARALLEL_MAKEINST: Extra options passed to the make command during the do_install task in order to specify parallel installation on the local build host.

2.4.5. 更多 bitbake 选项

从根本上说,BitBake 是一个通用任务执行引擎,它允许 shell 和 Python 任务高效并行运行,同时在复杂的任务间依赖约束下工作。 BitBake 的主要用户之一,OpenEmbedded,利用这个核心并使用面向任务的方法构建嵌入式 Linux 软件堆栈。更多详细使用方法请查看《bitbake-user-manual》


Bitbake paramater 描述
-c fetch 拉取目标所需要的代码
-c clean 清除目标的输出文件
-c cleanall 删除目标所有输出文件、共享高速缓存(shared state cache)和源代码
-c compile -f 使用此选项可在部署映像后强制重新编译,但不建议使用,除非 Yocto Project 不知道目标代码已经发生改变
-c listtasks 列出目标定义的所有 target

2.4.6. 分区固件烧写

编译生成的固件位于目录/build/tmp/deploy/images/board/


  • 分区烧写适用于调试阶段,固件验证请使用下文的统一固件烧写

  • rootfs 不支持单独烧写,需要打包完整固件再烧写

2.4.7. 统一固件烧写

编译生成的固件位于目录/build/tmp/deploy/images/board/,待下载的文件为.wic与update.img,进入loader模式后执行如下命令:


  • 固件默认登录账号为:root,密码为:firefly 。固件含有普通用户账号名称为:firefly ,密码为:firefly 。

注意:如果客户在 Windows PC 上开发,使用 RKdevtool 直接烧录 update.img 即可,不需要烧录 IMAGE NAME.wic。但是要注意一点是 update.img 是一个链接文件,实际得选择链接文件所指向的实际文件。

2.4.8. 相关概述

Yocto Project 是一个专注于嵌入式 Linux® 操作系统开发的开源协作项目,它提供灵活的工具集和开发环境,允许全球的嵌入式设备开发人员通过共享技术,软件堆栈,配置和用于创建这些定制的Linux映像的最佳实践进行协作。有关 Yocto 项目的更多信息,请参阅 Yocto Project 官网:www.yoctoproject.org/。 Yocto Project 官网上有 Yocto Project Reference ManualYocto Project Overview 等相关文档详细描述了如何构建系统。

2.4.9. Yocto Project Release layer 介绍

layer 路径 优先级(数字越大优先级越高) 描述
meta-oe meta-openembedded/meta-oe 6 contains a large amount of additional recipes
meta-python meta-openembedded/meta-python 7 Provide Python recipes
meta-qt5 meta-qt5 7 Provides QT5 recipes
meta-clang meta-clang 7 clang compiler
meta-rockchip meta-rockchip 9 Rockchip board level support available
meta meta 5 Contains the OpenEmbedded-Core metadata
meta-poky meta-poky 5 Holds the configuration for the Poky reference distribution
meta-yocto-bsp meta-yocto-bsp 5 Configuration for the Yocto Project reference hardware board support package.
meta-chromium meta-chromium 7 Provide chromium browser recipe

2.5. 编译 Debian 固件

本章介绍 Debian 固件的编译流程,推荐在 Ubuntu 18.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。

本教程的编译部分适用于 v1.0.6e 以上 SDK 版本


2.5.2. 编译 SDK

2.5.2.1. 编译前配置

device/rockchip/rk3588/ 目录下,有不同板型的配置文件,选择配置文件:


2.5.2.2. 编译

2.5.2.2.1. 全自动编译

2.5.2.2.2. 部分编译

  • 编译 u-boot



2.6. 编译 Buildroot 固件

本章介绍 Buildroot 固件的编译流程,推荐在 Ubuntu 18.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。

本教程的编译部分适用于 v1.0.6e 以上 SDK 版本


2.6.2. 编译 SDK

2.6.2.1. 编译前配置

device/rockchip/rk3588/ 目录下,有不同板型的配置文件,选择配置文件:


2.6.2.2. 编译

2.6.2.2.1. 全自动编译

全自动编译会执行上述编译、打包操作,生成 RK 固件。


打包固件,生成的完整固件会保存到 rockdev/pack/ 目录。

2.6.2.2.2. 部分编译

  • 编译 u-boot


Firefly Linux 开发指南

Firefly Linux 开发指南

4. 技术案例

4.1. 飞桨 FastDeploy

4.1.1. 介绍

FastDeploy 是一款全场景、易用灵活、极致高效的 AI 推理部署工具。提供开箱即用的云边端部署体验, 支持超过 150 Text, Vision, Speech和跨模态模型,并实现端到端的推理性能优化。包括图像分类、物体检测、图像分割、人脸检测、人脸识别、关键点检测、抠图、OCR、NLP、TTS等任务,满足开发者多场景、多硬件、多平台的产业部署需求。

目前 FastDeploy 初步支持 rknpu2,可以在 RK3588 平台上推理部分模型,其他模型还在适配中,具体支持列表和进度请前往:github

4.1.2. RK3588 端

4.1.2.1. 编译与安装

说明:本文测试是基于 RK3588 Firefly Ubuntu20.04 v1.0.4a 固件,采用 python 方式安装与部署,python 版本为 3.8 。因为固件中自带 rknpu2 v1.4.0 环境,因此本文跳过了准备 rknpu2 部分。其他部署方式、准备 rknpu2 等内容请查看官方文档: https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/rknpu2.md

4.1.2.1.1. 准备环境


这里提供一个提前编译好的 python 包用于快速测试:前往下载 提取码:1234

使用这个包的话可以跳过编译步骤,直接进行安装(上一步准备环境还是需要的)。该包基于 FastDeploy v1.0.0 (commit id c4bb83ee)

注意:此项目处于快速迭代中,这里提供的预编译包可能已经过时,仅供快速了解、测试。实际开发使用请从最新源码编译:

4.1.2.1.2. RK3588 上编译


如果你使用的 RK3588 内存比较小,编译可能会出现 OOM 错误,可以在python3 setup.py build命令后面追加-j N来控制编译线程数量。

4.1.2.1.3. RK3588 上安装

编译完成后可以在 FastDeploy/python/dist 下找到安装包,或者使用之前提供的预编译包。使用 pip3 安装


4.1.2.2. 推理模型

在完成安装后,这里提供了3个已经调整好的 demo,前往下载,提取码:1234

注意:此项目处于快速迭代中,这里提供的模型可能已经过时,仅供快速了解、测试。实际开发使用请前往本文开头官方 github 获取最新内容

解压后可以直接运行推理:

  • Picodet 物体检测模型


  • PaddleSeg 人像分割模型


4.1.3. PC 端

上一章节在 RK3588 上进行部署的只是运行环境,demo 是提前在 PC 端转换与调整好的。也就是说进一步的开发例如模型转换、参数调整等,是需要在 PC 端进行,所以还需要在 x86_64 Linux PC 上安装 FastDeploy。

4.1.3.1. 编译与安装

需求:Ubuntu18 及以上,python 环境 3.6 或 3.8

4.1.3.1.1. 安装 rknn-toolkit2

建议使用 conda 或 virtualenv 新建一个虚拟环境进行安装!安装 conda 或 virtualenv 的方法百度有很多,这里跳过。

首先前往下载 rknn_toolkit2 安装包:github


4.1.3.1.2. 编译安装 FastDeploy


4.1.3.2. 例子与教程

FastDeploy/examples 下有丰富的例子,每一层的 README.md 中都有详细的使用教程。

4.2. 容器虚拟安卓

AIC (Android in Container) 是指在 Linux 系统中使用容器来运行安卓。RK3588 Linux 即可使用 docker 来运行安卓并支持多开。

集群服务器搭配 AIC 可以增加安卓的密度,在云手机、云游戏等场景有很大的帮助。

此处有固件可供测试:点击前往 提取码 1234

4.2.1. 使用方法

说明:

  1. 固件使用的宿主系统是 Ubuntu Minimal 版本,使用 debug 串口、ssh、adb shell 等方式进行交互,没有桌面显示。

  2. 安卓的交互是通过网络 adb 连接并配合 scrcpy 等投屏工具实现,不是接入鼠标键盘来操作。

  3. 操作 AIC 需要知道基础的 Linux 终端操作知识、docker 容器知识、adb 使用方法。

4.2.1.1. 创建容器

将下载到的 container 文件夹复制到宿主机(RK3588)的 /userdata/ 目录下,通过里面的 aic.sh 脚本进行操作。

请将设备联网,首次运行需要先初始化:


更多内容请阅读 aic.sh 脚本

4.2.1.2. 连接容器

在局域网中使用任意电脑通过 adb 即可访问容器。


adb 和 scrcpy 的安装方法请自行上网搜索。

4.2.1.3. 管理容器

使用 docker 命令管理容器即可。


4.2.2. 性能展示

以 root 身份执行以下命令开启性能模式可以获得更好的体验:


单个 RK3588 使用 AIC 同时运行两个最高画质原神可达 35 帧以上: 

_images/aic_ys_performance.png

Android开发

1. ADB 使用

1.1. 前言

ADB,全称 Android Debug Bridge,是 Android 的命令行调试工具,可以完成多种功能,如跟踪系统日志,上传下载文件,安装应用等。

1.2. 准备连接

使用 Type-C 数据线连接 PC 以及设备的 OTG 端口。

 

_images/upgrade_otg_interface.jpg

1.3. 网络 ADB

  • 设置 -> 开发者选项 -> 网络 ADB 调试

查看开发板 IP 地址,PC 端通过网络访问:


1.4. Windows下的 ADB 安装

首先参照安装 RK USB 驱动一节安装好驱动。

然后下载 adb.zip,解压到 C:adb 以方便调用。

打开命令行窗口,输入:


如果一切正常,就可以进入 adb shell,在设备上面运行命令。

1.5. Ubuntu 下的 ADB 安装

  • 安装 ADB 工具:


1.6. 常用 ADB 命令

1.6.1. 连接管理

列出所有连接设备及其序列号:


1.7. 调试

1.7.1. 获取系统日志 adb logcat

  • 用法


1.7.2. 运行命令 adb shell

1.7.2.1. 获取详细运行信息 adb bugreport

adb bugreport 用于错误报告,里面包含大量有用的信息。

  • 示例


1.7.3. root 权限

如果 TARGET_BUILD_VARIANT 使用的是 userdebug 模式,要获得 root 权限,需要先运行:


让 ADB 的设备端切换到 root 权限模式,这样 adb remount 等需要 root 权限的命令才会成功。

1.8. 应用管理

1.8.1. 安装应用 adb install

  • 用法:


如果安装成功,工具会返回成功提示 Success;失败的话,一般是以下几种情况:

  • INSTALL_FAILED_ALREADY_EXISTS: 此时需要用 -r 参数来重新安装。

  • INSTALL_FAILED_SIGNATURE_ERROR: 应用的签名不一致,可能是发布版和调试版签名不同所致。如果确认 APK 文件签名正常,可以用 adb uninstall 命令先卸载旧的应用,然后再安装。

  • INSTALL_FAILED_INSUFFICIENT_STORAGE: 存储空间不足,需要检查设备存储情况。

1.8.2. 卸载应用 adb uninstall

  • 用法:


前面是 apk 文件,后面则是对应的包名称。

1.8.3. 命令行帮助信息 adb help


2. 编译环境搭建

2.1. 准备工作

编译 Android 对机器的配置要求较高:

  • 64 位 CPU

  • 16GB 物理内存 交换内存

  • 250GB 空闲的磁盘空间

建议使用 Ubuntu 18.04 操作系统或更高版本

  • Ubuntu 16.04 或 18.04 软件包安装参考:

此时视报错信息去安装缺少的软件包(dtc)即可

3. 编译 Android12.0 固件

3.1. 下载 Android12.0 SDK

SDK 源码与 bundle 压缩包均存放在云盘中。

3.1.1. 下载 SDK

  • SDK通过邮件的方式获取,把订单号发送到sales@t-firefly.com邮箱并注明需要的SDK名称firefly_rk3588_android12_git_20240704

  • 下载完成后,在解压前先校验下 MD5 码:

    
    
  • 然后解压:

    
    

注意:不要在共享文件夹、挂载文件夹以及非英文目录解压SDK,避免产生不必要的错误

3.1.2. 更新 SDK

下载 SDK 后,从 gitlab 处更新代码的方法:


下载页面选择云盘下载 Android12.0 Bundle

3.2. Core-3588L 产品编译方法

3.2.1. 整体编译

3.2.1.1. HDMI 固件编译

3.2.2. 分步编译

  • 编译 kernel:


3.2.3. 打包成统一固件 update.img

编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:


打包完成后将在rockdev/Image-aio_3588l/ 目录下生成统一固件: product名XXX_XXX_日期XXX.img

在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdevImage 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdevImage 目录里。

3.3. 其他编译说明

3.3.1. Android12.0 不能直接烧写 kernel.img 和 resource.img

Android12.0的kernel.imgresource.img包含在boot.img中,编译kernel后需要在android根目录下执行./mkimage.sh重新打包boot.img,然后烧写rockdev/Image-aio_3588l/目录下的boot.img

3.3.2. 单独编译kernel生成boot.img

编译的原理:在kernel目录下将编译生成的 kernel.imgresource.img 替换到旧的 boot.img 中, 所以编译的时候需要用 BOOT_IMG=xxx 参数指定boot.img的路径,命令如下:


编译后可以直接烧写kernel目录下的boot.img

3.4. 分区镜像

编译的时候执行 ./mkimage.sh 会重新打包 boot.imgsuper.img, 并将其它相关的镜像文件拷贝到目录 rockdev/Image-aio_3588l/ 中。以下列出一般固件用到的镜像文件:

固件 说明
boot.img 包含ramdis、kernel、dtb
dtbo.img Device Tree Overlays
MiniLoaderAll.bin 包含一级loader
misc.img 包含recovery-wipe开机标识信息,烧写后会进行recovery
parameter.txt 包含分区信息
recovery.img 包含recovery-ramdis、kernel、dtb
super.img 包含odm、product、vendor、system、system_ext分区内容
uboot.img 包含uboot固件
vbmeta.img 包含avb校验信息,用于AVB校验
update.img 包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包

请参照 《使用USB线缆升级固件》 一文来烧写分区镜像文件。

3.5. OTA 编译

请参照《OTA编译》章节

3.6. 常见问题

3.6.1. git clone 远程 bundle 仓库失败

Q:更新SDK时,git clone 远程 bundle 仓库出错:


4. 编译 Android14.0 固件

4.1. 下载 Android14.0 SDK

SDK 源码与 bundle 压缩包均存放在云盘中。如有需要请联系商务 : sales@t-firefly.com

4.1.1. 下载 SDK

  • SDK通过邮件的方式获取,把订单号发送到sales@t-firefly.com邮箱并注明需要的SDK名称firefly_rk3588_android14_git_20240822

  • 下载完成后,在解压前先校验下 MD5 码:

    
    
  • 然后解压:

    
    

注意:不要在共享文件夹、挂载文件夹以及非英文目录解压SDK,避免产生不必要的错误

4.1.2. 更新 SDK

下载 SDK 后,从 gitlab 处更新代码的方法:


下载页面选择云盘下载 Android14.0 Bundle

4.2. Core-3588L 产品编译方法

4.2.1. 整体编译

4.2.1.1. HDMI 固件编译

4.2.2. 分步编译

  • 编译 kernel:


4.2.3. 打包成统一固件 update.img

编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:


打包完成后将在rockdev/Image-aio_3588l/ 目录下生成统一固件: product名XXX_XXX_日期XXX.img

在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdevImage 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdevImage 目录里。

4.3. 其他编译说明

4.3.1. Android14.0 不能直接烧写 kernel.img 和 resource.img

Android14.0的kernel.imgresource.img包含在boot.img中,编译kernel后需要在android根目录下执行./mkimage.sh重新打包boot.img,然后烧写rockdev/Image-aio_3588l/目录下的boot.img

4.3.2. 单独编译kernel生成boot.img

编译的原理:在kernel目录下将编译生成的 kernel.img resource.img 替换到旧的 boot.img 中, 所以编译的时候需要用 BOOT_IMG=xxx 参数指定boot.img的路径,命令如下:


编译后可以直接烧写kernel目录下的boot.img

4.4. 分区镜像

编译的时候执行 ./mkimage.sh 会重新打包 boot.imgsuper.img, 并将其它相关的镜像文件拷贝到目录 rockdev/Image-aio_3588l/ 中。以下列出一般固件用到的镜像文件:

固件 说明
boot.img 包含ramdis、kernel、dtb
dtbo.img Device Tree Overlays
MiniLoaderAll.bin 包含一级loader
misc.img 包含recovery-wipe开机标识信息,烧写后会进行recovery
parameter.txt 包含分区信息
recovery.img 包含recovery-ramdis、kernel、dtb
super.img 包含odm、product、vendor、system、system_ext分区内容
uboot.img 包含uboot固件
vbmeta.img 包含avb校验信息,用于AVB校验
update.img 包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包

请参照 《使用USB线缆升级固件》 一文来烧写分区镜像文件。

4.5. OTA 编译

请参照《OTA编译》章节

4.6. 常见问题

4.6.1. git clone 远程 bundle 仓库失败

Q:更新SDK时,git clone 远程 bundle 仓库出错:


5.Firefly Android 开发指南

Firefly Android 开发指南

6.FireflyApi2 使用手册

FireflyApi2 使用手册

7. 技术案例

7.1. 虚拟硬件技术

_images/android_technical_cases_virtual_device.png

详情请参阅 虚拟硬件技术

7.2. 多设备启动系统

_images/android_technical_cases_multidevice.png

详情请参阅 多设备启动系统

7.3. 多屏异显

_images/android_technical_cases_yixian.png

详情请参阅 RK3588多屏异显

7.4. 多屏拼接

_images/android_technical_cases_pinjie.png

详情请参阅 RK3588多屏拼接

接口使用

1. ADC 使用

1.1. 简介

AIO-3588L 开发板上的 AD 接口有两种,分别为:温度传感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。其中:

  • TS-ADC(Temperature Sensor):支持七通道。

  • SAR-ADC(Successive Approximation Register):支持八通道单端12位的SAR-ADC,最大转换速率为1MSPS,采用20MHz的A/D转换器时钟。

内核采用工业 I/O 子系统来控制 ADC,该子系统主要为 AD 转换或者 DA 转换的传感器设计。 下面以 SAR-ADC 为例子,介绍 ADC 的基本配置方法。

1.2. 硬件

AIO-3588L 的ADC接口图如下:

_images/usage_adc_interface.jpg

1.3. DTS配置

1.3.1. 配置DTS节点

AIO-3588L SAR-ADC 的 DTS 节点在 kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s.dtsi 文件中定义,如下所示:


1.3.2. 在驱动文件中匹配 DTS 节点

用户驱动可参考 Firefly adc demo :kernel-5.10/drivers/iio/adc/adc-firefly-demo.c,这是一个侦测 AIO-3588L 风扇状态的驱动。首先在驱动文件中定义 of_device_id 结构体数组:


接着在 firefly_adc_probe 中对 DTS 所添加的资源进行解析:


1.4. 驱动说明

1.4.1. 获取 AD 通道

注意:

  • Vref 为标准电压

  • n 为 AD 转换的位数

  • Vresult 为用户所需要的采集电压

  • raw 为 AD 采集的原始数据

例如,标准电压为 1.8V,AD 采集位数为 12 位,AD 采集到的原始数据为 445,则:


1.5. 接口说明


  • 功能:读取 chan 通道 AD 采集的原始数据。

  • 参数:

    • chan:要读取的采集通道指针

    • val:存放读取结果的指针

1.6. 调试方法

1.6.1. Demo 程序使用

kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-firefly-demo.dtsi 中使能 adc_demo ,将 disabled 改为 okay:


1.6.2. 获取所有 ADC 值

有个便捷的方法可以查询到每个 SARADC 的值:


1.7. FAQs

1.7.1. 为何按上面的步骤申请 SARADC,会出现申请报错的情况?

驱动需要获取ADC通道来使用时,需要对驱动的加载时间进行控制,必须要在saradc初始化之后。saradc是使用module_platform_driver()进行平台设备驱动注册,最终调用的是module_init()。所以用户的驱动加载函数只需使用比module_init()优先级低的,例如:late_initcall(),就能保证驱动的加载的时间比saradc初始化时间晚,可避免出错。

 

2. Camera 使用

  • 接口效果图

_images/usage_camera_mipicsi.jpg

2.1. MIPI CSI用法

RK3588/RK3588S平台支持两个DPHY硬件, 分别是 dphy0_hw/ dphy1_hw, 两个dphy硬件都可以工作在两个模式: full mode 和split mode, 其中 dphy0_hw 拆分为 csi2_dphy0/ csi2_dphy1/ csi2_dphy2 三个逻辑dphy(参见rk3588s.dtsi)。

目前Core-3588L硬件支持二个DPHY硬件

2.2. DPHY

2.2.1. Full Mode

  • 仅使用csi2_dphy0,csi2_dphy0与csi2_dphy1/csi2_dphy2互斥,不可同时使用;

  • data lane最大4 lanes;

  • 最大速率2.5Gbps/lane;

2.2.2. Split Mode

  • 仅使用csi2_dphy1和csi2_dphy2, 与csi2_dphy0互斥,不可同时使用;

  • csi2_dphy1和csi2_dphy2可同时使用;

  • csi2_dphy1和csi2_dphy2各自的data lane最大是2 lanes;

  • csi2_dphy1对应物理dphy的lane0/lane1;

  • csi2_dphy2对应物理dphy的lane2/lane3;

  • 最大速率2.5Gbps/lane;

_images/usage_camera_rk3588_mipi_csi_mode.png

简单点来讲,如果用单目摄像头我们可以配置full mode,若使用双目摄像头我们可以配置split mode。

2.3. Full Mode配置

链接关系: sensor->csi2_dphy0->mipi2_csi2->rkcif_mipi_lvds2 - - -> rkcif_mipi_lvds2_sditf->rkisp0_vir0

2.3.1. Full Mode设备树配置要点

2.3.2. 配置sensor端

我们需要根据板子原理图的MIPI CSI接口找到sensor是挂在哪个I2C总线上,然后在对应的I2C节点配置camera节点,正确配置camera模组的I2C设备地址、引脚等属性。如下Core-3588L的xc7160配置:

  • 参考kernel-5.10/arch/arm64/boot/dts/rockchip/aio-3588l-cam-8ms1m.dtsi


2.3.3. csi2_dphy0相关配置

csi2_dphy0与csi2_dphy1/csi2_dphy2互斥,不可同时使用。另外需要使能csi2_dphy0_hw节点


2.3.4. isp相关配置

其中rkisp_vir0节点的remote-endpoint指向mipi_lvds2_sditf

Core-3588L的xc7160自带ISP,因此不需要RKISP,其他情况sensor默认请打开以下配置


2.4. Split Mode配置

链接关系:

sensor1->csi2_dphy1->mipi2_csi2->rkcif_mipi_lvds2 - - -> rkcif_mipi_lvds2_sditf->rkisp0_vir2

sensor2->csi2_dphy2->mipi3_csi2->rkcif_mipi_lvds3 - - -> rkcif_mipi_lvds3_sditf->rkisp1_vir0

2.4.1. Split Mode设备树配置要点

2.4.2. 配置sensor端

我们需要根据板子原理图的MIPI CSI接口找到两个sensor是挂在哪个I2C总线上,然后在对应的I2C节点配置两个camera节点,正确配置camera模组的I2C设备地址、引脚等属性。如下Core-3588L的gc2053/gc2093配置:

2.4.3. csi2_dphy1/csi2_dphy2相关配置

csi2_dphy0与csi2_dphy1/csi2_dphy2互斥,不可同时使用


2.4.4. isp相关配置

其中rkisp0_vir2节点的remote-endpoint指向mipi2_lvds_sditf, rkisp1_vir0节点的remote-endpoint指向mipi3_lvds_sditf


2.5. 软件相关目录


2.6. 单目CAM-8MS1M使用

firefly已经配置好相应的dts,单目摄像头CAM-8MS1M,只需包含相应的dtsi文件即可使用单目摄像头CAM-8MS1M

2.6.1. 使用单目摄像头CAM-8MS1M

dts的配置默认使用单目摄像头


2.7. Camera底层调试

查找摄像头节点


使用v4l2-ctl抓取camera数据帧

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080 --stream-to=/data/out.yuv

把out.yuv文件拷贝出来通过ubuntu去查看


2.8. Android 系统使用 Camera 应用

除了官方默认支持的摄像头外,Android系统使用camera的apk打开摄像头都需要配置camera3_profiles*.xml,具体可参考Android SDK hardware/rockchip/camera/etc/camera目录下的文件

2.9. Linux 系统预览摄像头

Ubuntu 固件集成了 test_camera-cifisp.sh 测试脚本,直接运行该脚本就可以了,脚本路径:test_camera-cifisp.sh


2.10. IQ文件

raw摄像头支持的iq文件路径external/camera_engine_rkaiq/iqfiles/isp3x, 与以前不一样的地方是iq文件不再采用.xml的方式,而是采用.json的方式。虽有提供xml转json的工具, 但isp20的xml配置转换后也不适用isp3x,同样isp21的json也不适用isp3x。

若使用raw摄像头sensor,请留意isp3x目录所支持的iq文件

3. Display 使用

_images/usage_display_rk3588_vop.png

RK3588 拥有四路 Video 输出端口,每一个 Video 输出端口都绑定了固定的显示控制器,如 Port0 可以用于与 DP0、DP1、HDMI/eDP0 和 HDMI/eDP1 等显示控制器的连接,其他 Portx 以此类推。

每一个 Portx 都有各自所能输出的最大分辨率:

  • Port0 最大可以输出 7680x4320@60Hz

  • Port1 最大可以输出 4096x2304@60Hz

  • Port2 最大可以输出 4096x2304@60Hz

  • Port3 最大可以输出 1920x1080@60Hz

软件上如果把 HDMI0 显示控制器连接在 Port0 上,且硬件 phy 支持 HDMI2.1,则 HDMI0 支持 8K@60Hz 的输出。

如果给每一个 Portx 都单独分配一个显示控制器的话,便可支持同一时间的四屏同显(异显)。

但从软件的角度上,有以下的配置注意事项:

  1. RK3588 在做 8K 输出的时候,其实芯片内部是同时使用了 Port0 以及 Port1 的资源,只是借用 Port0 口做输出,所以当与 Port0 连接的显示控制器连接外部的 8K 显示器做输出的时候,与 Port1 连接的显示控制器工作会有异常。

    例如 HDMI0(接Port0) 接 8K 输出的时候,HDMI1(接Port1) 显示会有异常。只有当 Port0 输出小于等于4K@60Hz 的时候,Port1 才可以正常输出 4K@60Hz。

  2. 目前一个 Portx 在同一时间只能输出一种分辨率格式,所以如果软件配置有多个不同分辨率的显示接口都接在同一个 Portx 上面的话,同一时间只能使用其中一个。例如 VGA 与 DP,目前同时只能使用其中一个(后面随着 SDK 的更新便可支持同一路 Portx 下同时接多个显示外设。)。

3.1. AIO-3588L 显示接口的配置

AIO-3588L 有三种显示输出接口,分别是 HDMI、Display Port、以及 MIPI DSI,可以做到多屏同显/异显,接口图如下所示:

  • HDMI0/ HDMI1/ Display Port 

  • _images/usage_display_interface.png

  • MIPI DSI0/ MIPI DSI1 

  • _images/usage_display_dsi_interface.png

下面对各个显示输出接口的配置和使用作基本的介绍,详细内容可以参考文件:

  • kernel-5.10/arch/arm64/boot/dts/rockchip/aio-3588l.dts

  • kernel-5.10/arch/arm64/boot/dts/rockchip/aio-3588l-mipi101-M101014-BE45-A1.dts

3.1.1. HDMI

AIO-3588L 硬件上有两个 HDMI 显示输出接口:

  • HDMI0 支持 HDMI2.1 协议,分辨率最高可以支持 7680x4320@60Hz

  • HDMI1 支持 HDMI2.0 协议,分辨率最高可以支持 4096x2304@60Hz

3.1.1.1. 软件配置

由于 HDMI0 以及 HDMI1 在软件配置是类似的,所以下面以 HDMI0 的配置为例,HDMI0 软件上表示为 hdmi0,在设备树中添加:


需要注意的是,由于这里默认会把 HDMI0 连接在 Port0 上,即为了支持 8K 输出。如果这个时候 HDMI1 连接在了 Port1 端口,如:


则会出现前文说的 HDMI1 显示异常的情况,所以如果要支持 HDMI0(8K) HDMI1(4K)场景,需要把 HDMI1 连接在 Port2 上,如:


3.1.2. Display Port

AIO-3588L 有一个 Display Port 显示输出接口,支持 DP TX 1.4a 协议,分辨率最高可以支持 7680x4320@30Hz。

3.1.2.1. 软件配置

Display Port 软件上表示为 dp0,在设备树上添加:


这里要注意,SDK 默认的软件配置是把 dp0 连接在 vp2 上面,这样会导致 dp0 最高只能输出 4096x2304@60Hz,所以如果需要 7680x4320@30Hz 的功能,需要把 dp0 连接在 vp0上面,软件修改如下:


3.1.3. MIPI DSI

AIO-3588L 有两路 MIPI DSI 显示输出接口,均支持 DPHY2.0 和 4 Lane 的数据输出,最高可输出 4096x2304@60Hz(取决于连接的 Portx)。

3.1.3.1. 软件配置

由于 DSI0 和 DSI1 在软件配置上类似,这里以 DSI0 的配置为例,外接的屏幕是 Firefly V2 版本屏幕,DSI0 软件上表示为 dsi0

结合 AIO-3588L 的 DSI0 接口和屏幕时序

  • DSI0 接口 

  • _images/usage_display_mipi_v2_interface.png

  • V2 屏幕显示时序 

  • _images/usage_display_mipi_v2_timing.jpg

  • V2 屏幕上电时序 

  • _images/usage_display_mipi_v2_power_on.png

  • V2 屏幕下电时序 

  • _images/usage_display_mipi_v2_power_off.png

  • V2 屏幕上下电符号参考 

  • _images/usage_display_mipi_v2_power_menu.png

在设备树上添加:


在配置 MIPI DSI的时候,如果出现异常现象,如黑屏,画面拉伸,显示有噪点等,需要注意排查:

  1. 显示时序是否配置正确,尤其是 DCLK 的配置。

  2. 上下电时序是否正确,在文件 kernel-5.10/drivers/gpu/drm/panel/panel-simple.c中的 panel_simple_preparepanel_simple_unprepare 函数内,调用了设备树中所配置的上下电时序和 gpio 口。

    如果选择在 uboot 阶段开启开机 logo, 那么还需要排查 u-boot/drivers/video/drm/rockchip_panel.c 文件内的 panel_simple_prepare 和 panel_simple_unprepare 函数。

  3. 搭示波器看一下上电时序是否正确,主要是确认 LCD 使能引脚、复位引脚和屏幕上电指令间的时序是否正确。

3.2. AIO-3588L 多屏场景的配置

下面列出一些常规的场景下,关于 Portx 以及 显示控制器之间的配置方法:

  • 四屏显示(接 DP 屏幕,HDMI0 HDMI1 Display Port MIPI DSI0)


3.3. 调试手段

  • 在系统中设置分辨率

系统鼠标点击:‘设置->显示->HDMI->分辨率设置’

  • 获取 HDMI/Display Port 的 edid(以 HDMI 为例)


  • 获取 HDMI/Display Port 的连接状态(以 HDMI 为例)


一般如果遇到 HDMI/Display Port 无法显示的问题,都需要先执行上面的命令去看一下连接状态、edid 和分辨率是否正确。

4. Ethernet 使用

4.1. dts 配置

4.1.1. 公共的配置

kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-diff.dtsi


kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-firefly-port.dtsi


4.1.2. 板级的配置

kernel-5.10/arch/arm64/boot/dts/rockchip/aio-3588l.dtsi


4.1.3. 查看IP地址

  • 双以太网口接入网络,可以通过调试串口或者adb来查看IP地址,比如

    
    

4.1.4. 连通性测试

5. GPIO 使用

5.1. 简介

GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的,其核心是填充 GPIO bank 的方法和参数,并调用 gpiochip_add 注册到内核中。

5.2. GPIO引脚计算

Core-3588L 有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分,常用以下公式计算引脚:


5.3. 输入输出

首先在 DTS 文件中增加驱动的资源描述:

GPIO_ACTIVE_HIGH 表示高电平有效,如果想要低电平有效,可以改为:GPIO_ACTIVE_LOW,这个属性将被驱动所读取。

然后在 probe 函数中对 DTS 所添加的资源进行解析,代码如下:


of_get_named_gpio_flags 从设备树中读取 firefly-gpio firefly-irq-gpio 的 GPIO 配置编号和标志,gpio_is_valid 判断该 GPIO 编号是否有效,gpio_request 则申请占用该 GPIO。如果初始化过程出错,需要调用 gpio_free 来释放之前申请过且成功的 GPIO 。在驱动中调用 gpio_direction_output 就可以设置输出高还是低电平,这里默认输出从 DTS 获取得到的有效电平 GPIO_ACTIVE_HIGH,即为高电平,如果驱动正常工作,可以用万用表测得对应的引脚应该为高电平。实际中如果要读出 GPIO,需要先设置成输入模式,然后再读取值:


5.4. 中断

在 Firefly 的例子程序中还包含了一个中断引脚,GPIO 口的中断使用与 GPIO 的输入输出类似,首先在 DTS 文件中增加驱动的资源描述:


然后在 probe 函数中对 DTS 所添加的资源进行解析,再做中断的注册申请,代码如下:


调用 gpio_to_irq 把 GPIO 的 PIN 值转换为相应的 IRQ 值,调用 gpio_request 申请占用该 IO 口,调用 request_irq 申请中断,如果失败要调用 free_irq 释放,该函数中 gpio_info-firefly_irq 是要申请的硬件中断号,firefly_gpio_irq 是中断函数,gpio_info->firefly_irq_mode 是中断处理的属性,firefly-gpio 是设备驱动程序名称,gpio_info 是该设备的 device 结构,在注册共享中断时会用到。

5.5. 复用

该案例仅供参考,最终以实际硬件接口为准
GPIO 口除了通用输入输出、中断功能外,还可能有其它复用功能,以GPIO1_D0为例,就有如下几个功能:

func0 func1 func2 func3 func4
GPIO1_D0 I2S0_SDO1 I2C7_SCL_M0 UART6_TX_M2 SPI1_MISO_M2

查看 /d/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins,查看各个引脚的作用,如果发现GPIO1_D0和GPIO1_D1被复用为I2c,则在dts中关闭它


Note: 此处 GPIO1_D0 仅作示例,实际使用中不推荐如此修改

上面介绍了在DTS上修改,那在运行时又如何切换功能呢?下面以 I2C7_m0 为例作简单的介绍,详细介绍可以参考RKDocs/common/PIN-Ctrl/Rockchip-Developer-Guide-Linux-Pin-Ctrl-CN.pdf

查规格表可知,I2C7_SDA_M0 与 I2C7_SCL_M0 的功能定义如下:

Pad# func0 func1 func2 func3 func4 func5
I2C7_SCL_M0/GPIO1_D0 GPIO1_D0 UART6_TX_M2 SPI1_MISO_M2 I2S0_SDO1    
I2C7_SDA_M0/GPIO1_D1 GPIO1_D1 UART6_RX_M2 SPI1_MOSI_M2 I2S0_SDO2 I2S0_SDI3 PDM0_SDI1_M0

kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s.dtsi 里有:


跟复用控制相关的是 pinctrl- 开头的属性:

  • pinctrl-names 定义了状态名称列表: default (i2c 功能) 和 gpio 两种状态。

  • pinctrl-0 定义了状态 0 (即 default)时需要设置的 pinctrl: &i2c7m0_xfer

  • pinctrl-1 定义了状态 1 (即 gpio)时需要设置的 pinctrl: &i2c7m0_gpio

这些 pinctrl 在 kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s.dtsi 中这样定义:


kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi中有i2c7的定义


RK_FUNC_GPIO 的定义在 kernel-5.10/include/dt-bindings/pinctrl/rockchip.h ,此处简写作0:


知道了上面关于i2c7的定义后,在 kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-firefly-demo.dtsi 中为i2c7节点添加gpio的资源


i2c驱动注册流程如下:


pinctrl_select_state是选择pinctrl的函数,它用来选择我们dts中设置的pinctrl。

5.6. 调试方法

5.6.1. GPIO 调试接口

Debugfs 文件系统目的是为开发人员提供更多内核数据,方便调试。 这里 GPIO 的调试也可以用 Debugfs 文件系统,获得更多的内核信息。GPIO 在 Debugfs 文件系统中的接口为 /sys/kernel/debug/gpio,可以这样读取该接口的信息:


从读取到的信息中可以知道,内核把 GPIO 当前的状态都列出来了,以 GPIO1 组为例,gpio-56(GPIO1_D0) 输出高电平 (out hi)。

5.6.2. 查看 pinmux-pins

使用命令


解析: pin 0这一列表示引脚编号,gpio0-0这一列表示gpio组编号,后面MUX UNCLAIMED这一列表示数据选择器的拥有者,GPIO UNCLAIMED这一列表示gpio的拥有者。

其中 MUX UNCLAIMED 表示该引脚还没有被节点使用pinctrl去进行控制,例如:节点 i2c7 被启用,它拥有pinctrl-0属性,对引脚pin 56功能作出出修改,复用为i2c ,则该引脚的信息会变为pin 56 (gpio1-24): fec90000.i2c (GPIO UNCLAIMED) function i2c7 group i2c7m0-xfer ,它被地址为0xfec90000、名字为i2c的节点使用pinctrl配置,pinctrl的值是i2cm0-xfer。

GPIO UNCLAIMED表示还没有注册的gpio使用该引脚,我们用上述gpio_demo例子去注册该引脚,引脚信息会变成pin 56 (gpio1-24): gpio_demo gpio1:56 function gpio group pin56_57_gpio ,它被名为gpio_demo的节点使用pinctrl配置,pinctrl的值是pin56_57_gpio,该引脚还被申请为gpio。

5.7. FAQs

5.7.1. Q1: 如何将 PIN 的 MUX 值切换为一般的 GPIO?

A1: 当使用 GPIO request 时候,会将该 PIN 的 MUX 值强制切换为 GPIO,所以使用该 PIN 脚为 GPIO 功能的时候确保该 PIN 脚没有被其他模块所使用。

5.7.2. Q2: 为什么我用 IO 指令读出来的值都是 0x00000000?

A2: 如果用 IO 命令读某个 GPIO 的寄存器,读出来的值异常,如 0x00000000 或 0xffffffff 等,请确认该 GPIO 的 CLK 是不是被关了,GPIO 的 CLK 是由 CRU 控制,可以通过读取 datasheet 下面 CRU_CLKGATE_CON* 寄存器来查到 CLK 是否开启,如果没有开启可以用 io 命令设置对应的寄存器,从而打开对应的 CLK,打开 CLK 之后应该就可以读到正确的寄存器值了。

5.7.3. Q3: 测量到 PIN 脚的电压不对应该怎么查?

A3: 测量该 PIN 脚的电压不对时,如果排除了外部因素,可以确认下该 PIN 所在的 IO 电压源是否正确,以及 IO-Domain 配置是否正确。

5.7.4. Q4: gpio_set_value() 与 gpio_direction_output() 有什么区别?

A4: 如果使用该 GPIO 时,不会动态的切换输入输出,建议在开始时就设置好 GPIO 输出方向,后面拉高拉低时使用 gpio_set_value() 接口,而不建议使用 gpio_direction_output(), 因为 gpio_direction_output 接口里面有 mutex 锁,对中断上下文调用会有错误异常,且相比 gpio_set_value,gpio_direction_output 所做事情更多,浪费。

6. HDMI-IN 使用

AIO-3588L 有一个 HDMI-IN 接口, 支持标准的 HDMI2.0 协议,它具备以下的特性:

  • HDMI 1.4b/2.0 RX: Up to 4K@60fps

  • Support FMT: RGB888/YUV420/YUV422/YUV444 8bit

  • Pixel clock: Up to 600MHz

  • HDCP1.4/2.3

  • CEC hardware engine

  • E-EDID configuration

  • S/PDIF 2channel output

  • I2S 2/4/6/8channel output

接口图如下: _images/usage_hdmiin_interface.png

目前有 APK 及命令的方式来进行 HDMI-IN 的功能调试。

6.1. Android 使用 HDMI-IN

默认 AIO-3588L 的 Android 系统中会带有两个 APK ,一个名为 Live Tv,另一个名为 RockchipCamera2,如下图所示: 

_images/usage_hdmiin_rk3588_apk.png

直接点击 APK 便可进行 HDMI-IN 的视频输入显示,HDMI-IN 的音频输入会从 AIO-3588L 的耳机、HDMI、Display Port 等接口输出。

需要注意的是,在软件层上 Live Tv 默认走的是 Tv Hal 层,RockchipCamera2 默认走的是 USB Camera Hal 层。

RockchipCamera2 默认只支持 NV12,NV16,RGB3 三种输入格式(所以如果输入源格式不对的话,会导致该 APK 打开黑屏),支持的最大输入分辨率为 3840x2160@30fps。而 Live Tv 则没有这样的限制。

SDK 中 APK 对应的源码路径:


6.2. Linux 使用 HDMI-IN

Ubuntu 固件集成了 test_hdmirx.sh 测试脚本,直接运行该脚本就可以了,脚本路径:/usr/local/bin/test_hdmirx.sh


6.3. 调试命令

6.3.1. 视频调试

HDMI-IN 设备在内核中会被注册为 video 设备,生成的节点如:/dev/video8,可以通过 v4l2-ctl 命令来获取设备信息和抓帧。

  • 获取设备信息

    
    
  • 获取外部设备输入的分辨率信息

    
    
  • 抓取帧率(需要设置好分辨率和像素格式)

    
    
  • 把抓取到的帧保存为文件,这里表示抓一帧并保存在 data/4kp60_nv12.yuv

    :/ # v4l2-ctl  -d /dev/video8 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4  --stream-skip=10  --stream-to=/data/4kp60_nv12.yuv --stream-count=1 --stream-poll
    <<<<<<<<<<<
    
  • 在 PC 端查看抓取到的帧文件

    • Window 端可以使用 7yuv 工具

    • Linux 端可以使用 ffplay 命令

      
      

6.3.2. 音频调试

可以通过 tinycap 命令去录制输入的音频。

可以看到,hdminrx(hdmiin)的声卡号为2,可以在 HDMI-IN 有音频输入的时候运行以下命令来录制和播放音频。

 

7. LED 使用

7.1. 前言

可通过使用 LED 设备子系统或者直接操作 GPIO 控制该 LED。

7.2. 以设备的方式控制 LED

标准的 Linux 专门为 LED 设备定义了 LED 子系统。 在 AIO-3588L开发板中的LED 均以设备的形式被定义。用户可以通过 /sys/class/leds/ 目录控制LED。

开发板上的 LED 的默认状态为:

用户可以通过 echo 命令向其 brightness 属性输入命令控制每一个 LED:


7.3. 使用 trigger 方式控制 LED

Trigger 包含多种方式可以控制 LED,这里就用两个例子来说明。

  • Simple trigger LED

  • Complex trigger LED

更详细的说明请参考 leds-class.txt

首先我们需要知道定义多少个 LED,同时对应的 LED 的属性是什么。

注意:compatible 的值要跟 drivers/leds/leds-gpio.c 中的 .compatible 的值要保持一致。

7.3.1. Simple trigger LED

按名字来是看就是简单的触发方式控制 LED,如下就默认打开黄灯,AIO-3588L开机后黄灯就亮。

(1)定义 LED 触发器在 kernel-5.10/drivers/leds/trigger/led-firefly-demo.c 文件中有如下添加:


7.3.2. Complex trigger LED

如下是 trigger 方式控制 LED 复杂一点的例子,timer trigger 就是让 LED 达到不断亮灭的效果:

我们需要在内核把 timer trigger 配置上。

kernel-5.10 路径下使用 make menuconfig,按照如下方法将 timer trigger 驱动选中。


8. PCIe 使用

8.1. 简介

AIO-3588L 开发板上有 2 个 PCIe2.0 x 2 (M.2 SATA / PCIe Wifi/BT 模块),如图:

 

_images/usage_pcie_interface.png

8.2. 软件配置

关于 RK3588 PCIe 的硬件可用资源及软件上 pcie 控制器节点、 PHY 节点对应关系如图: 

_images/usage_pcie_phy.png

AIO-3588L 开发板上使用情况如下

  • PCIe2.0 x 1 接口两个

 

9. PWM 使用

9.1. 前言

本章主要描述如何配置 PWM。

AIO-3588L的 PWM 驱动为:kernel-5.10/drivers/pwm/pwm-rockchip.c

9.2. DTS配置

配置 PWM 主要有以下三大步骤:配置 PWM DTS 节点、配置 PWM 内核驱动、控制 PWM 设备。

9.2.1. 配置 PWM DTS节点

在 DTS 源文件 kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-firefly-demo.dtsi 添加 PWM DTS 配置,如下所示:


pwms参数分析: &pwm15: 在 rk3588s.dtsi 中有定义。 0 :表示 chip index ,一般是0,因为rockchip pwm每个chip只有一个。 100000000 : 一个周期时间为100000000纳秒 ,一秒有10个100000000纳秒 ,所以这个pwm输出周期为10Hz。 1: 表示极性, 0为正常极性,1为反转极性。

duty_ns表示占空比激活时间,单位也是纳秒

9.3. 接口说明

用户可在其它驱动文件中使用以上步骤生成的 PWM 节点。具体方法如下:

(1)、在要使用 PWM 控制的设备驱动文件中包含以下头文件:


该头文件主要包含 PWM 的函数接口。

(2)、申请 PWM

使用


(3)、配置 PWM

使用


(4)、使能PWM函数


(5)控制 PWM 输出主要使用以下接口函数:

  • 功能:用于申请 PWM


参考例子: kernel-5.10/drivers/pwm/pwm-firefly-demo.c

9.4. 调试方法

通过内核丰富的 debug 接口查看 PWM 注册状态,adb shell 或者串口进入 Android 终端执行:


查看注册是否成功,成功则返回接口名和寄存器地址。

9.5. FAQs

9.5.1. PWM 无法注册成功:

  • dts 配置文件是否打开对应的 PWM。

  • PWM 所在的 IO 口是否被其他资源占用,可以根据报错的返回值去查看原因。

10. RTC 使用

10.1. 简介

AIO-3588L开发板采用HYM8563作为RTC(Real Time Clock),HYM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断 输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为 400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增

  • 可计时基于 32.768kHz 晶体的秒,分,小时,星期,天,月和年

  • 宽工作电压范围:1.0~5.5V

  • 低休眠电流:典型值为 0.25μA(VDD =3.0V, TA =25°C)

  • 内部集成振荡电容

  • 漏极开路中断引脚

10.2. RTC驱动

驱动参考:kernel-5.10/drivers/rtc/rtc-hym8563.c

10.3. 接口使用

Linux 提供了三种用户空间调用接口。在 AIO-3588L开发板中对应的路径为:

  • SYSFS接口:/sys/class/rtc/rtc0/

  • PROCFS接口: /proc/driver/rtc

  • IOCTL接口: /dev/rtc0

10.3.1. SYSFS接口

可以直接使用 catecho 操作 /sys/class/rtc/rtc0/ 下面的接口。

比如查看当前 RTC 的日期和时间:


10.3.2. PROCFS 接口

打印 RTC 相关的信息:


10.3.3. IOCTL接口

可以使用 ioctl 控制 /dev/rtc0

详细使用说明请参考文档 kernel-5.10/Documentation/admin-guide/rtc.rst

10.4. FAQs

10.4.1. Q1: 开发板上电后时间不同步?

A1: 检查一下 RTC 电池是否正确接入。

11. SATA 使用

11.1. 简介

AIO-3588L 开发板上有 1 个 M.2 SATA 接口

可以软件配置成 M.2 SATA3.0 接口,支持 SATA 协议的 SSD 使用,也可以软件配置成 M.2 PCIe2.0 接口,支持 NVMe 协议的 SSD 使用。

默认软件配置成 M.2 SATA3.0 接口, 支持 SATA 协议的 SSD 使用。

 

_images/usage_sata_interface.png

注意事项:

  • M.2 SATA 接口,注意应选择 SATA 协议的 SSD 接入,而不是 NVME 协议的 SSD

11.2. 软件配置

11.2.1. 方式一:系统设置修改

Settings->Connected devices -> M.2 SSD Type

选择需要生效的选项SATA 或 PCIe

_images/swtich_sata_pcie.jpg

修改后需要重启系统才会生效

11.2.2. 方式二:DTS 配置

一般根据原理图在 DTS 中选择正确的控制器节点和 PHY 节点使能,并关闭与其复用的控制器节点就可以。

kernel-5.10/arch/arm64/boot/dts/rockchip/aio-3588l.dtsi 中有下面一段配置:


combphy0_ps:PHY 节点

sata0:sata0 控制器节点

pcie2x1l2:pcie2x1l2 控制器节点

M2_SATA_OR_PCIE默认值为 1 即配置成 SATA3.0,如果需要配置成 PCIe2.0,需修改为 0

11.3. 挂载

11.3.1. 自动挂载

在 Android 系统界面中将硬盘格式化为可用格式就可以开机自动挂载

11.3.2. 命令手动挂载

  • 查找设备节点


11.4. 读写测速

SATA3.0 的传输速率理论上达到 6.0 Gbps,可以参考如下命令进行读写速度测试:

  • dd


  • fio


12. SPI 使用

12.1. SPI 简介

_images/usage_spi_interface.jpg

12.2. SPI 工作方式

SPI 以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少 4 根线,分别是:


  • CPOL:表示时钟信号的初始电平的状态,0为低电平,1为高电平。

  • CPHA:表示在哪个时钟沿采样,0为第一个时钟沿采样,1为第二个时钟沿采样。

SPI 的四种工作模式波形图如下:

_images/usage_spi_waveform.jpg

12.3. 驱动编写

下面以 XM25QU128C Flash 模块为例简单介绍 SPI 驱动的编写。

12.3.1. 硬件连接

AIO-3588L与 XM25QU128C 硬件连接如下表:

12.3.2. 编写Makefile/Kconfig

kernel-5.10/drivers/spi/Kconfig 中添加对应的驱动文件配置:


kernel-5.10/drivers/spi/Makefile 中添加对应的驱动文件名:


12.3.3. 配置 DTS 节点

kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-firefly-demo.dtsi 中添加 SPI 驱动结点描述,如下所示:


  • status:如果要启用 SPI,则设为 okay,如不启用,设为 disable

  • spi-demo@00:由于本例子使用 CS0,故此处设为 00,如果使用 CS1,则设为 01

  • compatible:这里的属性必须与驱动中的结构体:of_device_id 中的成员 compatible 保持一致。

  • reg:此处与 spi-demo@00 保持一致,本例设为:0x00。

  • spi-max-frequency:此处设置 spi 使用的最高频率,AIO-3588L最高支持 50000000。

  • spi-cpha,spi-cpol:SPI 的工作模式在此设置,本例所用的模块 SPI 工作模式为 SPI_MODE_0 或者 SPI_MODE_3,这里我们选用 SPI_MODE_0,如果使用 SPI_MODE_3,spi_demo 中打开 spi-cpha 和 spi-cpol 即可。

12.3.4. 定义SPI驱动

在内核源码目录 kernel-5.10/drivers/spi/ 中创建新的驱动文件,如:spi-firefly-demo.c

在定义 SPI 驱动之前,用户首先要定义变量 of_device_idof_device_id 用于在驱动中调用 DTS 文件中定义的设备信息,其定义如下所示:


此处的 compatible 与 DTS 文件中的保持一致。

spi_driver定义如下所示:


12.3.5. 注册SPI设备

在初始化函数 static int __init firefly_spi_init(void) 中向内核注册 SPI 驱动:spi_register_driver(&firefly_spi_driver);

如果内核启动时匹配成功,则 SPI 核心会配置 SPI 的参数(mode、speed 等),并调用 firefly_spi_probe

12.3.6. 读写 SPI 数据

  • firefly_spi_probe 中使用了两种接口操作读取 XM25QU128C 的 ID:

  • firefly_spi_read_xm25x_id_0 接口直接使用了 spi_transfer spi_message 来传送数据。

  • firefly_spi_read_xm25x_id_1 接口则使用 SPI 接口 spi_write_then_read 来读写数据。

成功后会打印:


12.3.7. 打开 SPI demo

spi-firefly-demo 默认没有打开,如果需要的话可以使用以下补丁打开 demo 驱动:


12.3.8. 常用 SPI 接口

下面是常用的 SPI API 定义:


12.4. 接口使用

Linux 提供了一个功能有限的 SPI 用户接口,如果不需要用到 IRQ 或者其他内核驱动接口,可以考虑使用接口 spidev 编写用户层程序控制 SPI 设备。在 AIO-3588L开发板中对应的路径为: /dev/spidev1.0

spidev 对应的驱动代码:kernel-5.10/drivers/spi/spidev.c

内核 config 需要选上 SPI_SPIDEV:


spidev的详细使用说明请参考文档kernel-5.10/Documentation/spi/spidev.rst

12.5. FAQs

12.5.1. Q1: SPI 数据传送异常

A1: 确保 SPI 4 个引脚的 IOMUX 配置正确, 确认 TX 送数据时,TX 引脚有正常的波形,CLK 频率正确,CS 信号有拉低,mode 与设备匹配。

13. UART 使用

13.1. 硬件

AIO-3588L 硬件版本的串口接口图如下:

_images/usage_uart_interface.png

13.2. DTS配置

文件路径kernel-5.10/arch/arm64/boot/dts/rockchip/aio-3588l.dtsi 其中UART3可配置为CAN1,默认公版sdk都是配置为UART3,如果需要配置为CAN1,只需要配置CAN1_OR_UART3为1


配置好串口后,硬件接口对应软件上的节点为:


13.3. UART 收发验证

最简单的方式短接UART7 TX RX 引脚, 然后使用命令在调试串口或ADB执行命令


最终调试串口终端即可接收到字符串 “firefly uart test…”

14. Watchdog 使用

14.1. 简介

看门狗(watchdog)实际是一个定时器,启动之后会开始计时。系统或者软件需要在规定时间内与看门狗通信(俗称喂狗)重置计时,如此反复下去,以此来确定系统和软件正常运行。

如果规定时间内没有喂狗,看门狗超时,说明系统或应用陷入循环、卡死,此时看门狗会发出复位信号让主控复位,脱离卡死。

本章节主要介绍 AIO-3588L 开发板内部看门狗的使用。

14.2. DTS配置

AIO-3588L的 watchdog 的 DTS 节点在 kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s.dtsi 文件中定义,如下所示:


14.3. 使用

watchdog 默认是关闭的,需按上述说明在 DTS 文件中打开相关节点方能使用。

watchdog 的驱动文件为 kernel-5.10/drivers/watchdog/dw_wdt.c。下面介绍两种方法来使用 watchdog:

内部看门狗的设备名称为/dev/watchdog,用户可通过 echo 命令来控制该设备


也可以通过程序来控制看门狗,通过Android.mk编译生成可执行文件,在机器启动后,push到上面运行,demo代码如下:


demo说明:

1、内部看门狗在使用 open 函数打开后会立刻开始计时。

2、关于超时时间:用户可以用 ioctl 来设置超时时间和获取超时时间。当用户没有设置超时时间时,驱动会应用默认请求的超时时间为 30 s。需要说明的是驱动最终设置的超时时间并不一定是应用层传输的时间或者驱动一开始设置的默认时间。驱动函数里有一个超时时间的列表,该列表中存放了 16 个超时时间(前 9 个是 0)。驱动会在超时时间列表中找到一个合适的时间作为最终 watchdog 设置的超时时间。

以下为超时时间的详细列表:

请求的超时时间 通过 ioctl 获取的超时时间 watchdog最终设置的超时时间
timeout_request > 89 timeout_get = timeout_request timeout_set = 89
44 < timeout_request <= 89 timeout_get = 89 timeout_set = 89
22 < timeout_request <= 44 timeout_get = 44 timeout_set = 44
11 < timeout_request <= 22 timeout_get = 22 timeout_set = 22
5 < timeout_request <= 11 timeout_get = 11 timeout_set = 11
2< timeout_request <= 5 timeout_get = 5 timeout_set = 5
timeout_request = 2 timeout_get = 2 timeout_set = 2
timeout_request = 1 timeout_get = 1 timeout_set = 1

参考文档:SDK/RKDocs(linux 为 docs)/common/watchdog

14.4. 外部看门狗

很多设备上有外部硬件看门狗,通过查看设备文件可以确认是否支持外部看门狗。如果有硬件看门狗 /dev/ 下应该会生成 wdt_XXX 的设备文件。


配件

1. 摄像头模组

Firefly 支持的摄像头如下:

2. 显示屏模组

Firefly 支持的显示屏如下:

其他

1. 大语言模型

1.1. RKLLM 介绍

RKLLM SDK可以帮助用户快速将大语言模型部署到AIO-3588L上。 SDK下载

1.1.1. RKLLM-Toolkit 功能介绍

RKLLM-Toolkit 是为用户提供在计算机上进行大语言模型的量化、转换的开发套件。通过该工具提供的 Python 接口可以便捷地完成以下功能:

  • 模型转换:支持将 Hugging Face 格式的大语言模型(Large Language Model, LLM)转换为RKLLM 模型,转换后的 RKLLM 模型能够在 Rockchip NPU 平台上加载使用。

  • 量化功能:支持将浮点模型量化为定点模型,目前支持的量化类型包括 w4a16 和 w8a8。

1.1.2. RKLLM Runtime 功能介绍

RKLLM Runtime 主 要 负 责 加 载 RKLLM-Toolkit 转换得到的 RKLLM 模型,并在AIO-3588L 板端通过调用 NPU 驱动在 Rockchip NPU 上实现 RKLLM 模型的推理。在推理RKLLM 模型时,用户可以自行定义 RKLLM 模型的推理参数设置,定义不同的文本生成方式,并通过预先定义的回调函数不断获得模型的推理结果。

1.2. RKLLM-Toolkit 安装

RKLLM-Toolkit目前只适用于Linux PC,建议使用Ubuntu20.04(x64)。因为系统中可能同时有多个版本的 Python 环境,建议使用 miniforge3 管理 Python 环境。


1.3. 大语言模型部署例程

RKLLM已支持的大模型如下

Model Huggingface Link
DeepSeek-R1-Distill LINK
LLAMA LINK
TinyLLAMA LINK
Qwen LINK
Phi LINK
ChatGLM3-6B LINK
Gemma LINK
InternLM2 LINK
MiniCPM LINK
TeleChat LINK
Qwen2-VL LINK
MiniCPM-V LINK

1.3.1. 大语言模型转换运行Demo

下面以RKLLM SDK的DeepSeek-R1-Distill-Qwen-1.5B_Demo为例演示如何转换、量化、导出大语言模型,最后在板端部署运行。

1.3.1.1. 在 PC 上转换模型

DeepSeek-R1-Distill-Qwen-1.5B 为例,依据表格链接,找到对应模型仓库,克隆完整仓库内容。 在前述RKLLM-Toolkit安装正确的前提下,进入 Conda 环境。然后执行generate_data_quant.py生成量化标定数据。


如下按实际情况修改export_rkllm.py之后。执行export_rkllm.py。即可得到转换模型。

(RKLLM-Toolkit-1.1.4) root@ea5d57ca8e66:/rkllm/rknn-llm/examples/DeepSeek-R1-Distill-Qwen-1.5B_Demo/export# python3 export_rkllm.py 
INFO: rkllm-toolkit version: 1.1.4
WARNING: Cuda device not available! switch to cpu device!
The argument `trust_remote_code` is to be used with Auto classes. It has no effect here and is ignored.
Downloading data files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 15307.68it/s]
Extracting data files: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 2377.72it/s]
Generating train split: 21 examples [00:00, 3327.05 examples/s]
Optimizing model: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 28/28 [21:16<00:00, 45.59s/it]
Building model: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 399/399 [00:07<00:00, 52.78it/s]
WARNING: The bos token has two ids: 151646 and 151643, please ensure that the bos token ids in config.json and tokenizer_config.json are consistent!
INFO: The token_id of bos is set to 151646
INFO: The token_id of eos is set to 151643
INFO: The token_id of pad is set to 151643
Converting model: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 339/339 [00:00<00:00, 2494507.12it/s]
INFO: Exporting the model, please wait ....
[=================================================>] 597/597 (100%)
INFO: Model has been saved to ./DeepSeek-R1-Distill-Qwen-1.5B_W8A8_RK3588.rkllm!

1.3.1.2. 在 AIO-3588L 上部署运行RKLLM模型

1.3.1.2.1. 板端内核要求

在板端使用RKLLM Runtime 进行模型推理前,首先需要确认板端的NPU 内核是否为v0.9.8版本以上


若所查询的 NPU 内核版本低于 v0.9.8,请前往官方固件地址下载最新固件进行更新

1.3.1.2.2. RKLLM Runtime 的编译要求

在使用 RKLLM Runtime 的过程中,需要注意gcc交叉编译工具的版本。推荐下载交叉编译工具gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu


1.3.1.2.3. 板端运行推理

编译完成后生成可执行程序install/demo_Linux_aarch64/llm_demo,将编译得到的llm_demo和库文件rknn-llm/rkllm-runtime/Linux/librkllm_api/aarch64/librkllmrt.so以及定频脚本rknn-llm/scripts/fix_freq_rk3588.sh一并通过scp推送到板端。


1.3.1.2.4. 聊天模板

LLM 的一个常见应用场景是聊天。在聊天上下文中,不再是连续的文本字符串构成的语句,聊天模型由一条或多条消息组成的对话组成,每条消息都有一个“用户“或“助手”等角色,还包括消息文本。然而不同的模型对聊天的输入格式要求也不同。聊天模板用于将问答的对话内容转换为模型的输入prompt。倘若使用空的聊天模板或者使用默认的聊天模板,与模型在训练期间看到的消息格式不匹配,可能会导致性能下降。

例如查看ChatGLM3的聊天模板


1.4. 其他

更多demo和api使用请参考RKLLM SDK例程和文档。

1.5. FAQs

Q1:转换模型失败?

A1:检查 PC 可用运行内存,参数量越大的模型转换或者运行时所需的内存越大,可以尝试增大 swapfile 或者使用大内存的 PC。

2. NPU使用

RK3588 内置 NPU 模块, 处理性能最高可达6TOPS。使用该NPU需要下载RKNN SDK,RKNN SDK 为带有 NPU 的 RK 系列芯片提供编程接口,能够帮助用户部署使用 RKNN-Toolkit2 导出的 RKNN 模型,加速 AI 应用的落地,具体支持平台列表可通过 SDK 中 README 文档或者访问airockchip 查看,开发建议以airockchip官方更新版本作为参考。

2.1. RKNN 模型

RKNN 是 Rockchip NPU 平台使用的模型类型,以.rknn后缀结尾的模型文件。用户可以通过RKNN SDK提供的工具将自主研发的算法模型转换成 RKNN 模型

RKNN 模型可以直接运行在 RK3588 平台上,在rknpu2/examples中有例子,根据README.md编译生成 Android 或 Linux Demo(需要交叉编译环境)。也可以直接下载编译好的 Demo

在 AIO-3588L 上运行yolov5 demo如下:

# Platform 为芯片平台,如RK3576,RK3588, RK3566_RK3568等
:/ # cd /data/rknn_yolov5_demo_Android  (Linux 系统使用 rknn_yolov5_demo_Linux 即可)
:/data/rknn_yolov5_demo_Android # chmod 777 rknn_yolov5_demo
:/data/rknn_yolov5_demo_Android # export LD_LIBRARY_PATH=./lib
:/data/rknn_yolov5_demo_Android # ./rknn_yolov5_demo model/Platform/yolov5s-640-640.rknn ./model/bus.jpg resize ./out.jpg
post process config: box_conf_threshold = 0.25, nms_threshold = 0.45
Loading mode...
sdk version: 2.3.0 (c949ad889d@2024-11-07T11:35:33) driver version: 0.9.3
model input num: 1, output num: 3
  index=0, name=images, n_dims=4, dims=[1, 640, 640, 3], n_elems=1228800, size=1228800, w_stride = 640, size_with_stride=1228800, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
  index=0, name=output0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, w_stride = 0, size_with_stride=1638400, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
  index=1, name=286, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, w_stride = 0, size_with_stride=409600, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
  index=2, name=288, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, w_stride = 0, size_with_stride=122880, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=-128, scale=0.003922
model is NHWC input fmt
model input height=640, width=640, channel=3
Read ./model/bus.jpg ...
img width = 640, img height = 640
once run use 67.055000 ms
loadLabelName ./model/coco_80_labels_list.txt
person @ (209 243 286 510) 0.879723
person @ (479 238 560 526) 0.870588
person @ (109 238 231 534) 0.839831
bus @ (91 129 555 464) 0.692042
person @ (79 353 121 517) 0.300961
save detect result to ./out.jpg
loop count = 10 , average run  59.530100 ms

2.2. 非 RKNN 模型

对于 Caffe、TensorFlow 等其他模型,想要在 RK3588 平台运行,需要先进行模型转换。可以使用 RKNN-Toolkit2 工具将模型转换成 RKNN 格式。

2.3. RKNN-Toolkit2工具

2.3.1. 工具介绍

RKNN-Toolkit2 是为用户提供在 PC、Rockchip NPU 平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成各种操作。

工具的全部功能简单介绍如下:

  • 模型转换: 支持 CaffeTensorFlowTensorFlow LiteONNXDarkNetPyTorch 等模型转为 RKNN 模型,并支持 RKNN 模型导入导出,RKNN 模型能够在 Rockchip NPU 平台上加载使用
     

  • 量化功能: 支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化 ( asymmetric_quantized-8 及 asymmetric_quantized-16 ),并支持混合量化功能 。 asymmetric_quantized-16 目前版本暂不支持
     

  • 模型推理: 能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果; 或将 RKNN 模型分发到指定的 NPU 设备上进行推理并获取推理结果
     

  • 性能评估: 将 RKNN 模型分发到指定 NPU 设备上运行,以评估模型在实际设备上运行时的性能
     

  • 内存评估: 评估模型运行时的内存的占用情况。使用该功能时,必须将 RKNN 模型分发到 NPU 设备中运行,并调用相关接口获取内存使用信息
     

  • 量化精度分析: 该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路

2.3.2. 环境依赖

  • 系统依赖:RKNN-Toolkit2 目前版本适用系统Ubuntu18.04(x64)及以上,工具只能安装在 PC 上,暂不支持 Windows、MacOS、Debian 等操作系统

  • Python版本:3.6/3.8

  • Python依赖库:


2.3.3. RKNN-Toolkit2 安装

建议使用 virtualenv 管理 Python 环境,因为系统中可能同时有多个版本的 Python 环境,以 Python3.6 为例


2.3.4. 模型转换 Demo

rknn-toolkit2/examples下有各种功能的 Toolkit Demo ,这里我们运行一个模型转换 Demo 为例子,这个 Demo 展示了在 PC 上将 tflite 模型转换成 RKNN 模型,然后导出、推理、部署到 NPU 平台运行并取回结果的过程。模型转换的具体实现请参考 Demo 内源代码以及本页末尾的文档。

2.3.4.1. 在 PC 上仿真运行

  • RKNN-Toolkit2 自带了一个模拟器,直接在 PC 上运行 Demo 即是将转换后的模型部署到仿真 NPU 上运行


2.3.4.2. 运行在与 PC 相连的 AIO-3588L NPU 平台上

RKNN-Toolkit2 通过 PC 的 USB 连接到 OTG 设备 AIO-3588L。RKNN-Toolkit2 将 RKNN 模型传到 AIO-3588L 的 NPU 上运行,再从 AIO-3588L 上获取推理结果、性能信息等:

  • 首先部署 AIO-3588L 环境:更新librknnrt.so及运行rknn_server Android


  • 然后在 PC 上修改examples/tflite/mobilenet_v1/test.py文件,在其中添加目标平台


  • PC 端运行test.py


2.3.5. 其他 Toolkit Demo

其他 Toolkit Demo 可以在rknn-toolkit2/examples/下找到,例如量化、精度评估等。具体实现以及使用方法请参考 Demo 内源代码以及详细开发文档。

2.4. 详细开发文档

AIO-3588L NPU 及 Toolkit 详细使用方法请参考RKNN SDK下《Rockchip_RKNPU_User_Guide_RKNN_API_*.pdf》、《Rockchip_User_Guide_RKNN_Toolkit2_*.pdf》文档。

常见问题解答

1. Linux 设备树 (DTS) 指南

有时候需要配置设备树来调整板子功能,比如 M.2 接口 SATA/PCIE 功能的切换、CAN 接口时钟的修改等。这篇教程会告诉你如何在 SDK 中寻找到板子对应的设备树文件以及有关修改的注意事项。

1.1. 找到设备树

首先需要学习如何编译 Linux SDK,之后你应该可以理解,所有的编译配置信息记录在 SDK/device/rockchip/rk3588/ 下的众多 mk 文件里。

假设我需要编译 ITX-3588J 支持 mipi 屏幕的 Ubuntu 固件,那么对应的配置文件为:itx-3588j-BE45-A1-ubuntu.mk

前往 SDK/device/rockhip/rk3588 下寻找 itx-3588j-BE45-A1-ubuntu.mk 并打开,可以很直观看到对应的 dts:


RK_KERNEL_DTS 属性就记录着对应的 dts 文件名称,此处是不带后缀的,所以完整的 dts 名称为 rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1.dts

有些 mk 文件可能没有 RK_KERNEL_DTS 属性,例如编译麒麟固件的配置 itx-3588j-kylin.mk:


原因是它 source 了其他文件,其实设备树信息是记录在了 ${DEVICE_NAME}-ubuntu.mk 中。${DEVICE_NAME} 是个变量,表示设备名称,所以也就是记录在了 itx-3588j-ubuntu.mk 中。

知道设备树名称后,就可以前往 SDK/kernel/arch/arm64/boot/dts/rockchip/ 下找到该设备树。

1.2. 修改设备树

打开 SDK/kernel/arch/arm64/boot/dts/rockchip/rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1.dts 后你可能发现,这个文件基本是空的,如何修改?


原因是该文件 include 了 rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1.dtsi,注意后缀为 dtsi,再次打开这个文件就可以看到设备树节点。同样的,该文件也会 include 其他文件。

所以设备树是多个 dts/dtsi 文件共同组成的,并不是单个文件:


  1. 如果在 A.dts 里面找不到某个节点,那么就可能在 B.dtsi 中,或者在 C.dtsi 中…根据包含关系总能找到。

  2. 上层的配置会覆盖底层的配置,例如 C.dtsi 中将 uart0 关闭,但 A.dts 中配置为开启,那么 A.dts 中的配置会生效,uart0 开启。

  3. 一个 dtsi 可能被多个文件 include,修改会导致多个板型同步修改,所以修改前请明确包含关系。

以太网、PCIE、UART 等各功能的配置指南一般可以在 SDK/docs/ 下的文档中找到。修改设备树需要基本的 kernel 知识、设备树语法,并且你需要明确的知道你在干什么。修改不当会导致功能不正常,甚至无法开机。

1.3. 编译烧录

修改完成后回到 SDK 根目录,使用 build.sh 进行配置与编译:


编译的结果会在 SDK/kernel 下,是一个镜像 extboot.img 和一个文件夹 extboot

烧录方法(二选一):

  1. 可以将 SDK/kernel/extboot/ 下的所有东西复制到板子的 /boot/ 下,然后重启板子。

  2. 或者根据固件烧录中烧写 kernel 分区的方法烧录 extboot.img

参考资料

1. 接口定义

1.1. 整机接口定义

AIO-3588L V1.0 提供了丰富的接口,主要包括:

  • 1 x HDMI2.1(最大支持 8K@60Hz 输出)

  • 1 x HDMI2.0

  • 1 x HDMIIN2.0(最大支持 4K@60Hz 输入)

  • 1 x Display Port1.4(最大支持 8K@30Hz 输出)

  • 1 x USB3.0 OTG(Type-C)

  • 2 x MIPI-DSI

  • 2 x MIPI-CSI

  • 1 x M.2 SATA3.0 或 M.2 PCIe2.0

  • 1 x PCIe3.0x4

  • 1 x TF Card

  • 1 x 4G LTE

  • 1 x SIM 卡槽

  • 2 x USB3.0

  • 2 x USB2.0(由44Pin排针引出)

  • 1 x PCIe2.0 (M.2 E-KEY for WiFi6/BT5.0)

  • 1 x FAN

  • 1 x RJ45(支持 1Gbps)

  • 1 × 3.5mm耳机接口

1.2. 具体如下图:

_images/interface_all.png

资源下载

资源下载

电话咨询
微信咨询
留言