Linux系统中I2C总线设备的驱动设计

从需求的角度去理解Linux系列:总线、设备和驱动 这是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇,期待此系列文章日后会是学习嵌入式Linux的标杆! 阅读详情
 具体在linux中AT91RM9200 I2C总线适配器驱动的实现,首先初始化AT91RM9200 I2C的工作模式,然后装载I2C总线驱动,这需要两个结构模块来描述:struct i2c_adapter和struct i2c_algorithm。

初始化i2c_adapter结构成员如下:
static struct i2c_adapter at91rm9200_adapter = {
name:           AT91RM9200,   
id:             I2C_ALGO_SMBUS,   
algo:           &at91_algorithm,   
algo_data:      NULL,   
inc_use:        at91_inc,   
dec_use:        at91_dec,   
... ...
};

这个模块并未提供读写函数,具体的读写方法由第二个模块struct i2c_algorithm提供。
static struct i2c_algorithm at91_algorithm = {
name:  at91 i2c,
id:  I2C_ALGO_SMBUS,
smbus_xfer: at91_smbus_xfer,
master_xfer: at91_xfer,
functionality: at91_func,
};

通过调用I2C core中的接口函数i2c_add_adapter将这两个模块注册到操作系统里,总线驱动就算装上了。由此可见,i2c_algorithm实现了i2c通信具体方法。针对本文at91rm9200 I2C适配器, at91_xfer最为关键。分析内核可知,I2C core框架中提供给主机使用的数据传输接口:i2c_master_send,i2c_master_recv,i2c_transfer最终都是通过调用at91_xfer实现。

数据传输处理如下:数据发送主机初始化Start状态后,向主机模式寄存器TWI_MMR中DADR发送一个7位从机地址,以通知从机器件。从机地址后的位表示传输方向(写或读)。该位为0,说明是写操作(发送操作);若该位为1,说明为数据读请求( 接收操作)。TWI 传输要求从机每收到一个字节后均要给出应答。在应答时钟脉冲中,主机释放数据线(HIGH),将从机拉低以产生应答。主机在该时钟脉冲中轮询数据线,可使用轮询或中断方式来检验状态位。若从机未应答该字节,将置位状态寄存器TWI_SR的NAK 位。

写操作则发送数据至保持寄存器TWI_THR,设置TWI_CR的START 位以启动传输。数据在内部移位寄存器中移位,当检测到应答,TXRDY位置位,直到TWI_THR中有新数据写入,才清除该位。主机产生STOP 状态来结束传输。设置START 后开始读序列。当状态寄存器中RXRDY 位置位时,接收保持寄存器(TWI_RHR)以收到一个字符。当读TWI_RHR 时RXRDY 位复位。

TWI接口可执行多种传输格式:7位从机地址和10位从机地址。通过主机模式寄存器TWI_MMR配置三个内部地址字节。若从机仅支持7 位地址,IADRSZ 必须置为0。若从机地址大于7 位,用户必须配置地址大小IADRSZ 并在内部地址寄存器TWI_IADR中设置其他从机地址位。

X1227的设备驱动实现

X1227 是一个带有时钟、日历、CPU 监控电路和两路查询报警的实时时钟。时钟使用一个低成本的32.768kHz 的晶体作为输入,可精密地用秒、分钟、小时、日期、星期、月、年来显示时间,它可以自动调整闰年至2096年。同时X1227有一个看门狗定时器、3个超时时间可供选择。另外,X1227有一个4K位的EEPROM阵列,可用作某些用户配置数据的存储器。下面以X1227为例,说明一个具体的I2C设备驱动程序的设计要点。

如前所述,I2C总线驱动只是提供了对一条总线的读写机制,本身并不会去做通信。通信是由I2C设备驱动来做的,设备驱动透过I2C总线同具体的设备进行通讯。一个设备驱动有两个模块来描述,struct i2c_client和struct i2c_driver。i2c_client用来描述一个具体的I2C设备,i2c_driver结构提供了i2c_adapter与i2c_client之间的通信方式。

