本文记录 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。

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 input | PowerShell 的 $body 未定义或为空;重新定义 JSON 后再发送。 |
HTTP 500 U+000A (LF) | 用户消息在 JSON 字符串中被手动换行;使用 Ask-LLM 函数传入单个字符串。 |
| 返回内容被 PowerShell 折叠 | 访问 $result.choices[0].message.content,或使用文中的 Ask-LLM 函数。 |