Skip to main content

BSP 故障排查

总体原则是先确定出错的层级。这个 SDK 分为五层,每一层都有不同的调试方法:

1. Host environment     → setup_build_env.sh --check / ./build.sh check
2. Build → build.sh logs, make info, help <component>
3. Images and flashing → output/image/, upgrade_tool, serial console
4. System boot → serial console at 1500000, init scripts, /var/log
5. Application/runtime → /var/log/Recamera2_developer.log, processes, ports, configuration

1. 通用诊断工具​

命令目的
./build.sh check检查主机构建依赖
./build.sh info打印当前 BoardConfig、所有非空的 RK_* 变量、三个组件 SDK 的 make info 以及电源域检查结果
./build.sh help <component>打印某个组件实际使用的 make 命令和参数,便于手动复现
make -C project/app/<app> V=1为应用构建启用详细输出
make V=1 -C media/samples为媒体构建启用详细输出(非空的 V 会关闭 CMD_DBG=@ 静默模式)
./build.sh DEBUG app使用 -O0 -g 重新构建,并在打包时跳过 strip
./build.sh ASAN app使用 AddressSanitizer 重新构建以排查内存问题
在设备上运行 /bin/sdkinfo确认设备上运行的构建版本和 BoardConfig
在设备上运行 cat /etc/ota_version检查固件版本

build.sh 设置了 trap 'err_handler' ERR;失败时会打印出错的函数和行号。可在日志中搜索 err_handler 或 Error: 以快速定位问题。

2. 主机环境与构建问题​

症状原因解决方案
运行 ./build.sh --help 时打开了板卡选择菜单尚未运行 lunch;脚本会在解析参数前检查 .BoardConfig.mk先运行 ./build.sh lunch,之后 help / --help 才会生效
Not found tool aarch64-rockchip1240-linux-gnu-gcc, please install first !!!工具链目录缺失或不可执行确认 tools/linux/toolchain/aarch64-rockchip1240-linux-gnu/bin/ 存在;如有需要,执行 tools/linux/toolchain/<tc>/env_install_toolchain.sh
*** error: Please Check Configure !!! / build app depend on media libs and header files在 media 构建完成前就开始构建应用先运行 ./build.sh media,并确认 output/out/media_out/{include,lib} 存在
Build rootfs is not yet complete, packaging cannot proceed!未生成 rootfs tar 归档运行 ./build.sh rootfs 并检查 output/out/sysdrv_out/rootfs_glibc_rv1126b.tar
不清楚是哪个应用构建失败project/app/Makefile 使用 $(foreach) 串行构建应用,并在第一个失败处退出使用 make -C project/app/<app> V=1 复现该应用的构建
Rust 应用(recamera_services)生成了 armv7 二进制应用的 Makefile 默认使用 armv7-unknown-linux-gnueabihf运行 make SERVICE_TARGET=aarch64-unknown-linux-gnu
cross 报错或卡住Docker 已停止,或当前用户不在 docker 组中运行 sudo systemctl start docker;注销并重新登录
Node 前端构建失败Node.js 版本低于 18运行 nvm use 18 或使用 setup_build_env.sh 安装的版本
CMake 版本过旧recamera_ipc 需要 CMake ≥3.21使用 setup_build_env.sh 安装的 CMake,并检查 PATH 顺序
与 protobuf 相关的构建错误缺少 libprotobuf-dev / protobuf-compiler运行 sudo apt install libprotobuf-dev protobuf-compiler
切换板卡后出现意外错误旧配置与新配置的输出混在一起运行 ./build.sh clean,然后重新构建
磁盘已满Buildroot、内核和 media 输出体积较大保持至少 20 GB 可用空间(推荐 100 GB);使用 du -sh output sysdrv/source/buildroot 定位占用
以 root 构建一次后出现权限问题构建输出归 root 所有运行 sudo chown -R $USER:$USER . 然后重新构建
由于符号链接缺失导致脚本行为异常通过 Windows 传输了文件重新解压原始 tar 归档;参见 下载与解压

3. 烧录问题​

