Linux驱动开发(I2C系统的重要结构体)

news2024/11/26 10:28:07

文章目录

  • 前言
  • 一、I2C硬件框架
  • 二、i2c_adapter
  • 三、i2c_client
  • 四、i2c_msg
  • 总结


前言

本篇文章来讲解I2C系统的重要结构体,了解这些结构体对于编写I2C驱动来说是至关重要的,所以要想编写好一个I2C驱动程序那么就必须先了解这些结构体。

一、I2C硬件框架

这里使用百问网的一张图片来讲解:
在这里插入图片描述
一个芯片中可以有多个I2C控制器,并且一个I2C控制器可以控制多个设备。那么在对应的驱动中I2C控制器和这些设备还有传输的消息都是用什么来表示的呢?

在Linux内核中:
使用i2c_adapter这个结构体来代表一个I2C控制器。
传输的消息使用i2c_msg结构体表示。
设备使用i2c_client结构体表示。

二、i2c_adapter

i2c_adapter结构体:

struct i2c_adapter {
	struct module *owner;
	unsigned int class;		  /* classes to allow probing for */
	const struct i2c_algorithm *algo; /* the algorithm to access the bus */
	void *algo_data;

	/* data fields that are valid for all devices	*/
	const struct i2c_lock_operations *lock_ops;
	struct rt_mutex bus_lock;
	struct rt_mutex mux_lock;

	int timeout;			/* in jiffies */
	int retries;
	struct device dev;		/* the adapter device */

	int nr;
	char name[48];
	struct completion dev_released;

	struct mutex userspace_clients_lock;
	struct list_head userspace_clients;

	struct i2c_bus_recovery_info *bus_recovery_info;
	const struct i2c_adapter_quirks *quirks;
};

在Linux内核中我们能找到这个结构体,下面我们来讲解一下其中比较重要的成员。

nr成员:
这个成员变量代表的是第几个I2C控制器,因为在一个芯片中I2C控制器的数量肯定是不止一个的,所以需要有一个变量来标识具体是第几个I2C控制器。

const struct i2c_algorithm *algo

const struct i2c_algorithm *algo 是指向 I2C 访问算法的结构体指针,该指针指向一个常量类型的 struct i2c_algorithm 结构体,其中定义了 I2C 总线上的访问操作函数指针,包括了 master_xfer、smbus_xfer 以及 functionality 等。通过这些访问函数,可以实现对 I2C 总线上的传感器、EEPROM 和其他设备的读写操作。

在实现 I2C 设备驱动程序时,通常需要根据具体的 I2C 总线访问算法进行编程。而在适配器结构体 struct i2c_adapter 中,通过 algo 指针可以方便地获取到对应的 I2C 总线访问算法信息,从而实现 I2C 设备的访问。

algo结构体:

struct i2c_algorithm {
	/* If an adapter algorithm can't do I2C-level access, set master_xfer
	   to NULL. If an adapter algorithm can do SMBus access, set
	   smbus_xfer. If set to NULL, the SMBus protocol is simulated
	   using common I2C messages */
	/* master_xfer should return the number of messages successfully
	   processed, or a negative value on error */
	int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
			   int num);
	int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
			   unsigned short flags, char read_write,
			   u8 command, int size, union i2c_smbus_data *data);

	/* To determine what the adapter supports */
	u32 (*functionality) (struct i2c_adapter *);

#if IS_ENABLED(CONFIG_I2C_SLAVE)
	int (*reg_slave)(struct i2c_client *client);
	int (*unreg_slave)(struct i2c_client *client);
#endif
};

三、i2c_client

i2c_client结构体:

struct i2c_client {
	unsigned short flags;		/* div., see below		*/
	unsigned short addr;		/* chip address - NOTE: 7bit	*/
					/* addresses are stored in the	*/
					/* _LOWER_ 7 bits		*/
	char name[I2C_NAME_SIZE];
	struct i2c_adapter *adapter;	/* the adapter we sit on	*/
	struct device dev;		/* the device structure		*/
	int irq;			/* irq issued by device		*/
	struct list_head detected;
#if IS_ENABLED(CONFIG_I2C_SLAVE)
	i2c_slave_cb_t slave_cb;	/* callback for slave mode	*/
#endif
};

