• Linux I2C子系统【2】-i2c-adapter 创建过程



    前言

    1. 参考文章
      《具体芯片的I2C_Adapter驱动分析》
    2. i2c子系统分析了从启动内核如何创建i2c_adapter的过程

    一、I2C控制器内部结构

    I2C单独控制的话,占用CPU的时间非常高,这样不利于系统高效运转,所以一般的芯片里面都会有I2C控制器。

    1.1 通用的简化结构

    在这里插入图片描述
    I2C控制器里面一般会有很多的寄存器。比如:

    • controller_register可以设置I2C控制器的频率
    • tx_registerrx_register控制数据的传输
    • status_register控制I2C的状态
    • int_register控制I2C的中断
      当CPU需要发送数据时,只需要写给tx_register。后面的I2C控制器会自动帮忙做好,在SDA上发送数据。
      当程序写入tx_register后,就不用管了。直到数据发送结束,会产生一个发送完成的中断

    1.2 IMX6ULL的I2C控制器内部结构

    在这里插入图片描述

    • I2C_IFDR(频率寄存器)
    • I2C_I2CR(控制寄存器
    • I2C_I2SR(状态寄存器)
    • I2C_I2DR(数据I/O寄存器)
    • I2C_IADR(地址寄存器

    二、分析代码

    2.1 设备树

    1. imx6ull:arch/arm/boot/dts/imx6ull.dtsi

      i2c1: i2c@02221a0000 {
      	#address-cells = <1>;
      	#size-cells = <0>;
      	compatible = <"fsl,imx6ul-i2c", "fsl,imx21-i2c";
      	reg = <0x021a0000 0x40000>;
      	interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
      	clocks = <&clks IMX6UL_CLK_I2C1>;
      	status = "disabled";		//在100ask_imx6ull-14x14.dts 把它改成了"okay"
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    2.2 驱动程序分析

    2.2.1 Linux下I2C驱动程序的体系结构

    Linux下的i2c框架,分为了3个子模块
    在这里插入图片描述

    1. I2C核心
      I2C核心主要是i2c-core.c,里面涉及的adapter都是和i2c核心进行耦合的,设备和驱动不需要关心adapter部分。
    2. I2C总线驱动
      I2C总线驱动是对I2C硬件体系结构中适配器(i2c-adapter)端的实现,这部分主要是产生I2C协议的波形,操作硬件完成开始信号,数据传输,停止信号,设备应答检测等等,还是看上面那个经典的图片,adapter就是往下走的,所以就是操作到平台cpu的部分了。
    3. I2C设备驱动
      I2C设备驱动(i2c-client)是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据

    2.2.2 (IMX6ULL)I2C主机驱动

    I2C 总线驱动重点是 I2C 适配器(也就是 SOC 的 I2C 接口控制器)驱动,这里要用到
    两个重要的数据结构:i2c_adapteri2c_algorithm,Linux 内核将 SOC 的 I2C 适配器(控制器)
    抽象成 i2c_adapteri2c_adapter 结构体定义在 include/linux/i2c.h 文件中。

    498 struct i2c_adapter {
    499 	struct module *owner;
    500	 	unsigned int class; /* classes to allow probing for */
    501 	const struct i2c_algorithm *algo; /* 总线访问算法 */
    502 	void *algo_data;
    503
    504 	/* data fields that are valid for all devices */
    505 	struct rt_mutex bus_lock;
    506
    507 	int timeout; /* in jiffies */
    508 	int retries;
    509 	struct device dev; /* the adapter device */
    510
    511 	int nr;
    512 	char name[48];
    513 	struct completion dev_released;
    514
    515 	struct mutex userspace_clients_lock;
    516 	struct list_head userspace_clients;
    517
    518 	struct i2c_bus_recovery_info *bus_recovery_info;
    519 	const struct i2c_adapter_quirks *quirks;
    520 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    紧接着上篇文章《Linux I2C子系统【1】-I2C驱动分析-设备树创建platform_device》中的“i2c platform_driver主机驱动匹配platform_device 的过程”,.probe = i2c_imx_probe被执行,进入到开始创建i2c_adapter过程中。

    总结

    提示:这里对文章进行总结:

    例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 相关阅读:
    JVM实用参数(一)JVM类型以及编译器模式
    Web应用系统的小安全漏洞及相应的攻击方式
    从平面设计转行软件测试,喜提11K+13薪,回头看看我很幸运
    高效率开发Web安全扫描器之路(一)
    公司面试题总结(六)
    图像篡改数据集整理
    信管知识梳理(三)软件工程相关知识
    【大数据与云计算】实验作业
    KMP中的资源处理(字符串,图片等)
    QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题
  • 原文地址:https://blog.csdn.net/m0_46535940/article/details/126225958