驱动分析
I2C设备驱动框架图:
- 我们先RT-Thread的I2C框架图(这是我自己理解的框架图,如果不对的地方,请指出):
- 上图是我分析的RTT的I2C框架图。主要分为三层,驱动层-核心层-设备层。如果你分析过Linux的I2C框架,它的层次也是这样子。所以你了解了RTT的I2C之后再去看Linux的I2C框架,其实问题不大。
- 驱动层:分为硬件I2C驱动和软件I2C驱动。
- 核心层:
- ①其中bit_ops是RTT为软件I2C提供的中间层,它的作用:为底层模拟I2C驱动提供回调接口,为核心层提供统一I2C通信接口。
- ②而硬件I2C则直接对接核心层,提供统一I2C通信接口。
- ③RTT在核心层上,也像pin驱动那样,封装了一套API(虚线箭头),供用户直接使用。
- ④dev是提供RTT设备驱动框架的统一的API(实现箭头)。
- ⑤注意的是:模拟I2C驱动到核心层,增加了一层中间层。
- 设备层:设备就是杂七杂八的使用I2C的总线的设备。而这些设备可以选择使用RTT驱动框架的API,也可以选择RTT封装好的API。
- 通过上述的描述,可能还没了解的很清晰。下面我根据两种不同方式的驱动,两种不同的API,逐一分析,并且会结合试验来验证。
driver 层:
- RT-Thread的I2C驱动,分为两种类型:硬件I2C和软件I2C。在stm32的BSP中提供了软件I2C的驱动,不过为了全面介绍,硬件I2C的对接,作者也进行简单的对接和实现。
软件I2C:
- 软件I2C的层次图:
- drv_soft_i2c层: 主要进行软件I2C所用到scl引脚,sda引脚初始化。scl引脚和sda引脚的获取电平和设置电平接口和延时函数(udelay)。并对接bit_opt层提供的操作结构体:struct rt_i2c_bit_ops。并通过rt_i2c_bit_add_bus注册,提供给bit_opt层回调。
- struct rt_i2c_bit_ops结构体:
struct rt_i2c_bit_ops
{
void *data;
void (*set_sda)(void *data, rt_int32_t state);
void (*set_scl)(void *data, rt_int32_t state);
rt_int32_t (*get_sda)(void *data);
rt_int32_t (*get_scl)(void *data);
void (*udelay)(rt_uint32_t us);
rt_uint32_t delay_us;
rt_uint32_t timeout;
};
函数指针 |
功能 |
void (*set_sda)(void *data, r |