当前位置: 首页 > news >正文

【IMX6ULL驱动学习】I2C驱动

I2C驱动框架分为两部分:

  • I2C总线驱动:I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。
  • I2C设备驱动:I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。

13.1. I2C总线驱动

总线驱动主要实现I2C总线的初始化和配置,提供I2C总线的访问算法,供I2C设备驱动调用。具体来说就是初始化i2c_adapter结构体变量,然后设置i2c_algorithm中的master_xfer函数。完成以后通过 i2c_add_numbered_adapter i2c_add_adapter 这两个函数向系统注册设置好的 i2c_adapter,

13.2. I2C设备驱动

设备驱动包含两个数据结构:i2c_clienti2c_driver。基于总线-设备-驱动模型,i2c_client描述设备信息,i2c_driver(类似于platform_driver)描述驱动内容。

  1. i2c_client结构体(类似于platform_device
    • i2c_client结构体描述一个I2C设备的信息,一个设备对应一个i2c_client结构体变量
    • i2c_client结构体中包含了一个device结构体变量,这个变量是驱动模型的核心,通过这个变量可以将I2C设备注册到总线上
    • i2c_client结构体中还包含了设备的I2C地址、所属的I2C适配器等信息
    • i2c_client结构体一般由内核自动创建,驱动开发者不需要手动创建
    struct i2c_client {struct device dev;              /* 设备模型核心结构体 */struct i2c_adapter *adapter;    /* 该I2C设备所属的I2C适配器 */const struct i2c_device_id *id_entry; /* 该I2C设备对应的ID表项 */char name[I2C_NAME_SIZE];      /* 设备名称 */unsigned short flags;          /* 设备标志 */unsigned short addr;           /* I2C设备地址 */...
    };
    
  2. i2c_driver结构体(类似于platform_driver
    • i2c_driver结构体描述一个I2C设备驱动的信息,一个驱动对应一个i2c_driver结构体变量
    • i2c_driver结构体中包含了驱动的名字、ID表、设备树匹配表、文件操作函数集、proberemove函数等信息
    • i2c_driver结构体通过i2c_add_driver函数向系统注册
    struct i2c_driver {struct device_driver driver;        /* 设备驱动模型核心结构体 */const struct i2c_device_id *id_table; /* 该驱动支持的I2C设备ID表 */const struct of_device_id *of_match_table; /* 该驱动支持的设备树匹配表 */int (*probe)(struct i2c_client *client, const struct i2c_device_id *id); /* 设备初始化函数 */int (*remove)(struct i2c_client *client); /* 设备卸载函数 */struct file_operations *fops;       /* 文件操作函数集 */...
    };
    
    I2C设备驱动编写核心工作就是构建i2c_driver结构体变量,完成proberemove函数(函数原型已经在i2c_driver中声明),构建文件操作函数集,并通过i2c_add_driver函数向系统注册

13.3. 设备树下I2C设备驱动编写

13.3.1. 添加设备树

在I2C总线驱动下设置设备树,关键是设置compatible属性和reg属性

  • compatible属性用于匹配驱动
  • reg属性用于指定I2C设备的地址
&i2c1 {clock-frequency = <100000>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_i2c1>;status = "okay";ap3216c@1e{compatible = "alientek,ap3216c";my_name = "ap3216c";reg = <0x1e>;};
};

ap3216ccompatible = "alientek,ap3216c"属性用于匹配驱动,reg = <0x1e>属性指定I2C设备的地址为0x1e

13.3.2. 构造i2c_driver结构体变量

  1. 构建设备ID表struct of_device_id
  2. 构建文件操作函数集struct file_operations
  3. 实现proberemove函数
  4. 构建i2c_driver结构体变量
  5. 值得注意的是,i2c_driver中必须确保传统匹配方式ID列表i2c_device_id存在,不然设备树节点与驱动无法匹配,具体而言
    /* 设备树列表 */
    static const struct of_device_id ap3216_dt_match[] = {{ .compatible = "alientek,ap3216c" },{ }, };/* 传统匹配方式ID列表 */static const struct i2c_device_id ap3216c_id[] = {{"alientek,ap3216c", 0},  {}};static struct i2c_driver ap3216_i2c_driver = {.driver = {.owner = THIS_MODULE,.name = "ap3216c",.of_match_table	= ap3216_dt_match,/* 设备树列表 */},.probe = ap3216_i2c_probe,.remove = ap3216_i2c_remove,.id_table = ap3216c_id,/* 传统匹配方式ID列表 */};
    

13.3.3. 创建/注销I2C设备驱动

  1. init函数中调用i2c_add_driver函数注册I2C设备驱动
    int i2c_add_driver(struct i2c_driver *driver)
    // driver:指向i2c_driver结构体变量的指针
    
  2. exit函数中调用i2c_del_driver函数注销I2C设备驱动
http://www.dtcms.com/a/438248.html

相关文章:

  • 基于物联网数据采集的大型应用程序软件架构设计:核心要点、结构内容与链路关系
  • 【连载5】云数据库 MySQL 热点更新功能介绍
  • (四)Webpack、Slot与Vue CLI脚手架
  • 【附源码】个人事务管理系统的设计与实现
  • 基于PCIe(XDMA)的多路(1-32路)信号采集与回放子系统,多路视频、AD、光纤等信号,支持PR over PCIe
  • 【STM32项目开源】基于STM32的智能电子秤
  • 网站建设专用图形库西安网站快速排名提升
  • 红色php企业网站模板下载wordpress slider设置
  • Starting again-02
  • 【IMX6ULL驱动学习】PWM驱动
  • 智能向善” 核心,解析技术发展中的红利与风险平衡
  • 品牌 RWA 化构建白皮书
  • 个人数据泄露有哪些法律与安全风险?
  • 学习Java第二十九天——黑马点评33~36
  • 常见端口安全弱点汇总表
  • 抓取网站访问量小程序登录网址
  • LNMP 环境部署 WordPress
  • 从域名到网站建设完成的流程连云港做网站哪家好
  • 企业后端多节点部署实现大文件分片与断点上传
  • 算法入门:专题攻克主题一---双指针
  • 长春市城建网站网站建设相关问题
  • 设计模式(C++)详解——状态模式(State)(1)
  • 【计算机组成原理】深入浅出ASCII码:从历史起源到现代应用的全方位解析
  • [USACO11NOV] Cow Lineup S(黄)
  • 安卓开发学习
  • 全人源抗体制备的 “动物工厂”:转基因与嵌合小鼠技术如何突破免疫原性瓶颈?
  • 郑州网站建设报价电子商务的网站建设要求步骤
  • 做前端网站用什么软件写代码吗如何链接自己做的网站
  • 高阳网站建设网站头部通用代码
  • Ubuntu中安装Viper炫彩蛇教程(亲测可用)