接口说明

风扇

reComputer RK3576 通过 Linux hwmon 子系统提供风扇控制。风扇转速可以实时读取,PWM 占空比既可以手动设置,也可以交由自动温控调节器处理。

Hardware Monitor 路径

接口路径说明
风扇转速/sys/class/hwmon/hwmon6/fan1_input当前转速(RPM)
PWM 值/sys/class/hwmon/hwmon6/pwm10–255,控制占空比
PWM 模式/sys/class/hwmon/hwmon6/pwm1_enable0=关闭 1=手动 2=自动

温区

温区路径
SoC/sys/class/thermal/thermal_zone0/temp
大核(Big Core)/sys/class/thermal/thermal_zone1/temp
小核(Little Core)/sys/class/thermal/thermal_zone2/temp
DDR/sys/class/thermal/thermal_zone3/temp
NPU/sys/class/thermal/thermal_zone4/temp
GPU/sys/class/thermal/thermal_zone5/temp

温度值以毫摄氏度为单位——除以 1000 即可得到摄氏度(°C)。

读取风扇转速

bash
cat /sys/class/hwmon/hwmon6/fan1_input

输出单位为 RPM。示例:2161

一次性读取所有温度:

bash
for zone in /sys/class/thermal/thermal_zone*; do
    name=$(cat $zone/type)
    temp=$(( $(cat $zone/temp) / 1000 ))
    echo "$name: ${temp}°C"
done

控制风扇转速

  1. 切换到手动模式:
bash
echo 1 | sudo tee /sys/class/hwmon/hwmon6/pwm1_enable
  1. 设置 PWM 值(0–255):
PWM 值大致转速
0风扇关闭
64~25%
128~50%
192~75%
255全速
bash
# 设置为 50%
echo 128 | sudo tee /sys/class/hwmon/hwmon6/pwm1
  1. 恢复自动温控:
bash
echo 2 | sudo tee /sys/class/hwmon/hwmon6/pwm1_enable

自动温控脚本

该脚本根据 SoC 温度动态调整风扇转速,并在后台持续运行。

bash
#!/bin/bash
TEMP_SENSOR="/sys/class/thermal/thermal_zone0/temp"
PWM_ENABLE="/sys/class/hwmon/hwmon6/pwm1_enable"
PWM_VALUE="/sys/class/hwmon/hwmon6/pwm1"

echo 1 > $PWM_ENABLE

while true; do
    TEMP=$(( $(cat $TEMP_SENSOR) / 1000 ))

    if   [ $TEMP -lt 40 ]; then PWM=50
    elif [ $TEMP -lt 50 ]; then PWM=100
    elif [ $TEMP -lt 60 ]; then PWM=160
    elif [ $TEMP -lt 70 ]; then PWM=210
    else                        PWM=255
    fi

    echo $PWM > $PWM_VALUE
    echo "$(date '+%H:%M:%S') Temp: ${TEMP}°C  PWM: $PWM"
    sleep 5
done

将其保存为 fan-control.sh 并运行:

bash
chmod +x fan-control.sh
sudo ./fan-control.sh

在后台运行:

bash
sudo nohup ./fan-control.sh > /var/log/fan-control.log 2>&1 &

systemd 服务

  1. 复制脚本:
bash
sudo cp fan-control.sh /usr/local/bin/fan-control.sh
sudo chmod +x /usr/local/bin/fan-control.sh
  1. 创建服务文件:
bash
sudo tee /etc/systemd/system/fan-control.service << 'EOF'
[Unit]
Description=Fan Speed Controller
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/fan-control.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
  1. 启用并启动:
bash
sudo systemctl daemon-reload
sudo systemctl enable fan-control
sudo systemctl start fan-control
sudo systemctl status fan-control

快速参考

bash
# 读取风扇转速
cat /sys/class/hwmon/hwmon6/fan1_input

# 读取 SoC 温度
echo "$(( $(cat /sys/class/thermal/thermal_zone0/temp) / 1000 ))°C"

# 全速
echo 1 | sudo tee /sys/class/hwmon/hwmon6/pwm1_enable
echo 255 | sudo tee /sys/class/hwmon/hwmon6/pwm1

# 低速
echo 1 | sudo tee /sys/class/hwmon/hwmon6/pwm1_enable
echo 64 | sudo tee /sys/class/hwmon/hwmon6/pwm1

# 恢复自动
echo 2 | sudo tee /sys/class/hwmon/hwmon6/pwm1_enable

测试环境

项目
设备reComputer RK3576 DevKit
操作系统Linux 6.1(基于 Debian)
hwmon 接口/sys/class/hwmon/hwmon6(pwmfan)
空闲风扇转速~2155 RPM
空闲 SoC 温度~36°C

LED 指示灯状态

本设备在前面板上配备三个板载 LED 指示灯(电源、状态和用户)。这些 LED 可帮助用户监控硬件上电流程、观察系统运行状态,并提供完全可编程的接口以实现自定义软件交互。

