Linux下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/791102.shtml

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

相关文章

【大数据存储】实验五:Mapreduce

实验Mapreduce实例——排序(补充程序) 实验环境 Linux Ubuntu 16.04 jdk-8u191-linux-x64 hadoop-3.0.0 hadoop-eclipse-plugin-2.7.3.jar eclipse-java-juno-SR2-linux-gtk-x86_64 实验内容 在电商网站上,当我们进入某电商页面里浏览…

windows@软件显示模糊@屏幕显示器分辨率和精细度

文章目录 refsDPIPPIPPI (Pixels Per Inch)DPI (Dots Per Inch) 屏幕尺寸数windows中DPI设置对单个应用设置DPI兼容性设置使用系统全局设置 获取屏幕(监视器)信息👺获取监视器的型号pnp 监视器windows 获取屏幕分辨率 高分辨率屏幕高分辨率和高精细度屏幕&#x1f4…

RedHat9中KVM虚拟机的配置与管理

KVM虚拟技术介绍 Linux的KVM(Kernel-based Virtual Machine)虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机,每个虚拟机都有自己的操作系统和应用程序,就像运行在独立的物理…

MyBatis入门到掌握(JAVA)

建立连接可能涉及到的问题(只需要自己改一下就行) 1、MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发 2、数据库连接配置 (1)yml配置 # 数据库连接配置 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/…

【Java SE】7.1类和对象

1.面向对象的初步认知 1.1什么是面向对象 Java是一门纯面向对象的语言,在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认…

OAuth2-03-springboot 整合

拓展阅读 OAuth 2.0-01-Overview OAuth2-02-java 整合 OAuth2-03-springboot 整合 序言 安全性是暴露由许多微服务组成的公共访问API时要考虑的最重要的一个方面。 Spring有一些有趣的功能和框架,使我们的微服务安全配置更容易。 在本文中,我将向…

vue中splice方法总结

本文没有目录,很简单的几句话总结一下 1,参数解释2,使用方法 splice(index,len,item)是vue中对数组进行操作的方法之一,可以用来 删除, 更新,和 增加数组内容。 1,参数解释 index&#xff1a…

mysql如何根据datetime字段查询当月的数据

在MySQL中,你可以使用YEAR()和MONTH()函数来提取datetime字段的年份和月份,然后根据这些值来查询当月的数据。以下是一个示例查询,假设你有一个名为your_table的表,其中包含一个名为your_datetime_column的datetime字段&#xff1…

基于SpringBoot的“致远汽车租赁系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“致远汽车租赁系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 致远汽车租赁系统总体功能模块图 系统首页界…

2024年 前端JavaScript 进阶 第3天 笔记

3.1-JS进阶-内容和两种编程思想 3.2-构造函数实现封装以及存在 3.3-原型对象prototype 3.4-数组扩展案例-求最大值和数组求和 3.5-constructor属性以及应用 3.6-对象原型proto 3.7-原型继承 3.8-原型链以及instanceof运算符 3.9-综合案例-模态框构造函数写法 3.10-综合案例-0pe…

Phpstorm配置Xdebug

步骤 1、先去官网找到对应的php xdebug的版本 2、配置phpstorm断点调试 网址:https://xdebug.org/ 查看php对应的xdebug版本:Xdebug: Support — Tailored Installation Instructions 1.1查看对应php xdebug版本 全选,复制到目标网址 我…

笔记本三屏异显方案——更新中,是否能够在FPGA上实现,淘宝购物的价格太贵

三屏是(笔记本电脑屏幕,两个显示器屏幕),异显是采用屏幕的扩展功能,这样能够左边看视频文章,右边control cv代码。 一、 电脑有一个HDMI口的时候,只需要买一个TypeC(雷电接口&#x…

FreeBSD下如何进行添加路由等配置?

FreeBSD系统可以当作一台路由器来使用,实际上当年路由器刚刚出来的时候,有很大一部分就是用主机安装FreeBSD来提供路由功能的。 路由的基础知识 路由,就是计算机网络中决定数据包从源地址到目的地址路径的一种传输过程。路由表,就…

解密PGSQL数据库引擎:探索数据世界的秘密(二)

本系列文章简介: 在当今数字化时代,数据已经成为了最宝贵的资源之一。企业、政府和个人都在积极探索和利用数据来推动创新、改善决策和提升效率。而作为数据存储和管理的核心技术之一,数据库引擎扮演着至关重要的角色。 在众多数据库引擎中&a…

【前端Vue】社交信息头条项目完整笔记第3篇:三、个人中心,TabBar 处理【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程(附代码资料)主要内容讲述:一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配。二、登录注册准备,实现基本登录功能,登录状…

vue 数据埋点

最近菜鸟做项目,需要做简单的数据埋点,不是企业级的,反正看渡一的视频,企业级特别复杂,包括但不限于:错误收集、点击地方、用户行为…… 菜鸟的需求就是简单收集一下用户的ip、地址、每个界面的访问时间&a…

二、CentOS基础配置(2.权限与文本管理(vi))

文章目录 4、权限管理1、chmod - 修改文件或目录权限(1.)-R - 递归改变给定目录及其子目录中所有文件或目录的权限(2.)-c - 逐一列出更改的文件权限(3.)-v - 显示详细的更改信息(4.)-f - 忽略错误信息,强制执行更改(5.)使用字母来修改权限 2、chown - 修改文件或目录…

世链空投|io.net空投代撸渠道有哪些?io.net空投代撸要注意什么

世链空投(shilian.com)报道,从Io.net融资3000万美元,到估值10亿美元,市场对于Io.net空投的预期正越来越高。无数人开始涌入io.net空投,但又缺乏知识和技术,此时空投代撸就是一个不错的选择。关于Io.net空投代撸的渠道有…

技术揭秘:如何打造完美互动的充电桩硬件与服务平台?

充电桩平台全套源码地址 https://gitee.com/chouleng/cdzkjjh.git 这张图像是一个系统或服务的架构图。以下是对图中各个部分的描述: 前端: 位于图像的顶部,颜色为浅绿色。用户服务端: 紧邻前端,颜色为淡黄色。设备服…

MOS管小电流发热怎么处理?

01 MOSFET的击穿有哪几种? Source、Drain、Gate —— 场效应管的三极:源级S、漏级D、栅级G。(这里不讲栅极GOX击穿了啊,只针对漏极电压击穿) 先讲测试条件,都是源栅衬底都是接地,然后扫描漏极…