在 Linux 内核中,i2c_client 是 I2C 从设备的设备结构体,表示连接到 I2C 总线上的一个 I2C 从设备。它包含了该从设备的一些信息,例如设备地址、从设备驱动程序、从设备所在的 I2C 适配器等。

重要的成员:
unsigned short addr:I2C 从设备的地址,存储在 7 位中。注意,这个地址不包括 I2C 地址的读写位,即 7 位地址用于标识从设备的身份。

struct i2c_adapter *adapter:指向从设备所连接的 I2C 适配器的指针。有了适配器信息,可以通过适配器的接口访问连接的从设备。

四、i2c_msg

i2c_msg结构体:

struct i2c_msg {
	__u16 addr;	/* slave address			*/
	__u16 flags;
#define I2C_M_RD		0x0001	/* read data, from slave to master */
					/* I2C_M_RD is guaranteed to be 0x0001! */
#define I2C_M_TEN		0x0010	/* this is a ten bit chip address */
#define I2C_M_RECV_LEN		0x0400	/* length will be first received byte */
#define I2C_M_NO_RD_ACK		0x0800	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK	0x1000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_REV_DIR_ADDR	0x2000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NOSTART		0x4000	/* if I2C_FUNC_NOSTART */
#define I2C_M_STOP		0x8000	/* if I2C_FUNC_PROTOCOL_MANGLING */
	__u16 len;		/* msg length				*/
	__u8 *buf;		/* pointer to msg data			*/
};

struct i2c_msg 是 Linux 内核中 I2C/SMBus 消息的结构体,用于描述 I2C 总线上的一条消息。

重要的成员:

__u16 addr:I2C 从设备的地址,用于指定消息要发送到哪个从设备上。

__u16 flags:消息的标志参数,包括多种不同的位掩码:

通过这些参数,struct i2c_msg 结构体可以描述出 I2C 总线上的一条具体的消息,并通过设备驱动程序对该消息进行操作。

总结

有了这些重要结构体的知识我们就可以开始编写驱动程序了。

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

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

相关文章

图片识别工具Tesseract与使用

Tesseract工具是一个图片识别工具, 由HP实验室开发 由Google维护的开源的光学字符识别(OCR)引擎。它可以直接使用,或者(对于程序员)使用 API​​ 从图像中提取输入,包括手写的或打印的文本。与M…

KCC@上海正式成立啦!

5月28号下午,开源社区的朋友共聚于上海的一间茶室中,组织召开了 KCC上海第一次线下见面会,并正式成立了 KCC上海。 KCC(KAIYUANSHE City Community)是由开源社理事兼执行长庄表伟老师号召发起,旨在让开源社…

关于职场中的面试,要是遇到这些问题时,应该怎么回

(点击即可收听) 关于职场中的面试,要是遇到这些问题时,应该怎么回 平常多学一点,面试入职时就少踩一点坑,无论是去面试还是换工作,怎么样去回答面试官,遇到此类的问题,能够应付自如 1. 你觉得这份工作你能胜任? 首先,无论你在面试过程当中表现怎么样,一定要非常坚定,一定可以 …

让身份验证更简单:OAuth2基于令牌方式为第三方应用提供认证和授权方案

随着互联网应用的发展,跨系统身份认证解决方案也在不断演化和改进。下面是它的发展史: 早期的 Web 应用程序使用基于表单的身份验证方式;随着 Web 应用程序数量的增加,需求跨应用程序身份验证的呼声也越来越高,从而出…

行胜于言

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 最近在给我女儿辅导作业的过程中,发现了许多小问题,自己偶尔也会因此而焦躁,同时也在反思作为父母应该更好的帮助孩子成长,而AI能力的增强和孩子的成长有什么相似…

【Python】Python系列教程--Python3 VScode(三)

文章目录 前言安装 VS Code 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二) 准备工作: 安装 VS Code安装 VS Code Python 扩展安装 Python 3 安装 VS Code VS…

Maven仓库(本地仓库+远程仓库)

在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称为构件。 Maven 在某个统一的位置存储所有项目的构件,这个统一的位置,我们就称之为仓库。换言之,仓库就是存放依赖和插件的地方。 任何的构件都有唯一的坐标…

VUE代码批量格式化

