小弟我的18B20驱动程序去测试,温度总是不变
我的18B20驱动程序去测试,温度总是不变
- C/C++ code
#include<linux/init.h> #include<linux/kernel.h> #include<linux/module.h> #include<linux/fs.h> #include<asm/uaccess.h> #include<asm/io.h> #include<linux/device.h> #include<asm/gpio.h> #include<linux/poll.h> #include<linux/interrupt.h> #include<linux/irq.h> #include<linux/time.h> #include<linux/delay.h> MODULE_LICENSE("GPL"); /* 起点工作室 18B20驱动程序 采用9位精度 时间75ms采样一次 */ #define DEVICE_NAME "18B20-drv" #define GPHCON (unsigned long)(0x56000070) #define GPHDAT (unsigned long)(0x56000074) #define GPHUP (unsigned long)(0x56000078) typedef unsigned char BYTE; #define DS18B20_PIN S3C2410_GPH4 #define DS18B20_PIN_OUTP S3C2410_GPH4_OUTP #define DS18B20_PIN_INP S3C2410_GPH4_INP #define HIGH 1 #define LOW 0 static BYTE data[2];//store 18B20rature high and low static int major=0; static int minor=0; static int temp_open(struct inode *, struct file *); static int temp_release(struct inode *, struct file *); static ssize_t temp_read(struct file *, char *, size_t, loff_t *); //static ssize_t temp_write(struct file *, const char *, size_t, loff_t *); //static int temp_ioctl(struct inode *, struct file *, unsigned int cmd, unsigned long arg); static struct file_operations fops = { .owner = THIS_MODULE, //.open = temp_open, //.release = temp_release, .read = temp_read, // .write = temp_write, //.ioctl = temp_ioctl, }; static struct class *dev_class;//use this to create device node static int temp_init(void) { major = register_chrdev(0,DEVICE_NAME,&fops); if(major < 0) { printk("register %s error\n",DEVICE_NAME); return 1; } printk("DEV Number:%d,%d\n",major,minor); dev_class = class_create(THIS_MODULE,DEVICE_NAME); if(dev_class == NULL) { printk("18B20 node create error\n"); printk("TODO:mknod /dev/%s c %d %d\n",DEVICE_NAME,major,minor); } else { device_create(dev_class,NULL,MKDEV(major,minor),"%s%d",DEVICE_NAME,minor); printk("/dev/%s%d register sucess\n",DEVICE_NAME,minor); } return 0; } static void temp_exit(void) { if(dev_class) { device_destroy(dev_class,MKDEV(major,minor)); class_destroy(dev_class); } unregister_chrdev(major,DEVICE_NAME); } module_init(temp_init); module_exit(temp_exit); ////////////////////////////registerover///////////////////////////////// /* DS18B20 RESET */ static int temp_open(struct inode * pnode, struct file * pfile) { printk("18b20 open\n"); return 0; } static int temp_release(struct inode *pnode, struct file *pfile) { printk("18b20 release\n"); return 0; } int DS18B20_reset(void) { printk("hello reset\n"); s3c2410_gpio_cfgpin(DS18B20_PIN,DS18B20_PIN_OUTP); s3c2410_gpio_setpin(DS18B20_PIN,1); udelay(100); s3c2410_gpio_setpin(DS18B20_PIN,0); udelay(600); s3c2410_gpio_setpin(DS18B20_PIN,1); udelay(100); s3c2410_gpio_cfgpin(DS18B20_PIN,DS18B20_PIN_INP); if(s3c2410_gpio_getpin(DS18B20_PIN)==0) { printk("DS18B20 reset sucessfully\n"); return 0; } else { printk("reset failed and please try again\n"); return 1; } } /* DS18B20 WRITEBYTE */ void DS18B20_WByte(BYTE cmd) { unsigned int i; s3c2410_gpio_cfgpin(DS18B20_PIN,DS18B20_PIN_OUTP); for(i=0;i<8;i++) { s3c2410_gpio_setpin(DS18B20_PIN,LOW); udelay(1); if(cmd & 0x01) { s3c2410_gpio_setpin(DS18B20_PIN,HIGH); } else s3c2410_gpio_setpin(DS18B20_PIN,LOW); udelay(60); s3c2410_gpio_setpin(DS18B20_PIN,HIGH); udelay(15); cmd=cmd>>1; } s3c2410_gpio_setpin(DS18B20_PIN,HIGH); } /* DS18B20 READBYTE */ BYTE DS18B20_RByte(void) { unsigned int i; BYTE status=0; for(i=0;i<8;i++)//九位精度末3位不用 { s3c2410_gpio_cfgpin(DS18B20_PIN,DS18B20_PIN_OUTP); s3c2410_gpio_setpin(DS18B20_PIN,LOW); udelay(1); status>>=1; s3c2410_gpio_setpin(DS18B20_PIN,HIGH); s3c2410_gpio_cfgpin(DS18B20_PIN,DS18B20_PIN_INP); /* if 1 us after LOW translate HIGH read a 1 */ if(s3c2410_gpio_getpin(DS18B20_PIN)) status = status|0x80; udelay(60); } printk("%x\n",status); return status; } /* DS18B20 temp_init */ void DS18B20_start(void) { DS18B20_reset(); udelay(120); DS18B20_WByte(0xcc);//write cmd DS18B20_WByte(0x44); } /* DS18B20 Read temp */ void DS18B20_Read(void) { DS18B20_reset(); mdelay(2); DS18B20_WByte(0xcc);//write cmd DS18B20_WByte(0x44); data[0] = DS18B20_RByte(); data[1] = DS18B20_RByte(); } /* DS18B20 PRO */ void DS18B20_PRO(void) { DS18B20_start(); udelay(5); DS18B20_Read(); } static ssize_t temp_read(struct file *file, char *buf, size_t len, loff_t *off) { DS18B20_PRO(); buf[0] = data[0]; buf[1] = data[1]; return 0; }