返回所有文章
快速开始 / TSENGCHEN BLOG

RK3588_RK1828_Pcie_LLM_Quick_Start

08_QuickStart · RK3588_RK1828_Pcie_LLM_Quick_Start

08_QuickStart · 第 5 / 5 篇

保留原笔记正文与技术内容,仅脱敏敏感信息。配图按作者要求保留原样。

本文记录 RK3588 EVB10 通过 PCIe 使用 RK1828 的完整流程。目标是让第一次接触该平台的同学能按顺序完成:识别硬件、加载驱动、下载 RK1828 固件、部署 Qwen3-4B,并通过 Windows 调用模型。

1. 组件关系

Windows PC --ADB--> RK3588 EVB10(PCIe Root Complex) --PCIe Gen2 x1--> RK1828(NPU)
                         |                                      |
                    pcie-rkep.ko                         RK1828 固件
                         |                                      |
                    rknn3_startup ----------------------> rkllm3-server

RK3588 负责 PCIe、内核驱动和运行时代理;RK1828 负责执行 NPU 推理。rknn-smi 显示 RK1828 Online 才表示链路、驱动与固件均正常。

2. SDK 与关键源码位置

内容路径
RK3588 SDK/home/user/workspace/RK3588
RK182X SDK/home/user/workspace/RK182X
EVB10 主设备树RK3588/kernel-6.1/arch/arm64/boot/dts/rockchip/rk3588-evb10.dtsi
EVB10 V10 设备树RK3588/kernel-6.1/arch/arm64/boot/dts/rockchip/rk3588-evb10-v10-linux.dts
RK1828 PCIe 驱动源码RK3588/kernel-6.1/drivers/misc/rockchip/pcie-rkep.c
RK1828 PCIe 驱动模块RK3588/kernel-6.1/drivers/misc/rockchip/pcie-rkep.ko
RK1828 LLM 服务端RK182X/rknn/rknn3-runtime/rkllm3-server/

设备树中重点检查 pcie3x2(pcie@fe160000)是否为 status = "okay"。本板 RK1828 枚举为 PCIe BDF 0001:11:00.0。

3. 编译驱动

在编译服务器执行:

cd /home/user/workspace/RK3588
./build.sh rockchip_rk3588_evb10_v10_defconfig
./build.sh kernel

ls -lh kernel-6.1/drivers/misc/rockchip/pcie-rkep.ko

本次验证已成功生成:Image、rk3588-evb10-v10-linux.dtb、boot.img 以及 pcie-rkep.ko。

将模块复制到 Windows 后推送至板子:

cd C:\platform-tools
.\adb.exe push "D:\drivers\RK3588\pcie-rkep.ko" /tmp/pcie-rkep.ko

4. 安装 RK1828 用户态与固件

Windows 将安装包推送至板子:

.\adb.exe push "D:\drivers\RK3588\rknn3_rk182x_sodimm_installer_arm64.tgz" /tmp/
.\adb.exe shell

板端执行:

cd /tmp
tar xzf rknn3_rk182x_sodimm_installer_arm64.tgz
./install.sh

mkdir -p /usr/lib/modules
cp -f /tmp/pcie-rkep.ko /usr/lib/modules/pcie-rkep.ko
insmod /usr/lib/modules/pcie-rkep.ko
ls -l /dev/pcie-rkep*

期望出现:

/dev/pcie-rkep-0001:11:00.0

首次下载 RK1828 固件:

killall rknn3_transfer_proxy 2>/dev/null
/bin/rknn3_startup start
rknn-smi -v
rknn-smi info

重启 RK3588 后模块通常不会自动加载,重复执行:

insmod /usr/lib/modules/pcie-rkep.ko
/bin/rknn3_startup start

5. 关键日志如何判断

PCIe 与硬件链路

lspci -Dnn
lspci -vv -s 0001:11:00.0 | grep -E 'LnkCap:|LnkSta:'
dmesg | grep -Ei 'pcie|link up|link down|aer|rkep|rk182'

正常现象:

0001:11:00.0 Processing accelerators: Rockchip Device [1d87:182a]
rk-pcie fe160000.pcie: PCIe Gen.2 x1 link up
LnkSta: Speed 5GT/s, Width x1

