文章目录
1、简介
Linux中的I2C驱动框架和platform平台设备驱动类似,都是采用的设备驱动分离分层的概念,不过platform平台总线是内核中虚拟出来的,而I2C总线则是SoC里真实存在的。既然都是采用总线的方式,那么在Linux内核中I2C驱动也是被分为两部分:
- I2C总线驱动:也称I2C适配器驱动或I2C控制器驱动,比如IMX6ULL的I2C控制器驱动,就是控制I2C的SCL、SDA引脚电平传输数据的函数封装,这部分已经由SoC原厂做好了,我们直接可以使用;
- I2C设备驱动:这部分就是针对具体的外接设备的驱动,比如MPU6050的驱动。同时,这部分还被分成I2C设备和I2C驱动,前者偏向于描述硬件的信息,后者偏向于通用的软件逻辑,在编写某个I2C设备的驱动时这部分是重点关注。
接下来就来以Freescale i.MX6ULL(内核版本:4.1.15)为例先探究I2C总线驱动与I2C设备驱动的原理,然后再自己写一个简陋的MPU6050驱动。注意,如果只是想快速了解I2C设备的驱动,则可以直接跳到第4小节开始。
2、I2C总线、设备和驱动的结构体定义
这一小节主要是先了解一下总线、设备和驱动被内核抽象成的结构体定义及注册函数,下一小节“I2C总线、