资讯详情

基于ARM-LINUX的温度传感器驱动18B20(2)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define DEVICE_NAME "DS18B20"

static struct cdev cdev;

struct class *tem_class;

static dev_t devno;

static int major = 100;

unsigned int gpio=S5PV210_MP04(3);

void tem_reset(void)

{

s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(1));

gpio_set_value(gpio, 1);

//gpio_direction_output(gpio,1);

udelay(100);

gpio_set_value(gpio, 0);

udelay(600);

gpio_set_value(gpio, 1);

udelay(100);

s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0));

// gpio_direction_input(gpio);

}

void tem_wbyte(unsigned char data)

{

int i;

s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(1));

for (i = 0; i < 8; i)

{

gpio_set_value(gpio, 0);

udelay(1);

if (data & 0x01)

{

gpio_set_value(gpio, 1);

}

udelay(60);

gpio_set_value(gpio, 1);

udelay(15);

data >>= 1;

}

gpio_set_value(gpio, 1);

}

unsigned char tem_rbyte(void)

{

int i;

unsigned char ret = 0;

for (i = 0; i < 8; i)

{

s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(1));

gpio_set_value(gpio, 0);

// gpio_direction_output(gpio,0);

udelay(1);

gpio_set_value(gpio, 1);

s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(0));

// gpio_direction_input(gpio);

ret >>= 1;

if (gpio_get_value(gpio))

{

ret |= 0x80;

}

udelay(60);

}

s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(1));

return ret;

}

static ssize_t tem_read(struct file *filp, char *buf, size_t len, loff_t *offset)

{

unsigned char low, high;

tem_reset();

udelay(420);

tem_wbyte(0xcc);

tem_wbyte(0x44);

mdelay(750);

tem_reset();

udelay(400);

tem_wbyte(0xcc);

tem_wbyte(0xbe);

low = tem_rbyte();

high = tem_rbyte();

*buf = low / 16 high * 16;

*(buf 1) = (low & 0x0f) * 10 / 16 (high & 0x0f) * 100 / 16 % 10;

return 0;

}

static struct file_operations tem_fops =

{

.owner = THIS_MODULE,

.read = tem_read,

};

static int __init tem_init(void)

{

int result;

devno = MKDEV(major, 0);

result = register_chrdev_region(devno, 1, DEVICE_NAME);

if (result)

{

printk("register failed

");

return result;

}

cdev_init(&cdev, &tem_fops);

cdev.owner = THIS_MODULE;

cdev.ops = &tem_fops;

result = cdev_add(&cdev, devno, 1);

if (result)

{

printk("cdev add failed

");

goto fail1;

}

tem_class = class_create(THIS_MODULE, "tmp_class");

if (IS_ERR(tem_class))

{

printk("class create failed

");

goto fail2;

}

device_create(tem_class, NULL, devno, DEVICE_NAME, DEVICE_NAME);

return 0;

fail2:

cdev_del(&cdev);

fail1:

unregister_chrdev_region(devno, 1);

return result;

}

static void __exit tem_exit(void)

{

device_destroy(tem_class, devno);

class_destroy(tem_class);

cdev_del(&cdev);

unregister_chrdev_region(devno, 1);

}

module_init(tem_init);

module_exit(tem_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("gjianw217@163.com");

MODULE_DESCRIPTION("DS18B20 driver");

标签: 主板传感器温度过高

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台