上手教程
介绍
串口调试
升级固件
介绍
使用USB线缆升级固件
MaskRom模式
使用SD卡升级固件
Linux开发
编译 Linux 固件
Firefly Linux 开发指南
Android开发
ADB 使用
编译环境搭建
编译 Android14.0 固件
Firefly Android 开发指南
FireflyApi2 使用手册
技术案例
接口使用
Camera 使用
CAN 使用
Display 使用
I2C 使用
LED 使用
RTC 使用
SPI 使用
UART 使用
Watchdog 使用
配件
摄像头模组
通信模组
其他
大语言模型
NPU使用
常见问题解答
参考资料
资源下载
Core-3576JD4
产品规格书

上手教程

1. 介绍

Core-3576JD4 配置 Rockchip 八核 64 位 AIOT 处理器 RK3576,采用先进工艺制程,高性能低功耗,内置 ARM Mali G52 MC3 GPU,集成 6 TOPS 算力 NPU,支持 Transformer 架构下超大规模参数模型的私有化部署,并支持自定义算子开发,支持 Docker 容器化管理技术。同时支持 4K@120fps 解码/4K@60fps 编码,具备 4K@120fps 高清高帧率显示能力,支持外部看门狗,拥有工业级的稳定性。提供底板参考设计资料,用户可自主深度化定制。

_images/Core-3576JD4.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-3576JD4出厂默认会有一个操作系统,如果用户要运行其他操作系统,需要使用对应的固件烧写到主板。

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

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

1.2. 固件获取

1.3. 升级方式

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

  • 使用USB线缆升级固件

    使用Type-C 数据线 将主板连接到电脑上,通过升级工具将固件烧写到主板上。
     

  • 使用SD卡升级固件

    通过升级卡制作工具,将 MicroSD 卡制作为升级卡,将升级卡插入主板,上电开机,机器自动执行升级。

1.4. 启动存储器

AIO-3576JD4 从以下的存储器中加载系统:

  • eMMC 接口

  • SDMMC 接口

1.5. 启动模式

AIO-3576JD4有三种启动模式:

  • 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-3576JD4 开发板的存储器中。升级时,需要根据主机操作系统和固件类型来选择合适的升级方式。

2.2. 准备工具

  • AIO-3576JD4 开发板

  • 固件

  • 主机

  • 良好的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

为避免由下载工具版本引起的烧写问题,推荐使用公版固件压缩包内部打包好的工具进行烧写

也可以单独下载 AndroidTool,解压,运行 RKDevTool_Release_v2.xx 目录里面的 RKDevTool.exe(注意,如果是 Windows 7/8,需要按鼠标右键,选择以管理员身份运行),如下图:

_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模式

AIO-3576JD4 没有硬件进入 Loader 模式的办法。

2.5.1.2. 软件方式进入Loader模式

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


另外需要检查板子上的这个拨码开关是否在 1 的位置,如果不是,请拨到 1

_images/upgrade_otg_interface_switch.png

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.jpg

如果是带外壳整机,可以使用小棍子伸入耳机孔来按 maskrom 键。

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

_images/upgrade_maskrom_zh.png

4. 使用SD卡升级固件

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

使用MicroSD升级固件,需要在电脑上,通过做卡工具,将统一固件写入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 固件

1.1. 编译 Ubuntu 固件

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

本教程的编译部分适用于 v0.1.0a 以上 SDK 版本


1.1.2. 编译 SDK

1.1.2.1. 编译前配置

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


1.1.2.2. 编译

1.1.2.2.1. 全自动编译
  • 下载根文件系统:Rootfs,放到 SDK 路径下


生成的完整固件会保存到 output/update/ 目录。

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


  • 下载根文件系统:Rootfs,放到 SDK 路径下


Firefly Linux 开发指南

Firefly Linux 开发指南

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

  • 64GB 物理内存 交换内存

  • 400GB 空闲的磁盘空间

如需编译 Android 14,您必须使用 Ubuntu 20.04 或更高版本。
如需安装 Ubuntu 20.04 或更高版本所需的软件包,请运行以下命令:

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

3. 编译 Android14.0 固件

3.1. 下载 Android14.0 SDK

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

3.1.1. 下载 SDK

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

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

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

3.1.2. 更新 SDK

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


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

3.2. Core-3576JD4 产品编译方法

3.2.1. 整体编译

3.2.1.1. HDMI 固件编译

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

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

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

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

3.3. 其他编译说明

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

