上手教程
ROC-RK3576-PC 基于 Rockchip 新一代 8nm 高性能 AIoT 芯片 – RK3576 , 搭载八核(Cortex-A72 x 4 Cortex-A53 x 4)64位 CPU,主频高达 2.2GHz,为高性能计算和多任务处 理提供了强大支持。
内置 ARM Mali G52 MC3 GPU,集成 6 TOPS算力 NPU,支持 Transformer 架构下超大规模参数模型的私有化部署,支持多种深度学习框架、自定义算子开发、Docker 容器化管理技术。 配置外部看门狗,具备工业级稳定性,广泛适用于AI本地部署的应用场景。
参数 | |
---|---|
尺寸 | 25x15.5mm |
芯片 | CP2104 |
LED | Power LED, TX LED, RX LED |
USB 类型 | MicroUSB |
排针 | 2.54mm 3PIN |
主控 | 板卡型号 |
---|---|
PX30 | AIO-PX30-JD4 |
RK3128 | Firefly-RK3128, AIO-3128C |
RK3288 | Firefly-RK3288, AIO-3288C, AIO-3288J |
RK3308 | ROC-RK3308-CC, ROC-RK3308B-CC V0.1, ROC-RK3308B-CC V1.0 ROC-RK3308B-CC-PLUS |
RK3328 | ROC-RK3328-CC, ROC-RK3328-PC, AIO-RK3328-JD4 |
RK3399 | AIO-3399C, AIO-3399J, AIO-3399JD4 ROC-RK3399-PC-PLUS, ROC-RK3399-PC, ROC-RK3399-PC-Pro Firefly-RK3399, Face-RK3399 V1, Face-RK3399 V2 |
RK3399Pro | AIO-3399ProC, AIO-3399Pro-JD4 |
RK3566 | AIO-3566JD4, ROC-RK3566-PC |
RK3568 | AIO-3568J, ROC-RK3568-PC, ROC-RK3568-PC SE |
RV1106 | CT36L |
RV1126_RV1109 | AIO-1126-JD4, AIO-1109-JD4, CAM-C1126S2U, CAM-C1109S2U |
RK3588 | ITX-3588J,ROC-RK3588S-PC,AIO-3588SJD4,ROC-RK3588-PC,AIO-3588Q,AIO-3588SG ,AIO-3588L |
RK3576 | AIO-3576JD4 |
RK3506 | ROC-RK3506B-CC,ROC-RK3506J-CC |
注意: 如使用其它串口适配器遇到 TX 和 RX 不能输入和输出的问题,可以尝试对调 TX 和 RX 的连接。
波特率:1500000
数据位:8
停止位:1
奇偶校验:无
流控:无
说明: 以下表格中板型的调试串口波特率有所不同,是 115200。
板卡型号 |
---|
RK3128 全系列,RK3288 全系列,AIO-3576JD4 |
我们的串口模块使用的是 CP2104,所以下载驱动并安装:
如果您另外购买了使用其他芯片的模块,比如 CH340 或 PL2303,可以从这下载驱动:
如果在 Win8 上不能正常使用 PL2303,参考这篇文章, 采用 3.3.5.122 或更老版本的旧驱动即可。
如果在 Windows 系统上安装官网的 CP210X 驱动,使用 PUTTY 或 SecureCRT 等工具设置串口波特率为 1500000,如果出现设置不了或无效的问题,可以下载旧版本驱动。
插入适配器后,系统会提示发现新硬件,并初始化,之后可以在设备管理器找到对应的 COM 口:
Windows 上一般用 putty 或 SecureCRT。其中我们推荐使用 MobaXterm 免费版本。这是一款功能强大的终端软件,在这里介绍一下,MobaXterm 的使用方法与之类似。
到这里下载 MobaXterm:
选择 session 为 Serial。
将 Serial port 修改为在设备管理器中找到的 COM 端口。
设置 Speed (bsp) 为 1500000。
点击 OK 按钮。
在 Ubuntu 上可以有多种选择:
minicom
picocom
kermit
篇幅关系,以下就介绍 minicom 的使用。
升级固件
ROC-RK3576-PC出厂默认会有一个操作系统,如果用户要运行其他操作系统,需要使用对应的固件烧写到主板。
ROC-RK3576-PC有灵活的启动方式。一般情况下,除非硬件损坏,ROC-RK3576-PC 开发板是不会变砖的。
如果在升级过程中出现意外,bootloader 损坏,导致无法重新升级,此时仍可以进入 MaskRom 模式来修复。
ROC-RK3576-PC 支持通过以下两种方式升级固件:
使用USB线缆升级固件
使用Type-C 数据线 将主板连接到电脑上,通过升级工具将固件烧写到主板上。
使用SD卡升级固件
通过升级卡制作工具,将 MicroSD 卡制作为升级卡,将升级卡插入主板,上电开机,机器自动执行升级。
ROC-RK3576-PC 从以下的存储器中加载系统:
eMMC 接口
SDMMC 接口
ROC-RK3576-PC有三种启动模式:
Normal 模式
Loader 模式
MaskRom 模式
Normal 模式就是正常的启动过程,各个组件依次加载,正常进入系统。
在 Loader 模式下,bootloader 会进入升级状态,等待主机命令,用于固件升级等。
MaskRom 模式用于 bootloader 损坏时的系统修复。
一般情况下是不用进入 MaskRom 模式的,只有在 bootloader 校验失败(读取不了 IDB 块,或 bootloader 损坏) 的情况下,BootRom 代码 就会进入 MaskRom 模式。此时 BootRom 代码等待主机通过 USB 接口传送 bootloader 代码,加载并运行之。
要强行进入 MaskRom 模式,请参阅《MaskRom模式》一章。
本文介绍了如何将主机上的固件,通过Type-C 数据线烧录到 ROC-RK3576-PC 开发板的存储器中。升级时,需要根据主机操作系统和固件类型来选择合适的升级方式。
ROC-RK3576-PC 开发板
主机
良好的Type-C 数据线
固件可以通过编译SDK获得,也可以通过资源下载处下载公版固件(统一固件)。固件文件一般有两种:
单个统一固件
统一固件是由分区表、bootloader、uboot、kernel、system等所有文件打包合并成的单个文件。Firefly正式发布的固件都是采用统一固件格式,升级统一固件将会更新主板上所有分区的数据和分区表,并且擦除主板上所有数据。
多个分区镜像
即各个功能独立的文件,如分区表、bootloader、kernel等,在开发阶段生成。独立分区镜像可以只更新指定的分区,而保持其它分区数据不被破坏,在开发过程中会很方便调试。
通过统一固件解包/打包工具,可以把统一固件解包为多个分区镜像,也可以将多个分区镜像合并为一个统一固件。
安装RK USB驱动
下载 Release_DriverAssistant.zip,解压,然后运行里面的 DriverInstall.exe 。为了所有设备都使用更新的驱动,请先选择驱动卸载,然后再选择驱动安装。
运行AndroidTool的RKDevTool.exe
为避免由下载工具版本引起的烧写问题,推荐使用公版固件压缩包内部打包好的工具进行烧写
也可以单独下载 AndroidTool,解压,运行 RKDevTool_Release_v2.xx 目录里面的 RKDevTool.exe(注意,如果是 Windows 7/8,需要按鼠标右键,选择以管理员身份运行),如下图:
Linux 下无须安装设备驱动
下载 Linux_Upgrade_Tool, 并按以下方法安装到系统中,方便调用:
下载 Linux_adb_fastboot, 并按以下方法安装到系统中,方便调用:
通常我们升级固件的模式有两种,分别是Loader模式和MaskRom模式。烧写固件前,我们需要连接好设备,并让板子进入到可升级模式。
连接设备并通过RECOVERY按键进入Loader升级模式步骤如下:
先断开电源适配器连接
使用 Type-C 数据线一端连接主机,一端连接开发板
按住设备上的 RECOVERY (恢复)键并保持
接上电源
大约两秒钟后,松开 RECOVERY 键
Type-C 数据线接好后在串口调试终端或adb shell给板子运行以下命令
如何确定板子是否进入Loader模式,我们可以通过工具去查看
Windows操作系统
通过AndroidTool工具可以看到下方提示Found One LOADER Device
如果有进行”进入Loader模式”的操作,仍旧没有看到烧写工具提示LOADER,此时可以可以看一下Windows主机是否有提示发现新硬件并配置驱动。打开设备管理器,会见到新设备 Rockusb Device 出现,如下图。如果没有,可返回上一步重新安装驱动。
Linux操作系统
运行upgrade_tool后可以看到连接设备中有个Loader的提示
进入MaskRom模式的方法,请参考《MaskRom模式》
烧写统一固件 update.img 的步骤如下:
切换至Upgrade Firmware页。
按Firmware按钮,打开要升级的固件文件。升级工具会显示详细的固件信息。
按Upgrade按钮开始升级。
如果升级失败,可以尝试先按EraseFlash 按钮来擦除 Flash,然后再升级。
烧写分区映像的步骤如下:
切换至Upgrade Firmware页。
勾选需要烧录的分区,可以多选。
确保映像文件的路径正确,需要的话,点路径右边的空白表格单元格来重新选择。
点击Run按钮开始升级,升级结束后设备会自动重启。
如果板子进入不了 Loader 模式,此时可以尝试强行进入 MaskRom 模式。操作方法见《MaskRom模式》。
如果烧写过程中出现Download Boot Fail, 或者烧写过程中出错,如下图所示,通常是由于使用的USB线连接不良、劣质线材,或者电脑USB口驱动能力不足导致的,请更换USB线或者电脑USB端口排查。
有关启动模式的介绍,请参阅《升级固件介绍》一章
MaskRom 模式是设备变砖的最后一条防线。强行进入 MaskRom 涉及硬件操作,有一定风险,因此仅在设备进入不了 Loader 模式的情况下,方可尝试 MaskRom 模式。进入 MaskRom 的原理是人为的把 EMMC 的数据脚与地线短接,系统会认为 EMMC 数据出错,从而清除 EMMC 数据。
请小心阅读,并谨慎操作!
操作步骤如下:
先断开电源,然后按住 maskrom 按键,再上电,几秒后松开
此时设备就会进入 MaskRom 模式。
本文主要介绍如何通过MicroSD卡,升级主板上的固件。
使用MicroSD升级固件,需要在电脑上,通过做卡工具,将统一固件写入MicroSD卡,目前此操作只支持在Windows操作系统上完成。
主板
电脑
SD卡
USB读卡器
下载需要升级到主板上的统一固件。
打开SD_Firmware_Tool,勾选固件升级框,点击选择固件选择正确升级固件。
将MicroSD插入USB读卡器,再插入到电脑USB口上,在列表式组合框中选择正确的USB设备。
点击开始创建之后,等待创建结束。
取出MicroSD卡,插入主板的MicroSD卡插槽,对主板上电开机,主板自动开始升级。
升级完成后,取出MicroSD卡,主板自动重启,完成整个升级固件的流程。
Linux开发
本章介绍 Ubuntu 固件的编译流程,推荐在 Ubuntu 20.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。
本教程的编译部分适用于 v0.1.0a 以上 SDK 版本
下载根文件系统:Rootfs,放到 SDK 路径下
下载根文件系统:Rootfs,放到 SDK 路径下
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 |
使用 bitbake 命令构建的过程需要保证网络连接正常,如果是中国内陆客户需要保证能 ping 通外网
如果想单独编译部分 recipes 可以参考以下内容:
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.
从根本上说,BitBake 是一个通用任务执行引擎,它允许 shell 和 Python 任务高效并行运行,同时在复杂的任务间依赖约束下工作。 BitBake 的主要用户之一,OpenEmbedded,利用这个核心并使用面向任务的方法构建嵌入式 Linux 软件堆栈。更多详细使用方法请查看《bitbake-user-manual》。
MACHINE=roc-rk3576-pc bitbake u-boot-rockchip
Bitbake paramater | 描述 |
---|---|
-c fetch | 拉取目标所需要的代码 |
-c clean | 清除目标的输出文件 |
-c cleanall | 删除目标所有输出文件、共享高速缓存(shared state cache)和源代码 |
-c compile -f | 使用此选项可在部署映像后强制重新编译,但不建议使用,除非 Yocto Project 不知道目标代码已经发生改变 |
-c listtasks | 列出目标定义的所有 target |
Yocto Project 是一个专注于嵌入式 Linux® 操作系统开发的开源协作项目,它提供灵活的工具集和开发环境,允许全球的嵌入式设备开发人员通过共享技术,软件堆栈,配置和用于创建这些定制的Linux映像的最佳实践进行协作。有关 Yocto 项目的更多信息,请参阅 Yocto Project 官网:www.yoctoproject.org/。 Yocto Project 官网上有 Yocto Project Reference Manual 和 Yocto Project Overview 等相关文档详细描述了如何构建系统。
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 |
Firefly Linux 开发指南
Android开发
ADB,全称 Android Debug Bridge,是 Android 的命令行调试工具,可以完成多种功能,如跟踪系统日志,上传下载文件,安装应用等。
首先参照安装 RK USB 驱动一节安装好驱动。
然后下载 adb.zip,解压到 C:adb 以方便调用。
打开命令行窗口,输入:
列出所有连接设备及其序列号:
前面是 apk 文件,后面则是对应的包名称。
编译 Android 对机器的配置要求较高:
64 位 CPU
64GB 物理内存 交换内存
250GB 空闲的磁盘空间
如需编译 Android 14,您必须使用 Ubuntu 20.04 或更高版本。
如需安装 Ubuntu 20.04 或更高版本所需的软件包,请运行以下命令:
此时视报错信息去安装缺少的软件包(dtc)即可
SDK 源码与 bundle 压缩包均存放在云盘中。如有需要请联系商务 : sales@t-firefly.com
SDK通过邮件的方式获取,把订单号发送到sales@t-firefly.com邮箱并注明需要的SDK名称firefly_rk3576_android14.0_git_20241126
下载完成后,在解压前先校验下 MD5 码:
注意:不要在共享文件夹、挂载文件夹以及非英文目录解压SDK,避免产生不必要的错误
下载 SDK 后,更新代码的方法:
下载页面选择云盘下载 Android14.0 Bundle。
编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:
打包完成后将在rockdev/Image-rk3576_firefly_roc_rk3576_pc/ 目录下生成统一固件: product名XXX_XXX_日期XXX.img
在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdevImage 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdevImage 目录里。
固件 | 说明 |
---|---|
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线缆升级固件》 一文来烧写分区镜像文件。
请参照《OTA编译》章节
Firefly Android 开发指南
FireflyApi2 使用手册
接口使用
ROC-RK3576-PC 开发板上的 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 的基本配置方法。
ROC-RK3576-PC 的ADC接口图如下:
接着在 firefly_adc_probe 中对 DTS 所添加的资源进行解析:
调用 iio_read_channel_raw 函数读取 AD 采集的原始数据并存入 val 中。
使用标准电压将 AD 转换的值转换为用户所需要的电压值。其计算公式如下:
驱动需要获取ADC通道来使用时,需要对驱动的加载时间进行控制,必须要在saradc初始化之后。saradc是使用module_platform_driver()进行平台设备驱动注册,最终调用的是module_init()。所以用户的驱动加载函数只需使用比module_init()优先级低的,例如:late_initcall(),就能保证驱动的加载的时间比saradc初始化时间晚,可避免出错。
接口效果图
RK3576 芯片有 1 个 DCPHY 和 2 个 DPHY, 两个 DPHY 可以工作在两个模式: full mode 和 split mode。DCPHY 则只有 full mode。
简单点来讲,如果用单目摄像头我们可以配置 full mode,若使用双目摄像头我们可以配置 split mode。
目前ROC-RK3576-PC硬件只引出 1 个 DPHY。
配置链路为:csi2_dphy0 –> mipi1_csi2 –> rkcif_mipi_lvds1
详情请查看设备树:rk3576-roc-pc-cam-8ms1m.dtsi
查找摄像头节点
使用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去查看
RK3576 拥有 3 路 Video 输出端口,每一个 Video 输出端口都绑定了固定的显示控制器,如 Port0 可以用于与 DP0、DP1、HDMI/eDP0 和 HDMI/eDP1 等显示控制器的连接,其他 Portx 以此类推。
每一个 Portx 都有各自所能输出的最大分辨率:
Port0 最大可以输出 4K@120Hz
Port1 最大可以输出 2560x1600@60Hz
Port2 最大可以输出 1920x1080@60Hz
软件上如果把 HDMI0 显示控制器连接在 Port0 上,且硬件 phy 支持 HDMI2.1,则 HDMI0 支持 4K@120Hz 的输出。
如果给每一个 Portx 都单独分配一个显示控制器的话,便可支持同一时间的三屏同显(异显)。
ROC-RK3576-PC 有三种显示输出接口,分别是 HDMI、Display Port 以及 MIPI DSI,可以做到多屏同显/异显,接口图如下所示:
HDMI/ Display Port/ MIPI DSI
下面对各个显示输出接口的配置和使用作基本的介绍,详细内容可以参考文件:
kernel/arch/arm64/boot/dts/rockchip/rk3576-firefly-roc-rk3576-pc.dtsi
kernel/arch/arm64/boot/dts/rockchip/rk3576-firefly-roc-rk3576-pc-mipi101-M101014-BE45-A1.dts
ROC-RK3576-PC 硬件上有一个 HDMI 显示输出接口:
HDMI 支持 HDMI2.1 协议,分辨率最高可以支持 4k@120Hz
在设备树中添加:
ROC-RK3576-PC 有一个 Display Port 显示输出接口,支持 DP TX 1.4a 协议,分辨率最高可以支持 4k@120Hz。
Display Port 软件上表示为 dp0,在设备树上添加:
这里要注意,SDK 默认的软件配置是把 dp0 连接在 vp2 上面,这样会导致 dp0 最高只能输出 1920x1080@60Hz, 所以如果需要 4k@120Hz 的功能,需要把 dp0 连接在 vp0上面,软件修改如下:
ROC-RK3576-PC 有一路 MIPI DSI 显示输出接口,支持 DPHY2.0 和 4 Lane 的数据输出,最高可输出 2560x1600@120Hz(取决于连接的 Portx)。
外接的屏幕是 Firefly V2 版本屏幕,
结合 ROC-RK3576-PC 的 DSI 接口和屏幕时序
DSI 接口
V2 屏幕显示时序
V2 屏幕上电时序
V2 屏幕下电时序
V2 屏幕上下电符号参考
在设备树上添加:
在配置 MIPI DSI的时候,如果出现异常现象,如黑屏,画面拉伸,显示有噪点等,需要注意排查:
下面列出一些常规的场景下,关于 Portx 以及 显示控制器之间的配置方法:
在系统中设置分辨率
系统鼠标点击:‘设置->显示->HDMI->分辨率设置’
获取 HDMI/Display Port 的 edid(以 HDMI 为例)
一般如果遇到 HDMI/Display Port 无法显示的问题,都需要先执行上面的命令去看一下连接状态、edid 和分辨率是否正确。
GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的,其核心是填充 GPIO bank 的方法和参数,并调用 gpiochip_add 注册到内核中。
ROC-RK3576-PC 开发板为了方便用户开发使用,引出了GPIO口供用户调试和开发,可以用到的GPIO3_A4
首先在 DTS 文件中增加驱动的资源描述:
在 Firefly 的例子程序中还包含了一个中断引脚,GPIO 口的中断使用与 GPIO 的输入输出类似,首先在 DTS 文件中增加驱动的资源描述:
然后在 probe 函数中对 DTS 所添加的资源进行解析,再做中断的注册申请,代码如下:
从读取到的信息中可以知道,内核把 GPIO 当前的状态都列出来了,以 GPIO1 组为例,gpio-56(GPIO1_D0) 输出高电平 (out hi)。
使用命令
A1: 当使用 GPIO request 时候,会将该 PIN 的 MUX 值强制切换为 GPIO,所以使用该 PIN 脚为 GPIO 功能的时候确保该 PIN 脚没有被其他模块所使用。
A2: 如果用 IO 命令读某个 GPIO 的寄存器,读出来的值异常,如 0x00000000 或 0xffffffff 等,请确认该 GPIO 的 CLK 是不是被关了,GPIO 的 CLK 是由 CRU 控制,可以通过读取 datasheet 下面 CRU_CLKGATE_CON* 寄存器来查到 CLK 是否开启,如果没有开启可以用 io 命令设置对应的寄存器,从而打开对应的 CLK,打开 CLK 之后应该就可以读到正确的寄存器值了。
A3: 测量该 PIN 脚的电压不对时,如果排除了外部因素,可以确认下该 PIN 所在的 IO 电压源是否正确,以及 IO-Domain 配置是否正确。
A4: 如果使用该 GPIO 时,不会动态的切换输入输出,建议在开始时就设置好 GPIO 输出方向,后面拉高拉低时使用 gpio_set_value() 接口,而不建议使用 gpio_direction_output(), 因为 gpio_direction_output 接口里面有 mutex 锁,对中断上下文调用会有错误异常,且相比 gpio_set_value,gpio_direction_output 所做事情更多,浪费。
ROC-RK3576-PC开发板上有个三色LED灯,如下表所示:
LED | Pin name | Pin number |
---|---|---|
Blue | GPIO2_D0 | 88 |
Red | GPIO2_D2 | 89 |
Green | GPIO2_D1 | 90 |
可通过使用 LED 设备子系统或者直接操作 GPIO 控制该 LED。
Trigger 包含多种方式可以控制 LED,这里就用两个例子来说明。
Simple trigger LED
Complex trigger LED
默认应该就是开启的,如果没有,打开后要保存配置并编译烧录内核。
之后我们可以使用串口输入命令,就可以看到灯不停的间隔闪烁。
本章主要描述如何配置 PWM。
用户可在其它驱动文件中使用以上步骤生成的 PWM 节点。具体方法如下:
查看注册是否成功,成功则返回接口名和寄存器地址。
dts 配置文件是否打开对应的 PWM。
PWM 所在的 IO 口是否被其他资源占用,可以根据报错的返回值去查看原因。
ROC-RK3576-PC开发板采用 TT8563RH 作为RTC(Real Time Clock),TT8563RH 是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断 输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。
可计时基于 32.768kHz 晶体的秒,分,小时,星期,天,月和年
宽工作电压范围:1.0~5.5V
低休眠电流:典型值为 0.25μA(VDD =3.0V, TA =25°C)
内部集成振荡电容
漏极开路中断引脚
ROC-RK3576-PC 存在电容给RTC供电,可以在短时间内保证RTC运行。
打印 RTC 相关的信息:
A1: 检查一下 RTC 电池是否正确接入。
ROC-RK3576-PC 开发板上有 1 个 M.2 接口。
可以软件配置成 M.2 SATA3.0 接口,支持 SATA 协议的 SSD 使用,也可以软件配置成 M.2 PCIe2.0 接口,支持 NVMe 协议的 SSD 使用。
默认软件配置成 M.2 SATA3.0 接口, 支持 SATA 协议的 SSD 使用。
一般根据原理图在 DTS 中选择正确的控制器节点和 PHY 节点使能,并关闭与其复用的控制器节点就可以。
在 Android 系统界面中将硬盘格式化为可用格式就可以开机自动挂载
SATA3.0 的传输速率理论上达到 6.0 Gbps,可以参考如下命令进行读写速度测试:
ROC-RK3576-PC 硬件版本的串口接口图如下:
最简单的方式短接UART6 TX RX 引脚, 然后使用命令在调试串口或ADB执行命令
最终调试串口终端即可接收到字符串 “firefly uart test…”
看门狗(watchdog)实际是一个定时器,启动之后会开始计时。系统或者软件需要在规定时间内与看门狗通信(俗称喂狗)重置计时,如此反复下去,以此来确定系统和软件正常运行。
如果规定时间内没有喂狗,看门狗超时,说明系统或应用陷入循环、卡死,此时看门狗会发出复位信号让主控复位,脱离卡死。
本章节主要介绍 ROC-RK3576-PC 开发板看门狗的使用。
watchdog 默认是关闭的,需按上述说明在 DTS 文件中打开相关节点方能使用。
也可以通过程序来控制看门狗,通过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
配件
其他
RKLLM SDK可以帮助用户快速将大语言模型部署到ROC-RK3576-PC上。 SDK下载
RKLLM-Toolkit 是为用户提供在计算机上进行大语言模型的量化、转换的开发套件。通过该工具提供的 Python 接口可以便捷地完成以下功能:
模型转换:支持将 Hugging Face 格式的大语言模型(Large Language Model, LLM)转换为RKLLM 模型,转换后的 RKLLM 模型能够在 Rockchip NPU 平台上加载使用。
量化功能:支持将浮点模型量化为定点模型,目前支持的量化类型包括 w4a16 和 w8a8。
RKLLM Runtime 主 要 负 责 加 载 RKLLM-Toolkit 转换得到的 RKLLM 模型,并在ROC-RK3576-PC 板端通过调用 NPU 驱动在 Rockchip NPU 上实现 RKLLM 模型的推理。在推理RKLLM 模型时,用户可以自行定义 RKLLM 模型的推理参数设置,定义不同的文本生成方式,并通过预先定义的回调函数不断获得模型的推理结果。
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 |
(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!
若所查询的 NPU 内核版本低于 v0.9.8,请前往官方固件地址下载最新固件进行更新
在使用 RKLLM Runtime 的过程中,需要注意gcc交叉编译工具的版本。推荐下载交叉编译工具gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
LLM 的一个常见应用场景是聊天。在聊天上下文中,不再是连续的文本字符串构成的语句,聊天模型由一条或多条消息组成的对话组成,每条消息都有一个“用户“或“助手”等角色,还包括消息文本。然而不同的模型对聊天的输入格式要求也不同。聊天模板用于将问答的对话内容转换为模型的输入prompt。倘若使用空的聊天模板或者使用默认的聊天模板,与模型在训练期间看到的消息格式不匹配,可能会导致性能下降。
例如查看ChatGLM3的聊天模板
更多demo和api使用请参考RKLLM SDK例程和文档。
Q1:转换模型失败?
A1:检查 PC 可用运行内存,参数量越大的模型转换或者运行时所需的内存越大,可以尝试增大 swapfile 或者使用大内存的 PC。
RK3576 内置 NPU 模块, 处理性能最高可达6TOPS。使用该NPU需要下载RKNN SDK,RKNN SDK 为带有 NPU 的 RK 系列芯片提供编程接口,能够帮助用户部署使用 RKNN-Toolkit2 导出的 RKNN 模型,加速 AI 应用的落地,具体支持平台列表可通过 SDK 中 README 文档或者访问airockchip 查看,开发建议以airockchip官方更新版本作为参考。
RKNN 是 Rockchip NPU 平台使用的模型类型,以.rknn后缀结尾的模型文件。用户可以通过RKNN SDK提供的工具将自主研发的算法模型转换成 RKNN 模型
RKNN 模型可以直接运行在 RK3576 平台上,在rknpu2/examples中有例子,根据README.md编译生成 Android 或 Linux Demo(需要交叉编译环境)。也可以直接下载编译好的 Demo。
在 ROC-RK3576-PC 上运行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
对于 Caffe、TensorFlow 等其他模型,想要在 RK3576 平台运行,需要先进行模型转换。可以使用 RKNN-Toolkit2 工具将模型转换成 RKNN 格式。
RKNN-Toolkit2 是为用户提供在 PC、Rockchip NPU 平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成各种操作。
工具的全部功能简单介绍如下:
建议使用 virtualenv 管理 Python 环境,因为系统中可能同时有多个版本的 Python 环境,以 Python3.6 为例
在rknn-toolkit2/examples下有各种功能的 Toolkit Demo ,这里我们运行一个模型转换 Demo 为例子,这个 Demo 展示了在 PC 上将 tflite 模型转换成 RKNN 模型,然后导出、推理、部署到 NPU 平台运行并取回结果的过程。模型转换的具体实现请参考 Demo 内源代码以及本页末尾的文档。
RKNN-Toolkit2 自带了一个模拟器,直接在 PC 上运行 Demo 即是将转换后的模型部署到仿真 NPU 上运行
RKNN-Toolkit2 通过 PC 的 USB 连接到 OTG 设备 ROC-RK3576-PC。RKNN-Toolkit2 将 RKNN 模型传到 ROC-RK3576-PC 的 NPU 上运行,再从 ROC-RK3576-PC 上获取推理结果、性能信息等:
其他 Toolkit Demo 可以在rknn-toolkit2/examples/下找到,例如量化、精度评估等。具体实现以及使用方法请参考 Demo 内源代码以及详细开发文档。
ROC-RK3576-PC NPU 及 Toolkit 详细使用方法请参考RKNN SDK下《Rockchip_RKNPU_User_Guide_RKNN_API_*.pdf》、《Rockchip_User_Guide_RKNN_Toolkit2_*.pdf》文档。
常见问题解答
有时候需要配置设备树来调整板子功能,比如 M.2 接口 SATA/PCIE 功能的切换、CAN 接口时钟的修改等。这篇教程会告诉你如何在 SDK 中寻找到板子对应的设备树文件以及有关修改的注意事项。
首先需要学习如何编译 Linux SDK,之后你应该可以理解,所有的编译配置信息记录在
这次我们使用 rk3576-firefly-roc-rk3576-pc.dts 举例:
原因是该文件 include 了其他几个设备树文件,注意后缀为 dtsi,再次打开这些文件就可以看到设备树节点。同样的,该文件也会 include 其他文件。
所以设备树是多个 dts/dtsi 文件共同组成的,并不是单个文件:
2.或者根据固件烧录中烧写 kernel 分区的方法烧录 extboot.img
参考资料
ROC-RK3576-PC V1.0 使用的接口,主要包括:
1 x HDMI2.1(最大支持 4K@120Hz 输出)
1 x Display Port1.4(最大支持 4K@120Hz 输出)
1 x USB3.0 OTG(Type-C)
1 x MIPI-DSI
1 x MIPI-CSI
1 x SATA3.0 或 PCIe2.0
1 x TF Card
1 x USB3.0
3 x USB2.0 (其中2个USB2.0由20Pin排针引出)
1 x WIFI
1 x Bluetooth
1 x FAN
1 x RJ45(支持 1Gbps)
1 × 3.5mm耳机接口
1 × Mic输入(2P-1.25mm)
具体如下图:
资源下载