【IIC子系统】IIC驱动框架解析(一)

news2024/9/25 3:20:48

文章目录

  • I2C设备驱动开发
  • I2C设备驱动的三种匹配方式
    • (1)通用的匹配方式:OF style match
    • (2)电源管理专用的匹配方式:ACPI style match
    • (3)I2C专用的匹配方式:I2C id table

参考:
Linux驱动框架之i2c驱动框架解析

I2C设备驱动开发

我总结的图如下:
在这里插入图片描述

  • 主要两个C文件:
    • xxx.device.c:主要是实现i2c_client结构体,将这个文件编译出来的.ko文件称之为"设备驱动"
    • xxx.driver.c:主要是实现i2c_driver结构体,将这个文件编译出来的.ko文件称之为"主机驱动"
    • 主机驱动需要完成与硬件设备的匹配(设备树),然后实现字符设备接口(open,read,write,release,ioct…)一般会用MISC设备接口实现简单一点,就会在系统目录/dev/下生成对应的设备节点。
    • 应用层软件和设备驱动就是通过上述的字符设备驱动生成的设备节点进行各种基本操作。

我的实现的I2C设备驱动:

【RV1126】IIC驱动–EEPROM

【RV1126】IIC驱动–MAX30102

I2C设备驱动的三种匹配方式

文件地址:kernel/drivers/i2c/i2c-core-base.c
在线Linux源码位置查看:https://elixir.bootlin.com/linux/latest/source/drivers/i2c/i2c-core-base.c#L117

static int i2c_device_match(struct device *dev, struct device_driver *drv)
{
	struct i2c_client	*client = i2c_verify_client(dev);
	struct i2c_driver	*driver;


	/* Attempt an OF style match */
	if (i2c_of_match_device(drv->of_match_table, client))
		return 1;

	/* Then ACPI style match */
	if (acpi_driver_match_device(dev, drv))
		return 1;

	driver = to_i2c_driver(drv);

	/* Finally an I2C match */
	if (i2c_match_id(driver->id_table, client))
		return 1;

	return 0;
}

(1)通用的匹配方式:OF style match

这是所有的设备驱动匹配都适用的一种匹配方式,不仅限于I2C设备匹配,利用设备树(.dts,.dtsi)节点的字段进行配备。一般使用compatible字段来进行匹配。

定义位置:kernel/include/linux/mod_devicetable.h

/*
 * Struct used for matching a device
 */
struct of_device_id {
	char	name[32];
	char	type[32];
	char	compatible[128];
	const void *data;
};

算法中,只要name或type,或compatible任一个匹配,就算匹配.

使用实例:

设备树中的:

&i2c4 {
	status = "okay";
	maxim@57 {
		status = "okay";
		compatible = "maxim,max30102";
		reg = <0x57>;
	};
};

驱动代码中的:

static const struct of_device_id max30102_of_match[] = {
	{ .compatible = "maxim,max30102" },
	{}
};

static struct i2c_driver driver =
{
	.probe = rv1126_probe,
	.remove = rv1126_remove,
	.driver =
	{
		.name = "max30102",
		.of_match_table = of_match_ptr(max30102_of_match),
	},
};

由上可知,设备树中的compatible字段和结构体对象中的compatible成员是一致的,所以可以完成匹配

(2)电源管理专用的匹配方式:ACPI style match

对于ACPI主要是用于电源管理的,需要有acpi对应的id。

定义位置:kernel/include/linux/mod_devicetable.h

struct acpi_device_id {
	__u8 id[ACPI_ID_LEN];
	kernel_ulong_t driver_data;
	__u32 cls;
	__u32 cls_msk;
};

这个平时用得少,略过。

(3)I2C专用的匹配方式:I2C id table

相比于OF style的设备匹配,I2C id表匹配是i2c专有的匹配方式: id_table方式:

定义位置:kernel/include/linux/mod_devicetable.h

struct i2c_device_id {
	char name[I2C_NAME_SIZE];
	kernel_ulong_t driver_data;	/* Data private to the driver */
};

这种方式是比较常用的,有设备树后就用的少了。

使用实例:

