Android DHT11驱动
struct dht11_sensor_dev{
struct cdev cdev;
unsigned long pin;
unsigned char value[5];
unsigned char lock;
unsigned int irq;
struct timeval lasttv;
int bitcount;
int bytecount;
int started;
struct timer_list timer;
void (*write_bit)(unsigned long pin, char bit);
void (*delay)(short t);
};
static struct dht11_sensor_dev *dht11_dev;
struct class *dht11_class;
static int major = DEVICE_MAJOR;
static inline void usdelay(short t)
{
return ndelay(t * 1000);
}
static inline void gpio_write_bit(unsigned long pin, char bit)
{
gpio_set_value(pin, bit);
}
#if 0
static char gpio_read_bit(unsigned long pin)
{
return gpio_get_value(pin) ? 1 : 0;
//return gpio_get_value(pin);
}
static void gpio_write_bit_dir(unsigned long pin, char bit)
{
if (bit)
gpio_direction_input(pin);
else
gpio_direction_output(pin, 0);
}
static void gpio_write_bit_val(unsigned long pin, char bit)
{
gpio_set_value(pin, bit);
}
static int dht11_get_temperature(struct dht11_sensor_dev *dev)
{
return dev->value[0] * 1000 + dev->value[1];
}
static int dht11_get_humidity(struct dht11_sensor_dev *dev)
{
return dev->value[2] * 1000 + dev->value[3];
}
#endif
static irqreturn_t dht11_interrupt(int irq, void *dev_id)
{
struct dht11_sensor_dev *dev = (struct dht11_sensor_dev *)dev_id;
struct timeval tv;
long deltv = 0;
int signal = 0, data = 0;
signal = gpio_get_value(dev->pin);
do_gettimeofday(&tv);
deltv = tv.tv_sec - dev->lasttv.tv_sec;
data = (int)(deltv * 1000000 + (tv.tv_usec - dev->lasttv.tv_usec));
dev->lasttv = tv;
if(dev->bytecount == 5) return IRQ_HANDLED;
if((signal == 1) & (data > 40)){
d