I2C驱动程序模板
#
I2C驱动程序模板AT24C02
#
1.修改设备树- 放在哪个I2C控制器(总线)下面
- AT24C02的I2C设备地址
- compatible属性:用来寻找驱动程序
修改:arch/arm/boot/dts/100ask_imx6ull-14x14.dts
#
2.编写驱动入口函数与出口函数,注册和注销i2c设备:
当有对应的设备匹配上drv时,系统就会调用probe函数:
在probe函数中,我们记录client结构体,client结构体中有I2C总线(client->adapter)、设备树节点(client->dev.of_node)等信息;然后一样的套路,注册字符设备程序,注册设备节点myi2c。
接着就说file_operations结构体,操作具体硬件,这里是以EEPROM AT24C02为例
读函数:APP发起一次read操作,调用i2c_drv_read,我们没使用偏移量,默认从0地址开始读
- 先给内核数组kern_buf申请空间
- 然后读,分为两步
- 先发送要读的地址0,构造msgs[0]
- 再进行读,构造msgs[1]
- 调用i2c_transfer进行上述两步的传输
- copy_to_user
写操作:
- 先构造内核数组kern_buf,大小为size+1,是因为用第一位(kern_buf[0])表示需要写入的寄存器地址
- 然后,按每8位循环写入AT24C02
- 先从copy_from_user
- 再构造msgs[0],发起一次写操作,把kern_buf写入
- 然后等待硬件完成写入
AT24C02一次不能写入超过8个字节的数据,即一页数据,需要分多次写入;且写一页数据也不是一次写入的,需要等待至少10ms
#
3.编写APPAPP很简单:./i2c_test /dev/myi2c string
表示写入string
./i2c_test /dev/myi2c
表示读取,从地址0
#
4.开发板试验设备树里面有at24c02
系统总线I2C总线下面有设备:
装载驱动程序后,也存在/sys/bus/i2c/drivers/100ask_i2c_drv
驱动程序没有和设备匹配上
请点击左侧菜单(移动端为右下角)选择要查看的所有笔记吧。