lm75驱动资源程序
#include<linux/init.h>
#include<linux/module.h>
struct i2c_client *lm75_client;
struct cdev *lm75_cdev;
struct class *lm75_class;
struct device *lm75_device;
dev_t devno;
static int lm75_open(struct inode *inode, struct file *file)
{
return 0;
}
static ssize_t lm75_read(struct file *file, char __user *buf, size_t size, loff_t *opps)
{
int ret;
char *tmp;
tmp = kmalloc(size, GFP_KERNEL);
if (tmp == NULL)
return -ENOMEM;
ret = i2c_master_recv(lm75_client, tmp, size);
if (ret >= 0)
ret = copy_to_user(buf, tmp, size) ? -EFAULT : ret;
kfree(tmp);
return ret;
}
static ssize_t lm75_write(struct file *file, const char __user *buf, size_t size, loff_t *opps)
{
int ret;
char *tmp;
tmp = kmalloc(size, GFP_KERNEL);
if (tmp == NULL)
return -ENOMEM;
if (copy_from_user(tmp, buf, size)) {
kfree(tmp);
return -EFAULT;
}
ret = i2c_master_send(client, tmp, count);
kfree(tmp);
return ret;
}
struct file_operations lm75_fops ={
.owner =THIS_MODULE,
.open =lm75_open,
.write =lm75_write,
.read =lm75_read,
};
static int lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
lm75_client =kmalloc(sizeof(struct i2c_client),GFP_KERNEL);
lm75_client =client;
devno =MKDEV(250, 0);
/*给用户提供接口*/
register_chrdev_region(devno, 1, "lm75");
lm75_cdev=cdev_alloc();
cdev_init(lm75_cdev, &lm75_fops);
cdev_add(lm75_cdev, devno, 1);
lm75_class=class_create(THIS_MODULE, "lm75_class");
device_create(lm75_class, NULL, devno, NULL, "lm75");
return 0;
}
/*2.构建struct i2c_device_id结构体*/
struct i2c_device_id lm75_id[]={
[0]={
.name ="lm75",
.driver_data =0x48,
},
[1]={
.name ="lm75A",
.driver_data =0x49,
},
};
/*1.构建一个struct i2c_driver结构体*/
struct i2c_driver lm75_drv={
.probe =lm75_probe,
.remove =lm75_remove,
.id_table =lm75_id,
};
static int __init lm75_init(void)
{
/*注册i2c驱动*/
i2c_add_driver(&lm75_drv);
return 0;
}
static void __exit lm75_exit(void)
{
i2c_del_driver(&lm75_drv);
}
module_init(lm75_init);
module_exit(lm75_exit);