EC-R3588SPC 资料介绍
- 1 介绍
- 1.1 简介
- 1.2 资料链接
- 1.3 硬件资源
- 1.4 资源下载
- 2 升级固件
- 2.1 启动模式说明
- 2.1.1 前言
- 2.1.2 如何获取固件
- 2.1.3 升级方法
- 2.1.4 启动媒体
- 2.1.5 引导模式
- 2.1.5.1 正常模式
- 2.1.5.2 装载机模式
- 2.1.5.3 MaskRom模式
- 2.2 通过USB线升级固件
- 2.2.1 介绍
- 2.2.2 准备工具
- 2.2.3 准备固件
- 2.2.4 安装升级工具
- 2.2.4.1 视窗操作系统
- 2.2.4.2 Linux操作系统
- 2.2.5 进入升级模式
- 2.2.5.1 装载机模式
- 2.2.5.1.1 硬件方式进入Loader模式
- 2.2.5.1.2 软件方式进入Loader模式
- 2.2.5.1.3 检查Loader模式
- 2.2.5.2 MaskRom模式
- 2.2.6 升级固件
- 2.2.6.1 视窗操作系统
- 2.6.1.1 升级统一固件-update.img
- 2.2.6.1.2 升级分区镜像
- 2.2.6.2 Linux操作系统
- 2.2.6.2.1 升级统一固件-update.img
- 2.2.6.2.2 升级分区镜像
- 2.2.7 常见问题解答
- 2.2.7.1 如何强制进入MaskRom模式
- 2.2.7.2 编程失败分析
- 2.3 MaskRom模式
- 2.4 通过SD卡升级固件
- 2.4.1 介绍
- 2.4.2 准备工具
- 2.4.3 操作步骤
- 3 Linux
- 3.1 编译 Linux 固件
- 3.1.1 下载Firefly_Linux_SDK
- 3.1.1.1 安装工具
- 3.1.1.2 初始化代码库
- 3.1.1.3 同步代码
- 3.1.2 Linux SDK配置介绍
- 3.1.2.1 目录
- 3.1.2.2 配置文件简介
- 3.1.2.3 分区表
- 3.1.3 编译Ubuntu固件
- 3.1.3.1 准备工作
- 3.1.3.2 编译SDK
- 3.1.4 编译 Debian 固件
- 3.1.5 编译Buildroot固件
- 3.2 Firefly Linux 用户指南
- 3.3 技术案例
- 4 安卓
- 5 端口使用情况
- 5.1 CAN
- 5.1.1 介绍
- 5.1.2 硬件连接
- 5.1.3 DTS配置
- 5.1.4 通信
- 5.1.4.1 CAN通讯测试
- 5.1.5 更多命令
- 5.1.6 常见问题解答
- 5.2 显示
- 5.2.1 EC-R3588SPC 显示接口的配置
- 5.2.2 EC-R3588SPC 双场景配置
- 5.2.3 调试方法
- 5.3 以太网
- 5.3.1 DTS配置
- 5.3.2 如何使用双以太网
- 5.3.2.1 IP Addrs
- 5.3.2.2 PING 测试
- 5.4 LED
- 5.4.1 介绍
- 5.4.2 通过设备控制 LED
- 5.4.3 使用触发控制 LED
- 5.4.3.1 简单的触发 LED
- 5.4.3.2 复合触发 LED
- 5.5 输出端
- 5.5.1 接口图
- 5.5.2 原理图,示意图
- 5.5.3 控制
- 5.6 DIN
- 5.6.1 接口图
- 5.6.2 原理图,示意图
- 5.6.3 探测
- 5.7 实时时钟
- 5.7.1 介绍
- 5.7.2 驱动器实时时钟
- 5.7.3 接口使用
- 5.7.3.1 系统文件系统接口
- 5.7.3.2 进程接口
- 5.7.3.3 IOCTL接口
- 5.7.4 常见问题解答
- 5.8 SATA
- 5.9 串口
- 5.9.1 硬件接口
- 5.9.2 数据传输配置
- 5.9.3 RS232发送和接收
- 5.9.4 RS485发送和接收
- 5.10 看门狗
- 5.10.1 介绍
- 5.10.2 DTS配置
- 5.10.3 用法
- 配件
- 无线模块
- 其他
- 1 神经网络处理单元
- 2 Linux设备树 DTS(DeviceTree Source) 手册
- 参考
1 介绍
1.1 简介
EC-R3588SPC 介绍:
Rockchip RK3588S,新一代8核64位处理器,最大可配置32GB超大内存。支持8K视频编解码、千兆网络、双频WiFi、4G LTE;具有RS485、RS232、CAN等丰富接口,适用于边缘计算、人工智能、智能家居、智能零售、智能工业等领域
1.2 资料链接
Quick Start:
https://wiki.t-firefly.com/en/EC-R3588SPC/started.html
Upgrade Firmware:
https://wiki.t-firefly.com/en/EC-R3588SPC/upgrade_bootmode.html
LINUX:
https://wiki.t-firefly.com/en/EC-R3588SPC/linux_compile.html
Android:
https://wiki.t-firefly.com/en/EC-R3588SPC/android_adb_use.html
1.3 硬件资源
EC-R3588SPC 接口如下:
- 1 x HDMI2.1(最大输出支持8K@60Hz)
- 1 个 USB3.0 OTG(C 型)
- 1 x Display Port1.4 (最大输出支持8K@30Hz)
- 1 个 4G LTE
- 1 个 SIM 卡插槽
- 1 个 CAN
- 3 个 RS232
- 2 个 RS485
- 1 个 SATA3.0 或 PCIe2.0
- 1 x RELAY(继电器输出)
- 1 x INPUT(光耦隔离输入)
- 3 x LED(一个三色LED,两个单色LED)
- 1 张 TF 卡
- 1个USB3.0
- 1 x USB2.0(2个USB2.0由20针排针引出)
- 1 个无线网络
- 1 个蓝牙
- 2个RJ45(一个支持1Gbps,另一个支持100Mbps)
- 1×3.5mm耳机(V1.1版本支持录音)
1.4 资源下载
https://en.t-firefly.com/doc/download/159.html
2 升级固件
2.1 启动模式说明
2.1.1 前言
EC-R3588SPC默认安装Android操作系统。如果用户想要运行其他操作系统,则需要使用相应的固件对主板进行编程。
EC-R3588SPC具有灵活的启动模式。一般来说,EC-R3588SPC开发板不会变砖,除非硬件损坏。
如果升级过程中出现意外,bootloader损坏,导致无法再次升级,但仍可以进入MaskRom模式进行修复。
2.1.2 如何获取固件
固件下载链接 https://en.t-firefly.com/doc/download/159.html
2.1.3 升级方法
EC-R3588SPC支持通过以下两种方式更新固件:
-
通过USB 线升级固件 使用
USB 线将主板与电脑连接,使用升级工具将固件烧写到主板上。 -
通过SD卡升级固件 使用
升级卡制作工具将MicroSD卡制作为升级卡,将升级卡插入主板,上电,机器会自动进行升级。
2.1.4 启动媒体
eMMC接口
SDMMC接口
2.1.5 引导模式
EC-R3588SPC具有三种启动模式:
- 正常模式
- 装载机模式
- MaskRom模式
2.1.5.1 正常模式
正常模式是正常的启动过程。各个组件依次加载并正常进入系统。
2.1.5.2 装载机模式
Loader模式下,Bootloader会进入升级状态,等待主机命令进行固件升级等。
2.1.5.3 MaskRom模式
MaskRom模式用于Bootloader损坏时的系统修复。
一般情况下是不需要进入的。只有当Bootloader验证失败(IDB块无法读取,或者Bootloader损坏)时,BootRom代码才会进入。此时,BootRom代码等待主机通过USB接口传输Bootloader代码,加载并运行。MaskRom mode
强制进入请参考MaskRom模式章节。
2.2 通过USB线升级固件
2.2.1 介绍
本文介绍如何通过Type-C数据线将主机上的固件文件升级到开发板的闪存中。升级时,需要根据主机操作系统和固件类型选择合适的升级方式。
2.2.2 准备工具
- EC-R3588SPC开发板
- 固件
- 主机
- Type-C数据线
2.2.3 准备固件
固件可以通过编译SDK获取,也可以从资源下载中下载公共固件(统一固件) 。有两种类型的固件文件:
-
单一统一固件
统一固件是由分区表、bootloader、uboot、kernel、system等所有文件打包合并而成的单个文件。Firefly官方发布的固件采用统一的固件格式。升级统一固件会更新主板上所有分区的数据和分区表,并清除主板上的所有数据。 -
多个分区映像
即在开发阶段生成具有独立功能的文件,如分区表、Bootloader、内核等。独立分区镜像只能更新指定分区,同时保持其他分区数据不被破坏,在开发过程中调试会非常方便。
通过统一固件解包/打包工具,可以将统一固件解包为多个分区镜像,或者将多个分区镜像合并为统一固件。
2.2.4 安装升级工具
2.2.4.1 视窗操作系统
- 安装RK USB驱动
下载Release_DriverAssistant.zip,解压,然后运行里面的DriverInstall.exe。为了让所有设备都能使用更新后的驱动程序,请先选择Driver uninstall(驱动卸载),然后选择Driver install(驱动安装)。
- 运行AndroidTool的RKDevTool.exe
为了避免Androidtool_xxx版本导致的烧录问题,建议使用公共固件包内自带的工具进行烧录。公共固件包解压后如下:
ITX-3588J_Android12_HDMI_220308
├── ITX-3588J_Android12_HDMI_220308.img
├── linux
│ └── Linux_Upgrade_Tool_v1.65.zip
└── windows
├── DriverAssitant_v5.1.1.zip
└── RKDevTool_Release_v2.84.zip
也可以单独下载AndroidTool,解压,RKDevTool.exe在RKDevTool_Release_v2.xx目录下运行(注意如果运行的是Windows 7/8,需要右键选择以管理员身份运行),如下图:
2.2.4.2 Linux操作系统
Linux下无需安装设备驱动程序。
- Linux_升级_工具
https://en.t-firefly.com/doc/download/159.html
下载Linux_Upgrade_Tool,并将其安装到系统中,如下方便调用:
unzip Linux_Upgrade_Tool_xxxx.zip
cd Linux_UpgradeTool_xxxx
sudo mv upgrade_tool /usr/local/bin
sudo chown root:root /usr/local/bin/upgrade_tool
sudo chmod a+x /usr/local/bin/upgrade_tool
- Linux_adb_fastboot
下载Linux_adb_fastboot,并将其安装到系统中,如下方便调用:
sudo mv adb /usr/local/bin
sudo chown root:root /usr/local/bin/adb
sudo chmod a+x /usr/local/bin/adb
sudo mv fastboot /usr/local/bin
sudo chown root:root /usr/local/bin/fastboot
sudo chmod a+x /usr/local/bin/fastboot
2.2.5 进入升级模式
通常我们升级固件有两种模式,即Loader模式和MaskRom模式。在编写固件之前,我们需要连接设备并将开发板置于可升级模式。
2.2.5.1 装载机模式
2.2.5.1.1 硬件方式进入Loader模式
连接设备并按RECOVERY按钮进入 Loader 模式。步骤如下:
-
首先断开电源适配器:
-
Type-C数据线一端连接主机,另一端连接开发板。
-
EC-3588SPC是整机产品。RECOVERY 键和 RESET 键不会暴露。裸板位置如下图所示
-
我们需要用镊子戳入3.5MM耳机孔并按住
-
连接到电源。
-
大约两秒钟后,松开RECOVERY按钮。
2.2.5.1.2 软件方式进入Loader模式
Type-C数据线连接好后,在串口调试终端使用命令或者:adb shell
reboot loader
2.2.5.1.3 检查Loader模式
如何判断板子是否处于Loader模式,我们可以通过工具查看
视窗操作系统
AndroidTool 在底部显示提示 Found One LOADER Device
如果执行“进入Loader模式”操作后,未显示升级工具提示的LOADER,请检查您的Windows主机是否发现新硬件并配置驱动程序。打开设备管理器,会出现一个新设备,如下图。如果没有,您可以返回上一步重新安装驱动程序。Rockusb Device
Linux操作系统
运行upgrade_tool后,可以在连接的设备中看到Loader提示:
firefly@T-chip:~/severdir/down_firmware$ sudo upgrade_tool
List of rockusb connected
DevNo=1 Vid=0x2207,Pid=0x330c,LocationID=106 Loader
Found 1 rockusb,Select input DevNo,Rescan press <R>,Quit press <Q>:q
2.2.5.2 MaskRom模式
进入MaskRom模式请参考MaskRom模式。
2.2.6 升级固件
2.2.6.1 视窗操作系统
2.6.1.1 升级统一固件-update.img
更新统一固件的步骤update.img如下:
- 切换到页面。Upgrade Firmware
- 按下Firmware按钮打开要升级的固件文件。升级工具显示详细的固件信息。
- 按下Upgrade按钮开始升级。
- 如果升级失败,可以尝试先按按钮擦除Flash EraseFlash,然后再升级。
2.2.6.1.2 升级分区镜像
升级分区镜像的步骤如下:
- 切换到页面。Download Image
- 勾选要刻录的分区,选择多个。
- 确保图像文件的路径正确。如有必要,请单击路径右侧的空白表格单元格以再次选择它。
- 点击Run按钮开始升级,升级后设备会自动重启。
2.2.6.2 Linux操作系统
2.2.6.2.1 升级统一固件-update.img
sudo upgrade_tool uf update.img
如果升级失败,请尝试在升级前擦除。
# erase flash : Using the ef parameter requires the loader file or the corresponding update.img to be specified.
# update.img :The ubuntu firmware you need to upgrade.
sudo upgrade_tool ef update.img
# upgrade again
sudo upgrade_tool uf update.img
2.2.6.2.2 升级分区镜像
sudo upgrade_tool di -b /path/to/boot.img
sudo upgrade_tool di -r /path/to/recovery.img
sudo upgrade_tool di -m /path/to/misc.img
sudo upgrade_tool di -u /path/to/uboot.img
sudo upgrade_tool di -dtbo /path/to/dtbo.img
sudo upgrade_tool di -p paramater #upgrade parameter
sudo upgrade_tool ul bootloader.bin #upgrade bootloader
如果由于flash问题导致升级失败,可以尝试低级格式化并擦除nand flash:
sudo upgrade_tool lf update.img # low-level formatting
sudo upgrade_tool ef update.img # erase
fastboot 刻录动态分区:
adb reboot fastboot # enter bootloader
sudo fastboot flash vendor vendor.img
sudo fastboot flash system system.img
sudo fastboot reboot # After the burn is successful, restart
2.2.7 常见问题解答
2.2.7.1 如何强制进入MaskRom模式
A1:如果板子没有进入Loader模式,您可以尝试强制进入MaskRom模式。操作方法参见“如何进入MaskRom模式”。
2.2.7.2 编程失败分析
如果烧录过程中出现Download Boot Fail,或者烧录过程中出现错误,如下图所示,一般是由于USB线连接不良、劣质线材或者是驱动能力不足造成的计算机的 USB 端口。排除计算机 USB 端口故障。
2.3 MaskRom模式
有关启动模式的介绍,请参阅启动模式
MaskRom格局是装备烧毁的最后一道防线。强制进入MaskRom涉及硬件操作,有一定的风险,所以只有在设备进入该Loader模式后,才可以尝试MaskRom模式。
请仔细阅读并谨慎操作!
操作步骤如下:
您可以按MaskROM键然后给设备上电
此时,设备应进入。MaskRom mode
2.4 通过SD卡升级固件
2.4.1 介绍
本文主要介绍如何将主机上的固件升级到SD卡,需要根据主机操作系统进行选择。
2.4.2 准备工具
- EC-R3588SPC
- 固件
- 主机
- USB读卡器
- 微型SD卡
- SD_固件_工具
2.4.3 操作步骤
- 将 microSD 卡插入 USB 读卡器,然后插入主机 USB 端口
- 运行SD_Firmware_Tool,选中“升级固件”框并选择正确的可移动磁盘设备
- 选择我们要升级到EC-R3588SPC的固件
- 点击按钮Create进行制作并等待完成
- 取出microSD卡,插入主板的microSD卡槽,给主板上电,会自动开始升级
- 升级完成后,取出microSD卡并自动重启主板即可完成固件更新的整个过程
3 Linux
3.1 编译 Linux 固件
3.1.1 下载Firefly_Linux_SDK
首先准备一个空文件夹用来放置SDK,最好在home下,这里以~/proj为例。
注意:
- SDK使用交叉编译,所以将SDK下载到您的X86_64 PC上,不要将SDK下载到arm64板子上。
- 构建环境需要为Ubuntu18.04(真实PC或docker容器),其他版本可能会导致构建失败。
- SDK不要放在虚拟机的共享目录或非英文路径下。
- 请以普通用户身份获取/构建 SDK,既不允许也不需要 root 权限(除了使用 apt 安装某些东西)
3.1.1.1 安装工具
sudo apt update
sudo apt install -y repo git python
3.1.1.2 初始化代码库
- 方法一
通过repo下载,您可以选择获取完整的SDK或BSP:
mkdir ~/proj/rk3588_sdk/
cd ~/proj/rk3588_sdk/
## Full 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 (Only include some basic repositories and compile tools)
## BSP includes device/rockchip, docs, kernel, u-boot, rkbin, tools and cross-compile toolchian
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
- 方法二
下载Firefly_Linux_SDK分卷压缩包:Linux SDK
https://en.t-firefly.com/doc/download/159.html
下载后验证MD5码:
$ md5sum rk3588_linux_release_20230114_v1.0.6c_0*
c3bcb3f92bd139f72551c89f75d39bfa rk3588_linux_release_20230114_v1.0.6c_00
ebb658571a645d4af1e2b569709480b7 rk3588_linux_release_20230114_v1.0.6c_01
9761cc324e9f7133500b590c441b0307 rk3588_linux_release_20230114_v1.0.6c_02
7adc9fe2158d7681554dce1def238f49 rk3588_linux_release_20230114_v1.0.6c_03
3d9201e3849b8a523c05920bebe28b39 rk3588_linux_release_20230114_v1.0.6c_04
6faaee006fe60fc9be60a64a01506cb6 rk3588_linux_release_20230114_v1.0.6c_05
确认无误后即可解压:
mkdir -p ~/proj/rk3588_sdk
cd ~/proj/rk3588_sdk
cat path/to/rk3588_linux_release_20230114_v1.0.6c_0* | tar -xv
# export data
.repo/repo/repo sync -l
3.1.1.3 同步代码
执行以下命令同步代码:
# Enter the SDK root directory
cd ~/proj/rk3588_sdk
# Sync
.repo/repo/repo sync -c --no-tags
.repo/repo/repo start firefly --all
稍后可以使用以下命令更新SDK:
.repo/repo/repo sync -c --no-tags
3.1.2 Linux SDK配置介绍
3.1.2.1 目录
$ tree -L 1
.
├── app
├── buildroot # Buildroot root filesystem build directory
├── build.sh -> device/rockchip/common/build.sh # Compile script
├── device # Compile related configuration files
├── docs # Documentation
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh # Link script
├── prebuilts # Cross compilation toolchain
├── rkbin
├── rkflash.sh -> device/rockchip/common/rkflash.sh # Flash script
├── tools # Tools directory
├── u-boot
3.1.2.2 配置文件简介
该device/rockchip/rk3588/目录下有不同板型的配置文件(xxxx.mk),用于管理SDK各个工程的编译配置。相关配置介绍:
# Target arch
export RK_ARCH=arm64
# Uboot defconfig
export RK_UBOOT_DEFCONFIG=xxxx_defconfig
# Kernel defconfig
export RK_KERNEL_DEFCONFIG=xxxx_defconfig
# Kernel defconfig fragment
export RK_KERNEL_DEFCONFIG_FRAGMENT=xxxx.config
# Kernel dts
export RK_KERNEL_DTS=roc-rk3588s-pc-ext.dts
# parameter for GPT table
export RK_PARAMETER=parameter-xxxx.txt
# rootfs image path
export RK_ROOTFS_IMG=ubuntu_rootfs/rootfs.img
3.1.2.3 分区表
3.1.2.3.1 范围
parameter.txt 文件包含固件的分区信息。以parameter-ubuntu-fit.txt为例:
路径:device/rockchip/rk3588/parameter-ubuntu-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是分区的大小,以此类推。
3.1.2.3.2 包文件
package-file用于确定打包固件时所需的分区镜像和镜像路径,需要与parameter.txt保持一致。
路径:tools/linux/Linux_Pack_Firmware/rockdev/rk3588-package-file
# NAME Relative path
#
#HWDEF HWDEF
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
uboot Image/uboot.img
misc Image/misc.img
boot Image/boot.img
recovery Image/recovery.img
rootfs Image/rootfs.img
userdata RESERVED
backup RESERVED
3.1.3 编译Ubuntu固件
本章介绍Ubuntu固件的编译过程。建议在Ubuntu 18.04系统环境下开发。如果您使用其他系统版本,可能需要相应调整编译环境。
本教程的编译部分适用于v1.0.6e以上的SDK版本
$ readlink -f .repo/manifest.xml
/home/daijh/p/rk3588/.repo/manifests/rk3588/rk3588_linux_release_20230301_v1.0.6e.xml
3.1.3.1 准备工作
1.3.1.1 设置编译环境
sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \
expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \
unzip \
device-tree-compiler ncurses-dev \
3.1.3.2 编译SDK
3.1.3.2.1 预编译配置
里面有不同板卡的配置文件device/rockchip/rk3588/,选择配置文件:
./build.sh roc-rk3588s-pc-ext-ubuntu.mk
or
./build.sh roc-rk3588s-pc-ext-BE45-A1-ubuntu.mk # MIPI DSI
3.1.3.2.2 构建
< 3.1.3.2.2.1 自动编译 >
- 下载:Ubuntu rootfs(64位),放入SDK路径
7z x ubuntu-aarch64-rootfs.7z
mkdir ubuntu_rootfs
mv ubuntu-aarch64-rootfs.img ubuntu_rootfs/rootfs.img
- 开始编译
./build.sh
固件将保存到目录中rockdev/pack/。
< 3.1.3.2.2.2 部分编译 >
u启动
./build.sh uboot
核心
./build.sh extboot
恢复
./build.sh recovery
下载:Ubuntu rootfs(64位),放入SDK路径
7z x ubuntu-aarch64-rootfs.7z
mkdir ubuntu_rootfs
mv ubuntu-aarch64-rootfs.img ubuntu_rootfs/rootfs.img
更新.img目录链接的每个部分rockdev/:
./mkfirmware.sh
打包固件,固件将保存到目录下rockdev/pack/。
./build.sh updateimg
3.1.4 编译 Debian 固件
本章介绍Debian固件的编译过程。建议在Ubuntu 18.04系统环境下开发。如果您使用其他系统版本,可能需要相应调整编译环境。
本教程的编译部分适用于v1.0.6e以上的SDK版本
$ readlink -f .repo/manifest.xml
/home/daijh/p/rk3588/.repo/manifests/rk3588/rk3588_linux_release_20230301_v1.0.6e.xml
https://wiki.t-firefly.com/en/EC-R3588SPC/linux_compile.html
3.1.5 编译Buildroot固件
本章介绍Buildroot固件的编译过程。建议在Ubuntu 18.04系统环境下开发。如果您使用其他系统版本,可能需要相应调整编译环境。
https://wiki.t-firefly.com/en/EC-R3588SPC/linux_compile.html#compile-buildroot-firmware
3.2 Firefly Linux 用户指南
https://wiki.t-firefly.com/en/Firefly-Linux-Guide/preface.html
3.3 技术案例
4 安卓
https://wiki.t-firefly.com/en/EC-R3588SPC/android_adb_use.html
5 端口使用情况
5.1 CAN
5.1.1 介绍
控制器局域网(CAN)是一种能够有效支持分布式控制或实时控制的串行通信网络。CAN总线是汽车中广泛使用的一种总线协议,是为汽车环境中微控制器的通信而设计的。
- 查看TI 应用报告了解更多
https://www.ti.com/lit/an/sloa101b/sloa101b.pdf
5.1.2 硬件连接
两个CAN设备之间的连接,只需要CAN_H到CAN_H,CAN_L到CAN_L。
5.1.3 DTS配置
- 常见的 kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s.dtsi
can0: can@fea50000 {
compatible = "rockchip,can-2.0";
reg = <0x0 0xfea50000 0x0 0x1000>;
interrupts = <GIC_SPI 341 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN0>, <&cru PCLK_CAN0>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN0>, <&cru SRST_P_CAN0>;
reset-names = "can", "can-apb";
pinctrl-names = "default";
pinctrl-0 = <&can0m0_pins>;
tx-fifo-depth = <1>;
rx-fifo-depth = <6>;
status = "disabled";
};
can1: can@fea60000 {
compatible = "rockchip,can-2.0";
reg = <0x0 0xfea60000 0x0 0x1000>;
interrupts = <GIC_SPI 342 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN1>, <&cru PCLK_CAN1>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN1>, <&cru SRST_P_CAN1>;
reset-names = "can", "can-apb";
pinctrl-names = "default";
pinctrl-0 = <&can1m0_pins>;
tx-fifo-depth = <1>;
rx-fifo-depth = <6>;
status = "disabled";
};
can2: can@fea70000 {
compatible = "rockchip,can-2.0";
reg = <0x0 0xfea70000 0x0 0x1000>;
interrupts = <GIC_SPI 343 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_CAN2>, <&cru PCLK_CAN2>;
clock-names = "baudclk", "apb_pclk";
resets = <&cru SRST_CAN2>, <&cru SRST_P_CAN2>;
reset-names = "can", "can-apb";
pinctrl-names = "default";
pinctrl-0 = <&can2m0_pins>;
tx-fifo-depth = <1>;
rx-fifo-depth = <6>;
status = "disabled";
};
- 板子 arch/arm64/boot/dts/rockchip/roc-rk3588s-pc-ext.dtsi
&can2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&can2m0_pins>;
};
因为系统根据 dts 创建的 CAN 设备只有一个,而第一个创建的设备是 CAN0。
5.1.4 通信
5.1.4.1 CAN通讯测试
直接使用“candump”和“cansend”工具发送和接收消息,将工具推送到 /system/bin/ 。SDK 中包含工具“candump/cansend”,可从官方链接或github下载。
https://www.t-firefly.com/share/index/listpath/id/3cacb04c663f9fe97bf494ca55763dcd.html
https://github.com/linux-can/can-utils
#Close the can0 device at the transceiver
ip link set can0 down
#Set the bit rate to 250Kbps at the transceiver
ip link set can0 type can bitrate 250000
#Show can0 details
ip -details link show can0
#Open the can0 device at the transceiver
ip link set can0 up
#Perform candump on the receiving end, blocking waiting for messages
candump can0
#Execute cansend at the sending end to send the message
cansend can0 123#1122334455667788
5.1.5 更多命令
1、 ip link set canX down //turn off CAN device
2、 ip link set canX up //turn on CAN device
3、 ip -details link show canX //show CAN device details
4、 candump canX //Receive data from CAN bus
5、 ifconfig canX down //shutdown CAn device
6、 ip link set canX up type can bitrate 250000 //Set CAN Baudrate
7、 conconfig canX bitrate + (Baudrate)
8、 canconfig canX start //start CAN device
9、 canconfig canX ctrlmode loopback on //loopback test
10、canconfig canX restart //restart CAN device
11、canconfig canX stop //stop CAN device
12、canecho canX //check CAN device status查看can设备总线状态;
13、cansend canX --identifier=ID+data //send data
14、candump canX --filter=ID:mask //Use the filter to receive ID matching data
5.1.6 常见问题解答
- 1.6.1 检查总线CAN_H、CAN_L线是否松动或接反
接收端仅成功接收一次消息,之后就不再接收该消息。 - 1.6.2 时钟频率配置
如果CAN的比特率为1M,建议将CAN时钟速率修改为300M,使信号更加稳定。如果码率低于1M,时钟速率可以设置为200M。
5.2 显示
5.2.1 EC-R3588SPC 显示接口的配置
EC-R3588SPC 有两个显示输出接口,分别是 HDMI 和 Display Port,可以实现双屏同时显示/独显。接口图如下:
HDMI0/显示端口
https://wiki.t-firefly.com/en/EC-R3588SPC/usage_display.html#ec-r3588spc-displays-the-configuration-of-the-interface
5.2.2 EC-R3588SPC 双场景配置
https://wiki.t-firefly.com/en/EC-R3588SPC/usage_display.html#ec-r3588spc-dual-scene-configuration
5.2.3 调试方法
https://wiki.t-firefly.com/en/EC-R3588SPC/usage_display.html#debug-method
5.3 以太网
5.3.1 DTS配置
3.1.1 常见的
kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588-firefly-port.dtsi
&gmac1 {
/* Use rgmii-rxid mode to disable rx delay inside Soc */
phy-mode = "rgmii-rxid";
clock_in_out = "output";
snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
/* Reset time is 20ms, 100ms for rtl8211f */
snps,reset-delays-us = <0 20000 100000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac1_miim
&gmac1_tx_bus2
&gmac1_rx_bus2
&gmac1_rgmii_clk
&gmac1_rgmii_bus>;
tx_delay = <0x42>;
//rx_delay = <0x4f>;
phy-handle = <&rgmii_phy1>;
status = "disbaled";
};
3.1.2 板子
kernel-5.10/arch/arm64/boot/dts/rockchip/roc-rk3588s-pc.dtsi
/* gmac1 */
&gmac1{
snps,reset-gpio = <&gpio0 RK_PD3 GPIO_ACTIVE_LOW>;
tx_delay = <0x43>;
status = "okay";
};
5.3.2 如何使用双以太网
Android双网口分为内网和外网。
注:eth1辅助网络接口为USB 2.0扩展网络接口,因此最大速度为100M
硬件设备名称 | 驱动 | Android系统设备名称 | 主要和辅助 | 速度 |
---|---|---|---|---|
以太网0 | rk_gmac | 以太网 | 外部网络的主网络端口 | 1000Mpbs |
以太网1 | r8152 | 以太网2 | 内网辅助网口 | 100Mpbs |
5.3.2.1 IP Addrs
通过 ifconfig 从 debug 或 adb 获取
ifconfig eth0
eth0 Link encap:Ethernet HWaddr 52:22:4b:e4:f8:3c Driver rk_gmac-dwmac
inet addr:168.168.104.210 Bcast:168.168.255.255 Mask:255.255.0.0
inet6 addr: 240e:3b1:f175:9df0:ea6d:9993:33e6:202d/64 Scope: Global
inet6 addr: 240e:3b1:f175:9df0:e0e8:b021:fc7a:dafc/64 Scope: Global
inet6 addr: fe80::9cd8:e64d:b9c2:6f4/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:229 errors:0 dropped:0 overruns:0 frame:0
TX packets:62 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:40526 TX bytes:6698
Interrupt:70
ifconfig eth1
eth1 Link encap:Ethernet HWaddr e2:76:ef:f2:13:4f Driver r8152
inet addr:168.168.105.2 Bcast:168.168.255.255 Mask:255.255.0.0
inet6 addr: 240e:3b1:f175:9df0:7355:7ec7:fed3:ecab/64 Scope: Global
inet6 addr: 240e:3b1:f175:9df0:2e23:792d:f04a:2975/64 Scope: Global
inet6 addr: fe80::564f:1114:e491:4bbd/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:124 errors:0 dropped:1 overruns:0 frame:0
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12387 TX bytes:2072
5.3.2.2 PING 测试
- 以太网0
ping -I eth0 -c 10 www.baidu.com
PING www.a.shifen.com (14.215.177.38) from 168.168.104.210 eth0: 56(84) bytes of data.
64 bytes from 14.215.177.38: icmp_seq=1 ttl=55 time=9.45 ms
64 bytes from 14.215.177.38: icmp_seq=2 ttl=55 time=9.36 ms
64 bytes from 14.215.177.38: icmp_seq=3 ttl=55 time=10.0 ms
64 bytes from 14.215.177.38: icmp_seq=4 ttl=55 time=11.3 ms
64 bytes from 14.215.177.38: icmp_seq=5 ttl=55 time=41.7 ms
64 bytes from 14.215.177.38: icmp_seq=6 ttl=55 time=9.73 ms
64 bytes from 14.215.177.38: icmp_seq=7 ttl=55 time=9.28 ms
64 bytes from 14.215.177.38: icmp_seq=8 ttl=55 time=9.26 ms
64 bytes from 14.215.177.38: icmp_seq=9 ttl=55 time=9.50 ms
64 bytes from 14.215.177.38: icmp_seq=10 ttl=55 time=12.9 ms
--- www.a.shifen.com ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9013ms
rtt min/avg/max/mdev = 9.265/13.262/41.757/9.562 ms
- 以太网1
ping -I eth1 -c 10 168.168.4.168
PING 168.168.4.168 (168.168.4.168): 56 data bytes
64 bytes from 168.168.4.168: seq=0 ttl=64 time=2.408 ms
64 bytes from 168.168.4.168: seq=1 ttl=64 time=1.574 ms
64 bytes from 168.168.4.168: seq=2 ttl=64 time=1.669 ms
64 bytes from 168.168.4.168: seq=3 ttl=64 time=1.913 ms
64 bytes from 168.168.4.168: seq=4 ttl=64 time=1.666 ms
64 bytes from 168.168.4.168: seq=5 ttl=64 time=1.500 ms
64 bytes from 168.168.4.168: seq=6 ttl=64 time=1.631 ms
64 bytes from 168.168.4.168: seq=7 ttl=64 time=1.740 ms
64 bytes from 168.168.4.168: seq=8 ttl=64 time=1.590 ms
64 bytes from 168.168.4.168: seq=9 ttl=64 time=1.924 ms
--- 168.168.4.168 ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 1.500/1.761/2.408 ms
5.4 LED
5.4.1 介绍
EC-R3588SPC开发板上有一个三色LED灯和两个单色灯,如下表所示:
LED | 引脚名称 | 引脚数 | 评论 |
---|---|---|---|
蓝色的 | GPIO1_D5 | 61 | 三色灯 |
红色的 | GPIO3_B2 | 106 | 三色灯 |
绿色的 | GPIO3_C0 | 112 | 三色灯 |
分机黄(L2) | GPIO3_B7 | 111 | 下部单色 LED 与继电器配合使用 |
外接绿色(L1) | GPIO3_C1 | 113 | 上部单色 LED |
可以使用 LED 设备子系统或直接操作 GPIO 来控制 LED。
5.4.2 通过设备控制 LED
Linux 有自己的用于 LED 设备的 LED 子系统。在 EC-R3588SPC 中,LED 被配置为 LED 类设备。您可以通过 来控制它们/sys/class/leds/。
三基色灯:
- 蓝色:系统上电后亮起。
- 红色:由用户定义。
- 绿色:由用户定义。
单色灯珠:
- 外部黄色:继电器工作指示灯(丝印:L2)
- 外部绿色 :由用户定义。(丝印:L1)
您可以使用 echo 命令将命令写入其亮度属性来更改每个 LED 的行为:
三基色灯:
echo 1 > sys/class/leds/\:power/brightness //Blue led on
echo 0 > sys/class/leds/\:power/brightness //Blue led off
echo 1 > sys/class/leds/\:user/brightness //Red led on
echo 0 > sys/class/leds/\:user/brightness //Red led off
echo 1 > sys/class/leds/\:user1/brightness //Green led on
echo 0 > sys/class/leds/\:user1/brightness //Green led off
L1单色灯珠:
echo 1 > /sys/class/leds/ext_led1/brightness //Ext Yellow led on
echo 0 > /sys/class/leds/ext_led1/brightness //Ext Yellow led off
L2单色灯珠:
echo 1 > /sys/class/leds/ext_led2/brightness //Ext Green led on
echo 0 > /sys/class/leds/ext_led2/brightness //Ext Green led off
5.4.3 使用触发控制 LED
触发器包含多种控制LED的方式,这里用两个例子来说明。
- 简单的触发 LED
- 复合触发 LED
欲了解更多信息,请阅读文档leds-class.txt。
首先我们需要知道LED的定义有多少,而LED对应的属性是什么。
文件中定义三色灯节点kernel/arch/arm64/boot/dts/rockchip/roc-rk3588s-pc.dtsi:
firefly_leds: leds {
compatible = "gpio-leds";
power_led: power {
label = ":power"; //blue led
linux,default-trigger = "ir-power-click";
default-state = "on";
gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&led_power>;
};
user_led: user {
label = ":user"; //red led
linux,default-trigger = "ir-user-click";
default-state = "off";
gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&led_user>;
};
user1_led: user1 {
label = ":user1"; //green led
default-state = "off";
gpios = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&led_user1>;
};
};
文件中定义单色led节点kernel/arch/arm64/boot/dts/rockchip/roc-rk3588s-pc-ext.dtsi:
&firefly_leds {
ext_yellow_led: ext_led1 {
gpios = <&gpio3 RK_PB7 GPIO_ACTIVE_HIGH>;//yellow led
pinctrl-names = "default";
pinctrl-0 = <&led_user2>;
};
ext_green_led: ext_led2 {
gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;//green led
pinctrl-names = "default";
pinctrl-0 = <&led_user3>;
};
};
注意: 的值compatible必须与 中的值匹配drivers/leds/leds-gpio.c。
5.4.3.1 简单的触发 LED
这是一种控制 LED 的简单触发模式,如下以默认打开黄色 LED 为例。EC-R3588SPC的黄色LED在开机后会亮起。
(1) 定义LED触发 在其中kernel/drivers/leds/trigger/led-firefly-demo.c添加以下内容:
DEFINE_LED_TRIGGER(ledtrig_default_control);
(2) 注册触发器。
led_trigger_register_simple("ir-user-click", &ledtrig_default_control);
(3) 控制LED。
led_trigger_event(ledtrig_default_control, LED_FULL); #yellow led on
(4)启用LED演示。
led-firefly-demo默认是禁用的,如果需要打开demo驱动可以使用以下补丁:
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3588-firefly-demo.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3588-firefly-demo.dtsi
@@ -52,7 +52,7 @@
led_demo: led_demo {
- status = "disabled";
+ status = "okay";
compatible = "firefly,rk3588-led";
};
5.4.3.2 复合触发 LED
下面是触发方式控制LED的复杂例子,是让LED达到恒亮灭的效果。timer trigger
我们需要在内核上配置定时器触发器。
kernel-5.10在使用路径中,按照以下方法选择驱动程序。make menuconfigtimer trigger
Device Drivers
--->LED Support
--->LED Trigger support
--->LED Timer Trigger
保存配置并编译内核,烧录kernel.imgEC-R3588SPC板。我们可以使用串口输入命令,可以看到蓝灯不停的间隔闪烁。
echo "timer" > /sys/class/leds/:user/trigger
用户还可以使用以下cat命令获取触发器的可用值:
# cat /sys/class/leds/:user/trigger
none ir-power-click rfkill-any rfkill-none test_ac-online test_battery-charging-or-full
test_battery-charging test_battery-full test_battery-charging-blink-full-solid
test_usb-online mmc0 [timer] heartbeat backlight default-on ir-user-click mmc1
rfkill0 tcpm-source-psy-6-0022-online rfkill1 rfkill2
5.5 输出端
EC-R3588SPC 支持 1 个继电器输出,其中 ON 对应硬件原理图中的 OUTPUT1,COM 对应硬件原理图中的 RELAY_COM1。
5.5.1 接口图
5.5.2 原理图,示意图
5.5.3 控制
当GPIO3_C1_Output低电平时,OUTPUT1将与RELAY_COM1断开;当RELAY_CTL1输出高电平时,OUTPUT1将与RELAY_COM1连接。
由于下层 Ext Yellow(L2) 和继电器由同一个 GPIO 控制,控制 Ext Yellow(L2) 就是控制继电器输出
控制方式如下:
echo 1 > /sys/class/leds/ext_led2/brightness //The lower monochrome led is on, the relay is worked
echo 0 > /sys/class/leds/ext_led2/brightness //The lower monochrome led is off, the relay isn't worked
5.6 DIN
EC-R3588SPC支持光耦隔离输入,其中IN对应硬件原理图中的INPUT1,G对应硬件原理图中的INPUT_COM。
5.6.1 接口图
5.6.2 原理图,示意图
5.6.3 探测
当INPUT1和INPUT_COM连接时,GPIO3_D2_INPUT会检测到低电平;当 INPUT1 和 INPUT_COM 断开时,GPIO3_D2_INPUT 会检测到高电平。
检测模式如下:
# get GPIO export
echo 122 > /sys/class/gpio/export
# set direction to input
echo in > /sys/class/gpio/gpio122/direction
# read value
cat /sys/class/gpio/gpio122/value
5.7 实时时钟
5.7.1 介绍
EC-R3588SPC开发板使用HYM8563作为RTC(实时时钟),HYM8563是一款低功耗CMOS实时时钟/日历芯片,它提供了一个可编程时钟输出,一个中断输出和一个掉电检测器,所有地址和数据都是通过I2C总线接口串行传递。最高总线速度为400Kbits/s,每次读写数据后,嵌入的字地址寄存器会自动递增
- 计时可以基于 32.768kHz 晶体,以秒、分钟、小时、周、天、月和年为单位
- 宽工作电压范围:1.0~5.5V
- 低静态电流:典型值0.25μA(VDD = 3.0V,TA = 25°C)
- 内部集成振荡电容
- 漏极开路中断引脚
5.7.2 驱动器实时时钟
驱动程序参考:kernel-5.10/drivers/rtc/rtc-hym8563.c
5.7.3 接口使用
Linux提供了三种用户空间调用接口。EC-R3588SPC开发板中对应的路径为:
- 系统文件系统接口: /sys/class/rtc/rtc0/
- PROCFS接口: /proc/driver/rtc
- IOCTL接口: /dev/rtc0
5.7.3.1 系统文件系统接口
您可以直接使用下面的界面cat并echo进行操作/sys/class/rtc/rtc0/。
例如,查看当前RTC的日期和时间:
# cat /sys/class/rtc/rtc0/date
2013-01-18
# cat /sys/class/rtc/rtc0/time
09:36:10
设置启动时间,比如120秒后启动:
#Start the machine regularly after 120 seconds
echo +120 > /sys/class/rtc/rtc0/wakealarm
# View boot time
cat /sys/class/rtc/rtc0/wakealarm
#To turn it off
reboot -p
5.7.3.2 进程接口
打印RTC相关信息:
# cat /proc/driver/rtc
rtc_time : 06:53:50
rtc_date : 2022-06-21
alrm_time : 06:55:05
alrm_date : 2022-06-21
alarm_IRQ : yes
alrm_pending : no
update IRQ enabled : no
periodic IRQ enabled : no
periodic IRQ frequency : 1
max user IRQ frequency : 64
24hr : yes
5.7.3.3 IOCTL接口
您可以使用ioctl来控制/dev/rtc0.
rtc.txt详细说明请参阅文档。
5.7.4 常见问题解答
7.4.1. Q1:开发板上电后时间不同步?
A1: 检查RTC电池是否正确连接
5.8 SATA
注:EC-R3588SPC 默认配置不包含 SATA 或 PCIe 存储设备
8.1. 介绍
ROC-RK3588S-PC开发板上有1个M.2接口。
可以通过软件配置为M.2 SATA3.0接口,与支持SATA协议的SSD搭配使用,也可以通过软件配置为M.2 PCIe2.0接口,支持与NVMe协议的SSD搭配使用。
软件默认配置为M.2 SATA3.0接口,支持使用SATA协议的SSD。
https://wiki.t-firefly.com/en/EC-R3588SPC/usage_sata.html
5.9 串口
5.9.1 硬件接口
EC-R3588SPC 硬件版本串口如下图所示:
5.9.2 数据传输配置
文件路径kernel-5.10/arch/arm64/boot/dts/rockchip/roc-rk3588s-pc.dtsi
/* uart7 */
&uart7{
pinctrl-0 = <&uart7m2_xfer>;
status = "okay";
};
文件路径kernel-5.10/arch/arm64/boot/dts/rockchip/roc-rk3588s-pc-ext.dtsi
&spi1 {
status = "okay";
max-freq = <48000000>;
dev-port = <0>;
pinctrl-0 = <&spi1m2_pins>;
num-cs = <1>;
spi_wk2xxx: spi_wk2xxx@00{
status = "okay";
compatible = "firefly,spi-wk2xxx";
reg = <0x00>;
spi-max-frequency = <10000000>;
reset-gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;
irq-gpio = <&gpio3 RK_PC6 IRQ_TYPE_EDGE_FALLING>;
cs-gpio = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>;
};
};
配置串口后,硬件接口对应的节点
RS485 : /dev/ttysWK0(Silk screen:A1 B1) /dev/ttysWK1(Silk screen:A2 B2)
RS232 : /dev/ttysWK2(Silk screen:T1 R1) /dev/ttysWK3(Silk screen:T2 R2) /dev/ttyS7(Silk screen:T3 R3)
5.9.3 RS232发送和接收
最简单的方法是对 RS232 TX RX 引脚进行存根,然后使用命令在调试串口或 ADB 中执行命令
/dev/ttyS7 测试示例如下(请根据实际存根选择/dev/ttysWK2、/dev/ttysWK3、/dev/ttyS7)
busybox stty -echo -F /dev/ttyS7 # Close the echo
cat /dev/ttyS7 & # Get /dev/ttyS7
echo "firefly uart test..." > /dev/ttyS7 # Input string
最终调试串口终端可以收到字符串“firefly uart test…”
5.9.4 RS485发送和接收
最简单的方法就是把两个RS485,A1到A2,B1到B2打桩,然后使用命令在调试串口或者ADB中执行命令
busybox stty -echo -F /dev/ttysWK0 # Close the echo
cat /dev/ttysWK1 & # Get /dev/ttysWK1
echo "firefly uart test..." > /dev/ttysWK0 # Input string
最终调试串口终端可以收到字符串“firefly uart test…”
5.10 看门狗
5.10.1 介绍
看门狗实际上是一个定时器,一旦电路板通电就会开始计数。系统或软件需要在特定时间段内与其反复通信并重置倒计时,以检测故障并从故障中恢复。这个过程通常称为喂狗。
如果看门狗未及时馈送或出现任何超时,系统或应用程序就会陷入循环或卡住。此时,看门狗将发送信号来重置 SOC,以便将系统或应用程序拉出当前情况。
EC-R3588SPC 开发板包含一个集成的片上看门狗。本节将向您展示如何管理它。
5.10.2 DTS配置
EC-R3588SPC 中定义的看门狗节点kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s.dtsi,如下图:
wdt: watchdog@feaf0000 {
compatible = "snps,dw-wdt";
reg = <0x0 0xfeaf0000 0x0 0x100>;
clocks = <&cru TCLK_WDT0>, <&cru PCLK_WDT0>;
clock-names = "tclk", "pclk";
interrupts = <GIC_SPI 315 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
首先,用户需要打开DTS文件中的WDT节点:
&wdt{
status = "okay";
};
5.10.3 用法
默认情况下禁用看门狗。您需要按照上述方法打开DTS文件中的相关节点。
看门狗的驱动文件为kernel-5.10/drivers/watchdog/dw_wdt.c. 看门狗的使用方法有两种:
内部看门狗的设备名称为/dev/watchdog。您可以通过运行echo命令来控制该设备。
# Writing any character except capital V will open the watchdog, and write once every 44 seconds.
echo A > /dev/watchdog
# Turning on the watchdog, and the kernel will every 22 seconds feed the dog automatically.
echo V > /dev/watchdog
还可以通过程序控制看门狗。通过Android.mk编译可执行文件,开机后运行可执行文件。演示代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/watchdog.h>
#define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int)
#define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int)
int main(void)
{
int timeout1 = 22;
int timeout2;
int fd = open("/dev/watchdog", O_WRONLY); //start watchdog
int ret = 0;
if (fd == -1) {
perror("watchdog");
exit(EXIT_FAILURE);
}
ret = ioctl(fd, WDIOC_SETTIMEOUT, &timeout1); //set timeout
if (ret < 0)
printf("ioctl WDIOC_SETTIMEOUT failed.\n");
ret = ioctl(fd, WDIOC_GETTIMEOUT, &timeout2); //get timeout
if (ret < 0)
printf("ioctl WDIOC_SETTIMEOUT failed.\n");
printf("timeout = %d\n", timeout2);
while (1) {
ret = write(fd, "\0", 1); //feed the dog
if (ret != 1) {
ret = -1;
break;
}
printf("feed the dog\n");
sleep(10);
}
close(fd);
return ret;
}
demo说明:
1、内部看门狗用open函数打开后立即开始计时。
2、关于超时:用户可以设置超时时间,并通过ioctl函数获取超时时间。当用户未设置超时时,驱动程序将应用默认的请求超时 30 秒。需要说明的是,驱动程序最终设置的超时时间不一定是应用层的传输时间或者驱动程序一开始设置的默认时间。驱动函数中有一个超时时间列表,存储了16个超时时间,前9个超时时间为零。驱动程序会在超时列表中找到一个合适的时间作为看门狗设置的超时时间。
以下是超时时间的详细列表:
请求的超时时间 | ioctl获取的超时时间 | 最终超时由看门狗设置 |
---|---|---|
超时请求 > 89 | 超时获取 = 超时请求 | 超时设置 = 89 |
44 < 超时请求 <= 89 | 超时获取 = 89 | 超时设置 = 89 |
22 < 超时请求 <= 44 | 超时获取 = 44 | 超时设置 = 44 |
11 < 超时请求 <= 22 | 超时获取 = 22 | 超时设置 = 22 |
5 < 超时请求 <= 11 | 超时获取 = 11 | 超时设置 = 11 |
2< 超时请求 <= 5 | 超时获取 = 5 | 超时设置 = 5 |
超时请求 = 2 | 超时获取 = 2 | 超时设置 = 2 |
超时请求= 1 | 超时获取 = 1 | 超时设置 = 1 |
参考文件:
android: SDK/RKDocs/common/watchdog
Linux:SDK/docs/common/watchdog
配件
无线模块
注:EC-R3588SPC默认不包含4G模块
Firefly 支持以下无线模块:
- EC20 4G-LTE模块
https://wiki.t-firefly.com/en/EC20/ec20.html - EG25-G 4G LTE 模块
https://wiki.t-firefly.com/en/EG25/eg25.html - GPS & 格洛纳斯 & RG4538
https://wiki.t-firefly.com/en/GNSS/gnss.html
其他
1 神经网络处理单元
RK3588拥有NPU(Neural Process Unit)神经网络加速引擎,处理性能高达6 TOPS。使用该NPU模块需要下载RKNN SDK,该SDK为带NPU的RK3588S/RK3588芯片平台提供编程接口。该SDK可以帮助用户部署RKNN-Toolkit2导出的RKNN模型,加速AI应用的落地。
https://wiki.t-firefly.com/en/EC-R3588SPC/usage_npu.html
2 Linux设备树 DTS(DeviceTree Source) 手册
有时我们需要修改设备树来调整板卡的功能。例如:在SATA/PCIE之间切换M2插槽功能、更改CAN时钟频率等。本教程将教您如何找到正确的设备树文件以及修改它的一些注意事项。
1.1. 查找设备树
首先你需要学习如何构建Linux SDK,之后你应该明白构建的配置是在.mk文件中定义的SDK/device/rockchip/rk3588/。
假设需要搭建一个支持mipi屏的ITX-3588J Ubuntu固件,那么对应的mk文件为itx-3588j-BE45-A1-ubuntu.mk
cd 到SDK/device/rockhip/rk3588,找到并打开itx-3588j-BE45-A1-ubuntu.mk,可以看到dts:
CMD=`realpath $BASH_SOURCE`
CUR_DIR=`dirname $CMD`
source $CUR_DIR/itx-3588j-ubuntu.mk
# Kernel dts
export RK_KERNEL_DTS=rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1
RK_KERNEL_DTS显示 dts。这里没有后缀,所以带后缀的全名是rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1.dts
有些mk文件可能没有RK_KERNEL_DTS,例如itx-3588j-kylin.mk构建kylin固件的mk文件:
CMD=`realpath $BASH_SOURCE`
CUR_DIR=`dirname $CMD`
DEVICE_NAME=$(echo ${CMD} | awk -F '/' '{print $NF}')
DEVICE_NAME=${DEVICE_NAME%\-*}
source $CUR_DIR/${DEVICE_NAME}-ubuntu.mk
# parameter for GPT table
export RK_PARAMETER=parameter-kylin.txt
因为该文件来源于另一个文件 D E V I C E N A M E − u b u n t u . m k , {DEVICE_NAME}-ubuntu.mk, DEVICENAME−ubuntu.mk,{DEVICE_NAME}是一个变量,表示板子的型号。所以RK_KERNEL_DTS实际定义在itx-3588j-ubuntu.mk.
当您获得 dts 的名称后,您可以在 下找到它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你会发现这个文件基本是空的,设备树节点在哪里?
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2021 Rockchip Electronics Co., Ltd.
*
*/
/dts-v1/;
#include "rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1.dtsi"
/ {
model = "Firefly ITX-3588J MIPI(Linux)";
compatible = "rockchip,rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1", "rockchip,rk3588";
};
其中包含了另一个文件rk3588-firefly-itx-3588j-mipi101-M101014-BE45-A1.dtsi,注意后缀是dtsi,打开这个dtsi文件可以发现很多设备树节点。该 dtsi 文件还将包含一些其他文件。
所以设备树不是单个文件,而是一组 dts/dtsi 文件:
The basic relationship is:
Upper layer <--------------------> Lower layer
A.dts include B.dtsi include C.dtsi ... N.dtsi
如果在 A.dts 中找不到节点,那么它可能在 B.dtsi 中,或者 C.dtsi 中……遵循 inlcude 关系。
上层的配置会覆盖下层的配置。例如:在C.dtsi中禁用uart0,但在A.dts中启用uart0,A.dts中的配置将生效,uart0将被启用。
一个dtsi文件可能被很多文件包含,修改它会影响很多型号的板卡。所以修改之前先检查一下。
以太网、PCIE、UART等功能的设备树配置说明可以在下面找到SDK/docs/。修改设备树需要内核和dts语法的基本知识,并且你需要明白你要做什么。不当修改会导致功能异常甚至无法启动。
1.3. 编译下载
修改后返回SDK根目录,用于build.sh配置编译:
# select mk file
./build.sh itx-3588j-BE45-A1-ubuntu.mk
# compile kernel
./build.sh extboot
结果将位于SDK/kernel:图像extboot.img和目录下extboot
下载到开发板(选择一种方法):
将下面的所有文件复制SDK/kernel/extboot/到/boot/开发板中,然后重新启动开发板。
或者按照升级固件的内核部分下载extboot.img。
参考
1、Rockchip板卡镜像构建与使用
2、RK3588 开发板上根文件系统导出并制作img镜像
3、野火–LubanCat-RK3588系列板卡快速使用手册
4、firefly–Welcome to EC-R3588SPC Manual