EC-R3588SPC 资料介绍

news2024/10/6 6:49:40

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为例。

注意:

  1. SDK使用交叉编译,所以将SDK下载到您的X86_64 PC上,不要将SDK下载到arm64板子上。
  2. 构建环境需要为Ubuntu18.04(真实PC或docker容器),其他版本可能会导致构建失败。
  3. SDK不要放在虚拟机的共享目录或非英文路径下。
  4. 请以普通用户身份获取/构建 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系统设备名称主要和辅助速度
以太网0rk_gmac以太网外部网络的主网络端口1000Mpbs
以太网1r8152以太网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_D561三色灯
红色的GPIO3_B2106三色灯
绿色的GPIO3_C0112三色灯
分机黄(L2)GPIO3_B7111下部单色 LED 与继电器配合使用
外接绿色(L1)GPIO3_C1113上部单色 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, DEVICENAMEubuntu.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1876589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树 | 第6章 | Java版大话数据结构 | 1.7w字长文 | 二叉树 | 哈夫曼树 | 二叉树遍历 | 构造二叉树 | LeetCode练习

&#x1f4cc;本篇分享的大话数据结构中&#x1f384;树&#x1f384;这一章的知识点&#xff0c;在此基础上&#xff0c;增加了练习题帮助大家理解一些重要的概念✅&#xff1b;同时&#xff0c;由于原文使用的C语言代码&#xff0c;不利于学习Java语言的同学实践&#xff0c;…

endswith()方法——是否以指定子字符串结尾

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 endswith()方法用于检索字符串是否以指定子字符串结尾。如果是则返回True&#xff0c;否则返回False。endswith()方法的语法格式如下&…

GenAI 用于客户支持 — 第 1 部分:构建我们的概念验证

作者&#xff1a;来自 Elastic Chris Blaisure 欢迎来到 Inside Elastic 博客系列&#xff0c;我们将展示 Elastic 的内部运营如何解决实际业务挑战。本系列将揭示我们将生成式 AI&#xff08;gererative AI - GenAI&#xff09;集成到客户成功和支持运营中的历程&#xff0c;让…

【C++】类、静态、枚举、重载、多态、继承、重写、虚函数

五、类 面向对象编程是一个巨大的编程范式。C中的类class就是基于对象的程序设计。 我们可以用类来定义一个新的类型&#xff0c;这些新类型就可以像内置类型一样使用。 内置类型颗粒度太太小&#xff0c;现实需求又非常复杂&#xff0c;这就需要我们把内置类型适度的进行拼搭…

在Redis中使用Lua脚本实现多条命令的原子性操作

Redis作为一个高性能的键值对数据库&#xff0c;被广泛应用于各种场景。然而&#xff0c;在某些情况下&#xff0c;我们需要执行一系列Redis命令&#xff0c;并确保这些命令的原子性。这时&#xff0c;Lua脚本就成为了一个非常实用的解决方案。 问题的提出 假设我们有一个计数…

Redis为什么设计多个数据库

​关于Redis的知识前面已经介绍过很多了,但有个点没有讲,那就是一个Redis的实例并不是只有一个数据库,一般情况下,默认是Databases 0。 一 内部结构 设计如下: Redis 的源码中定义了 redisDb 结构体来表示单个数据库。这个结构有若干重要字段,比如: dict:该字段存储了…

Redis-实战篇-缓存更新策略(内存淘汰、超时剔除、主动更新)

文章目录 1、缓存更新策略1.1、内存淘汰1.2、超时剔除1.3、主动更新 2、业务场景&#xff1a;3、主动更新在企业中业务实现有三种方式3.1、Cache Aside Pattern3.1.1、操作缓存和数据库时有三个问题需要考虑&#xff1a;3.1.1.1、删除缓存还是更新缓存&#xff1f;3.1.1.2、如何…

信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换

PDF文档公众号回复关键字:20240629 2022 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 5.对于入栈顺序为a,b,c,d,e的序列&#xff0c;下列( )不合法的出栈序列 A. a&#xff0c;b&a…

架构师必知的绝活-JVM调优

前言 为什么要学JVM&#xff1f; 首先&#xff1a;面试需要 了解JVM能帮助回答面试中的复杂问题。面试中涉及到的JVM相关问题层出不穷&#xff0c;难道每次面试都靠背几百上千条面试八股&#xff1f; 其次&#xff1a;基础知识决定上层建筑 自己写的代码都不知道是怎么回事&a…

