Linux I2C驱动框架介绍

    从分层来看我们分为5层,从上到下,应用层,I2C驱动层,I2C核心层,I2C控制层(也叫适配层吧),硬件层,如下图,driver层是为应用层服务的提供fop,还有为硬件层提供数据,发送指令等,怎么发送的是核心层去完成,核心层维护的有两个链表,一个是I2C bus,一个是device链表,device链表中会注册一个I2C client是一个设备,表示从设备信息,这个client中包含有:名字,从设备地址;然后i2c的driver中也有名字,两个要保持一致。匹配动作是由i2c bus完成的。然后driver是通过client设备信息找到对应硬件完成操作。

Linux I2C驱动框架介绍_第1张图片

    另外这个client的从设备信息不是我们自己创建的是,我们创建的是驱动层的信息;实际上在控制层还有个i2c还有个adapter有专门的一个函数master_sfen专门控制我们的i2c控制器,来控制产生时序,i2c协议等,是由adapter创建的client,创建好了以后会加入到链表中,匹配好后会在driver中调用probe方法获取client,然后driver会把数据封装,调用i2c_transfer(ICS_MSG数据包)接口,在借助i2c client找到adpter,然后就找到adpter的传输算法,算法中继续控制master_sfen来控制我们的控制完成数据传输。

总结:

    这个框架的一个思想是在driver里面只负责提供数据,然后通过层层关系找到控制层的adapter将数据传输到硬件层。这样一个框架的作用是,不管是什么从设备,我们只需要在driver里面提供数据,具体怎么传递到硬件的不用管。我们在写i2c驱动时的一个大概步骤是:

1)    原厂已经将实现丢到内核,我们做的事在内核配置i2c-core.c,配置i2c-s3c2410.c(不同版本通过平台总线柔和了)

2)   由于不同从设备是不知道从设备具体地址的,所以我们做的事提供设备树dtbs,如果不是走的设备树方式,那么需要提供 结构体i2c_board_info一般是在machine_xxx.c文件中

3)   最后在driver里面实现驱动,数据封装,调用接口。


你可能感兴趣的:(I2C协议,Linux,驱动)