设备驱动程序接口与开发指南
1. 寻找驱动程序
若尚未找到设备驱动程序,可尝试在线搜索并在相关论坛询问是否有适用于更高版本 Linux 的驱动。若找到,可考虑更新板级支持包(BSP)以使用更高版本的内核。但有时这并不实际,此时可能需将驱动程序移植到当前内核。若内核版本相近,移植相对容易;若版本间隔超过 12 至 18 个月,可能需重写部分驱动代码以与当前内核集成。若所有方法均失败,则需自行编写缺失的内核驱动程序。
2. 用户空间的设备驱动程序
在编写设备驱动程序前,需考虑是否真有必要。许多常见设备有通用驱动程序,可直接从用户空间与硬件交互,无需编写内核代码。用户空间代码更易编写和调试,且不受 GPL 限制。这些驱动程序主要分为两类:
- 通过 sysfs 文件控制的设备,如 GPIO 和 LED。
- 通过设备节点提供通用接口的串行总线,如 I2C。
3. GPIO
通用输入输出(GPIO)是最简单的数字接口,可直接访问单个硬件引脚,引脚有高、低两种状态。多数情况下,可将 GPIO 引脚配置为输入或输出,还可通过软件操作一组 GPIO 引脚创建更高级的接口,如 I2C 或 SPI,此技术称为位操作(bit banging)。但软件循环的速度和精度有限,通常难以实现优于毫秒级的定时器精度,除非配置实时内核。GPIO 常见应用场景包括读取按钮和数字传感器、控制 LED、电机和继电器。
大多数片上系统(SoC)有大量 GPIO 位,通常每 32 位一组存于 GPIO 寄存器中。片上 GPIO 位通过多路复用器(pin mux)连接到芯片封装上的 GPIO 引脚。此外,电源管理芯片和专用 GPIO 扩