ds18b20的详细信息百度百科都有比较详细的介绍:
再有就是特别感谢这位提供datasheet时序的博主:http://www.cnblogs.com/wangyuezhuiyi/archive/2012/10/12/2721839.html
=================================================================================================
因为Linux内核3.0自带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-smdk2440.c中添加对设备DS18B20的支持:
加入w1-gpio.h头文件,以使用w1_gpio_platform_data结构体:
#include <linux/w1-gpio.h>
smdk2440_devices[ ]结构体中加入:
&s3c_ds18b20_device,
构建DS18B20设备的平台数据结构:
#if 1
/* DS1820B add by Handy 2015.8.17*/
static void w1_enable_external_pullup(int enable)
{
if(enable)
s3c_gpio_setpull(S3C2410_GPG(0), S3C_GPIO_PULL_UP);
else
s3c_gpio_setpull(S3C2410_GPG(0), S3C_GPIO_PULL_NONE);
}
static struct w1_gpio_platform_data ds18b20_w1_gpio = {
.pin = S3C2410_GPG(0),
.is_open_drain = 0,
.enable_external_pullup = w1_enable_external_pullup,
};
static struct platform_device s3c_ds18b20_device ={
.name = "w1-gpio",
.id = -1,
.dev = {
.platform_data = &ds18b20_w1_gpio,
},
};
#endif
说明:设备名称是“w1-gpio”,这个和w1-gpio.c驱动中的驱动名称一致,才能注册这个设备驱动。通过FL2440开发板底板原理图可以看到只用到了GPG(0)这个管脚。
好了我们接下来配置内核,支持W1-gpio和ds18b20驱动: