add mutex lock
This commit is contained in:
parent
c6e0d4dafa
commit
9ca61be337
34
ds18b20.c
34
ds18b20.c
@ -4,6 +4,7 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/ioctl.h>
|
#include <linux/ioctl.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/of_gpio.h>
|
#include <linux/of_gpio.h>
|
||||||
@ -17,7 +18,9 @@ unsigned int gpio_num = 0;
|
|||||||
#define DQ_L gpio_set_value(gpio_num, 0)
|
#define DQ_L gpio_set_value(gpio_num, 0)
|
||||||
#define DQ_V gpio_get_value(gpio_num)
|
#define DQ_V gpio_get_value(gpio_num)
|
||||||
|
|
||||||
spinlock_t lock;
|
//spinlock_t lock;
|
||||||
|
//#define DEFINE_MUTEX(LOCK)
|
||||||
|
struct mutex mutex;
|
||||||
|
|
||||||
//********************************
|
//********************************
|
||||||
//功能:ds18b20复位
|
//功能:ds18b20复位
|
||||||
@ -33,7 +36,7 @@ int init_DS18B20(void)
|
|||||||
udelay(65);
|
udelay(65);
|
||||||
result = DQ_V;
|
result = DQ_V;
|
||||||
udelay(240);
|
udelay(240);
|
||||||
printk("ds18b20 init result %d,%d", result, DQ_V);
|
//printk("ds18b20 init result %d,%d", result, DQ_V);
|
||||||
udelay(180);
|
udelay(180);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -46,7 +49,7 @@ unsigned char read_char(void)
|
|||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
unsigned char dat = 0;
|
unsigned char dat = 0;
|
||||||
|
|
||||||
spin_lock(&lock);
|
// spin_lock(&lock);
|
||||||
DQ_OUT;
|
DQ_OUT;
|
||||||
for(i=0; i<8; i++) {
|
for(i=0; i<8; i++) {
|
||||||
DQ_L;
|
DQ_L;
|
||||||
@ -60,7 +63,7 @@ unsigned char read_char(void)
|
|||||||
DQ_OUT;
|
DQ_OUT;
|
||||||
udelay(2);
|
udelay(2);
|
||||||
}
|
}
|
||||||
spin_unlock(&lock);
|
//spin_unlock(&lock);
|
||||||
return dat;
|
return dat;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +74,7 @@ void write_char(unsigned char dat)
|
|||||||
{
|
{
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
|
|
||||||
spin_lock(&lock);
|
//spin_lock(&lock);
|
||||||
DQ_OUT;
|
DQ_OUT;
|
||||||
for(i=0; i<8; i++)
|
for(i=0; i<8; i++)
|
||||||
{
|
{
|
||||||
@ -86,17 +89,14 @@ void write_char(unsigned char dat)
|
|||||||
udelay(2);
|
udelay(2);
|
||||||
dat >>= 1;
|
dat >>= 1;
|
||||||
}
|
}
|
||||||
spin_unlock(&lock);
|
//spin_unlock(&lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int initDs18b20(unsigned int gpioNum)
|
int initDs18b20(unsigned int gpioNum)
|
||||||
{
|
{
|
||||||
spin_lock_init(&lock);
|
|
||||||
gpio_num = gpioNum;
|
gpio_num = gpioNum;
|
||||||
if (init_DS18B20())
|
//spin_lock_init(&lock);
|
||||||
{
|
mutex_init(&mutex);
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,21 +111,33 @@ void readDs18b20Data(unsigned char *value)
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
mutex_lock(&mutex);
|
||||||
|
// local_irq_disable();
|
||||||
if (init_DS18B20())
|
if (init_DS18B20())
|
||||||
{
|
{
|
||||||
|
// local_irq_enable();
|
||||||
|
mutex_unlock(&mutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
write_char(0xCC);
|
write_char(0xCC);
|
||||||
write_char(0x44);
|
write_char(0x44);
|
||||||
|
|
||||||
|
// local_irq_enable();
|
||||||
|
|
||||||
mdelay(750);
|
mdelay(750);
|
||||||
|
|
||||||
|
// local_irq_disable();
|
||||||
|
|
||||||
if (init_DS18B20())
|
if (init_DS18B20())
|
||||||
{
|
{
|
||||||
|
// local_irq_enable();
|
||||||
|
mutex_unlock(&mutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
write_char(0xCC);
|
write_char(0xCC);
|
||||||
write_char(0xBE);
|
write_char(0xBE);
|
||||||
|
// local_irq_enable();
|
||||||
|
mutex_unlock(&mutex);
|
||||||
|
|
||||||
value[0] = read_char();
|
value[0] = read_char();
|
||||||
value[1] = read_char();
|
value[1] = read_char();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user