Chinaunix首页 | 论坛 | 博客
  • 博客访问: 41861
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-30 10:34
文章分类
文章存档

2014年(42)

我的朋友

分类: LINUX

2014-11-19 19:06:00

Dallas 1-wires是Dallas公司的单总线设备,最具代表性的就是DS18B20温度传感器,只需要一根线操作。
在移植2.6.37的时候就发现这个驱动写的特别好,层次分明,通用性好,使用方便。所以重点分析了这类驱动,领悟了驱动作者的精神,把这种思想发扬光大。然后在XC2440板上小试了一下,把DS18B20驱起来,准确获取温度,一个好的驱动让工作变得如此简单。

Linux内核自带Dallas 1-wires设备驱动,路径为:drivers/w1。此类驱动为Master/Slave模式:Master目录下为主控制器驱动,我们用到的是w1-gpio.c,Slave目录下是从设备驱动,我们使用的DS18B20属于温度传感器,所以使用w1_therm.c这个驱动。

w1-gpio.c是单总线的IO操作方法,用于模拟单总线时序;w1_therm.c是DS18B20的内部操作方法(读写寄存器),和IO时序无关;我们可以将驱动结构看成是将“w1_therm”挂接到“w1-gpio”总线上,由w1-gpio控制w1_therm工作。

在mach-xc2440.c中添加对DS18B20设备的支持:

加入w1-gpio.h头文件,以使用w1_gpio_platform_data结构体:
#include

xc2440_devices[ ]结构体中加入:
&xc2440_ds18b20_device,

构建DS18B20设备的平台数据结构:
/* DS18B20 */
static void w1_enable_external_pullup(int enable)
{
if (enable)
s3c_gpio_setpull(S3C2410_GPB(5), S3C_GPIO_PULL_UP);
else
s3c_gpio_setpull(S3C2410_GPB(5), S3C_GPIO_PULL_NONE);
}

static struct w1_gpio_platform_data ds18b20_w1_gpio = {
.pin = S3C2410_GPB(5),
.is_open_drain = 0,
.enable_external_pullup = w1_enable_external_pullup,
};

static struct platform_device xc2440_ds18b20_device = {
        .name     = "w1-gpio",
        .id       = -1,
        .dev      = {
.platform_data  = &ds18b20_w1_gpio,
        },
};

说明:设备名称是“w1-gpio”,这个和w1-gpio.c驱动中的驱动名称一致,才能注册这个设备驱动。
在XC2440开发板上,使用GPB5这个管脚连接DS18B20的IO管脚,所以在w1_gpio_platform_data结构体中指定pin为S3C2410_GPB(5),

配置内核,支持w1-gpio和ds18b20驱动:
  Device Drivers  ---> 
<*> Dallas's 1-wire support  --->
--- Dallas's 1-wire support
1-wire Bus Masters  ---> 
<*> GPIO 1-wire busmaster
1-wire Slaves  --->
<*> Thermal family implementation

查看设备:
#cd  /sys/class/devices/w1 bus master/
这个目录下有一个以“28-”开头的目录,这个就是你的DS18B20设备的目录,28代表你使用的温度传感器是DS18B20,后面接的一串数字和字母是它的ID号(用来识别不同设备,也是独一无二的)

进入这个目录,里面的w1_slave文件就是它的设备文件:

获取温度值:
查看w1_slave设备文件中的内容,便可得到温度值  #cat  w1_slave

“t=”后面的数字就是温度值,要在千位的后面加上小数点,此时温度为:30.875摄氏度

阅读(201) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~