《精通Linux设备驱动程序开发》——I2C

来源:互联网 发布:slam算法工作原理 编辑:程序博客网 时间:2024/05/15 05:07

一、I2C/SMBus是什么

  1、I2C的应用

    1)、台式机和笔记本中的串口总线,用英语处理器和一些外围设备之间的接口。

    2)、嵌入式设备。


  2、I2C和SMBus为主-从协议,其通信双方为主机适配器(主控制器)和客户设备(从设备)。


  3、I2C及其子集SMBus均为2线接口。这两根线为时钟线和双向数据线,分别称为SCL和SDA。


  4、I2C和SBMus设备使用7位地址。协议也支持10位地址,但很多设备仅相应7为地址,因此在总线上最多127个设备。由于协议的主从特性,设备地址也称为从地址。



二、I2C核心

  1、I2C核心由主机适配器驱动程序和客户驱动程序可利用的函数和数据结构组成。


  2、除了核心之外,内核的I2C底层设施还包括以下几项:

    1)、I2C主机适配器的设备驱动程序。属于总线驱动程序,通常由适配器驱动程序和算法驱动程序组成。

    2)、I2C设备客户的设备驱动程序。

    3)、I2C-dev,允许在用户模式下实现I2C客户驱动程序。


  3、一般来说我们要实现的是客户驱动程序,而不是适配器和算法驱动程序,因此相比于I2C主机适配器,有多得多的I2C设备。


  4、Linux I2C子系统(P163  图8-2)


  5、I2C核心提供的和SMBus兼容的数据访问函数(P163  表8-1)



三、总线事务(代码清单8-1  I2C总线上的事务)



四、设备实例:EEPROM

  1、初始化

    1)、代码清单8-2:初始化EEPROM驱动程序

    2)、代码清单8-3:打开EEPROM驱动程序


  2、探测设备

    1)、代码清单8-4:探测EEPROM块的存在

    2)、代码清单8-5:同客户关联


  3、检查适配器的功能。

    1)、没和主机适配器的功能都有限。一个适配器可能不支持表8-1中包括的所有命令。客户驱动程序在使用这些命令前必须检查适配器是否对其提供支持。

    2)、I2C核心提供两个能完成此功能的函数:

              i2c_check_functionality()检查某个特定的功能是否被支持。

              I2c_get_funcitionlity返回包含所有被支持功能的掩码。


  4、访问设备

    1)、代码清单8-6:从EEPROM读取数据。


  5、其它函数

    1)、为了支持给内部文件指针赋予新值得lseek()系统调用,需要实现llseek()函数。

    2)、为了验证数据的完整性,EEPROM驱动程序可实现ioctl()函数,用于校准并验证存储的数据的校验和。

    3)、EEPROM中不需要poll()和fsync()方法。

    4)、如果需要将驱动程序编译为一个模块,需要提供exit()方法,以注销设备,并清理客户设备特定的数据结构。



五、设备实例:实时时钟

  1、嵌入式上的I2C RTC。


  2、I2C RTC的寄存器分布。


  3、相关代码。



六、i2c-dev



七、使用LM-Sensors监控硬件

  1、LM-Sensors利用传感器芯片的设备驱动程序来排除故障。


  2、大多数芯片利用I2C/SMBus总线方式向CPU提供硬件监控接口。



八、SPI总线

  1、SPI总线也是串行的主-从接口,集成于很多微控制器内部。


  2、SPI使用四线:SCLK,CS,MOSI,MISO。


  3、典型的SPI客户驱动程序。


  4、SPI设备实例:触摸屏控制器ADS7846。



九、1-wire总线



十、调试

0 0
原创粉丝点击