第1章:RK平台概述
大家好,我是老周。做RK平台开发快十年了,从最早的RK29xx一路跟到现在的RK3588。今天咱们开始这门课,第一件事就是把RK平台的家底摸清楚。你想想看,做驱动移植和调试,连芯片家族和SDK架构都不熟,那后面遇到问题根本无从下手。
1.1 RK芯片家族:从RK33xx到RK35xx
瑞芯微的芯片线其实很清晰。我个人习惯把它们分成两大阵营:RK33xx系列和RK35xx系列。前者主打性价比和低功耗,后者主打高性能和AI算力。
| 系列 | 代表型号 | CPU架构 | 典型应用 |
|---|---|---|---|
| RK33xx | RK3328、RK3368、RK3399 | Cortex-A53/A72 大小核 | 智能音箱、NAS、入门平板 |
| RK35xx | RK3568、RK3588、RK3576 | Cortex-A76/A55 大小核 + NPU | 边缘计算、AI盒子、高端平板 |
核心差异点:RK35xx系列普遍集成了NPU(神经网络处理器),算力从0.8TOPS到6TOPS不等。这意味着你在做外设驱动时,可能要同时考虑CPU和NPU对同一外设的访问路径——我在RK3588上调试MIPI CSI摄像头时就踩过这个坑。
1.2 硬件平台特性
RK平台的硬件设计有几个共性,我总结一下:
- 多级电源域:每个外设都有独立的电源域和时钟门控。驱动里没开对时钟,外设就死给你看。
- 复用引脚(MUX):同一个引脚可以配成UART、I2C或GPIO。设备树里配错了,信号就乱套了。
- DMA控制器:大部分高速外设(SDIO、EMMC、USB)都走DMA通道。中断处理不及时,DMA会超时。
注意:RK3399和RK3588的IO电压域不同。RK3399的GPIO bank 0是1.8V,bank 1是3.3V。我曾经有个项目,把3.3V的I2C设备接到了1.8V的bank上,结果通信一直不稳定,查了两天才发现是电平不匹配。
1.3 SDK架构概览
RK官方提供两套SDK:Linux SDK和Android SDK。它们的底层驱动框架基本一致,但上层封装完全不同。
1.3.1 Linux SDK
Linux SDK主要面向嵌入式Linux产品。它的目录结构很清晰:
rk_linux_sdk/
├── kernel/ # Linux内核源码(4.19 / 5.10 / 6.1)
├── u-boot/ # 引导加载程序
├── device/ # 设备树、分区表、配置文件
├── external/ # 第三方库(ffmpeg、opencv等)
├── buildroot/ # 根文件系统构建工具
└── rkbin/ # 闭源固件(DDR初始化、M0协处理器固件)
驱动开发主要工作在kernel/和device/两个目录。设备树文件在device/rockchip/下,按芯片型号分文件夹。我建议你拿到板子后,第一件事就是找到对应的.dts文件,看看外设节点是怎么配的。
1.3.2 Android SDK
Android SDK在Linux SDK基础上增加了Android HAL层和Framework层。驱动开发流程会多一层:
- Kernel驱动:和Linux SDK一样,写字符设备或平台驱动。
- HAL层:用C++封装硬件访问接口,暴露给Framework。
- Framework层:Java写的服务,比如CameraService、SensorService。
我的经验:如果你做Android驱动调试,90%的问题出在HAL层和Kernel层的接口不匹配。比如HAL层期望的ioctl命令码和Kernel驱动里定义的不一致——这种问题日志里不会直接报错,你得用strace抓系统调用才能发现。
1.4 知识体系总览
下面这张图是我自己整理的RK平台外设驱动知识体系。你看一眼,心里就有谱了。
1.5 我的建议
学这门课之前,你最好先确认自己手头有块RK开发板。RK3568或者RK3588都行。没有板子光看代码,效果打五折。我当年学RK3399驱动时,就是一边看SDK代码一边拿逻辑分析仪量波形,量着量着就通了。
嗯,第一章就到这里。记住一句话:RK平台驱动开发,设备树是灵魂,时钟和电源是命脉。后面每一章都会围绕这个核心展开。