1. 课程导论:内核编译、设备树与SPI驱动的关系概述

1.1 为什么需要理解这三者的关系?

在嵌入式Linux开发中,内核编译、设备树(Device Tree)与SPI驱动构成了从硬件初始化到外设通信的完整链路。三者并非孤立存在,而是层层递进、相互依赖的有机整体:

  • 内核编译决定了系统支持哪些硬件平台、文件系统类型以及驱动框架。
  • 设备树将硬件描述从内核源码中解耦,以结构化数据告知内核“板子上有什么、接在哪里”。
  • SPI驱动则在内核SPI子系统框架下,利用设备树提供的资源信息完成具体外设的读写控制。

只有同时掌握这三者,才能在实际项目中独立完成从板级适配到外设驱动的全流程开发。

核心观点: 内核编译是“骨架”,设备树是“地图”,SPI驱动是“执行器”。三者协同工作,缺一不可。

1.2 三者的分层协作关系

下图展示了从内核启动到SPI外设访问的完整数据流与依赖关系:

内核编译 · 设备树 · SPI驱动 协作关系图 内核编译 配置 · 编译 · 镜像生成 设备树 (DT) 硬件描述 · 资源映射 SPI子系统 核心层 · 控制器 · 设备驱动 加载DTB 解析节点 Kconfig / Makefile 选择SPI驱动框架 dts / dtsi 文件 SPI控制器 & 外设节点 spi_driver 注册 probe · 数据传输 最终目标:SPI外设正常工作 温度传感器 · 显示屏 · ADC · 射频模块

1.3 学习目标

完成本章及后续课程后,你将具备以下能力:

序号 目标 对应技能
1 独立配置并编译嵌入式Linux内核 Kconfig 配置、交叉编译、镜像烧写
2 编写与修改设备树文件 dts 语法、节点绑定、资源映射
3 移植SPI控制器驱动 SPI 核心层接口、控制器注册、DMA/中断
4 编写SPI外设驱动 spi_device 注册、数据传输、用户态接口
5 调试与验证SPI通信 spidev 工具、逻辑分析仪、内核日志

1.4 前置知识要求

为了顺利学习本课程,建议你具备以下基础:

  • C语言编程基础:能够阅读和编写内核模块代码。
  • Linux基本操作:熟悉命令行、文件系统、编译工具链的使用。
  • 嵌入式硬件常识:了解GPIO、中断、时钟、SPI总线协议的基本概念。
  • 版本管理工具:至少会使用 Git 进行源码管理。
提示: 如果你对SPI协议本身不太熟悉,建议先花30分钟复习SPI的四线制(SCLK、MOSI、MISO、CS)和全双工通信原理,这对后续驱动编写至关重要。

1.5 课程内容概览

本课程共30章,按以下模块组织:

模块 章节范围 核心内容
基础篇 第1-5章 内核编译流程、设备树语法、SPI子系统架构
设备树实战 第6-12章 控制器节点、外设节点、中断与GPIO绑定
SPI驱动开发 第13-22章 控制器驱动、设备驱动、DMA传输、用户态接口
调试与优化 第23-27章 调试工具、性能分析、电源管理、安全机制
综合项目 第28-30章 完整案例:SPI温度传感器 + 显示屏驱动

1.6 开发环境准备

在开始内核编译之前,请确保你的开发环境满足以下要求:

  • 主机系统:Ubuntu 20.04/22.04 LTS 或 Debian 11/12(推荐)。
  • 交叉编译工具链:arm-linux-gnueabihf- 或 aarch64-linux-gnu-,版本 gcc 9+。
  • 内核源码:Linux 5.10 LTS 或 6.1 LTS(课程示例基于 5.10)。
  • 目标板:支持设备树的 ARM/ARM64 开发板(如 STM32MP157、i.MX6ULL、Raspberry Pi 3/4)。
注意: 不同内核版本之间的设备树绑定和SPI子系统API可能存在差异。本课程以 Linux 5.10 LTS 为基准,如果你使用其他版本,请留意内核文档中的变更说明。

1.7 本章小结