1. 课程导论与项目背景

1.1 Android 内核架构概览

Android 系统基于 Linux 内核构建,但并非直接使用标准 Linux 主线内核,而是经过 Google 与各硬件厂商深度定制与增强的 Android Common Kernel (ACK)。理解 Android 内核架构是开发底层驱动的前提。

从软件栈角度,Android 系统自上而下分为五个关键层次,其中内核层是硬件与上层框架之间的桥梁:

层次 组件/示例 说明
应用层 系统应用、第三方 App Java/Kotlin 编写,通过 Framework API 调用硬件
应用框架层 ActivityManager、InputManager 提供四大组件、系统服务、硬件抽象接口
硬件抽象层 (HAL) Camera HAL、Light HAL、GPIO HAL 将内核驱动接口封装为稳定的用户空间 API
Linux 内核层 GPIO 驱动、I2C 驱动、中断控制器 直接管理硬件资源,提供字符设备、中断、DMA 等机制
硬件层 SoC、传感器、LED、按键 物理芯片与外围设备
关键认知: Android 内核相比标准 Linux 内核增加了 Binder IPC、wakelocks、ashmem、ion 等特有机制,同时保留了完整的 GPIO 子系统、中断子系统和设备树 (Device Tree) 支持。GPIO 驱动开发在 Android 内核中与标准嵌入式 Linux 高度一致,但需要适配 Android 特有的权限模型和 SELinux 策略。

下面通过一张架构图直观展示 Android 内核与 GPIO 驱动在系统中的位置:

Android 系统软件栈与 GPIO 驱动位置 应用层 (App Layer) 系统应用 · 第三方 App · Java/Kotlin 应用框架层 (Framework) ActivityManager · InputManager · System Services 硬件抽象层 (HAL) Camera HAL · Light HAL · GPIO HAL (Stub) Linux 内核层 (Kernel) 进程调度 · 内存管理 · 设备驱动模型 GPIO 子系统 中断子系统 设备树 (DT) 字符设备 硬件层 (Hardware) SoC · GPIO 控制器 · 按键 · LED · 传感器 用户空间 内核空间
学习提示: 本课程聚焦于内核层中的 GPIO 子系统 和 中断子系统。你将学习如何编写一个完整的 GPIO 字符设备驱动,并处理来自硬件引脚的中断响应。这是 Android 设备上按键、传感器、LED 指示等功能的底层基础。

1.2 GPIO 驱动在 Android 系统中的作用

GPIO (General Purpose Input/Output) 是嵌入式系统中最基础、最灵活的硬件接口。在 Android 设备中,GPIO 驱动承担着以下关键角色:

  • 物理按键与开关检测: 音量键、电源键、Home 键等均通过 GPIO 中断实现按下/释放检测。
  • LED 指示灯控制: 充电指示灯、通知灯、摄像头闪光灯等通过 GPIO 输出高低电平控制。
  • 传感器使能与状态读取: 加速度计、陀螺仪等传感器的片选 (CS)、中断引脚、数据就绪引脚通常连接 GPIO。
  • 外设电源管理: 通过 GPIO 控制外设的供电使能 (LDO_EN、PWR_EN),实现省电策略。
  • 调试与测试: 开发阶段通过 GPIO 输出调试波形,或读取引脚电平进行硬件验证。
Android 功能场景 GPIO 角色 典型引脚数 中断需求
电源键 输入,检测下降沿中断 1 必需
音量键 (±) 输入,检测下降沿中断 2 必需
通知 LED 输出,PWM 或高低电平 1~3 (RGB) 无
摄像头闪光灯 输出,高电平使能 1 无
加速度计中断 输入,检测上升沿/电平 1 必需
SD 卡检测 输入,检测电平变化 1 可选
注意: 在 Android 内核中,GPIO 驱动不能直接与用户空间交互。通常需要通过 字符设备接口 (如 /dev/gpiochipX) 或 sysfs (已弃用) 暴露给 HAL 层。本课程将采用 字符设备 + 中断 的方式实现完整的驱动框架。

下面展示 GPIO 驱动在 Android 系统中的数据流与中断响应路径:

GPIO 中断响应数据流 硬件 GPIO 引脚 按键/传感器/外设 GPIO 控制器 寄存器 · 方向 · 电平 中断控制器 (GIC) 中断号 · 触发类型 CPU 中断处理 中断下半部 (Tasklet/Workqueue) 耗时操作 · 数据拷贝 字符设备驱动 (/dev/gpio_int) read/write/ioctl/poll 用户空间 HAL / App 中断响应流程 1. 硬件引脚电平变化 2. GPIO 控制器检测到中断 3. GIC 分发中断给 CPU 4. CPU 执行中断处理函数

1.3 项目目标与预期成果

本课程以一个完整的 Android 内核 GPIO 驱动与中断响应 项目为主线,从零开始构建一个可实际运行的驱动模块。项目目标如下:

目标维度 具体内容 对应章节
驱动开发环境 搭建 Android 内核编译环境,配置交叉编译工具链,理解内核模块编译流程 第 2~3 章
GPIO 基础驱动 编写 GPIO 字符设备驱动,实现引脚方向控制、电平读写、设备节点创建 第 4~7 章
中断响应机制 注册 GPIO 中断处理函数,实现中断上半部/下半部,支持多种触发类型 第 8~12 章
用户空间交互 通过 ioctl、poll、read/write 实现用户空间与驱动的双向通信 第 13~16 章
设备树集成 编写设备树节点,实现驱动与板级硬件信息的解耦 第 17~19 章
调试与优化 使用 printk、ftrace、GPIO 模拟调试,分析中断延迟与性能 第 20~23 章
Android HAL 对接 编写 HAL 模块,将内核驱动能力暴露给 Android Framework 第 24~27 章
项目实战与总结 完成一个完整的按键中断响应项目,输出驱动源码、HAL 层、测试 App 第 28~30 章
预期成果: 完成本课程后,你将获得以下可交付成果:
• 一个完整的 GPIO 字符设备驱动源码,支持输入/输出/中断功能。
• 对应的 设备树绑定文档 与 DTS 节点配置。
• 一个 Android HAL 模块,封装驱动接口供上层调用。
• 一个简单的 Android 测试 App,演示按键中断响应与 LED 控制。
• 掌握 内核调试工具链 的使用方法,能够独立排查驱动问题。

下面展示项目最终成果的模块关系图:

项目最终成果模块关系 内核空间 (Kernel Space) gpio_int_driver.ko 字符设备 + 中断处理 设备树 (DTS) gpio_int 节点配置 GPIO 子系统 · 中断子系统 · 内核框架 用户空间 (User Space) gpio_int.default.so HAL 封装层 GPIO Test App 按键/LED 演示 sysfs / ioctl Android Framework 通过 HAL 调用驱动 App 通过 Android API 间接控制硬件
课程定位: 本课程适合具备 C 语言基础和 Linux 基本操作经验的嵌入式/Android 开发者。你将通过动手实践,深入理解 Android 内核驱动开发的完整流程,从内核模块编写到 HAL 层对接,最终实现一个可用的硬件控制项目。