记得开始做的第一个项目就是一个i2c的sensor,那时候完全没有接触过Linux,连Linux Shell命令都不知道,呵呵。那时候没有人指点,记得当时去问三星的人,被鄙视了一把。汗~,幸好那时候项目的时间是非常的长,所以花了3个月左右的时间把内核中的i2c_dev.c i2c_core.c 看了一遍,把《嵌入式Linux设备驱动详解》i2c看了好多遍。刚看这本书的时候,那个晕啦。后来看多了,有了一些自己的推断,然后在硬件上去证实自己的想法。最后才完全搞明白。i2c是那么的简单被鄙视是应该的啊。呵呵,说了这么多废话。
其实,虽然花了三个月的时间去弄清楚i2c设备驱动,但,我觉得还是很值得的。从它入门,很容易就了解Linux设备驱动的一个主要架构了。
Linux设备一般的层次都同i2c一样,通用的东西做一个中间层,通常叫做core,我觉得有时候它就是去实现一个总线(有些不一定叫做总线,比如说input子系统)。这一层主要是去实现一条总线(虚拟的或实体的),然后在这个总线上会有一些标准的接口,通常是xx_bus_ops,当你要去和具体硬件挂钩的时候,你只需要去填充这个ops,然后register 到这个总线上,这样这个硬件就和总线挂钩上了。i2c驱动中s3c24XX_i2c.c(好像叫这个文件明吧,)实现了具体的硬件传输i2c的方法,然后注册到i2c总线上去。这个是底层。那上层是怎样去调用底层的驱动程序的呐?通常Linux设备驱动都会有一个driver,和device。但在i2c设备中我们只需要driver,就可以操作硬件了,因为在内核驱动中已经为我们实行了一个i2c_dev(dev/i2c-0)这个通用的设备节点。只需要访问它就可以去读写硬件了。当然你操作硬件得对应着硬件的Datasheet上的i2c时序去操作。哦,对了,对这个设备的读还是写,(记得不是很清楚了),是不能成功的应该是写,因为不能设它的slave地址,这个在网上有很详细的说明,逻辑反了。对于repstart 模式需要用ioctl的方式去读写。
呵呵,今天就到这里吧。