struct i2c_driver x1227_driver = {
name:  襒1227?
id:  I2C_DRIVERID_X1227,
flags:  I2C_DF_NOTIFY,
attach_adapter: x1227_probe,
detach_client: x1227_detach,
command: x1227_command
};

其中:attach_adapter利用适配器驱动提供的I2C总线访问方法,利用设备驱动程序模块中提供的地址线索信息,检测可能存在的设备及其地址。如果成功发现设备,则创建一个struct i2c_client来标识这个设备,并向该适配器的数据结构注册。detach_client用于从总线上注销设备、并释放i2c_client及相应的私有数据结构。command是用户接口中的ioctl功能的底层实现。

I2C设备驱动需要实现两个方面的接口,一个是对I2C core框架的接口,设备初始化时通过函数i2c_add_driver调用,来实现驱动的注册。这个i2c_driver一旦装入完成,其中的attach_adapter函数就会被调用。

另一个是对用户应用层的接口,提供用户程序访问I2C设备的接口,包括实现open,release,read,write以及最重要的ioctl等标准文件操作的接口函数。每个设备驱动程序都有一个称为file_operations的数据结构,用来实现接口函数。

static struct file_operations rtc_fops = {
owner:  THIS_MODULE,
ioctl:  x1227_rtc_ioctl,
open:  x1227_rtc_open,
release: x1227_rtc_release,
};

其中open和release用来打开和关闭X1227,x1227_rtc_ioctl则向用户提供的一系列控制时钟芯片的具体命令:RTC_GET_TIME(以固定的数据格式读取实时时钟的时间)、RTC_SET_TIME(以固定的数据格式设定实时时钟的时间)以及E2PROM读写等。

对于X1227,一般注册为一个miscdevice设备(所有miscdevice设备共同一个主设备号,不同的次设备号)。

static struct miscdevice x1227_rtc_miscdev = {
RTC_MINOR,
tc?
&rtc_fops
};

初始化时,通过misc_register (&x1227_rtc_miscdev)注册X1227,这样用户程序可以通过主设备号10 次设备号 135的设备节点/dev/rtc来访问X1227。

要测试X1227的时钟功能,首先把AT91RM9200的I2C总线驱动模块和X1227模块在系统启动时先后加载。需要指出的是,Linux将时钟分为系统时钟和硬件时钟两种。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,也就是本文中的X1227。

在Linux中,用于时钟查看和设置的命令主要有date、hwclock。首先设置系统时钟,比如设置为2006年8月17日12点30分:date 081712302006,然后设置硬件时钟为当前系统时钟时间,使用命令/sbin/hwclock 衧ystohc,则X1227中的时间设置为当前系统时间。然后,通常在操作系统启动时设置启动脚本/sbin/hwclock 衕ctosys,利用X1227内的时间更新系统时钟,然后直到重启或关闭系统,由系统时钟来记录时间。

结语

本文介绍了I2C总线适配器及I2C设备驱动的实现。该设计成功用于某网络测试设备的主控模块上,实现了设备的实时时钟功能,便于整个系统的监控。I2C总线在目前的嵌入式领域中应用非常广泛,如音/视频的控制,存储设备的通讯等,而Linux也已成为嵌入式系统的主流。从linux内核看,I2C的驱动程序具有清晰的层次结构,为编程者开发I2C相关驱动提供了规范的框架。
5大步骤!轻松玩转Dorisoy.Rigger:基于.NET Core 6、MAUI和Blazor的多数据库开发框架生成器 各位小伙伴,你们是否厌倦了每次项目启动都要从头配置数据库连接、编写重复的代码?今天,我们就来聊聊如何使用Dorisoy.Rigger这个强大的开发框架生成器,让你的.NET Core 6、MAUI和Blazor项目开发变得简单又高效!准备好迎接开发的新乐趣了吗?让我们一起开始吧!接下来,我们需要定义数据模型。假设我们有一个简单的用户表,包含ID、用户名和密码字段。在项目中创建一个新的类文件,命名为User.csset;set;set;这段代码定义了一个用户模型,其中包含了用户的ID、用户名和密码。 阅读详情

