三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

RK3568 Linux开发避坑指南:从编译依赖到DDR不稳,我踩过的那些坑

RK3568 Linux开发避坑指南:从编译依赖到DDR不稳,我踩过的那些坑

RK3568 Linux开发实战避坑手册:一位工程师的血泪经验总结

第一次拿到RK3568开发板时,我天真地以为凭借多年嵌入式开发经验,移植Linux系统不过是按部就班的流程。然而现实给了我一记响亮的耳光——从Ubuntu依赖包冲突到DDR神秘崩溃,每个环节都暗藏杀机。本文将分享那些让我熬了无数个通宵才解决的典型问题,这些在官方文档中从未明确警示的"坑",恰恰是项目能否顺利推进的关键转折点。

1. 开发环境搭建:那些官方没告诉你的细节

在Ubuntu 18.04上搭建编译环境看似简单,实则暗藏玄机。官方文档中sudo apt-get install那行命令,我原封不动执行后却遭遇了令人崩溃的依赖冲突。经过反复试验,发现必须按特定顺序安装才能避免问题:

# 正确的依赖安装顺序(关键!) sudo apt update sudo apt install -y libssl-dev liblz4-tool sudo apt install -y gcc g++ make sudo apt install -y device-tree-compiler python-pip

注意:Ubuntu 18.04默认的Python版本可能导致pyelftools安装失败,需先执行sudo apt install python-pyelftools=0.24-1锁定版本

更棘手的是SDK解压问题。当看到官方提供的cat x* | tar xz命令时,我没想到这个简单的操作会成为第一个拦路虎。实际使用时发现:

  • 必须使用root权限解压(尽管文档未提及)
  • 磁盘剩余空间需至少50GB(远超出SDK本身大小)
  • 解压中途可能报错,需要检查文件完整性

2. 编译过程中的"死亡陷阱"

执行./build.sh all时,那个突然弹出的电源域配置界面让所有新手都会心头一紧。我曾在三个不同项目中犯过同样的错误——直接关闭窗口导致配置错误。正确的处理流程应该是:

  1. 提前准备好原理图中电源域对应表
  2. 对照rk3568-evb.dtsi中的默认配置
  3. 在图形界面中逐项核对以下关键参数:
电源域默认电压实际需求对应寄存器
pmuio23.3V3.3V0xFE0200A0
vccio13.3V1.8V0xFE0200A4
vccio33.3V3.3V0xFE0200AC

另一个致命错误是盲目选择默认板级配置。有次为了节省时间直接选用evb配置,结果导致:

  • 内存时序不匹配(DDR4 vs LPDDR4)
  • GPIO复用冲突
  • 电源管理异常

血泪教训:即使使用官方开发板,也建议新建自定义配置:

# BoardConfig-rk3568-custom.mk 关键修改项 export RK_KERNEL_DTS=rk3568-custom export RK_KERNEL_DEFCONFIG=custom_linux_defconfig export RK_DDR_FREQ=1560

3. 调试串口修改:系统不启动的元凶

修改调试串口看似简单,实则需要对三个子系统同步修改:

  1. DDR初始化阶段(ddrbin_param.txt):

    uart id=4 # 对应硬件连接的UART4 uart iomux=1 # 必须与硬件引脚复用一致
  2. U-Boot阶段(rk3568-u-boot.dtsi):

    chosen { stdout-path = &uart4; u-boot,spl-boot-order = /*...*/; };
  3. Kernel阶段(rk3568-custom.dts):

    chosen { bootargs = "earlycon=uart8250,mmio32,0xfe680000"; }; fiq-debugger { rockchip,serial-id = <4>; };

我曾因遗漏U-Boot配置导致系统在DDR初始化后"沉默",花费两天才定位到问题。建议修改后使用以下验证流程:

  1. 用示波器检查UART4_TX引脚是否有波形
  2. 确认波特率设置为1500000(RK3568默认值)
  3. 检查硬件流控是否意外使能

4. DDR不稳定:最棘手的系统级问题

当系统随机崩溃且无任何日志输出时,DDR问题往往是罪魁祸首。通过Rockchip内部手册《DDR问题排查指南》,我总结出以下实战排错步骤:

现象诊断

  • 系统运行压力测试时随机崩溃
  • 高低温环境下故障率显著升高
  • 更换内存芯片后问题依旧

解决方案

  1. 降低运行频率(在ddrbin_param.txt中修改):

    lp4_freq=1000 # 从1560MHz降频到1000MHz
  2. 调整时序参数(需硬件工程师配合):

    // kernel/arch/arm64/boot/dts/rockchip/rk3568-dram-timing.dtsi dram-timing { sr_idle = <0x18>; pd_idle = <0x20>; ddr3_drv = <0x28>; };
  3. 电源噪声优化:

    • 在PMIC输出端增加22μF钽电容
    • 检查DDR_VDDQ电压纹波(应<50mV)

终极方案:使用Rockchip提供的DDR测试工具(需申请license):

./ddr_test -t lp4 -f 1000 -v 1.2 -m 8192

测试通过后,建议在系统中持续监控DDR状态:

# 实时查看DCR错误计数 cat /sys/kernel/debug/ddr_monitor/dcr_count

5. 系统定制化中的隐藏关卡

构建自定义Debian根文件系统时,环境变量设置是个隐形炸弹。有次在执行./build.sh debian后得到无法启动的系统,原因是:

# 错误示例:变量设置后立即编译 export RK_ROOTFS_SYSTEM=debian ./build.sh debian # 正确做法:先执行envsetup.sh source build/envsetup.sh export RK_ROOTFS_SYSTEM=debian lunch rk3568_custom ./build.sh debian

另一个常见问题是固件打包失败,通常是由于:

  • rockdev目录权限问题(需sudo执行)
  • 分区表未更新(修改parameter.txt后需重新生成)
  • 镜像大小超出限制(检查loader和resource.img)

6. 必备调试工具链

工欲善其事,必先利其器。这些工具让我节省了至少50%的调试时间:

  1. Rockchip专用工具

    • RKDevTool(v2.84以上版本)
    • DDR测试工具(需向FAE申请)
    • FlashTool(量产烧录)
  2. 第三方利器

    # 串口调试神器 sudo apt install picocom picocom -b 1500000 /dev/ttyUSB0 # 内存泄漏检测 valgrind --tool=memcheck ./test_app
  3. 自制调试脚本

    # 自动抓取内核日志 import serial ser = serial.Serial('/dev/ttyUSB0', 1500000) while True: print(ser.readline().decode('utf-8'))

7. 来自实战的九条黄金法则

  1. 任何修改前先备份原始配置(我吃过十几次亏)
  2. 电源域配置要三人复核(硬件、软件、PCB工程师)
  3. 串口修改必须"三件套"同步(DDR init/U-Boot/Kernel)
  4. 遇到随机崩溃先怀疑DDR(概率超过70%)
  5. 官方SDK更新后要完整编译(不要增量编译)
  6. 关键操作前拍摄硬件状态(避免插错跳线帽)
  7. 保留每个可启动的固件版本(方便回退)
  8. 使用版本控制管理设备树(git是救命稻草)
  9. 与社区保持沟通(Rockchip论坛有很多未公开的秘籍)

最后分享一个真实案例:某次量产前发现1%的设备会在高温下死机,最终发现是DDR供电走线过长导致。这个教训让我明白——RK3568开发中,硬件与软件的边界比想象中更模糊。

← 返回列表