动手写一个i2c设备驱动(5)

struct i2c_driver
--170-->探测函数,匹配成功之后执行,会将匹配到的i2c_client对象传入,完成申请资源,初始化,提供接口等工作。
--171-->移除函数,设备消失时会调用,驱动模块被rmmod时也会先被调用,完成和probe相反的操作。
--174-->这三个方法都是电源管理相关的接口
--190-->表明这是一个设备的驱动类,和platform一样,用于匹配设备树的of_match_table域在这里
--191-->用于使用平台文件或模块编写设备信息时进行匹配使用,相当于platform_driver中的id_table。
--197-->用于将所有i2c_driver联系到一起的节点

那么接下来就是填充对象了,我们这里使用的是设备树匹配,所以of_match_table被填充如下。

struct of_device_id mpu6050_dt_match[] = { {.compatible = "invensense,mpu6050"}, {}, }; struct i2c_device_id mpu6050_dev_match[] = {};

然后将这两个成员填充到i2c_driver对象如下,这个阶段我们可以在mpu6050_probe中只填写prink来测试我们的驱动方法对象是否有问题。

struct i2c_driver mpu6050_driver = { .probe = mpu6050_probe, .remove = mpu6050_remove, .driver = { .owner = THIS_MODULE, .name = "mpu6050drv", .of_match_table = of_match_ptr(mpu6050_dt_match), }, .id_table = mpu6050_dev_match, };

使用下述API注册/注销驱动对象,这个宏和module_platform_driver一样是内核提供给我们一个用于快速实现注册注销接口的快捷方式,写了这句以及模块授权,我们就可以静待各种信息被打印了

module_i2c_driver(mpu6050_driver); i2c_msg

如果测试通过,我们就要研究如何找到adapter以及如何通过找到的adapter将数据发送出去。没错,我说的i2c_msg

68 struct i2c_msg { 69 __u16 addr; /* slave address */ 70 __u16 flags; 71 #define I2C_M_TEN 0x0010 /* this is a ten bit chip address */ 72 #define I2C_M_RD 0x0001 /* read data, from slave to master */ 73 #define I2C_M_STOP 0x8000 /* if I2C_FUNC_PROTOCOL_MANGLING */ 74 #define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_NOSTART */ 75 #define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */ 76 #define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */ 77 #define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */ 78 #define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */ 79 __u16 len; /* msg length */ 80 __u8 *buf; /* pointer to msg data */ 81 };

struct i2c_msg
--69-->从机地址
--70-->操作标志,I2C_M_RD为读(0),写为1
--79-->有效数据长度
--80-->装载有效数据的头指针

我们知道,i2c总线上传入数据是以字节为单位的,而我们的通信类别分为两种:读and写,对于写,通常按照下面的时序

MaterSI2CAddr+WriteBit InternalRegisterAddr DATA DATA P
Slave           ACK       ACK       ACK       ACK      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/95a26e3a7df27d38ce2c2e697be33148.html