相关推荐

Python爬取京东商品数据保姆级教程(附源码及效果图)

本文介绍了一个基于Python的京东商品数据爬取教程,适合入门级开发者使用。文章详细讲解了从安装依赖库(DrissionPage、pandas等)到完成数据爬取的全过程,包括:1. 模拟用户搜索操作;2. 解析商品标题、价格、销量等关键信息;3. 处理复杂数据格式(如转换万级销量);4. 数据存储与Excel导出。教程提供了完整的封装函数,支持自定义搜索关键词和爬取数量,并包含错误处理和多种元素定位方式。最终数据会按时间戳命名导出为Excel文件,方便用于课程作业或毕业设计。

weixin_46449236的博客 1874

13_Linux无设备树Platform设备驱动

在实际的驱动开发中,一般12C主机控制器驱动已经由半导体厂家编写好了,而设备驱动一般也由设备器件的厂家编写好了,我们只需要提供设备信息即可,比如12C设备的话提供设备连接到了哪个12C接口上, I2C的速度是多少等等。第10行, match函数,此函数很重要,单词match的意思就是“匹配、相配”,因此此函数就是完成设备和驱动之间匹配的,总线就是使用match函数来根据注册的设备来查找对应的驱动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数。简单介绍一下驱动的分层。

Yuanghxb的博客 729

华为AR3260路由器NAT回流配置实战:从WEB界面到命令行的完整避坑指南

本文详细解析了华为AR3260路由器NAT回流(Hairpin NAT)的配置原理与实战方法。针对内网用户无法通过公网地址访问内部服务器的常见问题,文章不仅剖析了WEB界面配置的常见报错原因,更提供了清晰、可靠且一劳永逸的命令行(CLI)配置方案与排错指南,帮助企业网络工程师彻底解决内外网访问不一致的难题。

u6v7w8x的博客 872

第15章 Linux I2C核心、总线与设备驱动之I2C总线驱动实例

15.5 Tegra I2C总线驱动实例    NVIDIA Tegra I2C总线驱动位于drivers/i2c/busses/i2c-tegra.c(I2C 总线 controller driver)下,这里不具体研究硬件细节,只看驱动的框架和流程。    I2C总线驱动是一个单独的驱动,在模块的加载和卸载函数中,只需注册和注销一个platform_driver结构体,如代码清单15.18所示...

xiezhi123456的博客 830

第二天 原来Labview语言结构也挺自然(2.1 顺序结构)

新建项目文件StructureTest.lvproj,新建四个子VI(FlatSequence.vi、CaseStructure.vi、LoopStructure.vi、EventStructure.vi),具体新建流程可以参考1.2节。

weixin_38637405的博客 1003

STM32入门教程:无人机控制

我们将会一步一步引导您完成无人机的控制代码,包括无人机的姿态控制、飞行控制和通信控制等。第三步:配置无人机姿态控制 无人机的姿态控制是指控制无人机在空中的倾斜和转向。为了实现姿态控制,我们需要使用加速度计和陀螺仪传感器来获取无人机的姿态信息,并使用PID控制算法来控制无人机的姿态。在这一步骤中,您需要根据您使用的具体传感器和控制算法的要求进行更详细的配置和编码。在通信控制中,您需要考虑到通信的稳定性和可靠性。第五步:通信控制 无人机的通信控制是指与地面站或其他设备进行通信,传输飞行数据和接收飞行指令。

m0_75244442的博客 747

驱动程序开发:无设备树和有设备树的platform驱动

无设备树的platform驱动

morecrazylove的博客 1475

selenium绕过检测,规避检测

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined或者为false。而使用selenium访问则该值为true。那么如何解决这个问题呢?我们正常浏览器登录查看,window.navigator.webdriver的值为false我们通过selenium打开的网页,测试,可见window.navigator.webdriver的值为true。

景天科技苑 1万+

【嵌入式环境下linux内核及驱动学习笔记-(15)linux总线、设备、驱动模型之I2C总线】

