《精通linux设备驱动程序开发》第8章I2C协议 学习笔记
主要内容:
- I2C/SMBus是什么
- I2C核心
- 设备实例:EEPROM
1.I2C/SMBus是什么
I2C(Inter-Intergrated Circuit,内置集成电路)及其子集SMBus(System Management Bus,系统管理总线)均为同步串行接口。
I2C和SMBus为主-从协议,其通信双方为主机适配器(主控制器)和客户设备(从设备)。
2.I2C核心
I2C核心由主机适配器驱动程序和客户驱动程序可利用的函数和数据接口组成。核心中的公共代码减轻了驱动程序开发者的工作量。核心也见解使客户驱动程序独立于主机适配器,核心层的此机制及其好处也可在内核中其他的很多设备驱动程序类中发现。
3.设备实例:EEPROM
3.1初始化
类似其他驱动程序,I2C客户驱动程序也有自己的init()入口点,初始化用于分配数据结构,向I2C核心层注册驱动程序,将sysfs和Linux设备模块联系在一起。
代码片段 打开EEPROM驱动程序:
int eep_open(struct inode *inode, struct file *file) { /* The EEPROM bank to be opened*/ n = MINOR(file->f_dentry->d_inode->i_rdev); file->private_data = (struct ee_bank *)ee_bank_list[n]; /* Initialize the fields in ee_bank_list[n] such as size,slave address, and the current file pointer */ /* ... */ }
3.2 探测设备
I2C客户驱动,在主机控制器驱动和I2C核心的合作下,使某自身对应的设备成为从设备的过程如下:
(1)在初始化过程中,注册probe()方法。
(2)当I2C核心调用表明主机适配器已经存在的客户驱动程序的方法时,还会反过来调用i2c_probe()。
(3)主机控制器在总线上搜索步骤(2)中指定的从设备。
(4)在步骤(3)中,如果主机适配器检测到从设备,I2C核心会调用步骤(2)中在i2c_probe()的第三个参数中指定的attack()。
stay hungry, stay foolish