image24.png

  • LED 状态与默认硬件行为 在默认系统固件下,这些 LED 在启动过程及启动完成后会呈现以下标准行为:

  • 开发者须知:控制边界 在开始二次开发之前,务必了解每个 LED 底层的硬件走线方式,以避免不必要的排查工作:

  • 电源 LED(红色): 纯硬件控制。 该 LED 直接硬连接到主电源轨,没有任何 GPIO 或内核接口与之相连,无法通过软件或命令进行控制

  • 状态 LED(绿色): 系统级硬件控制。 该 LED 由底层硬件电源管理逻辑或 PMIC 固件直接控制,用以反映核心系统的稳定状态。它不向 Linux 用户空间暴露任何接口,无法通过软件或命令进行控制

  • 用户 LED(RGB 三色): 完全开放给开发者控制! 这是一颗接入板载 GPIO 扩展器(gpiochip6)的 RGB LED 封装。它是设备上唯一开放给用户自定义编程和软件自动化控制的指示灯。默认情况下,系统占用蓝色通道(USER_LED_B)作为心跳指示,红色和绿色通道处于空闲状态。

  • 用户 RGB LED 控制指南 在 Linux 环境中(如 Armbian),建议使用现代化的 gpiod 工具链(gpioinfo / gpioset)来操作空闲的红色和绿色通道,并使用标准 Linux sysfs 接口控制蓝色通道。 定位 LED 在系统中,LED 通过 sysfs 接口进行管理。运行以下命令确认 LED 节点:

bash
ls /sys/class/leds/user-led

预期输出:

image26.png

手动控制(开/关) 在手动控制 LED 之前,需要先将其触发模式设置为 none

bash
echo none | sudo tee /sys/class/leds/user-led/trigger

开启/关闭 LED

bash
# 打开
echo 1 | sudo tee /sys/class/leds/user-led/brightness
# 关闭
echo 0 | sudo tee /sys/class/leds/user-led/brightness

自动触发模式 内核提供了多种触发器,可根据系统事件自动控制 LED 行为。

bash
# 心跳模式
echo heartbeat | sudo tee /sys/class/leds/user-led/trigger
# 自定义定时器模式(闪烁)
# 启用定时器
echo timer | sudo tee /sys/class/leds/user-led/trigger
# 设置间隔
echo 500 | sudo tee /sys/class/leds/user-led/delay_on
echo 500 | sudo tee /sys/class/leds/user-led/delay_off

开机持久化配置 由于 /sys 中的更改是易失性的,重启后会被重置,你可以通过添加 cron 任务或使用 rc.local 使其永久生效。

按键

reComputer RK3576 系列主板配备了 3 个板载物理按键,主要用于电源控制和底层固件烧录。

image27.png

注意: 使用 Recovery 或 MaskROM 进行烧录时,请确保设备的 Type-C OTG 接口通过数据线连接到主机 PC。你需要使用 Rockchip 官方工具(如 Windows 上的 RKDevTool 或 Linux 上的 upgrade_tool)来执行相关操作。

GPIO

主板顶部提供了一个标准的 40 针扩展排针,为开发者提供了一整套底层硬件接口,包括电源、调试以及常见的工业通信总线(I2C、UART、SPI、CAN 等),方便连接外部传感器、驱动板,或进行系统级调试。

image29.png

40 针引脚定义表

GPIO 使用说明 默认情况下,除非被系统驱动预先占用,否则 40 针排针上的大多数引脚都作为标准 GPIO 使用。推荐使用标准的 gpiod 工具集(gpiodetectgpioinfogpiosetgpioget)在 Shell 层面进行操作。 以操作物理引脚 21(该引脚被指定为通用 GPIO,当前处于空闲状态)为例:

  • 定位其映射的控制器与线路编号:
bash
sudo gpioinfo | grep -i PIN_21

输出:

text
line 14:     "PIN_21"       unused   input  active-high

这表明它属于 gpiochip1 的第 14 号线路(Line)。

  • 将该引脚设置为高电平(例如点亮一个 LED):
bash
gpioset gpiochip1 14=1
  • 将该引脚设置为低电平:
bash
gpioset gpiochip1 14=0
  • 读取物理引脚 27 的输入状态: 执行 sudo gpioinfo | grep -i PIN_27 查询后可知,它映射到 gpiochip4 的第 23 号线路:
bash
gpioget gpiochip4 23

要启用引脚定义图中标注的专用外设硬件(I2C、UART、CAN、PWM),必须显式启用其对应的设备树覆盖层(Device Tree Overlay,DTBO),否则它们将始终只作为通用 GPIO 使用。 所有 40-Pin 专用的覆盖层配置均位于 /boot/dtb/rockchip/overlay/ 目录下,并严格遵循 recomputer-rk3576-devkit-40pin- 命名前缀:

配置步骤:

  • 打开系统环境配置文件:
bash
sudo nano /boot/armbianEnv.txt
  • 找到 overlays= 这一行(如果不存在,则在文件末尾追加一行),然后填入所需的覆盖层名称,不含 .dtbo 扩展名。多个覆盖层之间用空格分隔:
text
overlays=recomputer-rk3576-devkit-40pin-i2c3 recomputer-rk3576-devkit-40pin-can0
  • 保存并退出(Ctrl+O、Enter、Ctrl+X),然后重启设备以应用设备树修改:
bash
sudo reboot

注意:SPI 默认处于激活状态

SPI 总线引脚(引脚 19、21、23、24、26)在系统启动时默认已启用。你无需armbianEnv.txt 中为 SPI 额外指定任何自定义 DTBO。

硬件架构共享: 40-Pin 排针上的物理 SPI 信号与板载的 4G LTE / LoRaWAN / Hailo Wi-Fi 扩展槽位共享完全相同的硬件总线域。为了让这些通信模块获得开箱即用的体验,基础操作系统会让该 SPI 通道始终保持激活状态。

开发者建议: 如果你在 40-Pin 扩展排针上连接自定义的第三方 SPI 扩展板,请务必谨慎处理片选(CS)与地址分配,以避免与内置模块之间发生通信总线死锁。

USB

本设备为 reComputer RK3576 系列提供了多个物理 USB 接口,用于连接外部外设、进行系统固件烧录(OTG)以及扩展显示输出。