define I2C_CLASS_HWMON (1

weixin_45499326的博客 3991

从服务器到桌面超算:当3999美元的NVIDIA DGX Spark装上Ubuntu,普通开发者能玩出什么花?

DGX Spark的出现,标志着AI算力正在经历从"数据中心集中供给"到"个人桌面按需拥有"的范式转移。它让开发者可以在本地完成从数据预处理、模型微调到推理验证的全流程,只有在需要大规模训练时才调用云端资源。迭代速度:从按小时计费的云端调试,变成随时随地的本地实验数据主权:敏感信息永不离开本地成本可控:一次投入,长期使用,不受API调用次数限制AI算力民主化的时代,真的来了。你的下一台超级计算机,不必在云端。它就在你的桌面上,安静地等待着你的下一个创意。附录:实用资源。

QQ_778132974的博客 615

AIGC算法工程师面试八股文深度解析与进阶指南:揭秘Diffusion Models核心原理与实战技巧

总结来说,Cosine Noise Scheduler 的核心优势在于它能够更巧妙地平衡信号和噪声的比例,在扩散过程的早期阶段更长时间地保留原始图像的细节信息,从而为去噪模型提供一个更友好的学习环境,最终带来更优异的生成质量。🚀

FJN110的博客 344

Linux驱动开发的IIC设备驱动的投机取巧

前言Linux的IIC驱动想必大家都耳熟能详,网上也有很多相关的教程。网上的教程总结,比如:方法问题描述Linux 3.X.X版本之后,设备树+驱动此方法是比较符合linux驱动的写法的。...

Rice开发经验分享 479

从零开始学习PX4源码23(飞行模式管理)

本文摘要主要介绍了PX4飞控系统中飞行模式管理模块的代码实现流程。文章从整体架构入手,分析了飞行模式管理模块的启动过程、类继承关系以及核心运行机制。重点阐述了模块从rc.mc_apps启动脚本到FlightModeManager::main()的调用链路,包括任务创建、工作队列初始化和主循环执行流程。核心部分解释了Run()函数如何通过订阅传感器数据、更新参数、处理命令以及生成轨迹设定点来实现飞行模式切换和任务管理功能。文章为理解PX4飞行控制系统的模式切换机制提供了代码层面的详细分析。

陌城烟雨 499

嵌入式Linux系统中I2C总线设备的驱动设计

  嵌入式Linux系统中I2C总线设备的驱动设计   来源:电子产品世界  作者:新太科技股份有限公司(广州) 贾东耀摘要: 本文分析了Linux系统中I2C驱动程序的结构,并以AT91RM9200和X1227为例,介绍了如何在嵌入式Linux系统中实现I2C总线适配器及I2C设备驱动。关键词: Linux;I2C总线;I2C设备;驱动引言I2C总线是PHIL

gulfweed的专栏 734

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

从 0 理解 Linux 设备树:DTS、DTB、compatible、reg 与驱动匹配全梳理

本文介绍了Linux设备树(Device Tree)的背景、基本构成与关键属性。设备树通过DTS/DTSI/DTB机制实现硬件描述与驱动解耦,解决了传统板级信息直接写入内核导致的冗余问题。文章重点分析了设备树的分层结构、节点组织形式和命名规则,并详细解读了compatible、reg、status等核心属性的作用。通过I2C外设示例,展示了设备树如何参与驱动匹配与资源获取,为Linux内核提供了灵活的硬件配置方案。

qq_49860804的博客 728

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

概要性了解Linux的总线设备驱动

假如我们的板子上有很多LED,有时候需要操作这个LED,有时候需要操作另一个LED,我们希望代码可以清晰地组织在一起,方便扩展,同时自动为这些具体的设备生成对应的设备文件以供用户空间使用。在Linux中,可以通过总线设备驱动编程的方法来实现这个需求。这种方法将驱动程序划分为三个部分:总线 (Bus)、设备 (Device) 和 驱动 (Driver)。匹配过程可以大致理解为:这种设计具有模块化、可扩展和动态加载的优点,适用于开发复杂的嵌入式系统。总线设备驱动编程方法是 Linux 驱动模型的重要组成部分。总

昊虹AI笔记 1105

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux I2C总线设备驱动

1、I2C总线硬件介绍 I2C总线

JJ1116的博客 2288

I2C子系统详解1——I2C总线设备的驱动框架

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 2284

linux系统下操作I2C总线外设(imx6ull的oled显示屏i2c驱动笔记)

在硬件层中,I2C硬件总线只有两条线路,上面可以挂载多个I2C-device,这些I2C-device有的在I2C总线里充当主机的角色,一般情况该主机为板子上的主cpu中的I2C控制器,拿imx6ul板子来说,这个I2C主机就是imx6中的I2C控制器模块。

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 3171

Linux的 i2c 驱动框架分析

1.基本概念总线设备驱动模型,是Linux 内核的一个基础,基本理论可以说按照大企业的分工原则,每个人只要负责自己的事情,向其他部门给出标准的接口调用,后勤部就负责后勤工...

嵌入式Linux 1041

[linux 驱动]i2c总线设备驱动详解与实战

它定义了驱动程序必须实现的接口和包含的属性,以便与I2C总线上的设备进行交互。i2c_adapter对应于物理上的一个适配器,i2c_adapter 结构体是 Linux 内核中 I2C 子系统的一个核心组件,它封装了与 I2C 总线适配器相关的所有必要信息,使得驱动程序能够高效、安全地与 I2C 设备进行通信。i2c 的框架如下所示, i2c核心提供了I2C总线驱动和设备驱动的注册、注销方法,i2c通信方法(即Algorithm)上层的与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。

weixin_49406449的博客 2607

linux驱动移植-I2C总线设备驱动

----------------------------------------------------------------------------------------------------------------------------内核版本:linux 5.2.8根文件系统:busybox 1.25.0u-boot:2016.05-------------------------...

Graceful_scenery的博客 570

Linux总线设备驱动模型深度理解

物理上的总线是一堆电路线路连线(比如I2C总线、SPI总线、USB总线等等),软件上用来描述控制器与外设的连接关系,内核使用Bus结构体来描述这种连接关系,本质上总线Bus只是一个数据结构,它的名字用对应通信接口命名罢了,而一些驱动程序没有实际对应的通信接口(比如GPIO),那就用platform来命名吧,我们冠名为虚拟的总线!2、接下来看总线设备驱动模型和各类子系统(以platform设备驱动为例子,platform可以理解为通用简单的总线设备驱动的实现之一)的实现细节;2、总线设备驱动 的含义?

STCNXPARM的博客 1276

嵌入式linux驱动框架 I2C系统驱动程序模型分析

在嵌入式 Linux 系统中,I2C(Inter-Integrated Circuit)是一种常用的通信协议,用于连接低速设备(如传感器、显示器、存储器等)与主控制器。I2C 系统驱动程序模型通过层次化的设计,使得 I2C 总线设备和驱动程序能够高效、灵活地进行通信和管理。 本分析旨在详细介绍 I2C 驱动程序框架,重点分析其核心组成部分,如 i2c_driver 和 i2c_client,以及 I2C 总线、设备和驱动程序的交互关系。

你要拥有一个你喜欢并且热爱的人生 1547

Linux系统I2C设备驱动框架

注册、分配空间、初始化定位到中,最后一个参数传参出现问题,因为发送消息数量为1,但是ARRAY_SIZE(msg)为2,就可能导致发送消息为空,通讯超时。将传入的参数修改为1,完美解决!按照模块,编译运行应用程序,成功获取传感器数据PCA9685 接收来自 Jetson 设备 I2C 总线的指令,然后驱动 TB6612 芯片按照 PWM 控制信号对两个 TT 电机,透过改变电流大小去调整电机转速与方向,来执行 Jetbot 小车的移动。PCA9685。

DZJ_Nirvana 1929
上一篇: 嵌入式Linux系统下I2C设备驱动程序的开发
下一篇: I2C设备没有响应的可能的原因
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值