&i2c4 {
	status = "okay";
	eeprom@50 {
		status = "okay";
		compatible = "atmel,at24c256B";
		reg = <0x50>;
	};
};
static struct i2c_device_id id_table[]=
{
	{"eeprom", 0},
	{}
};
MODULE_DEVICE_TABLE(i2c, id_table);

static struct i2c_driver drv=
{
	.probe=rv1126_probe,
	.remove=rv1126_remove,
	.driver=
	{
		.name="at24c256B",
	},
	.id_table=id_table
};

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

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

相关文章

Prometheus时间序列选择器

下面均以prometheus_http_requests_total为例子&#xff0c;即prometheus的HTTP请求数&#xff0c;在机器上装prometheus server即可。 本篇简述prometheus的常用检索规则与工具&#xff1a;瞬间向量选择器、区间向量选择器与时间位移选择器。 瞬间向量选择器 瞬间向量选择器&a…

AI绘图提示词/咒语/词缀/关键词使用指南(Stable Diffusion Prompt 设计师操作手册)

基本知识&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion WebUI及问题解决记录》&#xff1b;运行使用时问题《Windows使用Stable Diffusion时遇到的各种问题整理》&#xff1b;模型运用及参数《Stable Diffusion 个人推荐的各种模型及设置参数、…

人工智能现状研究报告(上)

原创 | 文 BFT机器人 01 介绍 定义 人工智能(A):一种广泛的学科&#xff0c;其目标是创造智能机器&#xff0c;而不是人类和动物所展示的自然智能。 通用人工智能(AlamosGold):一个术语&#xff0c;用来描述未来机器可以在所有有经济价值的任务中达到甚至超过人类的全部认知能力…

SQL高级之慢查询日志

简介 他是一种日志记录&#xff0c;用来记录在MySql中响应时间超过阈值的语句&#xff0c;具体指运行时间超过long_query_time值的SQL&#xff0c;会被记录到慢查询日志中long_query_time的默认值为10&#xff0c;运行超过10s以上的语句就会被记录默认情况下&#xff0c;MYSQL…

python自动化测试之unittest简介讲解

一、unittest简介 1.先导入unittest 2.用help函数查看源码解析 3.查看描述&#xff1a; Python unit testing framework, based on Erich Gammas JUnit and Kent Becks Smalltalk testing framework. 翻译&#xff1a;python的单元测试框架&#xff0c;是基于java的junit测…

某农商行利用双因素认证和域用户自助改密方案构筑强身份验证机制,减轻IT运维压力

银行关键业务系统的安全关系到人民财产安全、隐私保护。为了提升银行关键信息基础设施安全防护水平&#xff0c;满足《关键信息基础设施安全保护要求》、等保要求等&#xff0c;某市农商银行正在借助宁盾 2FA 双因素认证和员工自助改密方案为操作系统终端、业务系统、堡垒机等设…

python3爬虫【二】python爬虫进行AES解密遇到的问题

1、TypeError: Object type <class ‘str’> cannot be passed to C code 报错如下&#xff1a; File "C:\Python311\Lib\site-packages\Crypto\Util\_raw_api.py", line 143, in c_uint8_ptrraise TypeError("Object type %s cannot be passed to C cod…

强化学习:随机近似与随机梯度下降

mean estimation 通过前面的学习&#xff0c;我们知道可以通过很多采样来求期望。而求 x ˉ \bar x xˉ 的方法由两种&#xff0c;一是直接将采样数据相加再除以个数&#xff0c;但这样的方法运行效率较低。 第二种方法是迭代式的计算&#xff0c;即来几个数据就算几个数据&a…

C++----析构函数,拷贝构造函数(6)

析构函数 概念 析构函数是一个特殊的函数&#xff0c;函数名和类名相同&#xff0c;但是要在前面加~&#xff0c;既没有参数&#xff0c;也没有返回值。析构函数在对象被销毁自动调用一次 如果类中没有析构函数&#xff0c;编译器会生成一个什么也不做的析构函数 如果类中有…

磁盘调度算法(期末复习版)

文章目录 一. FCFS 调度(先来先服务)二.SSTF调度(最短寻道时间优先)三. SCAN 调度(电梯算法)四. C-SCAN 调度(循环扫描)五. LOOK 调度 一. FCFS 调度(先来先服务) 磁盘调度的最简单形式当然是先来先服务&#xff08;FCFS&#xff09;算法。虽然这种算法比较公平&#xff0c;但…

