一、Linux的I2C体系结构

  Linux I2C体系结构分为3个组成部分

(1)Linux核心

  I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(algorithm)上层的,与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。

(2)I2C总线驱动

  I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter、I2C适配器的algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数。经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。

(3)I2C设备驱动

  I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在首CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。

  在Linux内核源代码中的drivers目录下包含一个i2c目录,而在i2c目录下又包含如下文件和文件夹:

  • i2c_core.c

  这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口

  • i2c_dev.c

  实现了I2C适配器设备文件的功能,每一个I2C适配器都被分配为一个设备。通过适配器访问设备是的主设备号都为89,次设备号为0~255.应用程序通过“i2c-%d”(i2c-0,i2c-1,i2c-2,...i2c-10,...)文件名并使用文件操作结构open()/write()/read()/ioctl()和close()等来访问这个设备。

  i2c-dev.c并没有针对特定的设备而设计,只是提供了通用read()等接口,应用程序可以借用这些接口访问适配器上的I2C设别的存储空间或寄存器,并控制I2C设别的工作方式。

  • chips文件夹

  这个目录中包含了一些特定的I2C设备驱动。在具体的I2C设别驱动中,调用的都是I2C核心提供的API,因此,这使得具体的I2C设备驱动不依赖于CPU类型和I2C适配器的硬件特性。

  • buses文件夹

  这个文件中包含了一些I2C总线的驱动。如针对S3C2410/S3C2440等处理器的I2C控制器驱动。

  • algos文件夹

  实现了一些I2C总线适配器的algorithm。

  此外,内核中的i2c.h这个头文件对i2c_driver/i2c_client/i2c_adapter和i2c_algotithm这4个数据结构进行了定义。理解这4个数据结构作用有利于后续的理解。

i2c_adapter结构体

struct i2c_adapter {
  struct module *owner;      /* 所属模块 */
  unsigned int id;         /* algorithm的类型,定义于i2c-id.h,以I2C_ALGO_开始 */
  unsinged int class;
  struct i2c_algorithm *algo;   /* 总线通信方法结构体指针 */
  void *algo_data;         /* algorithm 数据 */
  int (*client_register) (struct i2c_client *);  /* client注册时调用 */
  int (*client_unregister) (struct i2c_client *); /* client注销时调用 */
  u8 level;
  struct semphore bus_lock;
  struct semphore clist_lock;
  int timeout;
  int retries;            /* 重试次数 */
  struct device dev;         /* 适配器设备 */
  struct class_device class_dev;  /* 类设备 */
  int nr;
  struct list_head client;
  struct list_head list;
  char name[48];           /* 适配器名称 */
  struct completion dev_released; /* 用于同步 */
};

更多相关文章

  1. [Linux C]重启设备(系统)
  2. Android usb client mass-storage 多存储设备挂载问题解决
  3. Linux之I2C设备总结
  4. Linux2.6内核下键盘输入设备驱动的实现
  5. Linux PCI/PCI-E设备配置空间读取与修改
  6. ListView可复用适配器的封装及性能优化
  7. Android 通过读取本地Arp表获取当前局域网内其他设备信息
  8. 关于利用android-serialport-api实现在安卓设备上进行串口通信,附
  9. 如何在Android设备中创建Web服务器(用于远程访问)

随机推荐

  1. 芋道 Spring Boot Elasticsearch 入门
  2. 我的PMP学习感悟
  3. 芋道 Spring Boot 分库分表入门
  4. 芋道 Spring Boot 多数据源(读写分离)入门
  5. Centos怎么用parted分区超过2TB硬盘
  6. 使用Android模拟器调试linux内核
  7. Find常用语法
  8. 用原生 JavaScript 实现十大 jQuery 函数
  9. 怎样通过读源码提高你的 JavaScript 知识
  10. Mount挂载