Android14.0的kernel.imgresource.img包含在boot.img中,编译kernel后需要在android根目录下执行./mkimage.sh重新打包boot.img,然后烧写rockdev/Image-rk3576_firefly_aio_3576_jd4/目录下的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-rk3576_firefly_aio_3576_jd4/ 中。以下列出一般固件用到的镜像文件:

固件 说明
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.Firefly Android 开发指南

Firefly Android 开发指南

5.FireflyApi2 使用手册

FireflyApi2 使用手册

6. 技术案例

6.1. 虚拟硬件技术

_images/android_technical_cases_virtual_device.png

详情请参阅 虚拟硬件技术

6.2. 多设备启动系统

_images/android_technical_cases_multidevice.png

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

6.3. 多屏异显

_images/android_technical_cases_yixian.png

详情请参阅 RK3588多屏异显

6.4. 多屏拼接

_images/android_technical_cases_pinjie.png

详情请参阅 RK3588多屏拼接

1. Camera 使用

  • 接口效果图

_images/usage_camera_mipicsi.jpg

1.1. PHY 介绍

RK3576 芯片有 1 个 DCPHY 和 2 个 DPHY, 两个 DPHY 可以工作在两个模式: full mode 和 split mode。DCPHY 则只有 full mode。

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

1.2. Full Mode 配置

AIO-3576JD4 有 3 个摄像头接口,他们的配置链路如下:


1.3. 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去查看


1.4. Android 系统使用 Camera 应用

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

1.5. Linux 系统预览摄像头

Ubuntu 固件可以使用如下脚本进行预览。


2. CAN 使用

2.1. CAN 简介

CAN(Controller Area Network)总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。CAN总线是一种在汽车上广泛采用的总线协议,被设计作为汽车环境中的微控制器通讯。 如果想了解更多的内容可以参考CAN应用报告

2.2. 硬件连接

CAN模块之间接线:CAN_H接CAN_H,CAN_L接CAN_L。

_images/usage_can_interface.jpg

2.3. DTS 节点配置

  • 公共配置 kernel/arch/arm64/boot/dts/rockchip/rk3576.dtsi

    
    
  • 板级配置 kernel/arch/arm64/boot/dts/rockchip/rk3576-firefly-aio-3576jd4.dtsi


另外可设置时钟频率 assigned-clock-rates,如果 CAN 的比特率低于等于 3M 建议修改 CAN 时钟到 100M,信号更稳定。高于 3M 比特率的,时钟设置 200M 就可以。

2.4. 通信测试

2.4.1. CAN 通信测试

使用 candump 和 cansend 工具进行收发报文测试即可,Ubuntu 系统可使用 apt update && apt install can-utils 安装。

Android 可以将工具 push 到 /system/bin/ 目录下执行。工具包含在 SDK 中,也可以在 官方 或者 github 下载。

2.6. FAQS

总结调试过程中遇到的几个问题及解决方法:

2.6.1. 报文发送后很久才接收到,或者接收不到。

检查总线 CAN_H 和 CAN_L, 杜邦线是否松动或者接反。

2.6.2. CAN时钟频率配置

如果CAN的比特率低于等于3M建议修改CAN时钟到100M,信号更稳定。高于3M比特率的, 时钟设置200M就可以。

CAN时钟频率修改方法参考如下:


注意

  • 在某些时钟频率下,CAN的bitrate无法获得准确的速率,大家可以自行调整assigned-clock-rates去解决。

  • 查看是否得到所需的bitrare:

    
    

3. Display 使用

RK3576 拥有 3 路 vp (Video Port),每一个 vp 端口都绑定了固定的显示控制器。详情可以查看设备树文件 rk3576.dtsi 中的 vop_out 节点。

比如 vp0 支持 dsi, hdmi/edp, dp0~2 的输出。

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

  • vp0 最大可以输出 4K@120Hz

  • vp1 最大可以输出 2560x1600@60Hz

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

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

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

3.1. AIO-3576JD4 显示接口的配置

核心板虽然支持多种视频接口,但 AIO-3576JD4 只有 HDMI 接口。

客户在自行设计底板时候如果要用到其他接口,可以参考其他板型的 dts 比如:


4. I2C 使用

4.1. 简介

RK3576 有 10 个片上 I2C 控制器,但不是全都能使用,有些复用成了其他功能。

AIO-3576JD4开发板上通过排针引出了 2 个 I2C

_images/usage_i2c_interface.jpg

I2C0 (对应丝印 I2C5)和 I2C3 (对应丝印 I2C4)

为什么实际情况和丝印不同?那是因为该底板可兼容其他不同核心板。

