#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <linux/gpio.h>
#include <plat/gpio-cfg.h>
#define DEVICE_NAME "6410ds18"
#define DPRINTK(x...) printk(x);
#define DS18_PIN S3C64XX_GPB(1)
typedefunsignedchar U8;
void ds18_reset(void)
{
s3c_gpio_cfgpin(DS18_PIN, S3C_GPIO_SFN(1));
gpio_set_value(DS18_PIN, 0);
udelay(600);
gpio_set_value(DS18_PIN, 1);
udelay(55);
s3c_gpio_cfgpin(DS18_PIN, S3C_GPIO_SFN(0));
while(gpio_get_value(DS18_PIN));
while(! (gpio_get_value(DS18_PIN)) );
}
void ds18_write(U8 data)
{
U8 i;
s3c_gpio_cfgpin(DS18_PIN, S3C_GPIO_SFN(1));
for(i=0;i<8;i++){
gpio_set_value(DS18_PIN, 0);
udelay(10);
if((data&0x01)==1)
gpio_set_value(DS18_PIN, 1);
else
gpio_set_value(DS18_PIN, 0);
udelay(40);
gpio_set_value(DS18_PIN, 1);
udelay(1);
data = data >> 1;
}
}
U8 ds18_read(void)
{
U8 i;
U8 comdata=0x00;
for(i=0;i<8;i++){
comdata >>= 1;
s3c_gpio_cfgpin(DS18_PIN, S3C_GPIO_SFN(1));
gpio_set_value(DS18_PIN, 0);
udelay(1);
s3c_gpio_cfgpin(DS18_PIN, S3C_GPIO_SFN(0));
if( gpio_get_value(DS18_PIN))
comdata = comdata | 0x80;
udelay(40);
}
return comdata;
}
static int dht_read(struct file *file,char * buffer,size_t count,loff_t * ppos)
{
U8 data[2];
ds18_reset();
ds18_write(0xcc);
ds18_write(0x44);
ds18_reset();
ds18_write(0xcc);
ds18_write(0xbe);
data[0] = ds18_read();
data[1] = ds18_read();
ds18_reset();
count = copy_to_user(buffer, data, 2);
return count;
}
staticstruct file_operations dht_fops={
read:dht_read,
};
staticstruct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dht_fops,
};
static int __initmy_dht_init(void)
{
int ret;
s3c_gpio_setpull(DS18_PIN, S3C_GPIO_PULL_UP);
ret = misc_register(&misc);
printk(DEVICE_NAME " 6410_DS18b20 Pull_up initialized\n");
return0;
}
static void __exitmy_dht_exit(void)
{
misc_deregister(&misc);
}
module_init(my_dht_init);
module_exit(my_dht_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("TONY");
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
intmain(void)
{
int s,ret;
int fd;
unsignedchar data[5];
unsignedint temp;
float data_rh,data_t;
if((fd = open("/dev/6410ds18", O_RDONLY)) <0)
return -1;
printf("DS18B20 Get Data:\n");
while(1){
bzero(data,5);
read(fd,data,2);
printf("\nGet data-->");
for(s=0;s<2;s++) printf("%x ",data[s]);
printf("\n");
temp = (data[0]|data[1]<<8)*6.25;
data_t = (float)temp/100;
printf("temp=%4.2f\n",data_t);
sleep(3);
}
close(fd);
return 0;
}