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);

 

posted on 2013-12-26 21:55  weat  阅读(1032)  评论(0编辑  收藏  举报