mini2440 驱动ds18b20(二)

2014-11-24 01:35:47 · 作者: · 浏览: 6
nsigned long err;
struct ds18b20_dev *dev = filp->private_data;
unsigned char result[2] = {0x00, 0x00}; //这个是用来存放从ds18b20读到的值
ds18b20_reset(); //reset ds18b20
write_ds18b20(0xCC); //跳过ROM
write_ds18b20(0x44); //温度转换
ds18b20_reset(); //reset ds18b20
write_ds18b20(0xCC); //跳过ROM
write_ds18b20(0xbe); //读取RAM
result[0] = read_ds18b20(); //读低8位,存放在result[0]
result[1] = read_ds18b20(); //读高8位,存放在result[1]
ds18b20_reset();
err = copy_to_user(buf, &result, sizeof(result));
return err -EFAULT : min(sizeof(result), size);
}
static int ds18b20_release(struct inode *inode,struct file *filp)
{
return 0;
}
static const struct file_operations ds18b20_fops={
.owner=THIS_MODULE,
.read=ds18b20_read,
.open=ds18b20_open,
.release=ds18b20_release,
};
void ds18b20_setup_dev(struct ds18b20_dev *dev,int minor)
{
int err;
int devno;
devno = MKDEV(ds18b20_major,minor);
cdev_init(&dev->cdev,&ds18b20_fops);
dev->cdev.owner=THIS_MODULE;
dev->cdev.ops=&ds18b20_fops;
err=cdev_add(&dev->cdev,devno,1);
if(err)
printk(KERN_NOTICE "Error %d adding %d\n",err,minor);
}
static int __init ds18b20_init(void)
{
int result;
dev_t devno = 0;
if(ds18b20_major){
devno = MKDEV(ds18b20_major,ds18b20_minor);
result = register_chrdev_region(devno,1,DEV_NAME);
}
else{
result = alloc_chrdev_region(&devno,0,1,DEV_NAME);
ds18b20_major = MAJOR(devno);
}
if(result < 0)
return result;
ds18b20_devp = kmalloc(sizeof(struct ds18b20_dev),GFP_KERNEL);
if(ds18b20_devp){
result = -ENOMEM;
goto fail_malloc;
}
memset(ds18b20_devp,0,sizeof(struct ds18b20_dev));
ds18b20_setup_dev(ds18b20_devp,0);
my_class = class_create(THIS_MODULE,"ds18b20_class");
/*在linux 2.6.27之前是:class_device_create*/
my_device = device_create(my_class,NULL,MKDEV(ds18b20_major, ds18b20_minor),NULL,"ds18b20");
return 0;
fail_malloc:
unregister_chrdev_region(devno,1);
return result;
}
static void __exit ds18b20_exit(void)
{
cdev_del(&ds18b20_devp->cdev);
kfree(ds18b20_devp);
device_destroy(my_class, MKDEV(ds18b20_major, ds18b20_minor));//删除设备文件 /dev/ds18b20
class_destroy(my_class); //删除创建的bus
unregister_chrdev_region(MKDEV(ds18b20_major,ds18b20_minor),1);
}
module_init(ds18b20_init);
module_exit(ds18b20_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("WIOT");
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include //自动创建设备需要此头文件
#define DQ S3C2410_GPF(3) //mini2440里面是这样定义GPIO的
#define DQ_IN S3C2410_GPIO_INPUT //设置DQ为输入
#define DQ_OUT S3C2410_GPIO_OUTPUT //设置DQ为输入
#define