前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux系统驱动之I2C_Adapter驱动框架讲解与编写

Linux系统驱动之I2C_Adapter驱动框架讲解与编写

作者头像
韦东山
发布2021-12-08 10:53:32
1.8K0
发布2021-12-08 10:53:32
举报
文章被收录于专栏:韦东山嵌入式

资料下载

coding无法使用浏览器打开,必须用git工具下载:

代码语言:javascript
复制
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git

视频观看

百问网驱动大全

I2C_Adapter驱动框架讲解与编写

参考资料:

  • Linux内核文档:
    • Linux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt
    • Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yaml
  • Linux内核驱动程序:使用GPIO模拟I2C
    • Linux-4.9.88\drivers\i2c\busses\i2c-gpio.c
    • Linux-5.4\drivers\i2c\busses\i2c-gpio.c
  • Linux内核真正的I2C控制器驱动程序
    • IMX6ULL: Linux-4.9.88\drivers\i2c\busses\i2c-imx.c
    • STM32MP157: Linux-5.4\drivers\i2c\busses\i2c-stm32f7.c
  • 本节视频的代码在GIT仓库里
    • IMX6ULL:doc_and_source_for_drivers\IMX6ULL\source\04_I2C\05_i2c_adapter_framework
    • STM32MP157:doc_and_source_for_drivers\STM32MP157\source\A7\04_I2C\05_i2c_adapter_framework

1. 回顾

1.1 2C驱动程序的层次
在这里插入图片描述
在这里插入图片描述
1.2 I2C总线-设备-驱动模型
在这里插入图片描述
在这里插入图片描述

2. I2C_Adapter驱动框架

2.1 核心的结构体
1. i2c_adapter
在这里插入图片描述
在这里插入图片描述
2. i2c_algorithm
在这里插入图片描述
在这里插入图片描述
  • master_xfer:这是最重要的函数,它实现了一般的I2C传输,用来传输一个或多个i2c_msg
  • master_xfer_atomic:
    • 可选的函数,功能跟master_xfer一样,在atomic context环境下使用
    • 比如在关机之前、所有中断都关闭的情况下,用来访问电源管理芯片
  • smbus_xfer:实现SMBus传输,如果不提供这个函数,SMBus传输会使用master_xfer来模拟
  • smbus_xfer_atomic:
    • 可选的函数,功能跟smbus_xfer一样,在atomic context环境下使用
    • 比如在关机之前、所有中断都关闭的情况下,用来访问电源管理芯片
  • functionality:返回所支持的flags:各类I2C_FUNC_*
  • reg_slave/unreg_slave:
    • 有些I2C Adapter也可工作与Slave模式,用来实现或模拟一个I2C设备
  • reg_slave就是让把一个i2c_client注册到I2C Adapter,换句话说就是让这个I2C Adapter模拟该i2c_client
    • unreg_slave:反注册
2.2 驱动程序框架

分配、设置、注册一个i2c_adpater结构体:

  • i2c_adpater的核心是i2c_algorithm
  • i2c_algorithm的核心是master_xfer函数
1. 所涉及的函数
2. i2c_algorithm示例
  • Linux-5.4中使用GPIO模拟I2C
在这里插入图片描述
在这里插入图片描述
  • Linux-5.4中STM32F157的I2C驱动
在这里插入图片描述
在这里插入图片描述
  • Linux-4.9.88中IMX6ULL的I2C驱动
在这里插入图片描述
在这里插入图片描述

3. 编写一个框架程序

3.1 设备树

在设备树里构造I2C Bus节点:

代码语言:javascript
复制
	i2c-bus-virtual {
		 compatible = "100ask,i2c-bus-virtual";
	};
3.2 platform_driver

分配、设置、注册platform_driver结构体。

核心是probe函数,它要做这几件事:

  • 根据设备树信息设置硬件(引脚、时钟等)
  • 分配、设置、注册i2c_apdater
3.3 i2c_apdater

i2c_apdater核心是master_xfer函数,它的实现取决于硬件,大概代码如下:

代码语言:javascript
复制
static int xxx_master_xfer(struct i2c_adapter *adapter,
						struct i2c_msg *msgs, int num)
{
    for (i = 0; i < num; i++) {
        struct i2c_msg *msg = msgs[i];
        {
        	// 1. 发出S信号: 设置寄存器发出S信号
            CTLREG = S;
            
            // 2. 根据Flag发出设备地址和R/W位: 把这8位数据写入某个DATAREG即可发出信号
            //    判断是否有ACK
            
            if (!ACK)
                return ERROR;
            else {
	            // 3. read / write
	            if (read) {
                    STATUS = XXX; // 这决定读到一个数据后是否发出ACK给对方
                    val = DATAREG; // 这会发起I2C读操作
                } else if(write) {
                    DATAREG = val; // 这会发起I2C写操作
                    val = STATUS;  // 判断是否收到ACK
                    if (!ACK)
                        return ERROR;
                }                
            }
            // 4. 发出P信号
            CTLREG = P;
        }
    }
    
    return i;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 视频观看
  • I2C_Adapter驱动框架讲解与编写
    • 1. 回顾
      • 1.1 2C驱动程序的层次
      • 1.2 I2C总线-设备-驱动模型
    • 2. I2C_Adapter驱动框架
      • 2.1 核心的结构体
      • 2.2 驱动程序框架
      • 1. 所涉及的函数
      • 2. i2c_algorithm示例
    • 3. 编写一个框架程序
      • 3.1 设备树
      • 3.2 platform_driver
      • 3.3 i2c_apdater
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档