症状原因解决方案
upgrade_tool ld 未列出设备未进入 Maskrom / Loader 模式;缺少 udev 规则;未使用 sudo 运行安装 88-rockusb.rules,然后运行 udevadm control --reload-rules && udevadm trigger;确认 lsusb 中出现 2207: 设备;使用 sudo
运行 upgrade_tool 时提示 Permission denied解压时丢失了执行权限运行 chmod +x tools/linux/Linux_Upgrade_Tool/upgrade_tool
./rkflash.sh update 没有任何动作脚本中对应分支被注释掉了运行 sudo upgrade_tool uf output/image/update.img
执行 ./rkflash.sh all 后分区行为异常all 不会烧录 env.img手动运行 upgrade_tool di -p output/image/env.img(或使用 parameter.txt)
./build.sh sdcard_upgrade 没有输出Recamera2 板卡配置未定义 RK_SDCARD_UPGRADE_UBOOT_DEFCONFIG;check_config 静默返回在板卡配置中添加所需变量;参见 系统定制(DTS / 内核 / Buildroot / Overlay)
烧录中断后设备变砖Loader 未完全写入强制进入 Maskrom 模式,运行 upgrade_tool ul download.bin,然后重新烧录
Writing 'xxx' failed镜像大小与分区大小不匹配检查 boot.img 是否小于 11 M、rootfs.img 是否小于 3 G

4. 启动问题​

串口控制台是唯一可靠的通道: 1500000 8N1,console=ttyFIQ0。

串口控制台症状诊断解决方案
完全没有输出Loader / DDR 未启动,或串口连接 / 波特率错误确认波特率为 1500000;重新烧录 idblock.img + download.bin;测量串口 TX 信号
出现 U-Boot 后停止内核镜像或 DTB 有问题重新烧录 boot.img;检查 RK_KERNEL_DTS
Kernel panic - not syncing: VFS: Unable to mount root fsrootfs 与 boot 不匹配,或 PARTUUID 发生变化使用同一次构建生成的 boot 和 rootfs;分区变更后重新烧录 env
串口上出现 watchdog 信息并反复重启某个阻塞的进程阻止了 watchdog 刷新(-T 30)停止 S15watchdog 并排查;检查是否有卡死的进程
系统能启动但没有网络udhcpc 脚本或 DNS 优先级问题参见 设备访问与调试 中的网络故障排查章节
时间相差整数小时S20hwclock 使用了 --hctosys --utc,但注释中写 RTC 存储的是本地时间确认 RTC 存储的是 UTC 还是本地时间,并按需调整脚本
无法进入 Linux 但 U-Boot 正常rootfs 损坏使用 sudo ./rkflash.sh rootfs 仅重新烧录 rootfs

通过以下方式检查启动顺序:

# ls /etc/init.d/ /oem/usr/etc/init.d/          # Available startup scripts
# dmesg | head -50 # Early kernel logs
# cat /var/log/Recamera2_developer.log | head # Application logs
# ps w # Processes that actually started

5. 运行时与应用问题​

找不到共享库​

# ldd /userdata/my_app
  • 缺少 librockit.so、librknnrt.so 等 → LD_LIBRARY_PATH 未包含 /oem/usr/lib。登录 shell 会通过 /etc/profile.d/RkEnv.sh 设置该变量;对于非登录环境(init 脚本、cron),需要 source 该文件或显式导出变量。
  • 缺少第三方库 → 该库未包含在 rootfs 中。启用其 Buildroot 包;参见 系统定制(DTS / 内核 / Buildroot / Overlay)。
  • 在链接阶段,你可能还需要 -Wl,-rpath,/oem/usr/lib;参见 选择开发路径。

架构 / ABI 不匹配​

# file /userdata/my_app        # Must be ARM aarch64

Exec format error 表示该二进制是为 x86-64 构建的。GLIBC_2.xx not found 表示主机工具链比目标设备的运行时更新。

视频问题​