MySQL千亿级数据生产环境扩容

MySQL千亿级数据生产环境扩容 数据库平滑扩容1. 扩容方案剖析1.1 扩容问题1.2 停机方案1.3 停写方案1.4 日志方案1.5 双写方案&#xff08;中小型数据&#xff09;1.6 平滑2N方案&#xff08;大数据量&#xff09; 2. 平滑2N扩容方案实践2.1 实现应用服务级别的动态扩容2.1.1 M…

时间序列表征之SAX(Symbolic Aggregate approXimation)算法

前言 对于研究时间序列表征、时间序列分类&#xff0c;时间序列状态转换等方向&#xff0c;常用的简单粗暴的一个方法是SAX (Symbolic Aggregate approXimation), 由Jessica Lin等在2003年发表的论文中提出的&#xff0c;该论文的题目为《A Symbolic Representation of Time Se…

敏捷方法中测试人员的价值?

敏捷方法在软件开发中受到青睐&#xff0c;特别是在互联网应用服务系统的开发中&#xff0c;越来越多的公司采用敏捷方法&#xff0c;包括XP、Scrum、Lean、Crystal、FDD等。具体的敏捷方法在操作时有一些区别&#xff0c;但基本思想是一致的&#xff0c;如客户至上、拥抱变化、…

yolov8 源码解读 (part1: backbone, head)

yolov8 除了目标检测之外,还有实例分割功能, 这里解读检测和分割代码。 先上一张结构图,这个图里没有分割模块,后面会在代码里说明分割模块。 本篇解读红色框内的部分。 可以看到每个模块右边都有一个数字:0,1,… 这个数字是模块的顺序编号,按0,1,…,21的顺序进行,而…

澎湃新闻对话腾讯丁珂:从“治已病”到“治未病”,企业需快速构建“安全免疫力”

作者&#xff1a;澎湃新闻记者 周頔 随着数字化进程加快&#xff0c;企业数字化体系的边界在不断拓展&#xff0c;安全风险和挑战不断增加&#xff0c;传统被动防御的安全应对常显疲态&#xff0c;数字安全时代亟待建立全新的安全范式。 6月13日&#xff0c;腾讯安全联合IDC等…

华为某正式员工哀叹:自己被劝退了,同期入职的OD还好好的,正式员工还没外包稳定!...

在打工人心中&#xff0c;正式员工的含金量远远高于外包&#xff0c;但最近却有人爆料&#xff1a;华为正式员工还没外包稳定&#xff01; 一位硕士毕业、工作两年的华为正式员工说&#xff0c;自己被劝退了&#xff0c;但隔壁组同期入职的OD还好好的&#xff0c;正式员工竟然还…

Instant-NGP稿子

Instant-NGP是英伟达2022年发表的一篇论文&#xff0c;全称是使用哈希编码的多分辨率的即时神经图形原语 那这篇文章呢 这篇文章提出了一种对输入做哈希encoding的方式&#xff0c;来让很小的网络也能学到很高的质量。 这个图片是文中的一个图片&#xff0c;表现了可以在训练…

大数据Doris(四十六):Stream Load基本原理和语法介绍

文章目录 Stream Load基本原理和语法介绍 一、基本原理 二、语法与结果 1、语法 2、返回结果 Stream Load基本原理和语法介绍 Stream load 是一个同步的导入方式&#xff0c;用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 同步执行导入…

简要介绍 | 图像聚类:概念、原理与方法

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对图像聚类进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 图像聚类&#xff1a;概念、原理与方法 Cluster Analysis | NVIDIA Developer 1. 背景介绍 图像聚类&#xff08;Image Clustering&a…

波浪理论与伦敦金价走势分析

艾略特波浪理论(Elliott Wave Theory)是一套能应用于伦敦金走势分析的理论&#xff0c;它认为市场的走势会不断重复一种模式&#xff0c;每一周期由5个上升浪和3个下跌浪组成。波浪理论将不同规模的趋势分成了九大类&#xff0c;最长的超大循环波(Grand supercycle) 是横跨200年…