1、下载安装Visual Studio Code 2、安装插件 Vetur和Format Files 3、配置格式化,点击右下角设置 4、自定义格式化规则 复制下面的配置信息,覆盖原始配置,保存配置。 {"vetur.format.defaultFormatter.html": "js-beauti…

MySQL数据库 6.DDL操作 表

目录 🤔前景知识: 数据类型: 1. 数值类型 2. 字符串类型 3. 日期时间类型 🤔DDL操作表: 1.创建 示例:尝试创建把以下实例创建到表里 2.查询 1.查询当前数据库的所有表: &#x1f50…

南京智慧工厂量产下线, 深蓝S7展现硬核制造品质

以科技之力构建电动出行体验,深蓝S7要用硬核实力树立高价值电动SUV全新标杆。 深蓝S7南京智慧工厂下线 作为深蓝汽车旗下的首款中型SUV,深蓝S7自从5月20日开启预定以来,就一直是许多车友关注的焦点,订单火爆更是远超预期&#xff…

设计模式之~职责链模式

简述: 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为…

【哈希】位图/布隆过滤器

位图 前言 在实现位图结构之前我们先看一个问题: 给出40亿个不重复的无符号整型,并且是无序的。然后给一个无符号整数,怎样快速判断这个数是否在40亿个数之中。 方法一:对40亿个数据进行遍历。我们会发现,时间复杂度…

重启天涯,一场关于 “救命” 的直播

大家好,我是校长。 昨天在知乎热搜榜上看到了关于天涯网站的帖子,感觉值得思考。 前一段时间,我们就看到了关于天涯要关闭的新闻,感觉撑不下去了。 说实话,当时看到这个新闻的时候,挺感慨的,一个…

初识网络之UDP网络套接字

目录 一、UDP中的socket编程常用接口 1. socket的含义 2. sockaddr结构 3. socket编程中UDP协议常用接口介绍 3.1 创建socket文件描述符(TCP/UDP、客户端 服务器) 3.2 绑定端口号(TCP/UDP,服务器) 3.3 接收数据…

2023年上半年数据库系统工程师上午真题及答案解析

1.计算机中, 系统总线用于( )连接。 A.接口和外设 B.运算器、控制器和寄存器 C.主存及外设部件 D.DMA控制器和中断控制器 2.在由高速缓存、主存和硬盘构成的三级存储体系中,CPU执行指令时需要读取数据,那么DMA控制器和中断CPU发出的数据地…

聊聊我在淘宝做性能分析的经历

我们新推出大淘宝技术年度特刊《长期主义,往往从一些小事开始——工程师成长总结专题》,专题收录多位工程师真诚的心路历程与经验思考,覆盖终端、服务端、数据算法、技术质量等7大技术领域,欢迎一起沟通交流。 本文为此系列第三篇…

RNN基础概念

一、潜变量回归模型 使用潜变量 h t h_{t} ht​总结过去的信息 二、RNN 更新隐藏状态: h t φ ( W h h h t − 1 W h x x t − 1 b h ) h_{t}φ(W_{hh}h_{t-1}W_{hx}x_{t-1}b_{h}) ht​φ(Whh​ht−1​Whx​xt−1​bh​) 更新输出: o t W o h h t b…

第六十天学习记录:C语言进阶:文件操作3文件版通讯录改造

在之前写的静态通讯录和动态通讯录中,都存在一个致命的弊端,那就是当软件运行的过程中添加信息,不关闭软件能够正常显示信息。但一旦关闭软件,内存回收之后当再次打开软件,之前保存的信息全部都得重新添加。 因此需要…

人工智能-推荐

常用的推荐系统算法实现方案有三种: 协同过滤推荐(Collaborative Filtering Recommendation):该算法的核心是分析用户的兴趣和行为,利用共同行为习惯的群体有相似喜好的原则,推荐用户感兴趣的信息。兴趣有高…

老旧Mac不能升级macOS Ventura 13解决方案

老旧Mac不能升级macOS Ventura 13. 我2016年的MacBook Pro,遇到升级xcode失败以及不能更新到最新系统的问题。 ITMS-90725: SDK Version Issue - This app was built with the iOS 15.5 SDK. All iOS apps submitted to the App Store must be built with the iOS 15 SDK or …