show-overflow-tooltip 解决elementui el-table标签自动换行的问题

elementui中 el-table中某一行的高度不想因为宽度不够而撑开换行展示的解决方法。可通过show-overflow-tooltip属性解决&#xff0c;如下 代码是这样的 <el-table-column width"80" prop"id" label"ID"></el-table-column> <el…

java基于ssm+jsp 二手车交易网站

1用户功能模块 定金支付管理&#xff0c;在定金支付管理页面可以填写订单编号、车型、品牌、分类、车身颜色、售价、订金金额、付款日期、备注、用户名、姓名、联系方式、是否支付等信息&#xff0c;进行详情、修改&#xff0c;如图1所示。 图1定金支付管理界面图 预约到店管…

亨廷顿(Huntington)方法-名额分配

前言 20世纪初&#xff0c;美国人口普查局局长约瑟夫A亨廷顿&#xff08;Joseph A. Hill&#xff09;和数学家爱德华V亨廷顿&#xff08;Edward V. Huntington&#xff09;在研究议会议席分配问题时&#xff0c;提出了一种基于数学原理的算法。该算法通过计算每个州的人口比例&…

有趣的仿神经猫html5圈小猫游戏源码

有趣的仿神经猫html5圈小猫游戏源码,点击小圆点&#xff0c;围住小猫游戏。猫已经跑到地图边缘&#xff0c;你输了。内含json数据&#xff0c;部署到服务器方可运行 微信扫码免费获取源码

【自然语言处理系列】掌握jieba分词器:从基础到实战,深入文本分析与词云图展示

本文旨在全面介绍jieba分词器的功能与应用&#xff0c;从分词器的基本情况入手&#xff0c;逐步解析全模式与精确模式的不同应用场景。文章进一步指导读者如何通过添加自定义词典优化分词效果&#xff0c;以及如何利用jieba分词器进行关键词抽取和词性标注&#xff0c;为后续的…

基于docker安装redis服务

Redis是我们在项目中经常需要使用的缓存数据库&#xff0c;安装redis的方式也有很多&#xff0c;本文主要是给大家讲解如何基于docker进行redis服务的安装&#xff0c;主要介绍&#xff0c;如何拉取redis镜像、如何挂载redis的数据以及使用redis的配置文件和开启认证等功能&…

【MySQL】InnoDB架构

本文MySQL版本是8.X版本 这是官方文档给出来的架构图&#xff1a;MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 可以看出&#xff0c;整体上是分成两部分的&#xff1a;内存结构(提高效率)和磁盘结构(数据持久化)&#xff0c;下面将把每个区域都大致做一个…

RFID固定资产管理系统在企业中的应用与优势

随着企业资产规模的不断扩大和管理复杂性的增加&#xff0c;传统的资产管理方式已无法满足企业高效管理的需求。RFID固定资产管理系统凭借其高效、准确、实时的特点&#xff0c;成为企业固定资产管理的新宠。 一、什么是RFID固定资产管理系统 RFID&#xff08;无线射频识别&…

代理IP如何进行品牌保护?

品牌是企业无形的价值&#xff0c;代表了企业的文化、形象和软实力。随着网络攻击、侵权行为的频发&#xff0c;企业如何有效保护自己的品牌资产&#xff0c;维护品牌形象&#xff0c;成为了亟待解决的问题。代理IP作为一种网络工具&#xff0c;在品牌保护中发挥着不可或缺的作…

DNF手游鬼剑士攻略:全面解析流光星陨刀的获取与升级!云手机强力辅助!

《地下城与勇士》&#xff08;DNF&#xff09;手游是一款广受欢迎的多人在线角色扮演游戏&#xff0c;其中鬼剑士作为一个经典职业&#xff0c;因其强大的输出能力和炫酷的技能特效&#xff0c;吸引了众多玩家的青睐。在这篇攻略中&#xff0c;我们将详细介绍鬼剑士的一把重要武…

浅谈安科瑞ACRELCLOUD-1200光伏发电系统在建筑节能中的应用

摘要&#xff1a;21世纪以来&#xff0c;随着不可再生能源的逐渐减少&#xff0c;人们越来越重视能源的利用率&#xff0c;不断开发绿色能源。通过光伏发电系统&#xff0c;能够提升能源利用率&#xff0c;减少不可再生能源的开发。同时&#xff0c;也能加强我国建筑节能系统的…