#驱动drv.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <asm-generic/uaccess.h>
#include <linux/spinlock.h>
#include <linux/mutex.h>
#define DEVICE_NAME "dth"
#define DTH_GPIO 32
unsigned char buf[5];
void gpio_output(int value)
{
gpio_direction_output(DTH_GPIO,value);
}
int read_one_bit(void)
{
gpio_direction_input(DTH_GPIO);
return gpio_get_value(DTH_GPIO);
}
unsigned char read_data(void)
{
unsigned char data=0;
unsigned char flag=0;
gpio_output(0);
mdelay(20);
gpio_output(1);
udelay(40);
if(read_one_bit()==0)
{
int i=0;
int num=0;
int nums=0;
while(!gpio_get_value(DTH_GPIO))
{
i++;
udelay(5);
if(i>20)
{
break;
}
}
i=0;
while(gpio_get_value(DTH_GPIO))
{
i++;
udelay(5);
if(i>20)
{
break;
}
}
i=0;
memset(buf,0,sizeof(buf));
for(nums=0;nums<5;nums++)
{
for(num=0;num<8;num++)
{
while(!gpio_get_value(DTH_GPIO))
{
i++;
udelay(5);
if(i>10)
{
printk(KERN_INFO "time out\n");
break;
}
}
udelay(30);
if(gpio_get_value(DTH_GPIO))
{
data=0x01;
}
else
{
data=0;
}
data<<=1;
data|=flag;
}
buf[nums]=data;
}
return data;
}
else
{
printk("return data failed!\n");
return 0;
}
}
static ssize_t dth_misc_read(struct file *file, char __user *buff, size_t size, loff_t *f_ops)
{
unsigned char dat[5];
int ret=0;
*dat=read_data();
if((dat[0]+dat[1]+dat[2]+dat[3])==dat[4])
{
ret=copy_to_user(buff,dat,4);
if(ret<0)
{
printk("copy data failed!\n");
return ret;
}
}
else
return 0;
}
static int dth_misc_open(struct inode *inode, struct file *file)
{
gpio_request(DTH_GPIO,"dth11");
gpio_output(1);
printk("device opened!\n");
return 0;
}
static int dth_misc_close(struct inode *inode, struct file *file)
{
printk("device release!\n");
return 0;
}
static struct file_operations dth_opr = {
.owner =THIS_MODULE,
.open =dth_misc_open,
.release = dth_misc_close,
.read = dth_misc_read,
};
static struct miscdevice dth_misc = {
.minor=MISC_DYNAMIC_MINOR,
.name=DEVICE_NAME,
.fops=&dth_opr,
};
static int __init dth_device_init(void)
{
int ret;
ret=misc_register(&dth_misc);
if(ret<0)
{
printk(KERN_INFO "register misc_device failed!\n");
}
return 0;
}
static void __init dth_device_exit(void)
{
misc_deregister(&dth_misc);
}
module_init(dth_device_init);
module_exit(dth_device_exit);
MODULE_LICENSE("GPL");
##测试程序
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
int main()
{
int fd,ret;
unsigned char buf[4];//数据缓存区
fd = open("/dev/dth",O_RDONLY);
if(fd < 0){
printf("/dev/dht11 open fail\n");
return 0;
}
while(1){
printf("dht11fd = %d\n",fd);
ret = read(fd,buf,sizeof(buf));
if(ret < 0)
printf("read err!\n");
else{
printf("humidity = %d.%d%%\ttemp = %d.%d\n",
buf[0], buf[1],buf[2], buf[3]);
}
sleep(3);//采样时间不低于1S
}
close(fd);
return 0;
}
#结果如下
/mnt # ls
dthdrv.ko dthmisc.ko test
/mnt # insmod dthdrv.ko
/mnt # ./test
device opened!
dht11fd = 3
time out
time out
time out
time out
time out
humidity = 143.127% temp = 220.190
dht11fd = 3
time out
time out
time out
time out
time out
humidity = 143.127% temp = 220.190
dht11fd = 3
time out
time out
time out
time out
time out
humidity = 143.127% temp = 220.190
有大哥给看下一下是什么情况吗。