Skip to content

Commit

Permalink
W1: feature, w1_therm.c use strong pullup and documentation
Browse files Browse the repository at this point in the history
Added strong pullup to thermal sensor driver and general documentation on
the sensor.

Signed-off-by: David Fries <david@fries.net>
Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
David Fries authored and Linus Torvalds committed Oct 16, 2008
1 parent 6a158c0 commit 6cd1597
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 2 deletions.
2 changes: 2 additions & 0 deletions Documentation/w1/00-INDEX
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
00-INDEX
- This file
slaves/
- Drivers that provide support for specific family codes.
masters/
- Individual chips providing 1-wire busses.
w1.generic
Expand Down
4 changes: 4 additions & 0 deletions Documentation/w1/slaves/00-INDEX
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
00-INDEX
- This file
w1_therm
- The Maxim/Dallas Semiconductor ds18*20 temperature sensor.
41 changes: 41 additions & 0 deletions Documentation/w1/slaves/w1_therm
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
Kernel driver w1_therm
====================

Supported chips:
* Maxim ds18*20 based temperature sensors.

Author: Evgeniy Polyakov <johnpol@2ka.mipt.ru>


Description
-----------

w1_therm provides basic temperature conversion for ds18*20 devices.
supported family codes:
W1_THERM_DS18S20 0x10
W1_THERM_DS1822 0x22
W1_THERM_DS18B20 0x28

Support is provided through the sysfs w1_slave file. Each open and
read sequence will initiate a temperature conversion then provide two
lines of ASCII output. The first line contains the nine hex bytes
read along with a calculated crc value and YES or NO if it matched.
If the crc matched the returned values are retained. The second line
displays the retained values along with a temperature in millidegrees
Centigrade after t=.

Parasite powered devices are limited to one slave performing a
temperature conversion at a time. If none of the devices are parasite
powered it would be possible to convert all the devices at the same
time and then go back to read individual sensors. That isn't
currently supported. The driver also doesn't support reduced
precision (which would also reduce the conversion time).

The module parameter strong_pullup can be set to 0 to disable the
strong pullup or 1 to enable. If enabled the 5V strong pullup will be
enabled when the conversion is taking place provided the master driver
must support the strong pullup (or it falls back to a pullup
resistor). The DS18b20 temperature sensor specification lists a
maximum current draw of 1.5mA and that a 5k pullup resistor is not
sufficient. The strong pullup is designed to provide the additional
current required.
15 changes: 13 additions & 2 deletions drivers/w1/slaves/w1_therm.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@ MODULE_LICENSE("GPL");
MODULE_AUTHOR("Evgeniy Polyakov <johnpol@2ka.mipt.ru>");
MODULE_DESCRIPTION("Driver for 1-wire Dallas network protocol, temperature family.");

/* Allow the strong pullup to be disabled, but default to enabled.
* If it was disabled a parasite powered device might not get the require
* current to do a temperature conversion. If it is enabled parasite powered
* devices have a better chance of getting the current required.
*/
static int w1_strong_pullup = 1;
module_param_named(strong_pullup, w1_strong_pullup, int, 0);

static u8 bad_roms[][9] = {
{0xaa, 0x00, 0x4b, 0x46, 0xff, 0xff, 0x0c, 0x10, 0x87},
{}
Expand Down Expand Up @@ -192,9 +200,12 @@ static ssize_t w1_therm_read_bin(struct kobject *kobj,
int count = 0;
unsigned int tm = 750;

/* 750ms strong pullup (or delay) after the convert */
if (w1_strong_pullup)
w1_next_pullup(dev, tm);
w1_write_8(dev, W1_CONVERT_TEMP);

msleep(tm);
if (!w1_strong_pullup)
msleep(tm);

if (!w1_reset_select_slave(sl)) {

Expand Down

0 comments on commit 6cd1597

Please sign in to comment.