解释:RK1828 被识别,且链路以 PCIe Gen2 x1 工作。其他未接设备的 PCIe 控制器报 PCIe Link Fail 通常不影响 RK1828,只要 fe160000 和 0001:11:00.0 正常即可。

驱动加载

dmesg | grep -i pcie-rkep
ls -l /dev/pcie-rkep*

正常日志:

pcie-rkep 0001:11:00.0: did=182a
pcie-rkep 0001:11:00.0: func_ver=30300
pcie-rkep 0001:11:00.0: gen2x1

若没有 /dev/pcie-rkep-*,先确认模块与内核版本匹配,再执行 insmod /usr/lib/modules/pcie-rkep.ko。

固件下载

成功日志:

Downloading bootloader OK
Running ddr code...OK
Write subsoc_os... (100%)
Write node2_os... (100%)
Write node4_os... (100%)
Downloading firmware OK

Device boot state: 0xffffffff / Device is not in maskrom mode or loader mode 表示 RK1828 没有处于可下载状态。先检查 rknn-smi info:若已是 Online,无需重复下载;若未 Online,重启/重新上电 RK3588,加载驱动后立即运行 rknn3_startup start。

6. LLM:部署 Qwen3-4B

板端模型目录:/LLM/Qwen3-4B。模型文件应齐全:

Qwen3-4B.rknn
Qwen3-4B.weight
Qwen3-4B.tokenizer.gguf
Qwen3-4B.embed.bin

先确保 RK1828 在线:

rknn-smi info

在板端启动 OpenAI 兼容服务:

cd /LLM/Qwen3-4B

rkllm3-server \
  -m Qwen3-4B.rknn \
  --weight Qwen3-4B.weight \
  --vocab Qwen3-4B.tokenizer.gguf \
  --embed Qwen3-4B.embed.bin \
  --host 0.0.0.0 --port 8080 \
  -c 768 --n_predict 512 \
  --top-k 1 --top-p 0.8 --temp 0.8

出现以下日志即服务已就绪:

main: server is listening on http://0.0.0.0:8080 - starting the main loop
srv update_slots: all slots are idle

all slots are idle 是正常的等待请求状态,不是错误。

7. Windows 发送 LLM 消息

保持板端服务运行,Windows 创建 ADB 动态端口转发:

cd C:\platform-tools
.\adb.exe forward tcp:0 tcp:8080

命令输出的数字为本机端口,例如 56828。下面将 56828 替换为实际输出值。

为了避免 PowerShell 引号/换行导致 JSON 解析失败,定义一次短函数:

function Ask-LLM {
  param([string]$Text)

  $body = @{
    messages = @(@{ role = "user"; content = $Text })
    max_tokens = 256
  } | ConvertTo-Json -Depth 4 -Compress

  $result = Invoke-RestMethod `
    -Uri "http://127.0.0.1:56828/v1/chat/completions" `
    -Method Post `
    -ContentType "application/json" `
    -Body $body `
    -TimeoutSec 180

  $result.choices[0].message.content
}

调用示例:

Ask-LLM "PCIe是什么?"
Ask-LLM "用三句话解释RK1828的用途。"

运行期间查看 NPU:

.\adb.exe shell "rknn-smi info"

本次 Qwen3-4B 已成功返回 OpenAI 格式响应,生成速度约 84 token/s。

Pasted image 20260715103758

8. 常见问题

现象原因与处理
Windows 提示 rknn-smi、insmod 不识别这些是板端 Linux 命令;先执行 .\adb.exe shell,或使用 .\adb.exe shell "命令"。
adb: no devices/emulators found检查 USB、ADB 调试与 adb devices,设备恢复后重新推送。
adb forward 固定端口无法绑定Windows 端口被占用;使用 .\adb.exe forward tcp:0 tcp:8080 让 ADB 自动选端口。
HTTP 500 empty inputPowerShell 的 $body 未定义或为空;重新定义 JSON 后再发送。
HTTP 500 U+000A (LF)用户消息在 JSON 字符串中被手动换行;使用 Ask-LLM 函数传入单个字符串。
返回内容被 PowerShell 折叠访问 $result.choices[0].message.content,或使用文中的 Ask-LLM 函数。
08_QuickStart · 文档目录
上一篇RK3576_test1_FPGA_DSMC_Quick_Start