【整理】--linux总线变成--iic

1。 嵌入式Linux中I2C驱动程序分析

I2C(Inter2IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。嵌入式系统中,微控制器通过I2C总线可随时可对各个系统中的组件进行设置和查询,以管理系统的配置或掌握组件的功能状态来控制外围设备。I2C总线因为协议成熟,引脚简单,传输速率高,支持的芯片多,并且有利于实现电路的标准化和模块化,得到了包括Linux在内的很多操作系统的支持,受到开发者的青睐。在Linux环境下使用I2C总线协议,需要理解Linux的I2C总线驱动的体系结构,在此基础上来进行嵌入式驱动程序和应用程序的开发。

1。1 Linux的I2C驱动框架

Linux内核的I2C总线驱动程序框架如图1所示:

Linux的I2C体系结构分为3个组成部分:

I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册,注销方法,I2C通信方法(即"al2gorithm")上层的,与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等。这部分是与平台无关的。与其对应的是Linux内核源代码中的drivers目录下的i2c2core。c。

I2C总线驱动:I2C总线驱动是对I2C硬件体系结构中适配器端的实现。I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter,I2C适配器的algorithm数据结构i2c_algorithm控制I2C适配器产生通信信号的函数。经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位,停止位,读写周期,以及以从设备方式被读写,产生ACK等。不同的CPU平台对应着不同的I2C总线驱动,比如下文要提到的S3C2410的总线驱动i2c2s3c2410。c,它位于Linux内核源代码中的drivers目录下busses文件夹。

I2C设备驱动:I2C设备驱动是对I2C硬件体系结构中设备端的实现。设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。在Linux内核源代码中的drivers目录下的i2c2dev。c文件,实现了I2C适配器设备文件的功能。应用程序通过"i2c2%d"文件名并使用文件操作接口open(),write(),read(),ioctl()和close()等来访问这个设备。应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间寄存器并控制I2C设备的工作方式

1。2 Linux的I2C驱动框架中的主要数据结构及其关系

Linux的I2C驱动框架中的主要数据结构包括:i2c_driver,i2c_client,i2c_adapteri2c_algo2rithm。它们的定义在内核中的i2c。h头文件中。

i2c_adapter对应于物理上的一个适配器,这个适配器是基于不同的平台的,一个I2C适配器需要i2c_algorithm中提供的通信函数来控制适配器,因此i2c_adapter中包含其使用的i2c_algorithm的指针。i2c_algorithm中的关键函数master_xfer()以i2c_msg为单位产生I2C访问需要的信号。不同的平台所对应的master_xfer()是不同的,开发人员需要根据所用平台的硬件特性实现自己的xxx_xfer()方法以填充i2c_algorithm的master_xfer指针。

i2c_driver对应一套驱动方法,不对应于任何的物理实体。

i2c_client对应于真实的物理设备,每个I2C设备都需要一个i2c_client来描述。i2c_client依附于i2c_adpater,这与I2C硬件体系中适配器和设备的关系一致。i2c_driver提供了i2c2cli2ent与i2c2adapter产生联系的函数。当attach_a2dapter()函数探测物理设备时,如果确定存在一个client,则把该client使用的i2c_client数据结构的adapter指针指向对应的i2c_adapter,driver指针指向该i2c_driver,并调用i2c_adapter的client_register()函数来注册此设备。相反的过程发生在i2c_driver的detach_client()函数被调用的时候。

1。3 Linux的I2C体系结构中三个组成部分的作用

I2C核心提供了一组不依赖于硬件平台的接口函数,I2C总线驱动和设备驱动之间依赖于I2C核心作为纽带I2C核心提供了i2c_adapter的增加和删除函数,i2c_driver的增加和删除函数,i2c_client的依附和脱离函数以及i2c传输,发送和接收函数,i2c传输函数i2c_transfer()用于进行I2C适配器和I2C设备之间的一组消息交互。i2c_mas2ter_send()函数和i2c_master_recv()函数内部会调用i2c_transfer()函数分别完成一条写消息和一条读消息。

I2C总线驱动包括I2C适配器驱动加载与卸载以及I2C总线通信方法。其中I2C适配器驱动加载(与卸载)要完成初始化(释放)I2C适配器所使用的硬件资源,申请I/O地址,中断号,通过i2c_add_adapter()添加i2c_adapter的数据结构(通过i2c_del_adapter()删除i2c_adapter的数据结构)的工作。I2C总线通信方法主要对特定的I2C适配器实现i2c_algorithm的master_xfer()方法来实现i2c_msg的传输。不同的适配器对应的master_xfer()方法由其处理器的硬件特性决定。I2C设备驱动主要用于I2C设备驱动模块加载与卸载以及提供I2C设备驱动文件操作接口。

I2C设备驱动的模块加载通用的方法遵循以下流程:首先通过register_chrdev()将I2C设备注册为一个字符设备,然后利用I2C核心中的i2c_add_a2dapter()添加i2c_driver。调用i2c_add_adapter()过程中会引发i2c_driver结构体中的yyy_attach_adapter()的执行,它通过调用I2C核心的i2c_probe()实现物理设备的探测。i2c_probe()会引发yyy_detect()的调用。yyy_detect()中会初始化i2c_client,然后调用内核的i2c_attach_client()通知I2C核心此时系统中包含了一个新的I2C设备。之后会引发I2C设备驱动中yyy_init_client()来初始化设备。卸载过程执行相反的操作。

I2C设备驱动模块加载与卸载的流程如图2所示:

综上所述,对于特定的嵌入式Linux操作系统,由于I2C核心是不依赖硬件平台的,所以开发的主要工作在于特定平台的总线驱动的开发以及特定设备的驱动开发。

参考链接:http://www.cnblogs.com/jason-lu/archive/2012/11/24/2786406.html

时间: 2024-07-29 07:48:12

【整理】--linux总线变成--iic的相关文章

linux总线设备驱动模型

本篇文章通过平台总线设备模型为例,讲解总线设备驱动模型: platform_device_register的作用: 1.把device放入bus的device链表 2.从bus的driver链表中取出每一个driver,用bus的match函数判断driver能否支持这个device 3.若可以支持,调用driver的probe函数 platform_driver_register的作用: 1.将driver放入bus的driver链表 2.从bus的device链表中取出每一个device,用

整理Linux查看系统日志的一些经常使用命令

整理Linux查看系统日志的一些经常使用命令 last -a 把从何处登入系统的主机名称或ip地址,显示在最后一行. -d 指定记录文件.指定记录文件.将IP地址转换成主机名称. -f <记录文件> 指定记录文件. -n <显示列数>或-<显示列数> 设置列出名单的显示列数. -R 不显示登入系统的主机名称或IP地址. -x 显示系统关机,又一次开机,以及运行等级的改变等信息 下面看全部的重新启动.关机记录 last | grep reboot last | grep

整理Linux查看系统日志的一些常用命令

整理Linux查看系统日志的一些常用命令 last -a 把从何处登入系统的主机名称或ip地址,显示在最后一行. -d 指定记录文件.指定记录文件.将IP地址转换成主机名称. -f <记录文件> 指定记录文件. -n <显示列数>或-<显示列数> 设置列出名单的显示列数. -R 不显示登入系统的主机名称或IP地址. -x 显示系统关机,重新开机,以及执行等级的改变等信息 以下看所有的重启.关机记录 last | grep reboot last | grep shutd

[转]如何整理Linux磁盘碎片,竟与Windows的方式大不同 返回操作系统首页

Linux 系统永远不需要整理磁盘碎片的神话相信很多人都听说过.由于 Linux 采用了优秀的日志文件系统(ext2.ext3.ext4, btrfs等),在绝大多数情况下确实是不需要进行磁盘碎片整理的. 什么是磁盘碎片文件? 当文件系统在磁盘的扇区上读写文件时会形成不连续的整体,这样就会产生磁盘碎片文件.这种情况在 FAT 和 FAT 32 文件系统来说尤为突出,NTFS 文件系统对该现象进行了一些缓解.那为什么这种情况几乎不发生在 Linux 操作系统 (extX) 中呢? 在 FAT 和

辛星整理Linux部分常用命令

Linux下的命令太多了,这里先暂时整理一部分,这里我们为了实用,都没有列出具体参数. 第一部分:文件操作 ll以长格式查看目录及文件 ls以短格式查看目录及文件 df   -h查看磁盘大小信息 mkdir    dir_name   创建文件夹 rm  -rf   file_name    删除目录 rm  -f    file_name    删除文件 mv   file   path     将文件file移动到path目录下 cp   file    path     将文件file复制

笔记整理--Linux守护进程

Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:27) Linux多进程开发(三)进程创建之守护进程的学习 2013-07-04 17:25:35 标签:守护进程 daemon Linux多进程开发 系统编程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liam2199.bl

