2、I2C子系统
- :
subsystem | bus | dev | drv |
---|---|---|---|
platform | bus_type | platform_device | platform_driver |
I2C | bus_type | i2c_client | i2c_driver |
办法 | 特点 | 优缺点 |
---|---|---|
把它放在相应的时间节点上IO口拉高/低 | 思路清晰,操作麻烦 | |
配置寄存器 | 操作麻烦,可移植性差 | |
内核密封上述方法,并将其安装成函数接口 | 操作简单,移植性好,初次接触难以理解 |
2.1、I2C总线(/driver/i2c/busses/i2c-nxp.c)
- 功能:
- 实现通信
- 实现设备与驱动的分离(使用platform注册一个系统i2c子实现)
2.2、I2C核心层(/driver/i2c/i2c-core.c)
子系统的核心是管理适配器、设备和驱动。主要实现device和driver注册、匹配、回调和注销。
-
注册了i2c总线,注册了dummy Driver
-
提供了adapter、driver、i2c_board_info等待注册/注销方法
-
提供通信方式(send/recv)
-
-
i2c_transfer()
/* *传输数据 */int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);struct i2c_msg __u16 addr; /* slave address */ __u16 flags; /*写是0,读是1*/#define I2C_M_TEN 0x0010 /*a ten bit chip address*/#define I2C_M_RD 0x0001 /* read data,from slave to master */#define I2C_M_NOSTA 0x4000#define I2C_M_REV_DIR_ADDR 0x2000#define I2C_M_IGNORE_NAK 0x1000#define I2C_M_NO_RD_ACK 0x0800#define I2C_M_RECV_LEN 0x0400 /*length will be first received byte*/ __u16 len; /* msg length */ __u8 *buf; /* pointer to msg data */};
-
利用i2c_transfer只需填充一个i2c_msg即可:
msg[0].addr = addr; /*器件地址*/msg[0].flags = !I2C_M_RD; /*写标记*/msg[0].len = count; /*buf大小*/msg[0].buf = &data; /*一般有两个或多个字节组成,第一个是写的地址,后面是写的数据*/
-
利用i2c_transfer需填充两个i2c_msg:
msg[0].addr = chip_addr; /*器件地址*/msg[0].flags = !I2C_M_RD; /*写标记*/msg[0].len = count; /*buf大小*/msg[0].buf = &addr; /*器件单元地址*/msg[1].addr = chip_addr; /*器件地址*/msg[1].flags = I2C_M_RD; /*读标记*/msg[1].len = count; /*buf大小*/msg[1].buf = &buf; /*读取到的数据*/
-
-
int i2c_master_send(struct i2c_client *client, const char *buf, int count);
int i2c_master_recv(struct i2c_client *client, char *buf, int count);
-
s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)
s32 i2c_sm
-