USB 资源分配定义如下:

接口位置/标签物理接口形态总线协议与最大带宽硬件规格与控制器路由
USB 3.0 HostUSB Type-AUSB 3.2 Gen 1x1(5 Gbps)通过内部 USB 3.0 控制器路由,为 USB 3.0 工业相机、NVMe 存储扩展或高速 DAQ 模块提供针对性优化的高带宽数据通道。
USB 2.0 HostUSB Type-A(多个)USB 2.0(480 Mbps)由 USB 2.0 主控制器管理,用于连接键盘、鼠标、4G/5G 蜂窝调制解调器、硬件加密狗或 USB 转 UART 桥接板等标准外设。
USB Type-CUSB Type-CUSB 3.0 / 2.0 OTG + DP 1.4 Alt Mode一个多协议复合端口,路由至 RK3576 的 USB 3.0 OTG 控制器与 DisplayPort(DP)TX PHY,支持双向 Host/Device 角色切换与硬件视频流传输。

使用 lsusb 可以查看当前系统上连接的 USB 设备信息:

image34.png

注意:USB Type-C 接口架构

A. 系统烧录与维护(USB OTG 设备模式): 通过 Recovery / MaskROM 按键触发,该端口将进入设备模式,以便使用 RKDevTool 进行底层固件烧录。

B. DisplayPort 输出(DP 1.4 Alt 模式): 复用硬件视频通道,通过 Type-C 线缆或转接器直接驱动显示器,输出标准的 DP 1.4 画面。

C. 标准原生 Host 模式: 在系统正常运行期间默认作为标准 USB 3.0 Host,可直接连接 Type-C 存储设备、网络适配器或 Hub。

SD 卡插槽

主板配备一个标准的 Micro SD(TF)卡插槽,直接连接至 RK3576 SOC 的 SDMMC0 总线。该接口主要用于系统启动、运行操作系统(如 Armbian OS)以及本地数据存储。

image35.png

开箱即用体验 设备标配一张 32GB Class 10 Micro SD 卡。该卡已通过 Seeed Studio 的严格兼容性测试,完全能够胜任日常的 Armbian OS 操作、基础网络配置以及轻量级边缘 AI 算法验证,让开发者可以立即上手使用。

注意:启动优先级与存储建议

启动优先级机制(MaskROM 阶段): RK3576 上的固件启动顺序由底层 MaskROM 严格控制。如果 Micro SD 卡与板载 eMMC 上同时存在可启动固件,MaskROM 会优先从 Micro SD 卡加载 SPL(Secondary Program Loader,二级程序加载器)。在进行固件升级或多系统切换时,请特别留意这一物理特性。

NVMe 启动限制(U-Boot 阶段): M.2 NVMe SSD 不在 MaskROM 的直接启动路径之内,系统无法直接从裸 NVMe 硬盘执行第一阶段启动。若要从 NVMe SSD 运行操作系统,必须先在 Micro SD 卡或 eMMC 上执行引导程序进入 U-Boot 阶段,再由 U-Boot 完成初始化、加载,并将控制权移交给位于 NVMe 存储上的主操作系统。

重负载升级建议: 如果你计划在边缘侧部署具有高频 I/O 读写需求的应用(例如运行持续本地日志记录的大型数据库,或管理复杂的 Docker 容器集群),海量的 4K 随机读写可能会触及标准 Class 10 卡的性能瓶颈。对于此类重负载工业场景,建议将核心操作系统 rootfs 迁移至 M.2 NVMe SSD(通过 U-Boot 链式加载),或升级为明确标注 A1 或 A2(应用性能等级)的高性能 Micro SD 卡,以确保系统获得最佳响应速度。

挂载点: 在 Armbian OS 中,Micro SD 卡通常被枚举为 /dev/mmcblk0

SIM 卡插槽

主板配备一个板载卡槽,专为搭配安装在 Mini-PCIe 插槽中的 4G LTE 蜂窝模块而设计。通过插入标准运营商 SIM 卡,设备可以在没有有线以太网的环境中实现端到云的蜂窝网络连接。

image36.png

硬件架构与工作机制 Nano SIM 卡槽的信号线直接连接至 Mini-PCIe 插槽的特定引脚(如 UIM_PWR、UIM_DATA、UIM_CLK、UIM_RESET)。

  • 非 SOC 直连:请注意,SIM 卡信号并不直接与 RK3576 SOC 相连,而是完全由安装在 Mini-PCIe 插槽中的 4G 模块管理和驱动。因此,SIM 卡只有在兼容的 4G 模块处于激活状态时才能正常工作。

注意:开发者须知与操作规范

严禁热插拔: 请务必在设备完全断电(断开 DC 电源或 PoE 供电)的情况下插拔 SIM 卡。在系统运行时热插拔 SIM 卡可能永久损坏 4G 模块的 SIM 接口,或引发与网络相关的系统崩溃。

卡型规格: 该卡槽仅支持 Nano SIM 卡(4FF),这是现代智能手机中使用的最小标准卡型。请避免使用配合廉价塑料转接卡的 Micro 或 Standard SIM 卡,因为它们很容易卡住或弄弯卡槽内部的触点。

插入方向: 插入前请查看卡槽附近的丝印图标或结构缺口。通常,SIM 卡应以金属触点朝下、缺角一侧先插入的方式放入(请以板上的物理对齐标记为准)。

M.2 Key M 2280 插槽

主板配备一个标准的 M.2 Key M 2280 插槽,由 PCIe 2.1 x1 总线驱动,专为高速存储扩展或边缘 AI 计算加速而设计。

image37.png

