ROC-RK3506B-CC 搭载 Rockchip 全新芯片 RK3506B,22nm 先进制程工艺,集成了三核 ARM Cortex-A7 加单核 Cortex-M0,主频高达 1.5GHz。支持 AMP 多核异构架构,一颗芯片可支持 Linux、RTOS、Bare-metal 灵活组合搭配,如 2×Cortex-A7 Linux 1×Cortex-A7 RTOS Cortex-M0 HAL 或 3×Cortex-A7 RTOS Cortex-M0 HAL 等组合,采用标准 RPMsg 核间通信机制。SDK 原生支持 LVGL 轻量级 UI 框架,并结合芯片内部 2D 硬件加速,让 LVGL 运行更加流畅,从硬件上电到引导程序加载及内核加载,最后到 UI 显示,全链路启动优化。
参数 | |
---|---|
尺寸 | 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 |
下载驱动并安装:
如果在 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 的使用。
注意:Hardware Flow Control 和 Software Flow Control 都要设成 No,否则可能导致无法输入。
设置完成后回到上一菜单,选择 Save setup as dfl 即可保存为默认配置,以后将默认使用该配置。
ROC-RK3506B-CC出厂默认会有一个操作系统,如果用户要运行其他操作系统,需要使用对应的固件烧写到主板。
ROC-RK3506B-CC有灵活的启动方式。一般情况下,除非硬件损坏,ROC-RK3506B-CC 开发板是不会变砖的。
如果在升级过程中出现意外,bootloader 损坏,导致无法重新升级,此时仍可以进入 MaskRom 模式来修复。
ROC-RK3506B-CC 从以下的存储器中加载系统:
SPI FLASH 接口
eMMC 接口
SDMMC 接口
注意:eMMC 和 SDMMC 接口复用了,所以在不贴 SPI FLASH 的情况下,只能选其中一个接口来加载系统。
ROC-RK3506B-CC有三种启动模式:
Normal 模式
Loader 模式
MaskRom 模式
Normal 模式就是正常的启动过程,各个组件依次加载,正常进入系统。
在 Loader 模式下,bootloader 会进入升级状态,等待主机命令,用于固件升级等。
MaskRom 模式用于 bootloader 损坏时的系统修复。
一般情况下是不用进入 MaskRom 模式的,只有在 bootloader 校验失败(读取不了 IDB 块,或 bootloader 损坏) 的情况下,BootRom 代码 就会进入 MaskRom 模式。此时 BootRom 代码等待主机通过 USB 接口传送 bootloader 代码,加载并运行之。
要强行进入 MaskRom 模式,请参阅《MaskRom模式》一章。
本文介绍了如何将主机上的固件,通过Type-C 数据线烧录到 ROC-RK3506B-CC 开发板的存储器中。升级时,需要根据主机操作系统和固件类型来选择合适的升级方式。
ROC-RK3506B-CC 开发板
主机
良好的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模式》
MaskRom烧写固件前先确定板子ROC-RK3506B-CC是否有贴Nor Flash存储器,如下图:
如果有贴Nor Flash请参考切换升级存储器章节烧写统一固件,没有贴Nor Flash可按以下步骤继续操作
烧写统一固件 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 按键(Boot 按键),再上电,几秒后松开
此时设备就会进入 MaskRom 模式。
首先准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以~/proj为例
注意:
1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上
2. 编译环境请使用 Ubuntu22.04(真机或 docker 容器),如果使用其他版本可能导致编译出错
3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK
4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)
获取 SDK 需要先安装:
我们提供了一个 SDK 基础包。请联系业务 sales@t-firefly.com 获取。
下载完成后先验证一下 MD5 码:
在 device/rockchip/rk3506/ 目录下,有不同板型的配置文件(xxxx_defconfig),用于管理 SDK 每个环节的编译配置。firefly.config 作为基础的配置。其他版型的配置文件会引用 firefly.config 并且覆盖其中的一些变量配置。 firefly.config 相关配置介绍:
parameter.txt 文件中包含了固件的分区信息,以 parameter-buildroot-emmc-fit.txt 为例:
路径:device/rockchip/rk3506/parameter-buildroot-emmc-fit.txt
FIRMWARE_VER:8.1
MACHINE_MODEL:RK3506
MACHINE_ID:007
MANUFACTURER: RK3506
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3506
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
GROW_ALIGN: 0
CMDLINE:mtdparts=:0x00002000@0x00002000(uboot),0x00000800@0x00004000(misc),0x0000A000@0x00004800(recovery),0x00010000@0x0000E800(boot),0x00010000@0x0001E800(backup),0x00008000@0x0002E800(oem),0x00c00000@0x00036800(rootfs),-@0x00c36800(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
uuid:boot=7A3F0000-0000-446A-8000-702F00006273
CMDLINE 属性是我们关注的地方,以 uboot 为例, 0x00002000@0x00002000(uboot) 中 0x00002000 为uboot 分区的起始位置,0x00002000 为分区的大小,以此类推。
package-file 文件用于打包固件时确定需要的分区镜像和镜像路径,同时它需要与 parameter.txt 文件保持一致。
路径:/path/to/sdk/output/firmware/package-file
本章介绍 Buildroot 固件的编译流程,推荐在 Ubuntu 22.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。
本教程的编译部分适用于 v1.0.0a 以上 SDK 版本
在 device/rockchip/rk3506/ 目录下,有不同板型的配置文件,选择配置文件:
全自动编译会执行上述编译、打包操作,生成 RK 固件。
打包固件,生成的完整固件会保存到 output/update 目录。
编译 u-boot
AMP(Asymmetric Multi-Processing)系统是一种非对称多核异构系统,即在同一芯片内,通过分组 CPU ,并在不同组的 CPU 内运行不同的系统,通过合理分配任务和资源,AMP 系统可以提供更好的性能表现。
rk3506 芯片有 Cortex-A7 * 3 Cortex-M0 * 1 两类 CPU ,三个 Cortex-A7 核心支持 linux(kernel-6.1)、Baremetal(HAL)、RTOS(RT-Thread) , Cortex-M0 支持 Baremetal(HAL) 。 利用 AMP 特性,可在 Cortex-A7 * 3 运行 linux, Cortex-M0 * 1作为辅助核心跑裸机系统;也可在 Cortex-A7 * 2 运行linux, Cortex-A7 * 1作为辅助核心跑裸机或实时系统等多种组合 AMP 构建。
本章介绍 Linux SDK 的编译环境搭建
注意:
(1)推荐在 X86_64 Ubuntu 22.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。
(2)使用普通用户进行编译,不要使用 root 用户权限进行编译。
首先准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以~/proj为例
注意:
1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上
2. 编译环境请使用 Ubuntu22.04(真机或 docker 容器),如果使用其他版本可能导致编译出错
3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK
4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)
获取 SDK 需要先安装:
我们提供了一个 SDK 基础包。请联系业务 sales@t-firefly.com 获取。
下载完成后先验证一下 MD5 码:
方法一:
在 PC 中自行安装环境:
方法二:使用 Docker
使用 dockerfile 创建容器,在容器中进行编译,完美解决编译环境问题,并且与主机环境隔离,互不影响。
首先在主机中安装 docker,请参考:安装教程
创建一个目录作为 docker 工作目录,例如~/docker/,在其中创建文件dockerfile,内容如下:
创建镜像
镜像创建完毕后,创建容器并启动
现在就可以在容器中进行 SDK 的编译了。
退出容器、重启容器的方法:
本章介绍 Buildroot 固件的编译流程,推荐在 Ubuntu 22.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。
不同板型的配置文件存放在 /path/to/sdk/device/rockchip/rk3506/ 目录下
回到 SDK 根目录执行build.sh选择配置文件:
RK3506 支持 Linux 、HAL 、RT-Thread的 AMP 混合架构设计,使得不同的 CPU 可以运行不同的系统,以满足灵活的产品设计需求。该 SDK 目前默认使用 Linux RT-Thread 的混合结构模型,其中运行 Linux 的 CPU 为主核,运行 rtt 的 CPU 为从核;0~1 核心运行 Linux ,2 核心运行 RT-Thread 。
SDK 的统一编译配置脚本位于 device/rockchip/rk3506/ 目录下,编译配置脚本内容包括 U-Boot、Kernel、HAL、RT-Thread 的配置,以及 AMP 相关的 CPU 分配,内存分配等配置。用户可以根据需求增加或者修改配置脚本文件,以满足自己的编译需求。主要的 AMP 配置文件如下:
注意:kernel 设备树位于 kernel/arch/arm/boot/dts 目录下,它使用的设备树rk3506b-firefly-roc-rk3506b-cc-amp-emmc.dts只适用于2G内存规格。 如果你需要适用于其他内存规格设备,需自行更改它的内存描述标签memory。
AMP 使用到的硬件资源需在内核设备树关闭,并在 rk3506-amp.dtsi 设备树的 rockchip_amp 标签下声明
编译 rt-thread 制作 amp 镜像
打包amp镜像
./build.sh amp
使用 /path/to/sdk/device/rockchip/rk3506/amp_linux.its 配置文件打包出 output/firmware/amp.img
hal 或 rt-thread 默认使用 uart5 作为调试串口,波特率为 1.5M 。
打包固件,生成的完整固件会保存到 output/update/ 目录。
parameter.txt 文件中包含了固件的分区信息,以 parameter-buildroot-amp-emmc-fit.txt 为例:
路径:device/rockchip/rk3506/parameter-buildroot-amp-emmc-fit.txt
FIRMWARE_VER:8.1
MACHINE_MODEL:RK3506
MACHINE_ID:007
MANUFACTURER: RK3506
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3506
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
GROW_ALIGN: 0
CMDLINE:mtdparts=:0x00002000@0x00002000(uboot),0x00000800@0x00004000(misc),0x0000A000@0x00004800(recovery),0x00010000@0x0000E800(boot),0x00010000@0x0001E800(backup),0x00008000@0x0002E800(oem),0x00002000@0x00036800(amp),0x00c00000@0x00038800(rootfs),-@0x00c36800(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
uuid:boot=7A3F0000-0000-446A-8000-702F00006273
CMDLINE 属性是我们关注的地方,以 uboot 为例, 0x00002000@0x00002000(uboot) 中 0x00002000 为uboot 分区的起始位置,0x00002000 为分区的大小,以此类推。
package-file 文件用于打包固件时确定需要的分区镜像和镜像路径,同时它需要与 parameter.txt 文件保持一致。
路径:output/firmware/package-file
AMP(Asymmetric Multi-Processing)系统是一种非对称多核异构系统,即在同一芯片内,通过分组 CPU ,并在不同组的 CPU 内运行不同的系统,通过合理分配任务和资源,AMP 系统可以提供更好的性能表现。
rk3506 芯片有 Cortex-A7 * 3 Cortex-M0 * 1 两类 CPU ,三个 Cortex-A7 核心支持 linux(kernel-6.1)、Baremetal(HAL)、RTOS(RT-Thread) , Cortex-M0 支持 Baremetal(HAL) 。 利用 AMP 特性,可在 Cortex-A7 * 3 运行 linux, Cortex-M0 * 1作为辅助核心跑裸机系统;也可在 Cortex-A7 * 2 运行linux, Cortex-A7 * 1作为辅助核心跑裸机或实时系统等多种组合 AMP 构建。
本章介绍 Linux SDK 的编译环境搭建
注意:
(1)推荐在 X86_64 Ubuntu 22.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。
(2)使用普通用户进行编译,不要使用 root 用户权限进行编译。
首先准备一个空文件夹用于存放 SDK,建议在 home 目录下,本文以~/proj为例
注意:
1. SDK 采用交叉编译,所以要在 X86_64 电脑上使用 SDK,不要将 SDK 下载到板子上
2. 编译环境请使用 Ubuntu22.04(真机或 docker 容器),如果使用其他版本可能导致编译出错
3. 不要在虚拟机共享文件夹以及非英文目录存放、解压SDK
4. 获取、编译 SDK 请全程使用普通用户,不允许也不需要使用 root 权限(除非需要 apt 安装软件)
获取 SDK 需要先安装:
我们提供了一个 SDK 基础包。请联系业务 sales@t-firefly.com 获取。
下载完成后先验证一下 MD5 码:
方法一:
在 PC 中自行安装环境:
方法二:使用 Docker
使用 dockerfile 创建容器,在容器中进行编译,完美解决编译环境问题,并且与主机环境隔离,互不影响。
首先在主机中安装 docker,请参考:安装教程
创建一个目录作为 docker 工作目录,例如~/docker/,在其中创建文件dockerfile,内容如下:
创建镜像
镜像创建完毕后,创建容器并启动
现在就可以在容器中进行 SDK 的编译了。
退出容器、重启容器的方法:
本章介绍 Buildroot 固件的编译流程,推荐在 Ubuntu 22.04 系统环境下进行开发,若使用其它系统版本,可能需要对编译环境做相应调整。
不同板型的配置文件存放在 /path/to/sdk/device/rockchip/rk3506/ 目录下
回到 SDK 根目录执行build.sh选择配置文件:
RK3506 支持 Linux 、HAL 、RT-Thread的 AMP 混合架构设计,使得不同的 CPU 可以运行不同的系统,以满足灵活的产品设计需求。该 SDK 目前默认使用 Linux RT-Thread 的混合结构模型,其中运行 Linux 的 CPU 为主核,运行 rtt 的 CPU 为从核;0~1 核心运行 Linux ,2 核心运行 RT-Thread 。
SDK 的统一编译配置脚本位于 device/rockchip/rk3506/ 目录下,编译配置脚本内容包括 U-Boot、Kernel、HAL、RT-Thread 的配置,以及 AMP 相关的 CPU 分配,内存分配等配置。用户可以根据需求增加或者修改配置脚本文件,以满足自己的编译需求。主要的 AMP 配置文件如下:
注意:kernel 设备树位于 kernel/arch/arm/boot/dts 目录下,它使用的设备树rk3506b-firefly-roc-rk3506b-cc-amp-emmc.dts只适用于2G内存规格。 如果你需要适用于其他内存规格设备,需自行更改它的内存描述标签memory。
AMP 使用到的硬件资源需在内核设备树关闭,并在 rk3506-amp.dtsi 设备树的 rockchip_amp 标签下声明
编译 rt-thread 制作 amp 镜像
打包amp镜像
使用 /path/to/sdk/device/rockchip/rk3506/amp_linux.its 配置文件打包出 output/firmware/amp.img
hal 或 rt-thread 默认使用 uart5 作为调试串口,波特率为 1.5M 。
打包固件,生成的完整固件会保存到 output/update/ 目录。
parameter.txt 文件中包含了固件的分区信息,以 parameter-buildroot-amp-emmc-fit.txt 为例:
路径:device/rockchip/rk3506/parameter-buildroot-amp-emmc-fit.txt
FIRMWARE_VER:8.1
MACHINE_MODEL:RK3506
MACHINE_ID:007
MANUFACTURER: RK3506
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3506
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
GROW_ALIGN: 0
CMDLINE:mtdparts=:0x00002000@0x00002000(uboot),0x00000800@0x00004000(misc),0x0000A000@0x00004800(recovery),0x00010000@0x0000E800(boot),0x00010000@0x0001E800(backup),0x00008000@0x0002E800(oem),0x00002000@0x00036800(amp),0x00c00000@0x00038800(rootfs),-@0x00c36800(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
uuid:boot=7A3F0000-0000-446A-8000-702F00006273
CMDLINE 属性是我们关注的地方,以 uboot 为例, 0x00002000@0x00002000(uboot) 中 0x00002000 为uboot 分区的起始位置,0x00002000 为分区的大小,以此类推。
package-file 文件用于打包固件时确定需要的分区镜像和镜像路径,同时它需要与 parameter.txt 文件保持一致。
路径:output/firmware/package-file
Firefly Linux 开发指南
接口使用
ROC-RK3506B-CC 开发板上的 AD 接口有两种,分别为:温度传感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。其中:
TS-ADC(Temperature Sensor):支持一通道。
SAR-ADC(Successive Approximation Register):支持四个单端输入通道,10位的SAR-ADC,最大转换速率为1MS/s 。
内核采用工业 I/O 子系统来控制 ADC,该子系统主要为 AD 转换或者 DA 转换的传感器设计。 下面以 SAR-ADC 为例子,介绍 ADC 的基本配置方法。
排针上引出的 ADC 接口如下
ROC-RK3506B-CC SAR-ADC 的 DTS 节点在 kernel/arch/arm/boot/dts/rk3502.dtsi 文件中定义,如下所示:
注意:
Vref 为标准电压
n 为 AD 转换的位数
Vresult 为用户所需要的采集电压
raw 为 AD 采集的原始数据
例如,标准电压为 1.8V,AD 采集位数为 10 位,AD 采集到的原始数据为 445,则:
功能:获取 iio 通道描述
参数:
dev: 使用该通道的设备描述指针
consumer_channel: 该设备所使用的 IIO 通道描述指针
功能:释放 iio_channel_get 函数获取到的通道
参数:
chan:要被释放的通道描述指针
功能:读取 chan 通道 AD 采集的原始数据。
参数:
chan:要读取的采集通道指针
val:存放读取结果的指针
有个便捷的方法可以查询到每个 SARADC 的值:
驱动需要获取ADC通道来使用时,需要对驱动的加载时间进行控制,必须要在saradc初始化之后。saradc是使用module_platform_driver()进行平台设备驱动注册,最终调用的是module_init()。所以用户的驱动加载函数只需使用比module_init()优先级低的,例如:late_initcall(),就能保证驱动的加载的时间比saradc初始化时间晚,可避免出错。
CAN(Controller Area Network)总线,即控制器局域网总线,是一种有效支持分布式控制或实时控制的串行通信网络。CAN总线是一种在汽车上广泛采用的总线协议,被设计作为汽车环境中的微控制器通讯。 如果想了解更多的内容可以参考CAN应用报告
注意:排针上的 CAN 只引出了 CAN TX 和 CAN RX 接口,板子上没有内置 CAN 收发器 IC 。所以没有办法直接测试 CAN 接口,需要接入 CAN 收发器模块才能进行 CAN 收发测试。并且默认 CAN 配置是关闭的。需要使用和测试请在对应 dts 文件打开 CAN0 和 CAN1 配置。
打开 CAN0 和 CAN1配置
利用 RM_IO 特性,灵活设置了 CAN TX 和 CAN RX 的 GPIO 为以下管脚:
CAN0
GPIO0_B6 –> can0_tx ; GPIO0_C0 –> can0_rx
CAN1
GPIO0_C1 –> can1_tx ; GPIO0_C3 –> can1_rx
公共配置 kernel/arch/arm/boot/dts/rk3506.dtsi
板级配置 kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc.dtsi
另外可设置时钟频率 assigned-clock-rates,如果 CAN 的比特率低于等于 3M 建议修改 CAN 时钟到 100M,信号更稳定。高于 3M 比特率的,时钟设置 200M 就可以。
总结调试过程中遇到的几个问题及解决方法:
检查总线 CAN_H 和 CAN_L, 杜邦线是否松动或者接反。
如果CAN的比特率低于等于3M建议修改CAN时钟到100M,信号更稳定。高于3M比特率的, 时钟设置200M就可以。
CAN时钟频率修改方法参考如下:
注意:
在某些时钟频率下,CAN的bitrate无法获得准确的速率,大家可以自行调整assigned-clock-rates去解决。
查看是否得到所需的bitrare:
RK3506 拥有 1 路 Video 输出端口。Video Port 所能输出的最大分辨率:1280x1280@60Hz。
下面对各个显示输出接口的配置和使用作基本的介绍,详细内容可以参考文件:
kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc.dts
kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc-mipi101-BSD1218-A101KL68.dtsi
ROC-RK3506B-CC 有一路 MIPI DSI 显示输出接口,支持 2 Lane 的数据输出,最高可输出 1280x1280@60Hz 。
外接的屏幕是 Firefly V3 版本屏幕,
DSI 接口
在设备树上添加:
在配置 MIPI DSI的时候,如果出现异常现象,如黑屏,画面拉伸,显示有噪点等,需要注意排查:
显示时序是否配置正确,尤其是 DCLK 的配置。
上下电时序是否正确,在文件 kernel/drivers/gpu/drm/panel/panel-simple.c中的 panel_simple_prepare 和 panel_simple_unprepare 函数内,调用了设备树中所配置的上下电时序和 gpio 口。
如果选择在 uboot 阶段开启开机 logo, 那么还需要排查 u-boot/drivers/video/drm/rockchip_panel.c 文件内的 panel_simple_prepare 和 panel_simple_unprepare 函数。
搭示波器看一下上电时序是否正确,主要是确认 LCD 使能引脚、复位引脚和屏幕上电指令间的时序是否正确。
获取系统中正在使用的 Video Port(与所连接的显示控制器) 信息
一般如果遇到屏幕无法显示的问题,都需要先执行上面的命令去看一下连接状态和分辨率是否正确。
kernel/arch/arm/boot/dts/rk3506.dtsi
kernel/arch/arm/boot/dts/rk3506b-firefly-common.dtsi
双以太网口接入网络,可以通过调试串口或者 adb 来查看 IP 地址,比如
eth0
GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的,其核心是填充 GPIO bank 的方法和参数,并调用 gpiochip_add 注册到内核中。
ROC-RK3506B-CC 支持一个 Rockchip Matrix IO(RM_IO),旨在让众多功能信号共享到有限的引脚接口。在同一矩阵内,任何函数信号可以通过软件配置映射到任何引脚接口。RM_IO 支持 98 个功能信号映射到 32 个引脚接口(GPIO0_A0~GPIO0_C7, GPIO1_B1~GPIO1_B3, GPIO1_C2~GPIO1_C3、GPIO1_D1~GPIO1_D3) 。
具体 RM_IO 功能列表详见芯片 Datasheet 文档:/path/to/sdk/docs/en/Socs/Datasheet/Rockchip RK3506B Datasheet V1.0-20240816.pdf
ROC-RK3506B-CC 开发板为了方便用户开发使用,引出了GPIO口供用户调试和开发,可以用到的 GPIO0_C2。
ROC-RK3506B-CC 有 4 组 GPIO bank:GPIO0~GPIO3,每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分,常用以下公式计算引脚:
下面演示 GPIO0_C2 pin脚计算方法:
bank = 0; //GPIO0_C2 => 0, bank ∈ [0,4]
group = 2; //GPIO0_C2 => 2, group ∈ {(A=0), (B=1), (C=2), (D=3)}
X = 2; //GPIO0_C2 => 2, X ∈ [0,7]
number = group * 8 X = 2 * 8 2 = 18
pin = bank*32 number= 0 * 32 18 = 18;
GPIO0_C2 对应的设备树属性描述为:<&gpio0 18 GPIO_ACTIVE_HIGH>,由kernel/include/dt-bindings/pinctrl/rockchip.h的宏定义可知,也可以将GPIO0_C2 描述为<&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>。
当 GPIO0_C2 脚没有被其它外设复用时,我们可以通过 export 导出该引脚去使用
在上述 export 导出引脚后,可以直接设置 gpio 为输入模式或者输出模式
of_get_named_gpio_flags 从设备树中读取 gpio 和 irq-gpio 的 GPIO 配置编号和标志,gpio_is_valid 判断该 GPIO 编号是否有效,gpio_request 则申请占用该 GPIO。如果初始化过程出错,需要调用 gpio_free 来释放之前申请过且成功的 GPIO 。在驱动中调用 gpio_direction_output 就可以设置输出高还是低电平,这里默认输出从 DTS 获取得到的有效电平 GPIO_ACTIVE_HIGH,即为高电平,如果驱动正常工作,可以用万用表测得对应的引脚应该为高电平。实际中如果要读出 GPIO,需要先设置成输入模式,然后再读取值:
IRQ_TYPE_EDGE_RISING 表示中断由上升沿触发,当该引脚接收到上升沿信号时可以触发中断函数。 这里还可以配置成如下:
然后在 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 结构,在注册共享中断时会用到。
该案例仅供参考,最终以实际硬件接口为准
GPIO 口除了通用输入输出、中断功能外,还可能有其它复用功能,以GPIO0_C2为例,就有如下几个功能:
func0 | func1 | func2 |
---|---|---|
RM_IO18 | SPI0_MISO | REF_CLK1_OUT |
查看 /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins,查看各个引脚的作用,如果发现 GPIO0_C2 被复用为 SPI0_MISO ,则需要在dts中关闭它。
GPIO 调试有一个很好用的工具,那就是 IO 指令,ROC-RK3506B-CC 的 Linux 系统默认已经内置了 IO 指令,使用 IO 指令可以实时读取或写入每个 IO 口的状态,这里简单介绍 IO 指令的使用。首先查看 IO 指令的帮助:
Debugfs 文件系统目的是为开发人员提供更多内核数据,方便调试。 这里 GPIO 的调试也可以用 Debugfs 文件系统,获得更多的内核信息。GPIO 在 Debugfs 文件系统中的接口为 /sys/kernel/debug/gpio,可以这样读取该接口的信息:
从读取到的信息中可以知道,内核把 GPIO 当前的状态都列出来了,以 GPIO0 组为例,gpio-18(GPIO0_C2) 输出低电平 (out lo)。
使用命令
解析: pin 0这一列表示引脚编号,gpio0-0这一列表示gpio组编号,后面MUX UNCLAIMED这一列表示数据选择器的拥有者,GPIO UNCLAIMED这一列表示gpio的拥有者。
其中 MUX UNCLAIMED 表示该引脚还没有被节点使用pinctrl去进行控制。GPIO UNCLAIMED表示还没有注册的gpio使用该引脚
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-RK3506B-CC开发板上有两个LED灯,由扩展 gpio PCA9555 控制,如下表所示:
LED | Pin name | Pin number |
---|---|---|
Blue | PCA_IO1_6 | 286 |
Red | PCA_IO0_4 | 276 |
可通过使用 LED 设备子系统或者直接操作 GPIO 控制该 LED。
标准的 Linux 专门为 LED 设备定义了 LED 子系统。 在 ROC-RK3506B-CC开发板中的LED 均以设备的形式被定义。用户可以通过 /sys/class/leds/ 目录控制LED。
开发板上的 LED 的默认状态为:
Blue: 系统上电时打开状态
Red: 用户自定义状态
用户可以通过 echo 命令向其 brightness 属性输入命令控制每一个 LED,比如:
Trigger 包含多种方式可以控制 LED,这里就用两个例子来说明。
Simple trigger LED
Complex trigger LED
更详细的说明请参考 leds-class.txt 。
首先我们需要知道定义多少个 LED,同时对应的 LED 的属性是什么。
在 kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc.dtsi 文件中定义 LED 节点,可以用 pwm 控制也可以用 gpio 控制,类似这样:
注意:compatible 的值要跟 drivers/leds/leds-gpio.c 中的 .compatible 的值要保持一致。
如下是 trigger 方式控制 LED 复杂一点的例子,timer trigger 就是让 LED 达到不断亮灭的效果:
我们需要在内核把 timer trigger 配置上。
在 kernel 路径下使用 make menuconfig,按照如下方法将 timer trigger 驱动选中。
默认应该就是开启的,如果没有,打开后要保存配置并编译烧录内核。
之后我们可以使用串口输入命令,就可以看到灯不停的间隔闪烁。
用户还可以使用 cat 命令获取 trigger 的可用值:
root@rk3506-buildroot:/# cat /sys/class/leds/:user/trigger
none rfkill-any rfkill-none kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock
本章主要描述如何配置 PWM。
ROC-RK3506B-CC的 PWM 驱动为:kernel/drivers/pwm/pwm-rockchip.c
配置 PWM 主要有以下三大步骤:配置 PWM DTS 节点、配置 PWM 内核驱动、控制 PWM 设备。
例如 DTS 源文件 kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc-mipi101-BSD1218-A101KL68.dtsi PWM DTS 配置,如下所示:
pwms参数分析: &pwm0_4ch_2: 在 rk3502.dtsi 中有定义。 0 :表示 chip index ,一般是0,因为rockchip pwm每个chip只有一个。 50000 : 一个周期时间为100000000纳秒 ,一秒有10个100000000纳秒 ,所以这个pwm输出周期为20000Hz。 1: 表示极性, 0为正常极性,1为反转极性。
用户可在其它驱动文件中使用以上步骤生成的 PWM 节点。具体方法如下:
(1)在要使用 PWM 控制的设备驱动文件中包含以下头文件:
该头文件主要包含 PWM 的函数接口。
(2)申请 PWM
使用
通过内核丰富的 debug 接口查看 PWM 注册状态,adb shell 或者串口进入系统终端执行:
查看注册是否成功,成功则返回接口名和寄存器地址。
dts 配置文件是否打开对应的 PWM。
PWM 所在的 IO 口是否被其他资源占用,可以根据报错的返回值去查看原因。
ROC-RK3506B-CC开发板采用 TT8563RH 作为RTC(Real Time Clock),TT8563RH 是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断 输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。
可计时基于 32.768kHz 晶体的秒,分,小时,星期,天,月和年
宽工作电压范围:1.0~5.5V
低休眠电流:典型值为 0.25μA(VDD =3.0V, TA =25°C)
内部集成振荡电容
漏极开路中断引脚
ROC-RK3506B-CC 需要接入 RTC 电池给 RTC 芯片供电才可以保证在短时间系统断电后 RTC 能正常运行。
DTS配置参考: kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc.dtsi
驱动参考:kernel/drivers/rtc/rtc-hym8563.c
Linux 提供了三种用户空间调用接口。在 ROC-RK3506B-CC开发板中对应的路径为:
SYSFS接口:/sys/class/rtc/rtc0/
PROCFS接口: /proc/driver/rtc
IOCTL接口: /dev/rtc0
可以直接使用 cat 和 echo 操作 /sys/class/rtc/rtc0/ 下面的接口。
比如查看当前 RTC 的日期和时间:
注意:ROC-RK3506B-CC不支持定时开机
打印 RTC 相关的信息:
可以使用 ioctl 控制 /dev/rtc0。
详细使用说明请参考文档 kernel/Documentation/admin-guide/rtc.rst 。
A1: 检查一下 RTC 电池是否正确接入。
ROC-RK3506B-CC 硬件版本的串口 5 接口图如下:
UART5 默认没有打开。在文件路径kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc.dtsi 末尾添加以下内容并且编译内核烧录到板子:
最简单的方式短接 UART5 TX RX 引脚, 然后使用命令在调试串口或 ADB 执行命令
最终调试串口终端即可接收到字符串 “firefly uart test…”
看门狗(watchdog)实际是一个定时器,启动之后会开始计时。系统或者软件需要在规定时间内与看门狗通信(俗称喂狗)重置计时,如此反复下去,以此来确定系统和软件正常运行。
如果规定时间内没有喂狗,看门狗超时,说明系统或应用陷入循环、卡死,此时看门狗会发出复位信号让主控复位,脱离卡死。
本章节主要介绍 ROC-RK3506B-CC 开发板看门狗的使用。
ROC-RK3506B-CC 有两个 watchdog 。 watchdog 的 DTS 节点在 kernel/arch/arm/boot/dts/rk3502.dtsi 文件中定义,如下所示:
watchdog 默认是关闭的,需按上述说明在 DTS 文件中打开相关节点方能使用。
watchdog 的驱动文件为 kernel/drivers/watchdog/dw_wdt.c。下面介绍两种方法来使用 watchdog:
内部看门狗的设备名称为/dev/watchdog,用户可通过 echo 命令来控制该设备
也可以通过程序来控制看门狗,通过交叉编译生成可执行文件,在机器启动后,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
ROC-RK3506B-CC 还有 1 个外部看门狗,对应 /dev/wdt_crl
使用方法:
EarPhone 和 Speak 均采用双声道接口
Speak 的接口如下:
使用 aplay 命令播放 wav 格式音频
Mic 的接口如下:
Mic 默认是关闭的,使用时需要将其打开,通过以下操作进行
有时候需要配置设备树来调整板子功能,比如 CAN 接口时钟的修改等。这篇教程会告诉你如何在 SDK 中寻找到板子对应的设备树文件以及有关修改的注意事项。
首先需要学习如何编译 Linux SDK,之后你应该可以理解,所有的编译配置信息记录在 SDK/device/rockchip/rk3506/ 下的众多 defconfig 文件里。
格式为:firefly_芯片_板型(-配件)_系统_defconfig
假设我需要编译 ROC-RK3506B-CC 的 eMMC Buildroot 固件,则配置文件为 firefly_rk3506_roc-rk3506b-cc-emmc_buildroot_defconfig
前往 SDK/device/rockhip/rk3506 下打开 firefly_rk3506_roc-rk3506b-cc-emmc_buildroot_defconfig,可以很直观看到对应的 dts:
RK_KERNEL_DTS_NAME 属性就记录着对应的 dts 文件名称,在包含的 firefly.config 文件有定义。此处是不带后缀的,所以完整的 dts 名称为 rk3506b-firefly-roc-rk3506b-cc.dts
有些 defconfig 文件可能没有 RK_KERNEL_DTS_NAME 属性,原因是 defconfig 支持 include,可能 RK_KERNEL_DTS_NAME 在 include 的文件中已经配置过了,所以此处不用再配置。
知道设备树名称后,就可以前往 SDK/kernel/arch/arm/boot/dts/ 下找到该设备树。
这次我们使用 rk3506b-firefly-roc-rk3506b-cc.dts 举例:
打开 SDK/kernel/arch/arm/boot/dts/rk3506b-firefly-roc-rk3506b-cc.dts 后你可能发现,这个文件基本是空的,如何修改?
原因是该文件 include 了其他几个设备树文件,注意后缀为 dtsi,再次打开这些文件就可以看到设备树节点。同样的,该文件也会 include 其他文件。
所以设备树是多个 dts/dtsi 文件共同组成的,并不是单个文件:
如果在 A.dts 里面找不到某个节点,那么就可能在 B.dtsi 中,或者在 C.dtsi 中…根据包含关系总能找到。
上层的配置会覆盖底层的配置,例如 C.dtsi 中将 uart0 关闭,但 A.dts 中配置为开启,那么 A.dts 中的配置会生效,uart0 开启。
一个 dtsi 可能被多个文件 include,修改会导致多个板型同步修改,所以修改前请明确包含关系。
以太网、UART 等各功能的配置指南一般可以在 SDK/docs/ 下的文档中找到。修改设备树需要基本的 kernel 知识、设备树语法,并且你需要明确的知道你在干什么。修改不当会导致功能不正常,甚至无法开机。
修改完成后回到 SDK 根目录,使用 build.sh 进行配置与编译:
编译的结果会在 SDK/kernel 下,是一个镜像 zboot.img
烧录方法:
根据固件烧录中烧写 kernel 分区的方法烧录 zboot.img
ROC-RK3506B-CC V1.0 使用的接口,主要包括:
1 x Recovery key
1 x Boot key
1 x Reset key
2 x LED
1 x RTC 电池座
1 x DEBUG 串口(UART0)
1 x USB2.0 OTG(Type-C)
1 x MIPI-DSI
1 x TF Card(与 EMMC 接口复用,默认不贴)
1 x USB2.0 (其中2个USB2.0由20Pin排针引出)
1 x WIFI(只支持 2.4G 频段,不支持 5G 频段)
2 x RJ45(支持 100Mbps)
1 × 3.5mm 耳机接口
具体如下图:
资料下载