关闭

linux_I2C学习三(I2C子系统)

标签: linuxI2C驱动I2C子系统
423人阅读 评论(0) 收藏 举报
分类:

一、Linux--I2C子系统


1. I2C核心
I2C 总线和 I2C 设备驱动的中间枢纽,它提供了 I2C 总线驱动和设备驱动的注册、注销方法等。
2. I2C控制器驱动
I2C CPU对 I2C控制器的驱动实现, 控制器可在 CPU 外部, 也可以集成在 CPU 内部。
3. I2C设备驱动
对 I2C从设备的驱动实现,如AT24C02的驱动。


二、linux--I2C控制器驱动


用户态驱动设计:

用户态驱动设计实际是编写应用程序,由于它是通过大量的设备控制命令去驱动设备所以称为用户模式驱动。

class_create函数说明:自动创建设备文件

/* This is a #define to keep the compiler from merging different
 * instances of the __key variable */
#define class_create(owner, name)		\
({						\
	static struct lock_class_key __key;	\
	__class_create(owner, name, &__key);	\
})


i2c_add_driver函数说明:向Linux系统注册一个I2C驱动

static inline int i2c_add_driver(struct i2c_driver *driver)
{
	return i2c_register_driver(THIS_MODULE, driver);
}

I2C消息结构体struct i2c_msg:一次读或者写操作就称作一个消息

struct i2c_msg {
	__u16 addr;	/* slave address*/设备在I2C总线上的地址,7位,不加读写位,设备在I2C总线上的地址由4位出厂地址和3位用户自定义地址构成,第8位为读写标志
	__u16 flags;<span style="white-space:pre">	</span>/* I2C设备读写标志*/
#define I2C_M_TEN		0x0010	/* this is a ten bit chip address */
#define I2C_M_RD		0x0001	/* read data, from slave to master */
#define I2C_M_NOSTART		0x4000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_REV_DIR_ADDR	0x2000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK	0x1000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NO_RD_ACK		0x0800	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_RECV_LEN		0x0400	/* length will be first received byte */
	__u16 len;		/* msg length				*/
	__u8 *buf;		/* pointer to msg data			*/
};

I2C传输数据过程:

i2cdev_ioctl->i2cdev_ioctl_rdrw->i2c_transfer->调用适配器adap函数->调用适配器算法函数algo->调用适配器传输函数master_xfer


用户态驱动设计过程:

打开通用设备文件(/dev/i2c-0)->构造写数据到I2C设备的消息->使用ioctl写入数据



0
0
查看评论

初探linux子系统集之i2c子系统(二)

大概也是前年了,一直没有把那个i2c的子系统讲解完,这里偷个懒,把以前整理的i2c相关的知识再梳理一下,做个了结,然后再去学习timer子系统。
  • eastmoon502136
  • eastmoon502136
  • 2016-02-03 14:06
  • 2293

I2C子系统驱动框架及应用

I2C子系统框架: 应用程序层(app层) ——————————————————————————————————– i2c driver层: 从设备驱动层(TS Sensor等) 1. 需要和应用层交互(fops cdev) 2....
  • hanp_linux
  • hanp_linux
  • 2017-06-01 16:00
  • 893

I2C子系统驱动架构 - 驱动框架

文章系列I2C子系统驱动架构 - 简介I2C子系统驱动架构 - 驱动框架I2C子系统驱动架构 - 具体实现 基于linux内核4.6.3版本介绍 I2C驱动框架I2C驱动框架图如下所示,用户空间上的节点是用于上层开发工程师来操作i2c设备,内核空间的驱动架构分2层,Bus层的驱动代码是芯片厂商已...
  • l289123557
  • l289123557
  • 2016-07-03 18:15
  • 5210

linux内核I2C子系统学习(三)

写设备驱动: 四部曲: 构建i2c_driver注册i2c_driver构建i2c_client ( 第一种方法:注册字符设备驱动、第二种方法:通过板文件的i2c_board_info填充,然后注册) 注销i2c_driver 具体如下: ● &...
  • SUKHOI27SMK
  • SUKHOI27SMK
  • 2013-09-29 13:50
  • 634

I2C子系统详解

嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载:http://hbhuanggang.cublog.cn  1.1 I2C总...
  • bob_fly1984
  • bob_fly1984
  • 2014-07-15 10:31
  • 715

基于i2c子系统的驱动分析

和i2c有关的代码都在源码drivers/i2c目录下。内核提供了两种i2c的实现方法: 第一种叫i2c_dev,对应drivers/i2c/i2c-dev.c,这种方法仅仅封装了soc的i2c控制器操作,并向应用层提供操作接口。其本质是为应用层提供了一个库,驱动功能由应用层实现,不是主流的做法 第...
  • qq_28992301
  • qq_28992301
  • 2016-09-08 09:11
  • 871

Linux驱动子系统之I2C(一)

主要是参考http://blog.csdn.net/cjok376240497/article/details/6972305,对I2C子系统讲解的很透彻的一篇文章,值得一读。 1 硬件特性 1.1 概述 I2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数...
  • lingran07
  • lingran07
  • 2013-07-18 16:05
  • 2339

linux IIC子系统分析(二)—— linux i2c 架构概述

IIC总线因为它及简单的硬件连接和通讯方式,在现在的很多设备上它是一种不可或缺的通讯方式。如果是用当单片机直接操作IIC,其实很简单,只要正确把握IIC的操作时序就可以了。但是在linux系统中,IIC子系统结构是比较复杂的,它涉及到很多的linux内核的东西,以至于对于我这种新手来说,花了不少的时...
  • li_wen01
  • li_wen01
  • 2016-06-13 13:27
  • 1071

Linux I2C子系统分析-I2C总线驱动

在drivers/i2c/busses下包含各种I2C总线驱动,如S3C2440的I2C总线驱动i2c-s3c2410.c,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gpio.c。 i2c-gpio.c它是gpio模拟I2C总线的驱动,总线也是个设备,在这里将总线...
  • jianwushuang
  • jianwushuang
  • 2015-01-07 11:48
  • 375

I2C子系统驱动架构 - 简介

文章系列I2C子系统驱动架构 - 简介I2C子系统驱动架构 - 驱动框架I2C子系统驱动架构 - 具体实现I2C介绍I2C(Inter-Integrated Circuit)是由Philips半导体(现在的NXP半导体)研发的一种串行总线,一条总线上可以接多个设备。I2C支持三种速率模式:标准,快速...
  • l289123557
  • l289123557
  • 2016-07-03 15:56
  • 4213
    个人资料
    • 访问:47362次
    • 积分:1032
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:33篇
    • 译文:0篇
    • 评论:1条
    最新评论