首页 > 其他分享 >I2c_Adapter驱动框架讲解与编写-11

I2c_Adapter驱动框架讲解与编写-11

时间:2023-09-24 17:01:15浏览次数:355  
标签:11 I2c adap Adapter xfer Linux I2C adapter i2c

参考资料:

  • 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. 所涉及的函数

  • 分配

    struct i2c_adpater *adap = kzalloc(sizeof(struct i2c_adpater), GFP_KERNEL);
  • 设置

    adap->owner = THIS_MODULE;
    adap->algo = &stm32f7_i2c_algo;
  • 注册:i2c_add_adapter/i2c_add_numbered_adapter

    ret = i2c_add_adapter(adap);          // 不管adap->nr原来是什么,都动态设置adap->nr
    ret = i2c_add_numbered_adapter(adap); // 如果adap->nr == -1 则动态分配nr; 否则使用该nr  
  • 反注册

    i2c_del_adapter(adap);

2. i2c_algorithm示例

  • Linux-5.4中使用GPIO模拟I2C

 

  • Linux-5.4中STM32F157的I2C驱动
    •  

  • Linux-4.9.88中IMX6ULL的I2C驱动

 

3. 编写一个框架程序

3.1 设备树

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

    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函数,它的实现取决于硬件,大概代码如下:

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;
}
 

 

 

标签:11,I2c,adap,Adapter,xfer,Linux,I2C,adapter,i2c
From: https://www.cnblogs.com/liusiluandzhangkun/p/17726212.html

相关文章

  • 20211128李杰《信息安全系统设计与实现》第十章笔记
    一、任务内容自学教材第10章,提交学习笔记(10分) 大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的? ,评分标准如下 1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行......
  • C++11中std::ref()与&
    C++11中std::ref()与&引言最近看到一个多线程代码如下:typedefunsignedlonglongULL;voidaccumulator_function(conststd::vector<int>&v,ULL&acm,unsignedintbeginIndex,unsignedintendIndex){acm=0;for(unsignedinti=beginIndex;......
  • 2023-2024-1 20211211《信息安全系统设计与实现(上)》第10章学习笔记
    内容目录一、程序设计语言与shell脚本(1)一门程序设计语言有哪些必备要素和技能(2)这些要素和技能在shell脚本中如何呈现二、sh脚本三、sh脚本与C程序四、命令行参数五、sh变量六、sh中的引号七、sh命令(1)内置命令(2)linux命令八、sh控制语句(1)if-else-fi(2)if-elif-e......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记3(必做)
    学习笔记3程序设计语言必备要素和技能shell脚本实践过程截图程序设计语言必备要素和技能1.语法和语义:了解语言的基本语法规则和语义,包括如何定义变量、数据类型、运算符、控制结构等。这是编写有效代码的基础。2.数据结构和算法:掌握数据结构(如数组、链表、栈、队列)和基......
  • 《看了受制了》第二十四天,7道题,合计114道题
    2023年9月23日今天周六,尽力做了做,虽然Acwing没能AK。。没读懂题。Acwing5152简单输出题目理解基础语法代码实现#include<iostream>#include<algorithm>#include<unordered_map>#include<cstring>#include<cstdio>#include<vector>#include<queue>#i......
  • 11.变量的作用域
    变量和函数的作用域:'usestrict'functionf(a){vara=1;a=a+1;}a=111111111111111;在Javascript中,var定义变量是有作用域的在函数体中声明,在函数体外是不能用的内部函数可以访问外部函数,反之不行functionf(x){//相当......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第三周学习笔记
     202113252023-2024-1《信息安全系统设计与实现(上)》第三周学习笔记一、任务要求自学教材第10章,提交学习笔记(10分)大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?,评分标准如下1.知识点......
  • CodeForces 1149D Abandoning Roads
    洛谷传送门CF传送门考虑一条\(1\toi\)的路径是否在最小生成树上。称边权为\(a\)的边为轻边,边权为\(b\)的边为重边。轻边若不成环则一定在最小生成树上,因此先把轻边合并,这样形成了若干连通块。那么如果两点在一个连通块,它们只能通过轻边互达。同时,因为是树上路径,所......
  • win11任务栏变成透明的教程
    win11任务栏变成透明的教程其实win11原版的任务栏以纯色为主,并且没有任何的透明效果,让桌面壁纸无法完美展示出来,非常难看,因此我们可以通过第三方软件的方式来将它透明化,下面就一起来看一下具体的教程吧。win11任务栏怎么透明方法一:1、首先右键桌面空白处打开右键菜单,选择“......
  • Centos7.9+Oracle11g 单机文件系统安装注意事项
    数据库软件(上传至/root目录)p13390677_112040_Linux-x86-64_1of7p13390677_112040_Linux-x86-64_2of7其他软件包(上传至/root目录)compat-libstdc++-33-3.2.3-72.el7.x86_64.rpmpdksh-5.2.14-37.el5_8.1.x86_64.rpm安装软件包#安装compat包rpm-ivhcompat-libstdc++-33-3.2.3-72.el7......