Linux下I2C驱动框架: I2C驱动框架与I2C总线驱动(即I2C控制器)

一.  简介

现在,我们来学习一下如何在 Linux 下开发 I2C 接口器件 驱动,重点是学习 Linux 下的 I2C 驱动框架,按照指定的框架去编写 I2C 设备驱动。
本文来了解以下 Linux下 I2C 驱动框架,框架下的  i2C总线驱动(也就是I2C控制器驱动)。

二.  Linux下I2C驱动实验: I2C驱动框架与I2C总线驱动

1.  Linux I2C 驱动框架简介

回想一下我们在裸机篇中是怎么编写 AP3216C 驱动的,我们编写了四个文件: bsp_i2c.c
bsp_i2c.h bsp_ap3216c.c bsp_ap3216c.h 。其中前两个是 I.MX6U IIC 接口驱动,后两个文 件是 AP3216C 这个 I2C 设备驱动文件。相当于有两部分驱动:
(1)  I2C 主机驱动。
(2)  I2C 设备驱动。
对于 I2C 主机驱动,一旦编写完成就不需要再做修改,其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想,因此, Linux 内核也将 I2C 驱动分为两部分:
(1)  I2C 总线驱动, I2C 总线驱动就是 SOC I2C 控制器驱动,也叫做 I2C 适配器驱动。
(2)  I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。

2. I2C 总线驱动(I2C控制器驱动)

首先来看一下 I2C 总线,在讲 platform 的时候就说过, platform 是虚拟出来的一条总线,目的是为了实现总线、设备、驱动框架。
对于 I2C 而言,不需要虚拟出一条总线,直接使用 I2C 总线即可。 I2C 总线驱动重点是 I2C 适配器 ( 也就是 SOC I2C 接口控制器 ) 驱动。

(1)  I2C总线驱动的结构体

这里要用到两个重要的数据结构:i2c_adapter i2c_algorithmLinux 内核将 SOC I2C 适配器 ( 控制器 ) 抽象成 i2c_adapter i2c_adapter 结构体定义在 include/linux/i2c.h 文件中,结构体内容如下:
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	*/struct rt_mutex bus_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;
};

4 行, i2c_algorithm 类型的指针变量 algo ,对于一个 I2C 适配器,肯定要对外提供读 API 函数,设备驱动程序可以使用这些 API 函数来完成读写操作。 i2c_algorithm 就是 I2C 配器与 IIC 设备进行通信的方法。
i2c_algorithm 结构体定义在 include/linux/i2c.h 文件中,内容如下 ( 删除条件编译 )
 struct i2c_algorithm {
......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 *);
......
};

3 行, master_xfer 就是 I2C 适配器的传输函数,可以通过此函数来完成与 IIC 设备之间的通信。
6 行, smbus_xfer 就是 SMBUS 总线的传输函数。
综上所述,I2C 总线驱动,或者说 I2C 适配器驱动的主要工作就是初始化 i2c_adapter 结构体变量,然后设置 i2c_algorithm 中的 master_xfer 函数。

(2)  I2C 总线驱动注册与注销

完成以后通过 i2c_add_numbered_adapter函数 或 i2c_add_adapter函, 这两个函数向系统注册设置好的 i2c_adapter ,这两个函数的原型如下:
int i2c_add_adapter(struct i2c_adapter *adapter)
int i2c_add_numbered_adapter(struct i2c_adapter *adap)

这两个函数的区别在于, i2c_add_adapter 函数使用动态的总线号,而 i2c_add_numbered_adapter 函数使用静态总线号。函数参数和返回值含义如下:

adapter adap :要添加到 Linux 内核中的 i2c_adapter ,也就是 I2C 适配器。
返回值: 0 ,成功;负值,失败。

如果要删除 I2C 适配器的话使用 i2c_del_adapter 函数即可,函数原型如下:
void i2c_del_adapter(struct i2c_adapter * adap)
函数参数和返回值含义如下:
adap :要删除的 I2C 适配器。
返回值: 无。

三.  总结

关于 I2C 的总线 ( 控制器或适配器 ) 驱动就讲解到这里,一般 SOC I2C 总线驱动都是由半导体厂商编写的,比如, I.MX6U I2C 适配器驱动 NXP 已经编写好了,这个不需要用户去编 写。
因此, I2C 总线驱动对我们这些 SOC 使用者来说是被屏蔽掉的,我们只要专注于 I2C 设备驱 动即可。除非你是在半导体公司上班,工作内容就是写 I2C 适配器驱动。

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

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

相关文章

力扣40 组合总和Ⅱ Java版本

文章目录 题目描述代码 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1:…

16、Lua 协同程序(coroutine)

Lua 协同程序 Lua 协同程序什么是协同(coroutine)?线程和协同程序区别基本语法以下实例演示了以上各个方法的用法 生产者-消费者问题 Lua 协同程序 什么是协同(coroutine)? Lua协同程序(coroutine)与线程比较类似:拥有独立的堆栈&#xff0…

图解大型网站多级缓存的分层架构