支持的设备

  • NVMe SSD:支持标准 2280 规格的 NVMe 固态硬盘,可用于系统启动、大容量数据存储或存放大型 AI 模型。
  • AI 加速卡:兼容基于 M.2 Key M 接口的 AI 加速模块,以提升边缘推理能力。

已测试验证的设备 为确保最佳兼容性与系统稳定性,强烈建议使用经过 Seeed Studio 全面测试验证的 M.2 扩展模块:

注意:

协议兼容性: 该插槽仅支持 PCIe NVMe 设备,不支持 M.2 SATA SSD,操作系统也无法识别此类设备。

带宽限制: 该插槽运行在 PCIe 2.1 x1 通道上,理论最大带宽约为 500 MB/s。选购 NVMe SSD 时,性价比较高的标准 Gen3/Gen4 硬盘即可满足需求;超高速的 Gen4 SSD 会受限于 PCIe 2.1 x1 接口的带宽瓶颈。

外形规格: 安装螺柱专为 2280(22mm x 80mm)规格模块设计。

SSD 使用指南

bash
lsblk

image38.png

Hailo YOLOv11 部署与推理指南

安装软件包 安装基础 PCIe 驱动后,需要重启系统才能使更改生效。

image39.png

image40.png

bash
# 安装 PCIe 驱动
sudo dpkg -i hailort-pcie-driver_4.23.0_all.deb

# 重启系统
sudo reboot

# 重启后,验证驱动是否已加载
lsmod | grep hailo

# 安装 HailoRT
sudo dpkg -i hailort_4.23.0_arm64.deb

# 扫描并验证设备状态
hailortcli scan

# 创建并激活虚拟环境
python3 -m venv hailo_env
source hailo_env/bin/activate

# 安装 HailoRT Python 库
pip install hailort-4.23.0-cp311-cp311-linux_aarch64.whl

# 验证安装和设备连接
python3 -c "from hailo_platform import VDevice; vdev = VDevice(); print('Successfully connected via VDevice! Device info:', vdev)"

image41.png

image42.png

image43.png

安装 Hailo Model Zoo 要运行官方预训练模型,需要安装 Hailo Model Zoo 及其系统依赖项。

bash
# 1. 安装所需的系统库
sudo apt update
sudo apt install -y git libglib2.0-0 libgl1-mesa-glx

# 2. 克隆官方仓库(推荐使用最新分支)
git clone https://github.com/hailo-ai/hailo_model_zoo.git
cd hailo_model_zoo
pip install -e .

运行 YOLOv11 模型

  • 检查摄像头设备: 确认摄像头的挂载节点。
bash
v4l2-ctl --list-devices
  • 下载模型: 确认已下载 yolov11n.hef 模型文件,并将其放置在你的工作目录中。

创建一个名为 webcam_yolo11.py 的文件,并粘贴以下代码。请根据你的实际环境,调整配置部分下的 HEF_PATHDEVICE_ID

python
import numpy as np
import cv2
import time
from hailo_platform import (VDevice, HEF, InferVStreams, ConfigureParams,
                            HailoStreamInterface, InputVStreamParams, OutputVStreamParams)

# ================= 配置 =================
HEF_PATH = 'yolov11n.hef'
DEVICE_ID = "/dev/video40"  # Update based on v4l2-ctl output
CONF_THRESHOLD = 0.45

# COCO 数据集 80 类别标签
COCO_CLASSES = [
    "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light",
    "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow",
    "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
    "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard",
    "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple",
    "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
    "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
    "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
    "hair drier", "toothbrush"
]
# ==================================================

