1. dht11的驱动程序 文件名:temp_drv.c
//头文件来源于linux内核源码
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/gpio.h> //函数声明
#include "cfg_type.h" //端口宏定义
#include <linux/ioport.h> //IO相关
#include <linux/delay.h> //延时函数
#include <linux/time.h>
//1.定义一个字符设备
static struct cdev dht11_cdev;
static unsigned int dht11_major = 0; //主设备号;0--动态;>0--静态
static unsigned int dht11_minor = 0; //次设备号
static dev_t dht11_dev_num; //设备号
static struct class *dht11_class;
static struct device *dht11_device;
#define DHT_DATA (PAD_GPIO_D+19)
#define GEC6818_GET_DHTDATA _IOR('K', 0, unsigned int) //注册宏
static int gec6818_dht11_open(struct inode *inode, struct file *filp)
{
gpio_set_value(DHT_DATA, 1);
printk("dht11 driver is openning\n"); //应用程序打开驱动文件时打印
return 0;
}
static int gec6818_dht11_release(struct inode *inode, struct file *filp)
{
gpio_set_value(DHT_DATA, 1);
printk("dht11 driver is closing\n");//应用程序关闭驱动文件时打印
return 0;
}
static unsigned char get_byte(void)
{
int i=0, k=0;
int ret_data = 0;
for(k=0; k<8; k++)
{
i=0;//复位计数值
while(!gpio_get_value(DHT_DATA))//等待总线拉高跳出
{
i++;
udelay(1);
if(i > 120)
{
printk("DTH11 high timeout error\n");
break;
}
}
udelay(22);
ret_data <<= 1;//逐渐将数据移到最高位
if(gpio_get_value(DHT_DATA))
ret_data |= 0x01;//接收最高位放在第