该底板在搭配 Core-3576JD4 的情况下,实际连接的就是 I2C0 和 I2C3

用户空间可以使用 i2c-tools 的相关命令读写 I2C 设备。

如果是内核空间配置 I2C 设备,可分为两大步骤:

  • 定义和注册 I2C 设备

  • 定义和注册 I2C 驱动

下面以配置 GSL3680 为例。

4.2. 定义和注册 I2C 设备

在注册 I2C 设备时,需要结构体 i2c_client 来描述 I2C 设备。然而在标准 Linux 中,用户只需要提供相应的 I2C 设备信息,Linux 就会根据所提供的信息构造 i2c_client 结构体。

用户所提供的 I2C 设备信息以节点的形式写到 DTS 文件中,如下所示:


4.3. 定义和注册 I2C 驱动

4.3.1. 定义 I2C 驱动

在定义 I2C 驱动之前,用户首先要定义变量 of_device_id i2c_device_id

of_device_id 用于在驱动中调用 DTS 文件中定义的设备信息,其定义如下所示:


注:变量 id_table 指示该驱动所支持的设备。

4.3.2. 注册 I2C 驱动

使用 i2c_add_driver 函数注册 I2C 驱动。


在调用 i2c_add_driver 注册 I2C 驱动时,会遍历 I2C 设备,如果该驱动支持所遍历到的设备,则会调用该驱动的 probe 函数。

4.3.3. 通过 I2C 收发数据

在注册好 I2C 驱动后,即可进行 I2C 通讯。

  • 向从机发送信息:


4.4. FAQs

4.4.1. Q1: 通信失败,出现这种 log: “timeout, ipd: 0x00, state: 1” 该如何调试?

A1: 请检查硬件上拉是否给电。

4.4.2. Q2: 调用 i2c_transfer 返回值为 -6?

A2: 返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况:

  • I2C 地址错误,解决方法是测量 I2C 波形,确认是否 I2C 设备地址错误;

  • I2C slave 设备不处于正常工作状态,比如未给电,错误的上电时序等;

  • 时序不符合 I2C slave 设备所要求也会产生 Nack 信号。

4.4.3. Q3: 当外设对于读时序要求中间是 stop 信号不是 repeat start 信号的时候,该如何处理?

A3: 这时需要调用两次 i2c_transfer, I2C read 拆分成两次,修改如下:


5. LED 使用

5.1. 前言

AIO-3576JD4开发板上有 1 个绿色的电源灯,该灯为硬件指示灯,软件不可控制。

另一个黄色 LED 灯可控,由扩展 gpio PCA9555 控制,如下表所示:

LED Pin name Pin number
Yellow PCA_IO0_3 503

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

5.2. 以设备的方式控制 LED

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

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

  • Green: 电源指示灯,不可控

  • Yellow:用户自定义状态

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


5.3. 使用 trigger 方式控制 LED

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

  • Simple trigger LED

  • Complex trigger LED

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

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

kernel/arch/arm64/boot/dts/rockchip/rk3576-firefly-aio-3576jd4.dtsi 文件中定义 LED 节点,可以用 pwm 控制也可以用 gpio 控制,类似这样:


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

5.3.1. Simple trigger LED

按名字来是看就是简单的触发方式控制 LED,请参考 kernel/drivers/leds/trigger/led-firefly-demo.c

5.3.2. Complex trigger LED

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

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

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


默认应该就是开启的,如果没有,打开后要保存配置并编译烧录内核。

之后我们可以使用串口输入命令,就可以看到灯不停的间隔闪烁。


6. RTC 使用

6.1. 简介

AIO-3576JD4开发板采用 TT8563RH 作为RTC(Real Time Clock),TT8563RH 是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断 输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。

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

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

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

  • 内部集成振荡电容

  • 漏极开路中断引脚

AIO-3576JD4 存在电容给RTC供电,可以在短时间内保证RTC运行。

_images/usage_rtc_capacitor.jpg

6.2. RTC驱动

DTS配置参考: kernel/arch/arm64/boot/dts/rockchip/rk3576-firefly-aio-3576jd4.dtsi

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

6.3. 接口使用

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

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

  • PROCFS接口: /proc/driver/rtc

  • IOCTL接口: /dev/rtc0

6.3.1. SYSFS接口

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

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


注意:AIO-3576JD4不支持定时开机

6.3.2. PROCFS 接口

打印 RTC 相关的信息:


6.3.3. IOCTL接口

可以使用 ioctl 控制 /dev/rtc0

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

6.4. FAQs

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

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

7. SPI 使用

7.1. SPI 简介

