16 KiB
16 KiB
01-Linux内核与驱动开发
一、可学习的内容
RK3568 是 Rockchip 的 SoC,官方提供了完整的驱动参考文档。以下按外设模块列出资料位置和可学习的方向。
1.1 常规外设驱动(GPIO / SPI / UART / I2C / PWM / CAN)
| 模块 | 文档位置 | 可学内容 |
|---|---|---|
| CAN | Common/CAN/ (2 份 PDF) | RK3568 CAN 控制器寄存器配置、ip link 对应的底层 ioctl 实现、FD 模式启用 |
| SPI | Common/SPI/ (2 份 PDF) | Rockchip SPI 主控制器架构、DMA 传输模式、设备树 spi-max-frequency 配置 |
| UART | Common/UART/ (3 份 PDF) | 串口 DMA 收发、流控 (RTS/CTS)、波特率自动检测 |
| I2C | Common/I2C/ (2 份 PDF) | I2C 主机模式、时钟拉伸、设备树 i2c-scl-rising-time-ns |
| PWM | Common/PWM/ (2 份 PDF) | PWM 输出、捕获输入、设备树 pwms 属性 |
| Pin-Ctrl | Common/Pin-Ctrl/ (2 份 PDF) | GPIO 引脚复用配置 (pinctrl)、驱动强度、施密特触发 |
学习路线:
- 先读 CAN 文档(你项目中直接用到)
- 再读 SPI/UART/I2C(嵌入式外设三大件,每个驱动模式几乎一样:
platform_driver → probe → 注册字符设备/cdev → file_operations → read/write/ioctl) - Pin-Ctrl 是理解"为什么
ip link set can0 up会失败"的关键——CAN 引脚可能被其他功能占用
1.2 高速外设(PCIe / USB / GMAC)
| 模块 | 文档位置 | 可学内容 |
|---|---|---|
| PCIe | Common/PCIe/ (4 份 PDF) | PCIe RC/EP 模式、MSI 中断、DMA 数据传输 |
| USB | Common/USB/ (15 份 PDF) | USB 3.0/2.0 Host/Device 模式、Type-C 切换、OTG |
| GMAC | Common/GMAC/ (5 份 PDF) | 千兆以太网 MAC 控制器、RGMII 时序约束、1588 PTP |
1.3 多媒体与加速(VPU / NPU / GPU / Camera / Display)
| 模块 | 文档位置 | 可学内容 |
|---|---|---|
| DISPLAY | Common/DISPLAY/ (18 份 PDF) | HDMI/LVDS/MIPI DSI 输出、多屏同显/异显、图层合成 |
| CAMERA | Common/CAMERA/ (3 份 PDF) | MIPI CSI/DVP 摄像头接口、ISP 图像处理流水线 |
| NPU | Common/NPU/ (3 份 PDF) | RK3568 NPU 架构、RKNN 模型部署、YOLOv5 推理 |
1.4 存储与文件系统(MMC / NVM / FS / DDR)
| 模块 | 文档位置 | 可学内容 |
|---|---|---|
| MMC | Common/MMC/ (2 份 PDF) | eMMC/SD 卡驱动、HS200/HS400 高速模式 |
| NVM | Common/NVM/ (9 份 PDF) | NAND/NOR Flash、SFTL (闪存转换层) |
| FS | Common/FS/ (1 份 PDF) | Linux 文件系统在 Rockchip 上的适配 |
| DDR | Common/DDR/ (11 份 PDF) | DDR 初始化/训练、频率调节、带宽监控 |
1.5 系统与安全(CLK / PMIC / DEBUG / TRUST)
| 模块 | 文档位置 | 可学内容 |
|---|---|---|
| CLK | Common/CLK/ (3 份 PDF) | 时钟树、PLL 配置、clk_summary 解读 |
| DVFS | Common/DVFS/ (4 份 PDF) | 动态电压频率调节、CPU 调频策略 |
| PMIC | Common/PMIC/ (10 份 PDF) | RK806/RK809 电源管理 IC、上电时序 |
| POWER | Common/POWER/ (2 份 PDF) | 系统休眠/唤醒、低功耗模式 |
| DEBUG | Common/DEBUG/ (4 份 PDF) | JTAG/SWD 调试、crash 工具分析、看门狗 |
| TRUST | Common/TRUST/ (6 份 PDF) | ATF (ARM Trusted Firmware)、OPTEE 安全 OS、安全启动 |
| UBOOT | Common/UBOOT/ (7 份 PDF) | U-Boot 在 RK3568 上的引导流程、FIT Image |
二、Linux 应用层文档
路径: [6-开发参考资料\Rockchip官方参考文档\Linux\](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/)
├── [ApplicationNote/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/ApplicationNote/) (19 份 PDF) ← 最实用!
│ → Rockchip平台Linux应用开发笔记
│ → 涵盖: 启动流程、GPIO/sysfs、LED、按键、RTC、WDT、I2C设备、SPI设备等
├── [Camera/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/Camera/) (6 份 PDF) → V4L2 摄像头框架
├── [Graphics/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/Graphics/) (4 份 PDF) → DRM/KMS 显示框架
├── [Multimedia/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/Multimedia/) (14 份 PDF) → GStreamer/FFmpeg 多媒体
├── [Profile/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/Profile/) (5 份 PDF) → 性能分析 (perf、ftrace)
├── [Recovery/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/Recovery/) (6 份 PDF) → OTA 升级、恢复出厂
├── [Security/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/Security/) (4 份 PDF) → dm-verity、SELinux
└── [Wifibt/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/Wifibt/) (6 份 PDF) → WiFi/BT 驱动
ApplicationNote 是最值得读的——它就是"我该用什么 API 操作 GPIO/I2C/UART"的答案。
三、用户手册中的驱动相关文档
以下在 [TL3568-EVM\3-用户手册](../TL3568-EVM(Buildroot-2018.02)_V1.8/3-%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/) 下:
| 文件名 | 内容 |
|---|---|
| 2-2-Linux应用开发手册.pdf | 必读! GPIO/LED/按键/UART/SPI/I2C/CAN 应用层编程指南 |
| 2-3-Linux-RT系统测试手册.pdf | Preempt-RT 内核编译 + Cyclictest 延迟测试 |
| 2-9-1-基于Linux + RT-Thread、Baremetal的AMP开发案例.pdf | AMP 多核异构详解 |
| 2-10-Docker容器部署方法说明.pdf | 在 RK3568 上跑 Docker |
| 2-12-ISP图像处理开发案例.pdf | ISP 图像调试 |
| 2-13-NPU开发案例.pdf | NPU 模型部署 |
| 2-18-GDB程序调试方法说明.pdf | GDB/GDB Server 远程调试 |
四、驱动开发学习建议
如果你要写一个 Linux 新驱动
标准流程(以写一个 I2C 温度传感器驱动为例):
1. 读 [Common/I2C/](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Common/I2C/) 文档 → 了解 RK3568 I2C 控制器的硬件特性
2. 读 [ApplicationNote](../TL3568-EVM(Buildroot-2018.02)_V1.8/6-%E5%BC%80%E5%8F%91%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99/Rockchip%E5%AE%98%E6%96%B9%E5%8F%82%E8%80%83%E6%96%87%E6%A1%A3/Linux/ApplicationNote/) → 了解 Linux 用户态怎么用 /dev/i2c-* 或 sysfs
3. 写 DTS 节点 → 在设备树中描述传感器挂在哪条 I2C 总线、地址多少
4. 写 platform_driver → probe() 中 i2c_new_client_device() 注册设备
5. 注册到 hwmon/sysfs → 温度值暴露到 /sys/class/hwmon/
6. 编译 -> insmod -> dmesg 验证
关键工具链:
dmesg | grep <name>— 看 probe 是否成功cat /sys/kernel/debug/pinctrl/*/pinmux-pins | grep <function>— 检查引脚复用cat /sys/kernel/debug/clk/clk_summary— 检查时钟是否正确devmem <addr>— 直接读寄存器(最后手段)
五、可直接使用的 Demo 代码
路径: [4-软件资料\Demo\](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/)
base-demos/
├── [can_echo/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/can_echo/) ← CAN 收发回环示例
├── [led_flash/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/led_flash/) ← GPIO 控制
├── [key_demo/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/key_demo/) ← 按键中断
├── [spi_rw/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/spi_rw/) ← SPI 读写
├── [uart_rw/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/uart_rw/) ← UART 收发
├── [devmem_rw/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/devmem_rw/) ← 物理内存读写
├── [lcd_demo/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/lcd_demo/) ← LCD 显示
├── [tcp_udp/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/tcp_udp/) ← 网络编程
├── [igh_ethercat_dc_motor/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/igh_ethercat_dc_motor/) ← IgH EtherCAT 主站 + 电机控制
└── [EcMasterDemoDcMotor/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/base-demos/EcMasterDemoDcMotor/) ← Acontis EtherCAT 主站
linux-rt-demos/
├── [Cyclictest/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/linux-rt-demos/Cyclictest/) ← 实时延迟测试
├── [rt_gpio_ctrl/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/linux-rt-demos/rt_gpio_ctrl/) ← 实时 GPIO 控制 (SCHED_FIFO)
├── [rt_input/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/linux-rt-demos/rt_input/) ← 实时输入处理
└── [rt_spi_rw/](../TL3568-EVM(Buildroot-2018.02)_V1.8/4-%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99/Demo/linux-rt-demos/rt_spi_rw/) ← 实时 SPI 读写