前言 缓存技术存在于应用场景的方方面面。从浏览器请求,到反向代理服务器,从进程内缓存到分布式缓存,其中缓存策略算法也是层出不穷。 假设一个网站,需要提高性能,缓存可以放在浏览器,可以放在反向代理服…

uniapp原生下拉刷新在手机上不起作用

开启原生下拉刷新时,页面里使用了全屏高的scroll-view,向下拖动内容时,会优先触发scroll-view滚动而不是下拉刷新。 "enablePullDownRefresh": true, 这就可能会导致下拉刷新不起作用,这时候就需要做到取舍&#xff0c…

设计模式(12):代理模式

一.核心作用 通过代理,控制对对象的访问;可以详细控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。 二.核心角色 抽象角色: 定义代理角色和真实角色的公共对外方法;真实角色: 实现抽…

【智能排班系统】雪花算法生成分布式ID

文章目录 雪花算法介绍起源与命名基本原理与结构优势与特点应用场景 代码实现代码结构自定义机器标识RandomWorkIdChooseLocalRedisWorkIdChooselua脚本 实体类SnowflakeIdInfoWorkCenterInfo 雪花算法类配置类雪花算法工具类 说明 雪花算法介绍 在复杂而庞大的分布式系统中&a…

小坤二次元导航HTML源码

源码介绍 小坤二次元导航HTML源码,很好看的一个htmlの引导页/导航页!需要的上! 源码下载 小坤二次元导航HTML源码

游戏攻略|基于Springboot和vue的游戏分享平台系统设计与实现(源码+数据库+文档)

游戏攻略分享平台 目录 基于Springboot和vue的游戏分享平台系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台: 2、后台 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a…

ubuntu23设置kibana后台启动服务

要在Ubuntu 23系统中设置Kibana作为系统服务,以便能够通过systemd管理其启动、停止、重启以及设置开机自动启动,可以按照以下步骤操作: 1. 创建Kibana systemd服务单元 创建一个名为kibana.service的文件在 /etc/systemd/system/ 目录下&am…

python绘制子图(旭日图、渐变堆积面积图、多数据折线图、比例关系图)

大家好,我是带我去滑雪! 子图可以更清晰地展示和理解复杂的数据关系,通过将数据分成多个小图,有助于观察数据间的关系和趋势。减少数据之间的重叠和混淆,使得每个子图更易于理解和解释。不同类型的子图可以呈现数据的不…

蓝鲸6.1 CMDB 事件推送的开源替代方案

本文来自腾讯蓝鲸智云社区用户:木讷大叔爱运维 背景 在蓝鲸社区“社区问答”帖子中发现这么一个需求: 究其原因,我在《不是CMDB筑高墙,运维需要一定的开发能力!》一文中已经介绍,在此我再简单重复下&#…

mysql知识点梳理

mysql知识点梳理 一、InnoDB引擎中的索引策略,了解过吗?二、一条 sql 执行过长的时间,你如何优化,从哪些方面入手?三、索引有哪几种类型?四、SQL 约束有哪几种呢?五、drop、delete、truncate的区…

勒索病毒最新变种.rmallox勒索病毒来袭,如何恢复受感染的数据?

导言: 随着信息技术的飞速发展,网络安全问题日益突出,其中勒索病毒便是近年来备受关注的网络安全威胁之一。在众多勒索病毒中,.rmallox勒索病毒以其独特的传播方式和强大的加密能力,给广大用户带来了极大的困扰。本文…

java算法题每日多道十六

502. IPO 题目 假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号混知近2000篇历史文章在线查看,找文章方便了

关于公众号文章批量下载,我之前写过很多文章: 视频更新版:批量下载公众号文章内容/话题/图片/封面/音频/视频,导出html,pdf,excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

牛客小白月赛90(C\D\E)

C 小A的数字(思维,考虑特殊情况) 一、题目要求 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 小A给定一个数字 n,请你帮她找出从低位对齐后任意一位均与 n对应数位不同的最小正整数。 对于本题…

大型语言模型(LLMs)面试常见问题解析

概述 这篇文章[1]是关于大型语言模型(LLMs)的面试问题和答案,旨在帮助读者准备相关职位的面试。 token? 在大型语言模型中,token 指的是什么? 分词(Tokenization):可以将…

IDEA/PyCharm/GoLand同时打开2个分支

背景 想对比2个分支的代码,或者在A分支开发时,需要看B分支,切来切去太麻烦,而且新写的代码还没法直接切到B分支。 操作方法 假如有A、B 2个分支。 通过git worktree为B分支新建1个worktree,然后通过打开新项目的方式…

list使用与模拟实现

目录 list使用 reverse sort unique splice list模拟实现 类与成员函数声明 节点类型的定义 非const正向迭代器的实现 list成员函数 构造函数 尾插 头插 头删 尾删 任意位置插入 任意位置删除 清空数据 析构函数 拷贝构造函数 赋值重载函数 const迭代器的…

【c++】初阶模版与STL简单介绍

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章介绍一下模版和对STL进行简单的介绍,后续我们进入对STL的学习! 目录 模版1.泛型编程2.函数模板2.1函数模板的原理2.2模版的实例化…