linux 下 DS18B20(1-wires)驱动移植

Dallas 1-wiresDallas公司的单总线设备,最具代表性的就是DS18B20温度传感器,只需要一根线操作。

在移植2.6.37的时候就发现这个驱动写的特别好,层次分明,通用性好,使用方便。所以重点分析了这类驱动,领悟了驱动作者的精神,把这种思想发扬光大。然后在XC2440板上小试了一下,把DS18B20驱起来,准确获取温度,一个好的驱动让工作变得如此简单。

 

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

 

w1-gpio.c是单总线的IO操作方法,用于模拟单总线时序;w1_therm.cDS18B20的内部操作方法(读写寄存器),和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这个管脚连接DS18B20IO管脚,所以在w1_gpio_platform_data结构体中指定pinS3C2410_GPB(5)

 

配置内核,支持w1-gpiods18b20驱动:

  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

你可能感兴趣的:(arm+linux)