Linux下I2C驱动实验:I2C 设备驱动

一.  简介

前面一篇文章学习了 Linux下 I2C 驱动框架与 I2C总线驱动(即I2C控制器驱动),文章如下:

Linux下I2C驱动实验: I2C驱动框架与I2C总线驱动-CSDN博客

Linux 内核也将 I2C 驱动分为两部分:
(1)  I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。
(2)  I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。

本文来学习一下  I2C 设备驱动。

二. Linux下I2C驱动实验:I2C设备驱动

I2C 设备驱动重点关注两个数据结构:i2c_client i2c_driver,i2c_client 就是描述设备信息的,i2c_driver 描述驱动内容,类似于 platform_driver

1. I2C 设备驱动涉及的结构体

(1)i2c_client 结构体

i2c_client 结构体定义在 include/linux/i2c.h 文件中,内容如下:
struct i2c_client {unsigned short flags; /* 标志 */unsigned short addr; /* 芯片地址,7 位,存在低 7 位*/
......char name[I2C_NAME_SIZE]; /* 名字 */struct i2c_adapter *adapter; /* 对应的 I2C 适配器 */struct device dev; /* 设备结构体 */int irq; /* 中断 */struct list_head detected;
......
};
一个设备对应一个 i2c_client ,每检测到一个 I2C 设备就会给这个 I2C 设备分配一个 i2c_client

(2)i2c_driver结构体

i2c_driver 类似 platform_driver,是我们编写 I2C 设备驱动重点要处理的内容,i2c_driver 结构体定义在 include/linux/i2c.h 文件中,内容如下:
struct i2c_driver {unsigned int class;/* Notifies the driver that a new bus has appeared. You should avoid* using this, it will be removed in a near future.*/int (*attach_adapter)(struct i2c_adapter *) __deprecated;/* Standard driver model interfaces */int (*probe)(struct i2c_client *, const struct i2c_device_id *);int (*remove)(struct i2c_client *);/* driver model interfaces that don't relate to enumeration  */void (*shutdown)(struct i2c_client *);/* Alert callback, for example for the SMBus alert protocol.* The format and meaning of the data value depends on the protocol.* For the SMBus alert protocol, there is a single bit of data passed* as the alert response's low bit ("event flag").*/void (*alert)(struct i2c_client *, unsigned int data);/* a ioctl like command that can be used to perform specific functions* with the device.*/int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);struct device_driver driver;const struct i2c_device_id *id_table;/* Device detection callback for automatic device creation */int (*detect)(struct i2c_client *, struct i2c_board_info *);const unsigned short *address_list;struct list_head clients;
};

第 10 行,当 I2C 设备和驱动匹配成功以后, probe 函数就会执行,和 platform 驱动一样。
第 28 行,device_driver 驱动结构体,如果使用设备树的话,需要设置 device_driver 的
of_match_table 成员变量,也就是驱动的兼容(compatible)属性。
第 29 行,id_table 是传统的、未使用设备树的设备匹配 ID 表。

对于我们 I2C 设备驱动编写人来说,重点工作就是构建 i2c_driver。

2. I2C 设备驱动注册与删除

构建完成 i2c_driver 结构体 以后,需要向Linux 内核注册这个 i2c_driver i2c_driver 注册函数为 i2c_register_driver函数 ,此函数原型如下:
int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
函数参数和返回值含义如下:
owner 一般为 THIS_MODULE
driver :要注册的 i2c_driver
返回值: 0 ,成功;负值,失败。

  i2c_add_driver 也常常用于注册 i2c_driver i2c_add_driver 是一个宏,定义如下:
#define i2c_add_driver(driver) \i2c_register_driver(THIS_MODULE, driver)
i2c_add_driver 就是对 i2c_register_driver 做了一个简单的封装,只有一个参数,就是要注册的 i2c_driver

注销 I2C 设备驱动的时候需要将前面注册的 i2c_driver Linux 内核中注销掉,需要用到

i2c_del_driver 函数,此函数原型如下:
void i2c_del_driver(struct i2c_driver *driver)
函数参数和返回值含义如下:
driver :要注销的 i2c_driver
返回值: 无。

三. 总结

i2c_client结构体:表示I2C设备,不需要我们自己创建 i2c_client,我们一般在设备树里面添加具体的I2C芯片,比如 fxls8471,系统在解析设备树的时候,就会知道有这个I2C设备,然后会创建对应的i2c_client。

i2c设备驱动框架:i2c_driver初始化与注册,需要II2C设备驱动编写人员编写的,IIC驱动程序就是初始化i2c_driver,然后向系统注册。注册使用i2c_register_driver、i2c_add_driver,如果注销i2c_driver使用i2c_del_driver。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024水会|全国水科技大会第一版日程正式公布

中华环保联合会、福州大学、上海大学在四川省成都市联合举办“2024全国水科技大会暨技术装备成果展览会”。 大会主题:加快形成新质生产力 增强水业发展新动能 大会亮点:邀请部委、四川省、各市领导,6位院士,100余位行业专家&a…

自动化测试如何管理测试数据

前段时间,知识星球里有同学问到:自动化case越多,测试数据越多,数据的管理成本也越来越高,是否需要一个数据池来专门管理测试数据?这是一个好问题,也是很多测试同学在自动化测试实践中必须面对的…

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】

LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】 题目描述:解题思路一:双向链表,函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。一张图:知识点__slots__ 解题思路二:0解题思路三:0 题目描述&am…

JAVAEE之Spring, Spring Boot 和Spring MVC的关系以及区别