笔记整理--Linux编程

linux c编程open() read() write()函数的使用方法及实例 | 奶牛博客 - Google Chrome (2013/8/31 17:56:10) 今天把文件IO操作的一些东东整理下.基本的,对于锁机制下次再整理.常用的文件IO函数有标题的三个open() read() write() .首先打开一个文件使用open()函数,然后可以获取到一个文件描述符,这个就是程序中调用这个打开文件的一个链接,当函数要求到文件描述符fd的时候就把这个返回值给函数即可.read跟write

m20预习笔记整理--linux基础知识

程序由指令+数据组成    高级语言--编译器--汇编语言--编译器--机器语言    linux指的是GUN tools+linux内核 系统结构    硬件        内核(内核隐藏了硬件特性,将计算机的计算能力抽象提供给应用程序使用)            应用程序(基于内核的systemcal实现的程序)            shell(也是应用程序)            库函数(.a或.so----是程序,但是没有执行入口,只能被调用)                应用程序,

整理 linux命令

linux下常用的mysql命令: 1.linux下启动mysql命令 mysqladmin start/ect/init.d/mysql start (前面为mysql的安装路径) 2.linux下重启mysql的命令:mysqladmin restart/ect/init.d/mysql restart (前面为mysql的安装路径) 3.linux下关闭mysql的命令:mysqladmin shutdown/ect/init.d/mysql shutdown (前面为mysql的安装路径