I2C的注册过程在Linux内核中是一个关键步骤,它涉及到两个主要的驱动模型:Legacy model(传统模式)和Standard driver model(标准驱动模式)。这两种模式在设备注册、通信接口以及用户空间的交互上有所不同。
1. **Legacy model (传统模型)**:
- 驱动者需要手动创建`i2c_client`结构,知道设备的地址,这要求开发者对硬件有深入了解。
- 主要数据结构包括`i2c_driver`,其核心组成部分包括:驱动号(id)、设备类别(class)、与适配器关联和分离的函数,如`attach_adapter`和`detach_adapter`,以及设备的探测、初始化(通过`probe`函数)和分离(`detach_client`)操作。
2. **Standard driver model (标准驱动模型)**:
- 无需手动创建`i2c_client`,只需提供设备的支持列表或地址列表,简化了驱动编写。
- 在这种模式下,驱动者需填写关于支持设备的信息,例如使用内核配置的I2C设备或自定义地址。
- **平台设备和驱动**:
平台设备(`platform_device`)用于向内核注册设备资源,包括硬件相关的特性。平台驱动(`platform_driver`)通过名字与平台设备匹配,当匹配成功后,驱动会得到设备的初始化和使用权限。
- **注册流程**:
- 驱动开发者首先在`i2c_driver`中定义必要的回调函数,然后通过`probe`函数在系统启动时探测并初始化符合条件的设备。
- `attach_adapter`和`detach_adapter`函数分别负责在适配器级别与设备建立和解除连接。
- `register_driver`函数将`i2c_driver`实例注册到内核,使其成为可使用的设备。
- **用户空间接口**:
- 用户空间通过`i2c_dev`接口访问I2C设备,包括`read()`和`write()`基本读写操作,以及更复杂的I2C_RDWR操作。
- SMBus(System Management Bus)扩展了I2C的功能,提供超时和校验机制,以及特定的总线协议。
- **总结**:
Linux I2C子系统提供了灵活且统一的接口,使得设备驱动开发人员能够根据需求选择合适的驱动模型。同时,它还支持高级功能,如SMBus,允许用户空间应用程序进行更高级别的控制和监控。
在编写I2C驱动时,理解这些核心概念和流程至关重要,因为它们直接影响到设备能否被正确识别、初始化和与用户空间通信。通过熟悉这些数据结构和函数,开发者可以有效地实现设备的管理和数据交换。