def main():
    # 1. Initialize Hailo Hardware
    hef = HEF(HEF_PATH)
    input_vstream_info = hef.get_input_vstream_infos()[0]
    input_h, input_w = input_vstream_info.shape[:2]

    cap = cv2.VideoCapture(DEVICE_ID)
    if not cap.isOpened():
        print("Cannot open webcam")
        return

    # Setup inference variables
    prev_time = 0

    with VDevice() as target:
        config_params_dict = ConfigureParams.create_from_hef(hef, HailoStreamInterface.PCIe)
        network_group = target.configure(hef, config_params_dict)[0]
        with network_group.activate():
            vstream_params = (InputVStreamParams.make_from_network_group(network_group),
                              OutputVStreamParams.make_from_network_group(network_group))
            with InferVStreams(network_group, vstream_params[0], vstream_params[1]) as vstreams:
                print("[INFO] Initialization successful! Running YOLOv11 real-time detection...")
                while True:
                    start_time = time.time()  # Record start time for FPS
                    ret, frame = cap.read()
                    if not ret:
                        break

                    # Preprocessing (Convert to RGB based on previous validation)
                    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                    resized = cv2.resize(frame_rgb, (input_w, input_h))
                    input_tensor = np.expand_dims(resized, axis=0)

                    # Inference
                    outputs = vstreams.infer(input_tensor)

                    # Parsing and Drawing
                    h, w, _ = frame.shape
                    for name, class_list in outputs.items():
                        # Iterate through 80 classes
                        for class_id, detections in enumerate(class_list[0]):
                            if len(detections) > 0:
                                for det in detections:
                                    if len(det) >= 5:
                                        ymin, xmin, ymax, xmax, confidence = det[:5]
                                        if confidence > CONF_THRESHOLD:
                                            # Coordinate Mapping
                                            left, top = int(xmin * w), int(ymin * h)
                                            right, bottom = int(xmax * w), int(ymax * h)

                                            # Get class name, display ID if out of bounds
                                            class_name = COCO_CLASSES[class_id] if class_id < len(COCO_CLASSES) else f"ID {class_id}"

                                            # Draw bounding box
                                            cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
                                            # Draw background and label text
                                            label = f"{class_name}: {confidence:.2f}"
                                            cv2.putText(frame, label, (left, top - 10),
                                                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

                    # Calculate and display real-time FPS
                    curr_time = time.time()
                    fps = 1 / (curr_time - start_time)
                    # Print in the top left corner
                    cv2.putText(frame, f"FPS: {fps:.1f}", (20, 40),
                                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

                    # Display window
                    cv2.imshow('reComputer RK3576 - Hailo YOLOv11', frame)
                    if cv2.waitKey(1) & 0xFF == ord('q'):
                        break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

image44.png

RK182x 部署与推理指南

RK182x 支持协处理器模式,由主机 SoC(例如 RK3588/RK3576)作为系统核心,负责任务调度、资源分配与整体控制,并通过高速 PCIe(通常协商至 Gen2 x1、5 GT/s,提供约 400 MB/s 的单向带宽)或 USB 3.0 接口连接到 RK1820/RK1828 加速单元。RK1820 与 RK1828 共享相同的 PCI 设备 ID(1d87:182a)。整个开发框架由 PC 端的模型转换工具(RKNN3 Toolkit)与板端的运行时环境(RKNN3 Runtime)组成。

方案 A:快速自动化部署(推荐) 使用 SDK 提供的预编译自动化安装包,可以一键完成内核驱动、设备固件、运行时库、调试工具以及系统自启动服务的部署。

bash
# 通过 ADB 从 PC 推送软件包到开发板
# 可选软件包包括:
#   - rknn3_rk182x_m2_installer_arm64.tgz(M.2 模块)
adb push rknn3_rk182x_m2_installer_arm64.tgz /tmp/installer.tgz
adb shell "cd /tmp && tar xzf installer.tgz && ./install.sh"

# 注意:必须进行硬断电(物理断电)以确保硬件和固件正确加载。
sudo poweroff

如果在开发调试过程中需要手动控制驱动绑定,或在未安装自动化安装包的环境中操作,请按顺序执行以下系统总线命令。请注意:RK1820 在驱动探测完成后,需要手动显式激活 BusMaster。

bash
# 强制驱动覆盖并触发绑定
echo pcie-rkep | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver_override
echo 0000:01:00.0 | sudo tee /sys/bus/pci/drivers/pcie-rkep/bind

# 启用 BusMaster 寄存器以激活加速卡总线主控
sudo setpci -s 01:00.0 COMMAND=0x0406

主机系统默认运行 Python 3.11。部署前,请确保已在 x86 机器上使用 RKNN3 Toolkit 将模型转换为专用的 .rknn 格式(适用于 LLM 和 CNN),并将转换后的文件(例如 qwen2_5_1_5b_rk1820.rknn)上传至主机。

bash
# 1. 创建工作空间
mkdir -p ~/rk_182x_work && cd ~/rk_182x_work

# 2. 克隆 Model Zoo 和 Toolkit 仓库
git clone --recursive https://github.com/airockchip/rknn3-model-zoo.git
git clone https://github.com/airockchip/rknn3-toolkit.git

# 3. 安装 rknn3-toolkit-lite
cd rknn3-toolkit/rknn3-toolkit-lite/packages
pip3 install ./rknn3_toolkit_lite-1.0.0-cp311-cp311-linux_aarch64.whl

# 4. 安装依赖
pip3 install -r requirements.txt

Mini-PCIe 插槽

主板配备一个标准 Mini-PCIe(Mini PCI Express)插槽,主要用于扩展 4G LTE、LoRaWAN 或 Wi-Fi HaLow 等工业级无线通信模块。

image45.png

信号与总线架构 该 Mini-PCIe 插槽内部同时布线了 PCIeUSB 信号,可与市面上绝大多数主流无线通信模块保持出色的兼容性。

  • 蜂窝网络扩展:与板载 Nano SIM 卡插槽配合使用,可直接插入 4G LTE 模块以实现蜂窝网络连接。

已测试验证的设备 为确保最佳兼容性与系统稳定性,强烈建议使用经过 Seeed Studio 全面测试验证的 Mini-PCIe 模块:

  • 4G 蜂窝网络
    • 官方推荐的 4G LTE Mini-PCIe 模块
  • LoRaWAN 与物联网无线
    • 基于 USB / SPI 的 LoRaWAN 网关模块
    • Wi-Fi HaLow(802.11ah)远距离低功耗无线模块

注意:

SIM 卡安装: 使用 4G LTE 模块时,请在设备断电状态下将 Nano SIM 卡插入板载卡槽。热插拔 SIM 卡可能导致模块识别失败或永久损坏。

天线走线: 由于工业外壳可能会屏蔽无线信号,在部署 4G 或 LoRaWAN 模块时,请务必连接 IPEX 转 SMA 转接线,将天线引出机箱外部。

驱动与网络配置: 大多数工业级 4G 模块在 Armbian OS 中需要特定的 USB 串口驱动(如 option 驱动)。开发者可以使用 NetworkManager 或 pppd 建立蜂窝网络连接。

4G 模块(EC25)配置与测试指南

image46.png

通过 AT 命令进行蜂窝网络配置 插入装有物联网 SIM 卡的 4G 模块,启动系统,并确认 USB 串口设备:

bash
lsusb
ls /dev/ttyUSB*

安装并启动 minicom 以与模块通信:

bash
sudo apt install minicom
sudo minicom -D /dev/ttyUSB2

核心 AT 命令速查

详细状态检查与拨号流程 SIM 卡状态检查:发送 AT+CPIN? 以确认 SIM 卡状态。

text
Command:  AT+CPIN?
Response: +CPIN: READY
Meaning:  The SIM card is present and ready (no PIN lock applied).

信号质量(RSSI)检查:发送 AT+CSQ 以评估无线信号环境。

text
Command:  AT+CSQ
Response: +CSQ: 28,99
Meaning:  Excellent signal. The value 28 maps to approx. -57 dBm (range 0-31, >20 is excellent). 99 indicates unknown Rx error rate (normal).

网络注册状态检查:发送 AT+CGREG?AT+CREG? 以检查蜂窝网络的注册状态。

text
Command:  AT+CGREG?  and  AT+CREG?
Response: +CGREG: 0,1  /  +CREG: 0,1
Meaning:  The trailing 1 indicates "Registered, home network", meaning the module has successfully attached to the tower.

当前运营商查询:发送 AT+COPS? 以检查运营商及网络制式。

text
Command:  AT+COPS?
Response: +COPS: 0,0,"T-Mobile",7
Meaning:  Currently attached to the specific carrier (e.g., T-Mobile). The trailing 7 indicates the connection is in LTE (4G) mode.

数据上下文激活:先通过 AT+QIACT? 查询,再使用 AT+QIACT=1 激活数据上下文。

text
Command:  AT+QIACT?   -> Response: OK (If empty, no context is currently active)
Command:  AT+QIACT=1  -> Response: OK
Meaning:  Successfully activates Context ID 1. The module will fetch a private IP from the carrier and enable cellular routing.

注意: 如果硬件与运营商套餐支持语音/数据并发,可以通过 ATD<number>; 发起语音通话。

内置 Ping 测试:运行 AT+QPING 可直接从模块验证 IP 层的连通性。

text
Command:  AT+QPING=1,"www.google.com",1,4
Response: +QPING: 0["142.250.190.46",32,45,255]
          +QPING: 0,4,4,0,40,52,45
Meaning:  Successfully pinged the target domain. 4 packets sent, 4 received, 0% loss.

故障排查

Lora 模块配置与测试指南

USB

验证设备识别

bash
ls /dev/ttyACM*
udevadm info /dev/ttyACM0 | grep -E "ID_VENDOR|ID_MODEL"

预期输出包括:

bash
E: ID_MODEL=STM32_Virtual_ComPort
E: ID_VENDOR=STMicroelectronics

TX 测试命令

bash
cd ~/sx1302_hal/libloragw
sudo ./test_loragw_hal_tx \
  -u \
  -d /dev/ttyACM0 \
  -r 1250 \
  -m LORA \
  -f 867.1 \
  -s 12 \
  -b 125 \
  -n 1000 \
  -z 100 \
  --dig 3 \
  --pa 0 \
  --pwid 13

预期输出

text
Opening USB communication interface
INFO: Configuring TTY
INFO: Connect to MCU
INFO: Concentrator MCU version is V01.00.00
INFO: MCU status: sys_time:197172 temperature:37.2oC
Note: chip version is 0x10 (v1.0)
TX done
TX done

image49.png

常见错误与修复方法

错误原因修复方法
chip version is 0xFF在 USB 模块上使用了 SPI 模式添加 -u 参数
failed to open COM port ... No such file or directory设备已断开连接(例如 GPIO 复位后)重新插拔或重启设备;不要运行 reset_lgw.sh
dmesg 中出现 USB disconnectreset_lgw.sh 切换了 GPIO 并导致 USB 断开连接USB 模块跳过复位脚本

注意: 在测试 USB 模式模块之前,请勿运行 reset_lgw.sh。该复位脚本会切换 GPIO 引脚,导致模块断电重启并引发 USB 断开连接。STM32 MCU 会在内部自行处理 SX1302 的复位。

SPI

验证设备识别

bash
ls /dev/ttyACM*
udevadm info /dev/ttyACM0 | grep -E "ID_VENDOR|ID_MODEL"

预期输出包括:

bash
E: ID_MODEL=STM32_Virtual_ComPort
E: ID_VENDOR=STMicroelectronics

TX 测试命令

bash
cd ~/sx1302_hal/libloragw
sudo ./test_loragw_hal_tx \
  -u \
  -d /dev/ttyACM0 \
  -r 1250 -m LORA -f 867.1 -s 12 -b 125 \
  -n 1000 -z 100 --dig 3 --pa 0 --pwid 13

预期输出

text
Opening USB communication interface
INFO: Configuring TTY
INFO: Connect to MCU
INFO: Concentrator MCU version is V01.00.00
INFO: MCU status: sys_time:197172 temperature:37.2oC
Note: chip version is 0x10 (v1.0)
TX done
TX done
...

image50.png

HaLow WiFi 模块配置与测试指南

HaLow WiFi 需要一个设备树覆盖层,以暴露 MM6108 芯片所需的 SPI 总线与 GPIO 配置。

将覆盖层添加到 Armbian 环境配置中:

bash
echo "overlays=recomputer-rk3576-devkit-halow-wifi" | sudo tee -a /boot/armbianEnv.txt

重启前先验证文件内容:

bash
tail -2 /boot/armbianEnv.txt

预期输出:

image51.png

重启以应用覆盖层:

bash
sudo reboot

重启后,确认驱动已加载且接口已出现:

bash
dmesg | grep -i morse | grep -E "found|Loaded|initialized|MAC"

预期输出:

text
morse_spi spi3.1: Morse Micro SPI device found, chip ID=0x0306
morse_spi spi3.1: Loaded firmware from morse/mm6108.bin, size 459124, crc32 0x51d355b9
morse_spi spi3.1: Loaded BCF from morse/bcf_default.bin, size 1251, crc32 0x941b2a82
morse_spi spi3.1: Firmware initialized
morse_spi spi3.1: Firmware Manifest MAC: 90:03:71:52:9d:8e

morse-hostapd 和 morse-wpa_supplicant 这两个二进制文件内部会调用 morse_cli,但实际安装的可执行文件名为 morsectrl,因此需要创建一个符号链接。

bash
sudo ln -s /usr/bin/morsectrl /usr/local/bin/morse_cli

该操作只需执行一次。

检查接口:

bash
ip link show | grep -E "wlan0|wlan1|morse0"

AP 模式 创建配置文件:

bash
sudo nano /etc/morse-hostapd.conf

最小可用配置:

text
interface=wlan0
driver=nl80211
ssid=HaLow_Test
country_code=AU          # Change to your region
hw_mode=a
channel=42               # AU channel, see table below
op_class=69
beacon_int=100
dtim_period=2
ieee80211ah=1
s1g_prim_chwidth=1
s1g_prim_1mhz_chan_index=0
s1g_capab=[SHORT-GI-ALL]
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ctrl_interface=/var/run/hostapd

关闭接口并启动 AP:

bash
sudo ip link set wlan0 down
sudo morse-hostapd /etc/morse-hostapd.conf -B

预期输出(成功):

text
s1g mapped ht channel 159
Full Channel Information
    Operating Frequency: 923000 kHz
    Operating BW: 2 MHz
wlan0: interface state COUNTRY_UPDATE->ENABLED
wlan0: AP-ENABLED

注意: Unable to set RAW 警告并非致命错误,它的出现是因为已安装的驱动版本不支持 RAW(Restricted Access Window,受限访问窗口)。AP 仍会正常启动。

检查 AP 状态:

bash
sudo morse-hostapd_cli -i wlan0 status
sudo morse-hostapd_cli -i wlan0 all_sta   # list connected clients

Station 模式 创建配置文件:

bash
sudo nano /etc/morse-wpa_supplicant.conf

最小配置:

text
ctrl_interface=/var/run/wpa_supplicant
country=AU

network={
    ssid="HaLow_Test"
    psk="12345678"
    key_mgmt=WPA-PSK
}

连接:

bash
sudo ip link set wlan0 down
sudo morse-wpa_supplicant -i wlan0 -c /etc/morse-wpa_supplicant.conf -D nl80211 -B
sudo dhclient wlan0

检查连接状态:

bash
sudo morse-wpa_cli -i wlan0 status
ip addr show wlan0

以太网 RJ45

主板配备两个独立的千兆以太网(RJ45)端口。双网口设计非常适合构建工业边缘网关、实现物理网络隔离(内网/外网),或配置复杂的网络路由。

image52.png

端口定义与功能:

  • 1x 标准千兆以太网(GbE):支持 10/100/1000 Mbps 自协商以太网连接。
  • 1x 支持 PoE 的千兆以太网(GbE with PoE PD):除标准千兆网络功能外,该端口还支持 **PoE PD(受电设备)**协议。

注意: 作为 PoE 受电设备(PD),该 RK3576 主板可以直接通过网线从 PoE 交换机(PSE)获取供电,无需额外配备 DC 电源适配器。

注意:

PoE 模块要求: PoE 受电功能并未直接内置于底板上,需要额外单独购买 PoE 扩展模块。如未安装该模块,该端口仅能作为标准千兆以太网端口使用。

PD 与 PSE 说明: 请注意,本设备的角色是 PoE 受电设备(PD),不支持 PoE 供电输出(PSE),即无法为 PoE IP 摄像头等外部设备供电。

系统网络配置: 在 Armbian OS 中,这两个物理端口通常被枚举为 eth0eth1。建议使用标准的 Linux NetworkManager 工具(通过 nmtuinmcli)或 systemd-networkd 来配置静态 IP 地址、网络桥接或链路聚合(bonding)。

DSI

主板配备一个 **4-lane MIPI DSI(22 针)**显示接口,专为连接高分辨率嵌入式 LCD 或工业触摸屏而设计。

接口特性

  • 高带宽传输:采用 4-lane 物理链路设计,相比传统 2-lane 接口具有显著更高的数据吞吐能力,可流畅驱动 1080P 甚至 2K 分辨率的高清显示屏。
  • 物理接口形态:采用 22 针 0.5mm 间距的 FPC(柔性印刷电路)连接器,带有翻盖锁定机构。
  • 树莓派生态兼容性:该接口在物理上向下兼容,支持直接连接标准树莓派 DSI 屏幕,大幅降低了开发者采购配件的成本与难度。

DSI 配置与测试指南

在 reComputer-RK3576 上,MIPI DSI 接口通过**设备树覆盖层(DTBO)**进行管理。用户需要根据所连接的显示外设,手动加载相应的覆盖层文件。 打开终端并编辑 Armbian 环境配置文件:

bash
sudo nano /boot/armbianEnv.txt

在文件末尾添加以下行,以指定 DSI 屏幕的覆盖层:

text
overlays=recomputer-rk3576-devkit-raspi-7inch-touchscreen

保存并退出(在 nano 中按 Ctrl + O,再按 Enter 保存,然后按 Ctrl + X 退出)。 更新软件包列表,并确保安装所需的多媒体与显示插件:

bash
sudo apt-get update
sudo apt install v4l-utils -y
sudo apt-get install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-x -y

重启系统以应用更改:

bash
sudo reboot

重启后,验证系统是否已成功初始化图形桌面环境:

bash
echo $XDG_SESSION_TYPE

注意:

如果输出为 x11wayland,说明 DSI 显示屏驱动正常,并已进入图形界面。

FPC 排线方向: 插入 FPC 排线时,请严格注意金属触点的朝向,触点必须朝向连接器内部的接触针脚。反向插入可能导致短路或屏幕无法点亮。插入后请确保翻盖锁扣已牢固扣紧。

驱动与设备树: MIPI 屏幕并非"即插即用"。连接显示屏后,你必须在 Armbian OS 中应用相应的设备树覆盖层(例如使用 armbian-add-overlay)或修改 /boot 中的 DTB 文件,以启用对应的面板驱动和背光控制节点。

触控支持: 该 22 针接口通常集成了用于触控反馈的 I2C 信号引脚。如果你使用的是 MIPI 触摸屏,请确保操作系统中已同时加载显示驱动和 I2C 触控 IC 驱动(例如 GT911)。

CSI

主板配备两个独立的 **4-lane MIPI CSI(22 针)**摄像头接口。凭借 RK3576 强大的 ISP(图像信号处理器)与内置 NPU,双 CSI 设计非常适合构建立体视觉系统、机器视觉检测工位,或直接为边缘 AI 模型推理提供高帧率视频流。

接口特性

  • 双 4-Lane 架构:提供两个物理端口(CSI_0CSI_1),每个端口均配备完整的 4-lane 数据通道,可同时处理两路高分辨率或高帧率的工业相机模块。
  • 物理接口形态:采用 22 针 0.5mm 间距的 FPC 连接器。
  • 树莓派生态兼容性:该 22 针连接器在物理引脚定义上基本兼容,支持直接连接标准树莓派 CSI 摄像头(例如基于 IMX219 / IMX477 传感器的官方或第三方模块),方便开发者快速验证视觉算法。

注意:

兼容性与选型: 强烈建议使用经过 Seeed Studio 官方验证的相机模块。使用未经验证或非标准的相机,可能需要开发者自行移植 Linux V4L2(Video for Linux 2)驱动。

线缆连接规范: 请务必留意 FPC 排线金属触点的朝向。此外,在工业部署或机器人框架集成过程中,请注意 MIPI 信号对电磁干扰(EMI)非常敏感,建议将相机排线长度控制在 30 cm(12 英寸)以内。

多相机并发采集: 在 Linux 中,两路相机通常被枚举为 /dev/video0/dev/video1。如果你的 AI 应用或多媒体框架(如 GStreamer 或 OpenCV)需要同时采集两路视频流,请确保合理分配内存带宽,并使用硬件加速插件以获得最佳性能。

CSI 配置与测试指南

本节将指导你同时启用双 MIPI CSI 摄像头(以树莓派 Camera V3 为例)。 编辑环境配置文件:

bash
sudo nano /boot/armbianEnv.txt

在文件末尾添加以下行,为 CAM0 和 CAM1 同时启用 V3 相机驱动:

text
overlays=recomputer-rk3576-devkit-cam0-rpi-v3 recomputer-rk3576-devkit-cam1-rpi-v3

注意:多个覆盖层之间必须用单个空格分隔。 保存文件并重启设备:

bash
sudo reboot

重启后,使用 v4l-utils 工具链验证并测试相机状态。 列出可用的相机设备与节点:

bash
v4l2-ctl --list-devices

查看指定相机(如 /dev/video22)所支持的像素格式与分辨率:

bash
v4l2-ctl --list-formats-ext --device=/dev/video22

相机帧率基准测试:测试特定分辨率与像素格式(例如 3280x2464 MJPG)下的流传输性能:

bash
v4l2-ctl -d /dev/video22 --set-fmt-video=width=3280,height=2464,pixelformat='MJPG' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=3280,height=2464 --stream-count=500

安装 GStreamer 命令行工具:

bash
sudo apt install gstreamer1.0-tools -y

运行以下管线以预览实时相机画面(请将 device=/dev/video11 替换为通过 v4l2-ctl --list-devices 获取到的实际视频节点):

bash
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3280,height=2464

HDMI

主板配备一个标准的 HDMI(Type-A)端口,主要用于连接外部显示器、电视或工业控制屏幕,提供高清同步的音视频输出。

image57.png

接口特性

  • 超高清分辨率:凭借 RK3576 强大的多媒体处理能力,该接口支持高达 4K 的超高清视频输出,非常适合渲染清晰的 GUI 仪表盘或多路监控视频画面。
  • 音视频同步:HDMI 端口可同时传输视频与数字音频信号。如果所连接的显示器内置扬声器,系统音频将直接通过 HDMI 连接播放,无需额外的 3.5mm 音频线。
  • 多屏显示支持:该 HDMI 端口可与板载的 Type-C(DP 1.4)及 MIPI DSI 接口协同工作。开发者可以在 Linux 操作系统中配置最多三块屏幕的镜像显示或扩展桌面模式。

注意:

线缆标准: 为确保稳定性并避免 4K 分辨率下出现屏幕闪烁,请务必使用符合 HDMI 2.0 或更高规格的优质线缆。

EDID 与分辨率自动检测: 操作系统(如 Armbian / Ubuntu)会在启动时自动读取显示器的 EDID 信息,以应用最佳分辨率。如果遇到"无信号"问题,可以通过 SSH 登录设备,并使用 xrandr 命令调试显示输出状态。

无头模式操作: 如果你将设备部署为纯粹的边缘计算节点、不连接物理显示器,操作系统可能会暂停桌面 UI 渲染以节省资源。如果在无头模式下仍需要 VNC 远程桌面访问,建议在该端口上插入一个"HDMI 欺骗头(显示模拟器)"。