注:i2c的注册即为i2c总线:i2c_add_driver() —> probe()
读写数据用ioctl( )
- i2c是站在soc角度开发的
- 每次发送的数据位8bit
- ack:在第9周期soc把sda拉高,从设备把它拉低
- i2c控制器(i2c_adapter):i2c协议的时钟(系统自带),与硬件打交道,有算法发送数据和解析数据 adap->algo->master_xfer( )
- 协议:都用英语沟通
- 总线:都有driver、client,匹配正确后调用probe( )方法.匹配是根据
compatible = “samsung,s5m8767-pmic”,变量的值进行匹配的 - 驱动中的创建与删除
add – del
register – unregister
create – destroy
kzalloc – kfree - 四个重要的结构体
- i2c_driver
- i2c_add_driver()
- i2c_del_driver()
- i2c_client(由i2c_adapter创建)
- i2c_adapter
- i2c_add_adapter()
- i2c_del_adapter()
- i2c_msg
- i2c_master_send()
- i2c_master_recv()
- i2c_driver
- cope_to_user((void *user) msg,buf,count)
1 给寄存器写数据
char buf[2] = {PWR_MGMT_1, 0x0};
i2c_master_send(mpu_dev->client, buf, 2);
2 读寄存器数据
char buf;
//读取某个特定寄存器的地址,然后返回值
int mpu6050_read_reg_byte(struct i2c_client *client, char reg)
{
// 先写寄存器的地址, 然后在读寄存器的值
int ret;
struct i2c_adapter *adapter = client->adapter;
struct i2c_msg msg[2];
char rxbuf[1];
msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].len = 1;
msg[0].buf = ®
msg[1].addr = client->addr;
msg[1].flags = I2C_M_RD;
msg[1].len = 1;
msg[1].buf = buf;
ret = i2c_transfer(adapter, msg, 2);
if(ret < 0)
{
printk("i2c_transfer read error\n");
return ret;
}
return 0;
}