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设备的平台数据结构:
static void w1_enable_external_pullup(intenable)
{
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_datads18b20_w1_gpio = {
.pin = S3C2410_GPB(5),
.is_open_drain = 0,
.enable_external_pullup = w1_enable_external_pullup,
};
static struct platform_devicexc2440_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摄氏度
转载:http://blog.sina.com.cn/s/blog_67571559010119e3.html