SPI 是一种高速的,全双工,同步串行通信接口,用于连接微控制器、传感器、存储设备等。 AIO-3576JD4 开发板提供了 SPI 接口,具体位置如下图:

_images/usage_spi_interface.jpg

丝印是 SPI3,但实际为 SPI4,原因是该底板可兼容不同核心板,在搭配 Core-3576JD4 时实际为 SPI4

7.2. SPI 工作方式

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


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

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

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

_images/usage_spi_waveform.jpg

7.3. 接口使用

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

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

内核 config 需要选上 SPI_SPIDEV:


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

7.4. FAQs

7.4.1. Q1: SPI 数据传送异常

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

8. UART 使用

8.1. 硬件

Core-3576JD4 使用了 UART3 做 RS485,在系统中对应 /dev/ttyS3 设备;UART8 做 RS232,在系统中对应 /dev/ttyS8 设备。没有引出普通 UART。

其中 GPIO3_A3 用作了 RS485 的收发控制,该引脚拉高是发送,拉低为接收。用户可以通过 /sys/class/gpio 子系统去操作。

接口图如下:

_images/usage_uart_interface.jpg

9. Watchdog 使用

9.1. 简介

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

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

本章节主要介绍 AIO-3576JD4 开发板看门狗的使用。

9.2. DTS配置

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


9.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

9.4. 外部看门狗

AIO-3576JD4 还有 2 个外部看门狗,核心板上一个,底板一个,分别对应 /dev/wdt_core 和 /dev/wdt_base

使用方法:


2. 通信模组

Firefly 支持的通信模组如下:

1. 大语言模型

1.1. RKLLM 介绍

RKLLM SDK可以帮助用户快速将大语言模型部署到AIO-3576JD4上。 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-3576JD4 板端通过调用 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-3576JD4 上部署运行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使用

RK3576 内置 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 模型可以直接运行在 RK3576 平台上,在rknpu2/examples中有例子,根据README.md编译生成 Android 或 Linux Demo(需要交叉编译环境)。也可以直接下载编译好的 Demo

在 AIO-3576JD4 上运行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 等其他模型,想要在 RK3576 平台运行,需要先进行模型转换。可以使用 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-3576JD4 NPU 平台上

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

  • 首先部署 AIO-3576JD4 环境:更新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-3576JD4 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/rk3576/ 下的众多 defconfig 文件里。

格式为:firefly_芯片_板型(-配件)_系统_defconfig

假设我需要编译 AIO-3576JD4 的 Ubuntu 固件,则配置文件为 firefly_rk3576_aio-3576jd4_ubuntu_defconfig

前往 SDK/device/rockhip/rk3576 下打开 firefly_rk3576_aio-3576jd4_ubuntu_defconfig,可以很直观看到对应的 dts:


RK_KERNEL_DTS_NAME 属性就记录着对应的 dts 文件名称,此处是不带后缀的,所以完整的 dts 名称为 rk3576-firefly-aio-3576jd4.dts

有些 defconfig 文件可能没有 RK_KERNEL_DTS_NAME 属性,原因是 defconfig 支持 include,可能 RK_KERNEL_DTS_NAME 在 include 的文件中已经配置过了,所以此处不用再配置。

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

1.2. 修改设备树

这次我们使用 rk3576-firefly-roc-rk3576-pc.dts 举例:

打开 SDK/kernel/arch/arm64/boot/dts/rockchip/rk3576-firefly-roc-rk3576-pc.dts 后你可能发现,这个文件基本是空的,如何修改?


  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-3576JD4 V1.0 使用的接口,主要包括:

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

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

  • 1 x USB2.0 (排针)

  • 2 x USB3.0

  • 3 x MIPI-CSI (CSI0 和 CSI1 不能同时使用)

  • 1 x TF Card

  • 1 x WIFI

  • 1 x Bluetooth

  • 1 x FAN

  • 2 x RJ45(支持 1Gbps)

  • 1 × 3.5mm 耳机接口

  • 1 x RS485

  • 1 x RS232

  • 1 x CAN

  • 1 x Mini PCIe (4G 模块)

  • 1 x PCIe M.2 (5G 模块)

具体如下图:

_images/interface_front_zh.png

_images/interface_back_zh.png

_images/interface_io_zh.png

1.2. 特殊接口说明

Mini PCIe (4G 模块) 和 PCIe M.2 (5G 模块) 共用了一路 USB,所以不能同时使用。

默认是 4G 模块,如需使用 5G 需要调整底板电阻位置。

资源下载

资料下载

电话咨询
微信咨询
留言