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结构体变量中读取出来
IIC设备驱动框架
于 2021-07-30 08:08:23 首次发布