嵌入式实践教程--【Linux驱动】Linux驱动开发基于Linux4.0+(六)I2C总线驱动

简介: 嵌入式实践教程--【Linux驱动】Linux驱动开发基于Linux4.0+(六)I2C总线驱动

I2C总线经常挂载eeprom、温度传感器、湿度传感器等设备。I2C总线下可以挂载多个设备,识别设备采用一个地址,这个地址在一条i2c总线是独一无二的。I2C总线驱动与spi总线驱动框架是一致的,都是采用控制器、core、设备三层驱动。


内核中I2C 的处理已经做好了,我们只需要做设备驱动程序相关的内容。总线处理好了I2C 协议,即总线知道如何收发数据,而不知道数据的含义,我们要做的只是设备相关层的代码。


I2C 协议中,先发出7bit“设备地址”,然后是1 位“写”或“读”的标志位。然后接着是每发出8 位数据有一个ACK 位。


一般I2C 驱动分为两层:


总线层:知道设备如何读写。芯片厂家会帮我们做好,操作寄存器。

设备驱动层:知道数据的含义。


一、4个数据结构的作用及区别



1、i2c_adapter和i2c_algorithm


i2c_adapter:对应于物理上的适配器

i2c_algorithm:对应于一套通信方法


缺少了i2c_algorithm的i2c_adapter什么也做不了。


i2c_algorithm中的关键函数master_xfer用于产生i2c访问周期所需要的信号,以i2c_msg为单位,i2c_msg非常重要,它包含了i2c的传输地址、方向、缓冲区、缓冲区长度。


2、i2c_driver和i2c_client


i2c_driver:对应一套驱动方法

i2c_client:对应于真实的物理设备


每个i2c设备都需要一个i2c_client来描述。i2c_driver和i2c_client是一对多的关系,一个i2c_driver可以支持多个同类型的i2c_client。


3、i2c_client和i2c_adapter


i2c_client依赖于i2c_adapter,i2c_adapter可以被多个i2c_client依赖。


二、总线驱动



I2C总线控制器通常是在内存上,所以它本身是在platform总线上。使用总线驱动模型,通过platform_driver和platform_device的匹配来执行。


(1)适配器驱动的初始化


在platform_driver的probe函数中完成两个工作:


1、初始化I2C适配器的硬件资源,申请IO、中断号、时钟等;

2、使用i2c_add_adapter()添加i2c_adapter数据结构,并且在此之前i2c_adapter已经被初始化。


static int xxx_i2c_probe(struct platform_device *pdev)
{
  struct i2c_adapter *adap;
  ...
  xxx_adapter_hw_init();
  ,,,
  i2c_add_adapter(adap);
}


在platform_driver的remove函数中完成相反的两个工作。


(2)i2c总线的通信方法


主要是实现i2c_algorithm的functionality和master_xfer函数。


三、设备驱动



1、初始化i2c_driver 和模块的加载和卸载


(同大部分总线驱动一样,不再赘述)


2、数据传输


在i2c设备上读写数据的时序且数据常通过i2c_msg组织,最后由i2c_transfer()发送


struct i2c_msg msg[2];
//第一条是写消息
msg[0].addr = client->addr;
msg[0].flags = 0;
msg[0].len = 1;
msg[0].buf = &offs;
//第二条是读消息
msg[1].addr = client->addr;
msg[1].flags = I2C_M_RD;
msg[1].len = sizeof(buf);
msg[1].buf = &buf[0];
i2c_transfer(client->adapter, msg, 2);


更详细示例的参考drivers/i2c/busses/i2c-tegra.c

相关文章
|
21天前
|
Unix Linux 数据安全/隐私保护
Linux服务器如何远程连接?服务器远程连接图文教程
服务器操作系统可以实现对计算机硬件与软件的直接控制和管理协调,任何计算机的运行离不开操作系统,服务器也一样,服务器操作系统主要分为四大流派:Windows Server、Netware、Unix和Linux。 今天驰网飞飞就给你们分享下Linux、Unix系统远程连接图文操作方法
24 4
Linux服务器如何远程连接?服务器远程连接图文教程
|
2天前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
9 1
|
4天前
|
Linux
linux驱动层输出dev_dbg打印信息
linux驱动层输出dev_dbg打印信息
9 0
|
5天前
|
关系型数据库 MySQL Linux
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
|
11天前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
该文指出了学习嵌入式Linux开发的两个常见误区。一是过分专注于学习桌面或服务器版Linux,而非关注嵌入式开发本身,实际上只需熟悉基本操作即可。二是试图在没有基础的情况下直接阅读Linux内核源代码,这是不切实际的,应先建立基础知识再进行源码学习。文章还提到了在嵌入式系统中获取和处理屏幕数据的示例,包括使用gsnap工具将framebuffer数据转为图像,以及涉及的交叉编译过程。
11 0
|
11天前
|
前端开发 Linux iOS开发
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
【4月更文挑战第30天】Flutter扩展至桌面应用开发,允许开发者用同一代码库构建Windows、macOS和Linux应用,提高效率并保持平台一致性。创建桌面应用需指定目标平台,如`flutter create -t windows my_desktop_app`。开发中注意UI适配、性能优化、系统交互及测试部署。UI适配利用布局组件和`MediaQuery`,性能优化借助`PerformanceLogging`、`Isolate`和`compute`。
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
|
12天前
|
Linux Shell 应用服务中间件
LINUX的应用与实践
LINUX的应用与实践
18 0
|
12天前
|
Linux Python Windows
Python虚拟环境virtualenv安装保姆级教程(Windows和linux)
Python虚拟环境virtualenv安装保姆级教程(Windows和linux)
|
13天前
|
存储 监控 Linux
【专栏】在 Linux 中,了解已安装驱动器是系统管理的关键
【4月更文挑战第28天】在 Linux 中,了解已安装驱动器是系统管理的关键。本文介绍了三种方法:1) 使用 `lsblk` 命令显示设备名、大小和类型;2) `fdisk -l` 命令提供详细分区信息;3) `gnome-disks` 等系统管理工具展示驱动器信息。此外,还讨论了驱动器类型识别、挂载点概念及其应用。通过这些方法,用户能有效地监控和管理 Linux 系统中的驱动器。
|
13天前
|
Linux Python
【专栏】这篇教程分分钟教会你在Linux中查看目录文件数的方法
【4月更文挑战第28天】在Linux中查看目录文件数的方法包括:使用`ls`结合`wc -l`,如`ls <directory_path> | wc -l`;使用`find`命令,如`find <directory_path> -type f | wc -l`;使用`tree`命令,如`tree <directory_path>`(可能需额外安装);以及通过编程方式,例如Python代码实现。注意权限、效率和选择适用方法以提升操作效率。本文提供了详细步骤和示例,助你轻松掌握!