最近因为工作需要涉及到了 I2C 总线。虽然我过去用过 I2c,但看了 Linux kernel 后才发现,一个 layer 能
被做到这样完善。
1.Linux 的 I2C 驱动架
Linux 中 I2C 总线的驱动分为两个部分,总线驱动(BUS)和设备驱动(DEVICE)。其中总线驱动的职责,是
为系统中每个 I2C 总线增加相应的读写方法。但是总线驱动本身并不会进行任何的通讯,它只是存在在那里,等
待设备驱动调用其函数。
设备驱动则是与挂在 I2C 总线上的具体的设备通讯的驱动。通过 I2C 总线驱动提供的函数,设备驱动可以忽略
不同总线控制器的差异,不考虑其实现细节地与硬件设备通讯。
1.1. 总线驱动
在系统开机时,首先装载的是 I2C 总线驱动。一个总线驱动用于支持一条特定的 I2C 总线的读写。一个总线驱
动通常需要两个模块,一个 struct i2c_adapter 和一个 struct i2c_algorithm 来描述:
static struct i2c_adapter pb1550_board_adapter =
{
name: "pb1550 adapter",
id: I2C_HW_AU1550_PSC,
algo: NULL,
algo_data: &pb1550_i2c_info,
inc_use: pb1550_inc_use,
dec_use: pb1550_dec_use,
client_register: pb1550_reg,
client_unregister: pb1550_unreg,
client_count: 0,
};
这个样例挂接了一个叫做“pb1550 adapter”的驱动。但这个模块并未提供读写函数,具体的读写方法由第二个