linux_I2C学习三(I2C子系统)

原创 2015年07月09日 16:08:03

一、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写入数据



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

写设备驱动: 四部曲: 构建i2c_driver注册i2c_driver构建i2c_client ( 第一种方法:注册字符设备驱动、第二种方法:通过板文件的i2c_board_info填充...

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

写设备驱动: 四部曲: 构建i2c_driver注册i2c_driver构建i2c_client ( 第一种方法:注册字符设备驱动、第二种方法:通过板文件的i2c_board_info...

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

http://www.cnblogs.com/liugf05/archive/2012/12/05/2803795.html linux内核I2C子系统学习(三) 写设备驱动:...

linux内核I2C子系统学习

因为I2C的通信肯定至少要有2个芯片完成,所以它的驱动是由2大部分组成: 主芯片的i2c的驱动从芯片的i2c的驱动     注:万一选的都不支持咋办???(惨了,只能2个芯片的驱动...

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

这部分准备分几个部分进行分析总结 因为I2C的通信肯定至少要有2个芯片完成,所以它的驱动是由2大部分组成: 主芯片的i2c的驱动从芯片的i2c的驱动     注:万一选的都不支持咋办...

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

下面具体分析如何写第一部分: 主控芯片的i2c驱动分为2个步骤: 写总线驱动: 选了个主控芯片,比如:S3C8900(自己瞎编的芯片) 在driver/i2c/busses/i2c-s3c24...

笔记五:linux下I2C子系统学习

一、i2c子系统框架: 二、i2c子系统调用流程: //+++++++++++++++++++++++++++++++++++++++++++ 设备端 i2c_...

LINUX驱动之IIC子系统之三I2C的数…

LINUX驱动之IIC子系统之三I2C的数据结构 仍然是按照老的规矩,讲一下I2C的数据结构,让大家在学习I2C前,形成一个整体上的知识结构的认知。它的数据结构也不多,主要的有下面几个:(I2C.h...

Linux内核I2C子系统驱动(三)

I2C子系统驱动之三,i2c设备驱动编写,at24c02
  • liaozc
  • liaozc
  • 2011年08月02日 21:07
  • 4867

linux IIC子系统分析(九)——实例分析通过设备节点访问I2c设备

在我们实际开发中,I2C 总线驱动一般芯片原厂会提供,我们开发一般是设计设备驱动。 在访问I2C设备驱动的方法中: 通过i2c-dev 从应用层驱动设备,这样的设计需要对I2C通讯协议非常熟悉,一般比...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux_I2C学习三(I2C子系统)
举报原因:
原因补充:

(最多只允许输入30个字)