I2c驱动框架
应用
(从设备驱动层)
i2c_driver层
(自己编写)
(核心层)
i2c_core层 i2c_bus_type
(i2c_core.c)
(控制器层)
i2c_adapter层
(i2c_xxx.c)
硬件
目录:linux/driver/i2c/
algo/ (i2c-algo-bit.c)
busses/ (原厂)
muxes/ (无用)
<从设备驱动层> i2c-dev.c 自己编写
<核 心 层> i2c-core.c 内核提供
<控 制 器 层> busses/i2c-xxx.c(瑞芯微:i2c-rk3x.c 全志:i2c-sunxi.c) 原厂提供
< 结构体>
struct i2c_msg {
__u16 addr; //从设备地址
__u16 flags; // 类型 (读1写0)
__u16 len; /* msg length */ 数据包个数
__u8 *buf; /* pointer to msg data */ 数据包
};
struct i2c_driver { //描述一个i2c从设备驱动的操作方法
unsigned int class;
/* Standard driver model interfaces */
int (*probe)(struct i2c_client *, const struct i2c_device_id *);
int (*remove)(struct i2c_client *);
struct device_driver driver; //父类
const struct i2c_device_id *id_table; // 用于匹配的id_table(列表)
const unsigned short *address_list;
struct list_head clients;
};
struct i2c_adapter {
const struct i2c_algorithm *algo; /* the algorithm to access the bus */
|
int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);
int nr; //编号
struct device dev; //父类
}
struct i2c_client { //代表i2c 从设备的信息
unsigned short addr; //7bit 从设备地址
char name[I2C_NAME_SIZE]; //用于和i2c driver进行匹配
struct i2c_adapter *adapter; //指向创建自己的适配器(控制器)
struct i2c_driver *driver; // 指针已经匹配成功之后的i2c driver
struct device dev; //父类--用于加入总线
};
<函数>
数据传输接口:i
i2c_master_send(const struct i2c_client * client,const char * buf,int count)
i2c_master_recv(const struct i2c_client * client,char * buf,int count)
↓
i2c_adapter / i2c_msg → i2c_transfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num) //通用
↓
i2c_algorithm → master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);
代码示例:https://www.cnblogs.com/panda-w/p/11118591.html
<代码框架> :
<笔记>
1. i2c driver层:应用交互,知道数据,不知传输
i2c core 层: 维护了一个i2c总线
i2c adapter: 硬件交互,不知数据,只知传输
2. 查看i2c设备信息:ls /sys/bus/i2c/devices/0-0050/(name)
查看i2c驱动名字:/sys/bus/i2c/drivers
3. 每个i2c控制器总线上都可以挂载多个i2c外设
4.每个I2C器件在出厂时都会固化自己的I2C地址的,也有通过硬件引脚选择I2C地址的
5. i2c控制器不用管,引出的引脚与控制器已经连死
6. 宏定义在结构体,说明在结构体中有效
3.