linux_I2C学习三(I2C子系统)

一、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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值