症状原因解决方案
示例程序无法打开 VI / 设备节点忙rkipc 已经占用了该设备运行 sh /oem/usr/bin/RkLunch-stop.sh 后重试;完成后恢复该服务
图像全黑或全绿未检测到传感器或缺少 IQ 文件运行 `dmesg
颜色错误或噪声很大IQ 文件与传感器不匹配对比 RK_CAMERA_SENSOR_IQFILES 与实际安装的传感器
无法接收 RTSP 码流go2rtc 未启用外部 554 端口检查 /userdata/config/rkipc.ini 中 [video.0.rtsp] enable,然后重启 S50go2rtc
Web UI 有视频但外部播放器没有go2rtc API 仅绑定到 127.0.0.1使用 :8555 上的 WebRTC,或通过 SSH 转发 1984 端口
/dev/videoN 编号发生变化不同固件版本的设备枚举方式不同在设备上使用 v4l2-ctl --list-devices 检查;不要将编号写死

Rockchip 的视频故障排查指南见 docs/zh/media/Rockchip_Trouble_Shooting_Linux_VENC_CN.pdf。

NPU / AI 问题​

症状原因解决方案
rknn_init 失败模型未针对 rv1126b 转换,或 Toolkit 与 Runtime 版本不匹配使用 target_platform='rv1126b' 重新转换;检查板卡上的 librknnrt.so 版本(内部基线 2.3.2)
推理输出完全错误预处理不匹配(mean/std、RGB/BGR、NCHW/NHWC、resize 策略)检查导出脚本参数,而不是凭猜测
结果不够准确INT8 校准集不具代表性先建立 FP16 基线,然后使用更好的校准集重新量化
OOM / 进程被杀死LLM / VLM 占用内存过多使用 rkllm_benchmark_demo 检查 memory_usage;尝试更小的量化方案
推理速度慢只使用了一个 NPU 核心设置 rknn_set_core_mask(ctx, RKNN_NPU_CORE_0_1)
长时间运行后性能下降热降频检查热状态;参见 docs/zh/bsp/Rockchip_Developer_Guide_Thermal_CN.pdf
VLM 输出乱码或异常视觉特殊 token 不匹配在运行时传入 img_start / img_end / img_content

音频问题​

请参阅音频开发中的问题表。最常见的问题是直接打开 hw:0,0 而不是使用 dsnoop,导致出现 Device or resource busy。

服务与端口​

# netstat -tlnp        # 22 / 7681 / 21 / 8555 / 1984 / 8765 / 554 / 5554
# ps w | grep -E 'rkipc|gmgr|skt2ws|tmir|rcisd|go2rtc|ttyd|notify'
# /etc/init.d/S49notify start|stop
# /oem/usr/etc/init.d/S50go2rtc restart

如果 SSH 拒绝正确的密码,可能是触发了 PAM 锁定(5 次失败 / 300 秒)。状态文件为 /userdata/config/system/login_lock.json;重启即可清除。

如果 ttyd 页面提示用户不被允许,则 ssh-login-whitelist.sh 中的允许列表仅包含 root 和 admin。

如果 FTP 未显示 config 目录,则 vsftpd.conf 中的 hide_file / deny_file 是有意将其隐藏。请改用 SFTP。

日志​

# tail -f /var/log/Recamera2_developer.log    # Human-readable
# tail -n 100 /var/log/Recamera2.log # JSON for programmatic parsing
# dmesg # Kernel logs

端口 8765 上的 WebSocket 实时日志绑定到 127.0.0.1。从主机访问时,请使用 ssh -L 8765:127.0.0.1:8765 root@<IP>。

内存与性能​

内核启用了调试节点;可通过以下命令查看:

# cat /proc/rk_cma/*        2>/dev/null      # CONFIG_RK_CMA_PROCFS
# cat /proc/rk_dmabuf/* 2>/dev/null # CONFIG_RK_DMABUF_PROCFS
# cat /proc/rk_memblock/* 2>/dev/null # CONFIG_RK_MEMBLOCK_PROCFS
# cat /proc/rk_rga/* 2>/dev/null # CONFIG_ROCKCHIP_RGA_PROC_FS
# ls /sys/kernel/debug/ # CONFIG_DEBUG_FS

具体节点名称取决于设备,仍需硬件验证。注意 RK_BOOTARGS_CMA_SIZE="8M" 会设置一个较小的 CMA 区域;如果大块连续内存分配失败,请先检查这一点。

通过 CONFIG_ELF_CORE=y 启用了 coredump。build.sh 中的 __BUILD_ENABLE_COREDUMP_SCRIPT() 可以生成启用脚本。将其与 IMAGE/.../DEBUG_FILES/kernel/vmlinux.tar.bz2 以及交叉 gdb 一起使用来分析 dump。

6. 缺陷报告中应包含的信息​

对于内部报告或 Rockchip 问题(参见 docs/en/Rockchip_User_Guide_Bug_System_EN.pdf),请一次性收集以下信息:

# On the host
./build.sh info > info.txt 2>&1
cat IMAGE/*/build_info.txt

# On the device
/bin/sdkinfo
cat /etc/ota_version
uname -a && cat /proc/cmdline
dmesg > dmesg.txt
cat /var/log/Recamera2_developer.log > app.log
cat /run/board_id.env
netstat -tlnp
ps w

还请附上完整的串口启动日志(1500000 波特率)、复现步骤,以及 IMAGE/..._RELEASE_TEST/ 压缩包的路径。

静态源码发现的问题、其证据、影响和验证状态被收集在源码审查与已知问题中,以将维护审计与运行流程分开。如果你遇到相关行为,请先根据当前 SDK 文件和版本进行核实。

技术支持与产品讨论​

感谢你选择我们的产品!我们将为你提供多种支持,以确保你在使用我们产品时的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...