Linux 驱动i2c -- Gsenser(三)

client这个变量之前在i2c-core中看到过很多次了,也不再藏着掖着了,这里就解释一下他的来历。这个来历真是
曲折离奇,记得刚开始找这个client的时候,用source insight3来一层层找func的caller,
因为有的函数有多个caller,不得不多次回溯,终于,在花了将近一天时间,经过无数次的回溯后,
我找到了client的前世今生,理清了他的来龙去脉。

client,顾名思义,意为客户端,是与主控器交互的终端。我们这里的client指的就是由主控器控制的挂上i2c总线的芯片。
那么,从硬件层面上来看,挂上i2c总线就是指i2c slave device的scl和sda,与i2c bus相连,那么软件里面需要做什么呢?
比如,你要遍历bus上的device,总要有地址吧,要有名称吧,还有比如说,这个device有个癖好什么的,这些都需要在软件里面进行添加。
在这里,就那个lis gsensor 芯片而言。他在挂上总线前,必须要显示地在i2c controller上声明这个设备的一些信息并添加到i2c adapter上去。

看到这里可能会有点晕了,一会client 一会controller 一会adapter,名词多了,就容易混乱,
简单介绍一下i2c驱动在linux kernel中的结构:
bus driver and device driver
[]    hardware
()    software

                    [pxa controller] 《--i2c bus--》 [device1] 《--i2c bus--》[device2] 《--i2c bus--》[device3]《--i2c bus--》
                                                 |
                                 (i2c bus driver)                                                    
                                                 |
                                        (i2c core)
            ________________|____________________________
           |                                     |                                                                |
(i2c device driver1)    (i2c device driver1)        (i2c device driver1)       
Note:
1)i2c bus driver is depends on particular platform chip ,eg: s3c2440 ,pxa910.
2)i2c device driver is independent to particular platforms.
i2c驱动是linux driver 中典型了三层设计,
上层i2c-bus,实现不同处理器的i2c controller,将其抽象成i2c adapter。
下层i2c-chip,实现了各个i2c 设备的驱动。
中间是i2c-core,实现i2c-bus 与 i2c-chip的交互。
通过了这样分层的设计,controller和device的驱动都可以单独编写,
可移植性就非常好了。不同的设备,挂到相同的controller上,也不需要修改代码就可以使用。
不同的controller也可以使用相同的设备,也不需要修改代码就能正常使用。

中间层负责将两者结合并进行交互,屏蔽了controller和device的硬件特性,使得上下两层的驱动不因硬件的变化而变化。

你可能感兴趣的:(Linux 驱动i2c -- Gsenser(三))