第一种实现方法:编写字符设备驱动,通过访问I2C控制器,来实现对I2C外设的访问。
第二种实现方法:编写字符设备驱动,通过GPIO模拟I2C时序,来实现对I2C设备的访问。
第三种实现方法:利用内核已有的I2C驱动框架,来实现I2C的驱动程序,完成对外设的访问。
第三种I2C驱动框架实现:
包含两类驱动:
1.I2C总线驱动
管理和驱动的设备对象就是I2C硬件控制器,这个驱动仅仅只负责I2C控制器发起时序,
至于传输的数据有I2C设备驱动来提供(I2C设备地址,读写的地址和数据)
总线驱动一般都是官方提供写好,只需要配置,编译即可
make menuconfig
Device Driver->
I2C Supports->
I2C hardware bus supports
S3C2410 I2C Driver
2.I2C设备驱动
管理和驱动的设备对象就是I2C的外设,这个驱动仅仅只负责获取数据,关心数据的具体含义,
它知道这个数据的意义(设备地址,地址,数据),最终这些数据信息都会丢给I2C总线驱动
来实现硬件的传输。所以I2C设备驱动不用操作数据如何通过I2C总线传输。传输靠I2C总线驱动
来做,但传输的数据来自I2C设备驱动。
由于外设的各类很多,所以这类驱动要自己来写。
linux内核I2C驱动框架分层:
app:open, read, write...//eeprom lm77, adp8860
unsigned char data =
0x20;
unsigned char addr =
0x10;
buf[0] = data;
buf[1] = addr;
write(fd, buf, 2;)
------------------------------------------------
I2C设备驱动
eeprom_open, eeprom_read,
eeprom_write:
关心应用程序操作的数据含义: addr就是个地址