IIC设备驱动框架

i2c适配器驱动
	struct i2c_adapter
	struct i2c_algorithm
	int i2c_add_adapter(struct i2c_adapter *adapter)
	int i2c_add_numbered_adapter(struct i2c_adapter *adap)
	void i2c_del_adapter(struct i2c_adapter * adap)
i2c设备驱动
	struct i2c_client
	struct i2c_driver
	struct bus_type i2c_bus_type ={};
	int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
	#define i2c_add_driver(driver) i2c_register_driver(THIS_MODULE, driver)
	void i2c_del_driver(struct i2c_driver *driver)



//定义ap3216c结构体
struct ap3216c_dev {
	dev_t devid; /* 设备号 */
	struct cdev cdev; /* cdev */
	struct class *class; /* 类 */
	struct device *device; /* 设备 */
	struct device_node *nd; /* 设备节点 */
	int major; /* 主设备号 */
	void *private_data; /* 私有数据 */
	unsigned short ir, als, ps; /* 三个光传感器数据 */
};
static struct ap3216c_dev ap3216cdev;


//具体读写操作函数
void ap3216c_readdata(struct ap3216c_dev *dev)
{
	buf[i] = ap3216c_read_reg(dev, AP3216C_IRDATALOW + i);
}
static unsigned char ap3216c_read_reg(struct ap3216c_dev *dev, u8 reg)
{
	ap3216c_read_regs(dev, reg, &data, 1);
}
static int ap3216c_read_regs(struct ap3216c_dev *dev, u8 reg, void *val, int len)
{
	struct i2c_client *client = (struct i2c_client *)dev->private_data;//从结构体变量中取出client地址
}


//操作文件函数
int ap3216c_open(struct inode *inode, struct file *file)
{
	filp->private_data = &ap3216cdev;//保存结构体变量地址
}
ssize_t ap3216c_read(struct file *file, char __user *buf, size_t, loff_t *ppos)
{
	//获取结构体变量地址
	struct ap3216c_dev *dev = (struct ap3216c_dev *)file->private_data;
	//方便操作结构体变量	
	ap3216c_readdata(dev);
}
int ap3216c_release(struct inode *inode, struct file *file)
{
	return 0;
}
static const struct file_operations ap3216c_ops = {
	.owner = THIS_MODULE,
	.open = ap3216c_open,
	.read = ap3216c_read,
	.release = ap3216c_release,
};


//完善驱动框架
static const struct i2c_device_id ap3216c_device_id[] = {
	{ "ap3216c", 0, },
	{ },
};
static struct i2c_driver ap3216c_driver = {
	.driver.name= "ap3216c",
	.probe		= ap3216c_probe,
	.remove		= ap3216c_remove,
	.id_table	= ap3216c_device_id,
};

int ap3216c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	ap3216cdev.private_data = client;//ap3216cdev结构体变量保存了client地址
}
int ap3216c_remove(struct i2c_client *client)
{
	return 0;
}


//字符设备文件操作集合
open()函数:filp->private_data = &ap3216cdev; 保存结构体变量地址
read()函数:struct ap3216c_dev *dev = (struct ap3216c_dev *)file->private_data; 从文件中读出结构体变量地址
//i2c驱动框架集合
ap3216c_probe()函数:ap3216cdev.private = client; 将client地址保存到ap3216cdev结构体变量
//i2c读取数据函数中
ap3216c_read_regs()函数:
struct i2c_client *client = (struct i2c_client *)dev->private_data; 将client地址从ap3216c结构体变量中读取出来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paper_Love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值