1.Spring, Spring Boot 和Spring MVC的关系以及区别 Spring: 简单来说, Spring 是⼀个开发应⽤框架,什么样的框架呢,有这么⼏个标签:轻量级、⼀ 站式、模块化,其⽬的是⽤于简化企业级应⽤程序开发 Spring的主要功能: 管理对象&am…

园区管理(源码+文档)

园区管理系统(小程序、ios、安卓都可部署) 文件包含内容程序简要说明含有功能项目截图客户端登录页我的退出登录发布详细注意事项公告列表入园记录主页我的资料电梯报修意见反馈客服入园申请注册招商列表 后台管理签到管理公告管理招商管理入园管理反馈报…

git 标签功能操作以及回退

Git 标签功能允许开发者为特定的提交打上标签,以便后续能够方便地引用这些提交。标签通常用于标记重要的版本或里程碑,例如软件发布的版本号。与分支不同,标签指向的是固定的提交,一旦设置,就不能轻易更改。下面是一些…

大数据毕业设计hadoop+spark旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 计算机毕业设计 机器学习 深度学习 知识图谱

基于hive数据仓库的贵州旅游景点数据分析系统的设计与实现 摘 要 随着旅游业的快速发展和数字化转型,旅游数据的收集和分析变得越来越重要。贵州省作为一个拥有丰富旅游资源的地区,旅游数据的分析对于促进旅游业的发展和提升旅游体验具有重要意义。基…

使用vscode写python项目时的一点小问题

一、工作区怎么切换 首先工作区就是文件夹,所以切换新的工作区就是打开新的文件夹。 方法有二: 1)ctrlk ctrlo 或者用2)文件-打开文件夹(文件在左上角第一个位置) 会出现类似的界面: 现在…

什么是Java中的JVM(Java虚拟机)?它如何工作?

Java中的JVM,全称Java Virtual Machine(Java虚拟机),是Java程序的运行环境,也是Java语言的核心和基础。它是一个虚拟的计算机,具有完善的硬体架构,如处理器、堆栈、寄存器等,以及相应…

WPS二次开发系列:如何获取应用签名SHA256值

在申请WPS SDK授权版时候需要开发者提供应用包名和签名,应用包名好说,那如何生成符合WPS要求的应用签名(SHA256)呢,经笔者亲测,有如下两种方式可以实现获取第三方应用签名值(SHA256) 1. 方法一&…

Rust---复合数据类型之元组

目录 元组的使用输出结果 元组的使用 fn main() {// 创建一个元组let my_tuple : (i32, &str, f64) (10, "hello", 3.14);// 打印元组中的元素println!("{:?}", my_tuple);// 访问元组中的元素let first_element my_tuple.0; // 访问第一个元素let…

Dockerfile怎么写及运行启动方法

在Dockerfile中编写Shell脚本代码通常用于定义容器构建过程中的各种操作,如安装软件、设置环境变量、复制文件、运行命令等。下面是一些基本步骤和示例,说明如何在Dockerfile中编写和使用Shell脚本代码:编写Shell脚本首先,创建一个Shell脚本文件,例如setup.sh,并在其中编…

C#/WPF 使用开源Wav2Lip做自己的数字人(无需安装环境)

实现效果 Speaker Wav2Lip概述 2020年,来自印度海德拉巴大学和英国巴斯大学的团队,在ACM MM2020发表了的一篇论文《A Lip Sync Expert Is All You Need for Speech to Lip Generation In The Wild 》,在文章中,他们提出一个叫做Wa…

Unity进阶之路(2)UI Toolkit

UI Toolkit是Unity内置的一个游戏UI解决方案。借鉴了web前端的设计模式。 web前端使用css,html,js。 其中css定义样式 html定义层级 js处理逻辑 UI Toolkit则是使用uss,uxml,C# 如果直接使用Unity提供的可视化UI创建工具创建…

最优算法100例之26-翻转单词顺序

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句…

全自动封箱机的工作原理:科技与效率的完美结合

随着科技的不断发展,越来越多的自动化设备走进了我们的日常生活和工业生产中。其中,全自动封箱机作为物流包装领域的重要一环,凭借其高效、精准的工作性能,正逐渐成为提升生产效率、降低劳动成本的得力助手。星派就来与大家深入探…

Linux实用性脚本 [bash]

Linux实用性脚本 [bash] 1. 列出排名前 5 的CPU/内存占用进程2. iptables 自动屏蔽访问网站频繁的IP3. 自动发布 Java 项目(Tomcat)4. Nginx 访问日志分析脚本5. 查看网卡实时流量脚本6. 批量检测网站是否异常并邮件通知7. 目录入侵检测与告警8. 一键查看…

网络原理 - HTTP / HTTPS(2)——http请求

目录 一、认识 “方法”(method) 1、GET方法 2、POST方法 (1)登录 (2)上传 (3)GET和POST使用习惯 3、GET方法和POST方法的区别 正确滴 关于一些网上的说法,错误滴…

Kimi精选提示词,总结PPT内容

大家好,我是子云,最近真是觉得Kimi这个大模型,产品体验很棒,能力也是不错,感觉产品经理用心了。 发现一个Kimi 一个小技巧,可以学习到很多高级提示词。 Kimi输入框可以配置常用提示词,同时也可…

51单片机学习笔记14 LCD1602显示屏使用

51单片机学习笔记14 LCD1602显示屏使用 一、LCD1602介绍1. 简介2. 引脚定义3. DDRAM4. 字模5. 指令(1)清屏指令 0x01(2)光标归位指令 0x02(3)进入模式设置指令 0x06(4)显示开关控制指…